• 基于SpringCloud+redis+Springsecurity实现的微信小程序外卖系统



    🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
     
    🍂个人博客首页: KJ.JK
     
    欢迎大家点赞👍收藏💖评论💬关注🔒
     
    💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
     
    🍂项目实战gitee开源地址: weiit/weiit-saas
     
    🍂项目实战github开源地址: weiit/weiit-saas
     
    ⭐希望大家可以在gitee和github点个star呀⭐


    一、项目介绍

    今天为大家带来的是weiit-saas这款Java开源项目进行实现的微信小程序weiit-saas是完全开源电商SaaS系统,属于weiit开源的社区版,旧版已不在维护和更新,仅供学习和参考,新版saas从底层架构到前后端UI设计已经全面优化和升级新版访问地址👉 weiit


    二、技术栈以及项目特点


    ⭐新版saas技术栈使用⭐

    • SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue +Mybatis+Mysql+Elasticsearch+redis+Springsecurity
       

    ⭐项目特点⭐

    • 项目采用Spring+SpringMVC+Mybatis主流开源框架,遵循MVC架构,设计轻巧,使用简单,开发人员接手与二次开发简单易懂,使用了各种目前主流对的项目框架,包括Mybatis、MybatisPlus、Spring、SpringMVC、SpringBoot、Mysql、Elasticsearch、redis、Spring、Springsecurity
    • 项目完成了对阿里云、腾讯云、微信生态的快速接入与代码示例,并成功运用到了商业中,方便大家学习对OSS/COS/短信服务/快递服务/公众号/小程序/微信开放平台/微信支付的技术点与应用场景的学习
    • 店家可自定义商品,进行上下架功能
    • 发放社群福利以及会员福利
    • 店家可自定义自己需要的模块,一键生成小程序
    • 该小程序使用了Springsecurity+自定义注解进行资源鉴权
    • 小程序与公众号第三方授权集成,让开发者与企业省去繁琐的配置,对AppId/AppSecret集成彻底告别
    • 不同企业数据隔离,真正实现SAAS数据隔离模型,让企业数据互不干扰

    三、数据库表设计

    营销—拼团活动表:主键,商品id,拼团价格,活动名称,有效期开始时间,有效期结束时间,单位小时,参团人数 ,限购数量
     
    营销—优惠券表:优惠券Id,优惠券编号,优惠券名称,优惠券类型,
     
    营销—砍价活动表:主键,商品id,活动名称,有效期开始时间,有效期结束时间,原价价格,砍到最低价格,砍价最小价格,砍价最大价格,用户发起砍价后的有效小时,行业
     
    商家物流表:主键,物流公司名称,图片,创建时间,修改时间,物流公司id,行业
     
    商品SKU信息表:主键,商品SKU编号,商品ID,条形码,SKU规格商品条形码图片,预览字段,SKU规格商品二维码图片,自定义规格值的ID,SKU规格供应价,SKU规格市场销售价,SKU规格销售价格,SKU规格商品的库存
     
    商品图片管理表:主键,商品ID,商品图片,创建时间,修改时间,行业
     
    商品描述表:主键,商品ID,是否删除,创建时间,修改时间,行业
     
    商品属性与规格表:主键,唯一识别号,上级,商品分类,创建时间,修改时间,行业
     
    商品表:商品一级分类,商品二级分类,商品三级分类,商品名称,商品供应价,商品市场销售价格,商品实际销售价格,商品总库存,商品主图,商品销量,限购数,商品规格类型设置,属性自定义,规格自定义,商品购买后赠送积分,运费方式,运费,运费模板id,商品重量,商品体积,商品排序,是否禁用,是否删除,建创人id,创建时间,修改人id,修改时间,行业
     
    全店风格表:主键,全店配色方案,颜色一,颜色二,行业
     
    底部菜单表:主键,方案名称,链接类型,链接类型为选择的商品,链接类型为自定义时,行业
     
    页面表:主键,页面名称,页面描述,页面背景,微页面布局参数,微页面封面,删除状态 ,创建时间,行业
     
    店铺协议表:主键,协议标题,协议内容,协议类型,行业


    四、系统设计


    SAAS微信小程序的主要功能模块包括 首页模块,点单模块,订单模块,我的管理模块


              (1)首页模块: 会展现社群福利会员福利领券中心邀请有利自取以及外卖功能


              (2)点单模块: 该模块包含各个周数展现的特价功能会员特惠餐桌啃卤下饭素菜串串米饭


              (3)订单模块: 该模块包含点击添加商品后加入购物车的商品信息最新订单历史订单


              (4)我的管理模块: 该模块包含卡券、积分、余额、我的订单、卡券激活、礼品卡、积分签到、卡券中心、客服、收货地址、退出、退款、收货功能


    五、系统功能演示


    🚩首页功能演示图


    请添加图片描述


    请添加图片描述


    🚩点单功能演示图


    请添加图片描述


    请添加图片描述


    请添加图片描述


    请添加图片描述


    请添加图片描述


    🚩订单模块演示图


    请添加图片描述


    请添加图片描述


    请添加图片描述


    🚩我的管理模块演示图


    请添加图片描述


    六、系统源代码


    public enum ApiResponseCode {
        SUCCESS("0","SUCCESS"),
        PARAM_ERROR("1001001","参数异常"),
        TOKEN_INVALID("1001002","请重新登录"),
        VALICODE_ERROR("1001003","验证码过期"),
        BALANCE_NOT_ENOUGH("1001004","余额不足"),
        GROUPON_PEOPLE_ENOUGH("1001005","拼团人数已满"),
        GROUPON_ING("1001005","该拼团进行中"),
        BARGAIN_NO_FINISH("1001006","当前有未完成的团"),
        GROUPON_PEOPLE_NOTEXIST("1001007","拼团异常"),
        BARGAIN_NO_HASBARGAIN("1001008","已帮好友砍价"),
        BARGAIN_HASDEAD("1001009","已完成或已过期的砍价"),
        ERROR_SIGN("1001010","错误签名"),
        BARGAIN_NO_ORDER("1001011","查无订单"),
        ORDER_STATE_ERROR("1001012","订单已完成"),
        WX_CODE_EMPTY("1001013","code 为空"),
        MOBILE_PHONE_NULL("1001014","手机号不能为空"),
        MERCH_HAS_EXIST("1001015","手机账户已注册"),
        VALIDATE_CODE_ERROR("1001016","验证码错误"),
        VALIDATE_CODE_MAX_ERROR("1001017","验证码次数上限"),
        FLOWPATH_ERROR("1001018","请按流程操作"),
        INTEGRAL_PAST("1001019","积分商品过期"),
        INTEGRAL_NOT_ENOUGH("1001020","亲,您的积分不足"),
        INTEGRAL_MAX_LIMIT("1001021","亲,已超兑换数量"),
        INTEGRAL_STATE_ERROR("1001022","稍后再试"),
        SHOP_NOTEL("1001023","店主未设置客服电话"),
        GROUPIDS_EMPTY("1001000","参数异常");
    
    
        private String code;
        private String message;
    
    
    
    
    
        ApiResponseCode(String code, String message) {
            this.code = code;
            this.message = message;
        }
    
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    @Controller
    @RequestMapping(value = "/ump/bargain")
    public class BargainController extends AdminController {
    
        public static Logger logger = Logger.getLogger(BargainController.class);
    
        @Resource
        private BargainService bargainService;
    
        @Resource
        ProductService productService;
    
    
        /**
         * 砍价活动 列表
         */
        @RequestMapping("/bargainList")
        public UIview bargainList() throws Exception {
            logger.info("进入 bargainController-list,砍价活动列表");
            //获取请求参数
            FormMap formMap = getFormMap();
            //开启分页
            PageHelper.startPage(formMap.getPage(), formMap.getRows());
            //查询展示数量
            List<E> list = bargainService.selectList(formMap);
    
            //返回到list页面
            UIview result = UIView("/center/ump/bargain/bargainList", false);
            //绑定分页返回
            result.addObject("pageInfo", new PageInfo<E>(list));
            //绑定上一次参数
            result.addObject("queryParam", formMap);
            return result;
        }
    
        /**
         * 砍价活动 新增
         */
        @RequestMapping("/add")
        public UIview add() throws Exception {
    
            UIview result = UIView("/center/ump/bargain/bargainCreate", false);
    
            this.getRequest().setAttribute("title", "砍价活动新增");
    
            return result;
        }
    
    
    
        /**
         * 砍价活动 编辑
         */
        @RequestMapping("/edit")
        public UIview edit() throws Exception {
    
            FormMap formMap = getFormMap();
    
            E infoMap = bargainService.selectOne(formMap);
            formMap.put("item_id",infoMap.get("item_id"));
            E itemInfo = productService.getItemById(formMap);
    
    
            String specString ="";
            if (itemInfo!=null && itemInfo.get("spec_custom")!=null){
                formMap.put("specIds", itemInfo.getStr("spec_custom").split(";"));
                List<E> specList = productService.getSpecCustomByIds(formMap);
    
                for(E spec :specList){
                    specString+=spec.getStr("key_name")+";";
                }
            }
            specString=specString==""?infoMap.getStr("product_name"):specString;
    
            infoMap.put("skuName",specString);
            UIview result = UIView("/center/ump/bargain/bargainCreate", false);
    
            this.getRequest().setAttribute("infoMap", infoMap);
    
            this.getRequest().setAttribute("title", "砍价活动编辑");
    
            return result;
        }
    
        /**
         * 砍价活动 保存
         */
        @RequestMapping("/save")
        public UIview save() throws Exception {
    
            FormMap param = getFormMap();
            if (param.get("validate_id") == null || param.get("validate_id").equals("")) {
    
                //根据生效时间判断是否现在生效
                if (System.currentTimeMillis()> DateUtil.getTimeByString(param.getStr("start_time"),"yyyy/MM/dd HH:mm:ss")){
                    param.put("state", 0);
                }else {
                    //未开始状态
                    param.put("state", -2);
                }
    
                bargainService.insert(param);
            } else {
                param.set("eivt", null);
                //失效后再编辑
                if (System.currentTimeMillis()> DateUtil.getTimeByString(param.getStr("start_time"),"yyyy/MM/dd HH:mm:ss") && System.currentTimeMillis()<DateUtil.getTimeByString(param.getStr("end_time"),"yyyy/MM/dd HH:mm:ss")){
                    param.put("state", 0);
                }else if (System.currentTimeMillis()<DateUtil.getTimeByString(param.getStr("start_time"),"yyyy/MM/dd HH:mm:ss")){
                    param.put("state", -2);
                }
    
                bargainService.edit(param);
            }
            UIview result = UIView("redirect:bargainList", false);
    
            return result;
        }
    
        /**
         * 砍价活动 状态修改
         */
        @RequestMapping("/status")
        public UIview status() throws Exception {
    
            FormMap formMap = getFormMap();
    
            formMap.set("eivt", "state");
    
            bargainService.edit(formMap);
    
            UIview result = UIView("redirect:bargainList", false);
    
            return result;
        }
    
        /**
         * 秒杀活动 删除
         */
        @RequestMapping("/remove")
        public UIview remove() throws Exception {
    
            FormMap map = getFormMap();
    
            bargainService.remove(map);
    
            UIview result = UIView("redirect:bargainList", false);
    
            return result;
        }
    
        /**
         * 砍价活动记录列表
         */
        @RequestMapping("/bargainDetailList")
        public UIview bargainOrderList() throws Exception {
            logger.info("进入 bargainController-bargainOrderList,满减送活动列表");
            //获取请求参数
            FormMap formMap = getFormMap();
            //开启分页
            PageHelper.startPage(formMap.getPage(), formMap.getRows());
            //查询展示数量
            List<E> list = bargainService.selectBargainDetailList(formMap);
            //返回到list页面
            UIview result = UIView("/center/ump/bargain/bargainDetailList", false);
            //绑定分页返回
            result.addObject("pageInfo", new PageInfo<E>(list));
            //绑定上一次参数
            result.addObject("queryParam", formMap);
            return result;
        }
    
        /**
         * 砍价活动 列表
         */
        @RequestMapping("/bargainNancyList")
        public UIview bargainNancyList() throws Exception {
            logger.info("进入 bargainController-bargainOrderList,砍价活动列表");
            //获取请求参数
            FormMap formMap = getFormMap();
            //开启分页
            PageHelper.startPage(formMap.getPage(), formMap.getRows());
            //查询展示数量
            List<E> list = bargainService.selectBargainNancyList(formMap);
            //返回到list页面
            UIview result = UIView("/center/ump/bargain/bargainNancyList", false);
            //绑定分页返回
            result.addObject("pageInfo", new PageInfo<E>(list));
            //绑定上一次参数
            result.addObject("queryParam", formMap);
            return result;
        }
    
    
        /**
         * 查询商品列表
         */
        @ResponseBody
        @RequestMapping("/productList.json")
        public String productList() throws Exception {
            logger.info("进入seckillController-productList,查询商品");
            try {
                FormMap formMap = getFormMap();
                formMap.set("product_name", new String(formMap.getStr("product_name").getBytes("ISO-8859-1")));
                List<E> productList = bargainService.selectProductList(formMap);
                List<E> productJson = new ArrayList<E>();
                for (E e : productList) {
                    E productinfo = new E();
                    productinfo.set("product_name", "" + e.getStr("product_name"));
                    productinfo.set("sale_price", e.getStr("sale_price"));
                    productinfo.set("stock", e.getStr("stock"));
                    if (StringUtils.isEmpty(e.getStr("state"))) {
                        productinfo.set("option", "选取");
                    } else {
                        productinfo.set("option", "已参加");
                    }
                    productJson.add(productinfo);
                }
                return toJsonAPI(productJson);
            } catch (Exception e) {
                e.printStackTrace();
                throw new Exception("出错啦...");
            }
        }
    
        /**
         * 选择多规格商品  规格、价格、库存、操作
         * produce_id
         */
        @ResponseBody
        @RequestMapping("/skuList.json")
        public String skuList() throws Exception {
            logger.info("BargainController-skuList,选择多规格商品");
            FormMap formMap = getFormMap();
            formMap.put("is_deleted", 0);
            formMap.put("is_disabled", 0);
            List<E> list = productService.selectItemList(formMap);
    
            E productInfo = productService.selectById(formMap);
    
            List<E> productJson = new ArrayList<E>();
            for (E e : list) {
                E productinfo = new E();
                formMap.put("specIds", e.getStr("spec_custom").split(";"));
                List<E> specList = productService.getSpecCustomByIds(formMap);
                String specString ="";
                for(E spec :specList){
                    specString+=spec.getStr("key_name")+";";
                }
                specString=specString==""?productInfo.getStr("product_name"):specString;
                productinfo.set("specDesc",specString);
                productinfo.set("sale_price", e.getStr("sale_price"));
                productinfo.set("stock", e.getStr("stock"));
                productinfo.set("option", "选取");
    
                productJson.add(productinfo);
    
            }
            return toJsonAPI(productJson);
        }
    
    
        /**
         * 微页面(活动页) 根据bargain_ids 获取砍价商品活动列表
         */
        @ResponseBody
        @RequestMapping("/getProductByBargainIds")
        public String getProductByBargainIds(@RequestParam String token,String bargain_ids,Integer bargainGetType) throws Exception {
            logger.info("进入 bargainController-getProductByBargainIds,微页面根据bargain_ids 获取砍价商品活动列表");
            FormMap formMap = new FormMap();
            try {
                formMap.put("shop_id", DesUtil.decrypt(token));
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("token 解密失败");
                return "";
            }
            if (!StringUtils.isEmpty(bargain_ids)&& bargainGetType==0) {
                formMap.put("bargain_ids", StringUtils.strip(bargain_ids, "[]").split(","));
            }
    		formMap.put("end_time",new Date());
            List<E> BargainList = bargainService.getProductByBargainIds(formMap);
            return toJsonAPI(BargainList);
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286

    💨实现源码获取👇

    🍂gitee开源地址: weiit/weiit-saas
     
    🍂github开源地址: weiit/weiit-saas
     
    ⭐希望大家可以在gitee和github点个star呀⭐


    作者:KJ.JK

    文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

  • 相关阅读:
    『现学现忘』Git基础 — 15、blob对象详解
    Java每日一练
    魔法猪系统重装大师怎么使用
    一个使用typescript实现的excel转json的工具
    基于Python实现的特征选择的遗传算法(GA)
    家用无线路由器如何用网线桥接解决有些房间无线信号覆盖不好的问题(低成本)
    手把手教大家在自己的Windows电脑上搭建一个视频电话系统(基于开源项目FreeSwitch+Linphone)
    网站被插入虚假恶意链接怎么办?
    mysql多表联查--牛客刷题分享
    [附源码]java毕业设计大学生兼职招聘网站
  • 原文地址:https://blog.csdn.net/m0_47384542/article/details/126257405