基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统

2年前数据库教程7533
基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统 置顶 KJ.JK 已于2022-09-20 22:13:23修改 3433 收藏 36 分类专栏: Java开源项目实战 文章标签: spring cloud SaaS数字商城 SaaS系统 电商系统 微信小程序 于2022-09-17 18:42:46首次发布 Java开源项目实战 专栏收录该内容 5 篇文章 8 订阅 订阅专栏

文章目录 一、什么是SaaS?二、数字商城系统介绍三、技术栈以及项目特点四、系统设计五、系统部分功能演示🚩店铺管理功能演示图🚩商品管理功能演示图🚩订单功能演示图🚩营销管理功能演示图 六、系统部分源代码 作者:KJ.JK


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈   🍂个人博客首页: KJ.JK   欢迎大家点赞👍收藏💖评论💬关注🔒   💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者


一、什么是SaaS?

SaaS的英文全称是Software as a Service,意思是软件即服务,是云计算的其中一种服务模式 SaaS是一种通过Internet提供集中托管应用程序的方式,企业用户一般通过客户端或网页来使用,无需购买、安装或维护任何软件及硬件,因此SaaS应用程序又被称为"基于Web的软件" 或 "托管软件"


二、数字商城系统介绍

该系统意在通过技术封装,让企业无需代码开发,帮助企业一键生成小程序、公众号,让企业拥有独立品牌的自营商城,数字商城支持自定义装修,面向的是全国用户,订单走快递物流;可以快速帮助线上电商用户搭建自己的小程序商城,产品类似有赞的微商城系统


三、技术栈以及项目特点

⭐新版saas技术栈使用⭐

SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue  

⭐项目特点⭐

项目采用Spring+SpringMVC+Mybatis主流开源框架,遵循MVC架构,设计轻巧,使用简单,开发人员接手与二次开发简单易懂;项目完成了对阿里云、腾讯云、微信生态的快速接入与代码示例,并成功运用到了商业中,方便大家学习对OSS/COS/短信服务/快递服务/公众号/小程序/微信开放平台/微信支付的技术点与应用场景的学习;小程序与公众号第三方授权集成,让开发者与企业省去繁琐的配置,对AppId/AppSecret集成彻底告别;微信支付第三方授权集成,让开发者与企业省去繁琐的配置,让企业服务成本大大降低;小程序代码自动push与升级,公众号基本常规功能(自定义菜单、图文、素材,群发)全部接管,让企业无需登录微信官方入口,统一化管理企业信息与数据;微信消息通知与模板自动同步与管理,让企业场景融合无障碍;自定义装修功能,实现企业电商场景多元化,解决不同行业不同模板,让企业需求得到真正解决;丰富的营销工具,解决企业微营销需求,并集中化管理。拼团活动、积分活动、砍价,优惠券,卡券,礼品卡,邀请有礼等营销活动,方便二次开发;不同企业数据隔离,真正实现SAAS数据隔离模型,让企业数据互不干扰不同企业不同域名自动分配,让企业小程序、公众号前端隔离,避免因为公众号或者小程序推广时导致域名被检测导致的封号问题出现,即不同企业不同域,意在防止saas平台中的企业受到其他企业的影响
四、系统设计

数字商城主要功能模块包括 首页、会员管理、商品管理、订单管理、营销管理、积分管理、店铺管理、基础设置、系统管理


          (1)首页模块: 该模块包含数字商城的首页


          (2)会员管理模块: 该模块包含微页面,全店风格,底部菜单,底部导航


          (3)商品管理模块: 该模块包含品牌管理、商品分类、商品列表、商品分组、运营分类、商品标签、商品库存、商品回收站


          (4)订单管理模块: 该模块包含全部订单、待付款订单、待发货订单、已发货订单、已完成订单、已退款订单、订单评价


          (5)营销管理模块: 该模块包含礼包分类、礼包主题、电子卡券、卡卷实例、卡券中心、邀请有礼、储值有礼、充值订单、拼团管理、拼团订单


          (6)积分管理模块: 该模块包含综合统计、店铺的概况、订单的概况、客户的分析


          (7)店铺管理模块: 该模块包含店铺装修、风格样式、底部导航、首页广告


          (8)基础设置模块: 该模块包含第三方应用设置,微信小程序、微信支付、企业微信、消息模板、协议设置


          (9)系统设置模块: 该模块包含一些常用的系统设置


五、系统部分功能演示
🚩店铺管理功能演示图




🚩商品管理功能演示图


🚩订单功能演示图


🚩营销管理功能演示图



六、系统部分源代码
/** * 营销管理-》优惠券 * @company http://www.wei-it.com 微邦互联 */ @Controller @RequestMapping(value = "/ump/coupons") public class CouponsController extends AdminController { public static Logger logger= Logger.getLogger(CouponsController.class); @Resource private CouponService couponService; @Resource ParameterService parameterService; @Resource WeixinOpenService weixinOpenService; /** * 优惠券》优惠券列表 */ @RequestMapping("/couponsList") public UIview couponsList(){ logger.info("进入CouponsController-couponsList,优惠券列表展示"); UIview view = UIView("/center/ump/coupons/couponsList",false); FormMap formMap=getFormMap(); PageHelper.startPage(formMap.getPage(), formMap.getRows()); List<E> list=couponService.selectList(formMap); view.addObject("pageInfo", new PageInfo<E>(list)); view.addObject("queryParam", formMap); return view; } /** * 优惠券》优惠券创建 */ @RequestMapping("/create") public UIview create(){ UIview view=UIView("/center/ump/coupons/couponsCreate", false); return view; } /** * 优惠券 》编辑 */ @RequestMapping("/edit") public UIview edit(){ logger.info("进入CouponsController-edit,优惠券编辑"); UIview view=UIView("/center/ump/coupons/couponsCreate", false); FormMap formMap=getFormMap(); E coupon=couponService.selectCoupon(formMap); view.addObject("coupon", coupon); return view; } /** * 优惠券 》优惠券新增保存 * @throws Exception */ @RequestMapping("/save") public ModelAndView save(){ logger.info("进入CouponsController-save,优惠券新增保存"); UIview view=UIView("couponsList", true); FormMap formMap=getFormMap(); //判断优惠形式type=1,2,3 if(formMap.getInt("type")==1){//优惠形式表示“指定金额” formMap.set("coupon_discount", null); formMap.set("random_min_price", null); formMap.set("random_max_price", null); }else if(formMap.getInt("type")==2){//优惠形式表示“打折” formMap.set("coupon_price", null); formMap.set("random_min_price", null); formMap.set("random_max_price", null); }else{//优惠形式表示“指定金额(随机)” formMap.set("coupon_discount", null); formMap.set("coupon_price", null); } //判断生效条件is_condition=-1,1 //生效条件表示“无条件” if(formMap.getInt("is_condition")==-1){ formMap.set("condition_price", null); } formMap.put("state",1); //判断使用有效期方式use_type=1 固定范围 ,2 指定时间范围 //使用有效期表示“固定范围” if(formMap.getInt("use_type")==1){ formMap.set("from_day", null); formMap.set("to_day", null); //如果开始时间小于当前时间 则优惠券处于未生效状态 ,其他情况都是生效状态 if (System.currentTimeMillis()< DateUtil.getTimeByString(formMap.getStr("start_time"),"yyyy/MM/dd HH:mm:ss")){ formMap.put("state",-2); } }else{ formMap.set("start_time", null); formMap.set("end_time", null); } //判断没人领取限制 //使用有效期表示“不限制领取熟量” if(formMap.getInt("maxLimitType")==1){ formMap.set("max_limit", 0); } //判断可使用商品 //使用有效期表示“全网商品通用” if(formMap.getInt("product_range_type")==1){ formMap.set("product_ids", null); }else{ formMap.set("product_ids", formMap.getStr("selectProductValues")); } //判断是新增还是修改 //新增优惠券判断 if(StringUtils.isEmpty(formMap.getStr("validate_id"))){ couponService.insert(formMap); }else{//修改优惠券 couponService.edit(formMap); } return view; } /** * 优惠券》优惠券列表》生效&不生效 */ @RequestMapping("/state") public UIview state(){ logger.info("进入CouponsController-state,优惠券生效&不生效操作"); UIview view=UIView("couponsList", true); FormMap formMap=getFormMap(); formMap.set("onlyUpdateState", "state"); couponService.edit(formMap); return view; } /** * 优惠券》优惠券列表》删除 */ @RequestMapping("/remove") public UIview remove(){ logger.info("进入CouponsController-remove,优惠券删除"); UIview view=UIView("couponsList", true); FormMap formMap=getFormMap(); formMap.set("state", "0"); List<E> list=couponService.selectCouponUserList(formMap); if(list.size() > 0){//该优惠券还有未使用的用户 view.addErrorMessage("删除失败,该优惠券还有未使用的用户!"); }else{ couponService.remove(formMap); view.addPNotifyMessage("优惠券删除成功!"); } return view; } /** * 优惠券 派发用户列表 */ @RequestMapping("/couponsGive") public UIview couponsGive(){ logger.info("进入CouponsController-couponsGive,优惠券推广与派发"); UIview view = UIView("/center/ump/coupons/couponsGive",false); FormMap formMap=getFormMap(); PageHelper.startPage(formMap.getPage(), formMap.getRows()); //查询没有领取该优惠券的用户列表与领取了但是没有超过优惠券最大设置限购数的用户列表 List<E> list=couponService.selectNoCouponUserList(formMap); view.addObject("pageInfo", new PageInfo<E>(list)); view.addObject("queryParam", formMap); E publicInfo=(E)this.getSession().getAttribute("publicInfo"); if (publicInfo!=null){ //获取公众号优惠券地址 和 链接 formMap.put("item_name","COUPONSMPQRCODE"); E paramInfo = parameterService.selectShopParamByName(formMap); this.getSession().setAttribute("couponMpQrCodeUrl",String.format(Constants.COUPON_QR_CODE,publicInfo.getStr("authorizer_app_id"))); if (paramInfo!=null){ this.getSession().setAttribute("couponMpQrcode",paramInfo.getStr("item_value")); }else { WeiitQrCodeUtil qrCodeUtil = new WeiitQrCodeUtil(); String qrCodePath = qrCodeUtil.createQRCodeAndUploadQcloud(String.format(Constants.COUPON_QR_CODE,publicInfo.getStr("authorizer_app_id"))); //入库 FormMap insertParam = new FormMap(); insertParam.put("item_code","COUPONQRCODE"); insertParam.put("item_name","COUPONSMPQRCODE"); insertParam.put("item_value",WeiitUtil.getFileDomain()+qrCodePath); insertParam.put("item_desc","公众号优惠券领取二维码"); insertParam.put("state",0); insertParam.put("shop_id",formMap.get("shop_id")); parameterService.insert(insertParam); this.getSession().setAttribute("couponMpQrcode",WeiitUtil.getFileDomain()+qrCodePath); } } E miniPublicInfo = (E) this.getSession().getAttribute("miniPublicInfo"); if (miniPublicInfo!=null){ //获取公众号优惠券地址 和 链接 formMap.put("item_name","COUPONSMAQRCODE"); E paramInfo = parameterService.selectShopParamByName(formMap); if (paramInfo!=null){ this.getSession().setAttribute("couponMaQrcode",paramInfo.getStr("item_value")); }else { try { formMap.put("appid",miniPublicInfo.getStr("authorizer_app_id")); File file = weixinOpenService.getInstance(formMap).getWxOpenComponentService().getWxMaServiceByAppid(miniPublicInfo.getStr("authorizer_app_id")).getQrcodeService().createWxaCode("pages/Receive_coupons/Receive_coupons",225); String qrCodePath = WeiitUtil.uploadFile(FileUtils.readFileToByteArray(file),"png"); FormMap insertParam = new FormMap(); insertParam.put("item_code","COUPONQRCODE"); insertParam.put("item_name","COUPONSMAQRCODE"); insertParam.put("item_value",WeiitUtil.getFileDomain()+qrCodePath); insertParam.put("item_desc","小程序优惠券领取二维码"); insertParam.put("state",0); insertParam.put("shop_id",formMap.get("shop_id")); parameterService.insert(insertParam); this.getSession().setAttribute("couponMaQrcode",WeiitUtil.getFileDomain()+qrCodePath); } catch (Exception e) { e.printStackTrace(); } } } return view; } /** * 派发优惠券 保存 * @return * @throws Exception */ @RequestMapping("/couponsGiveSave") public UIview couponsGiveSave(){ logger.info("进入CouponsController-couponsGiveSave,优惠券推广提交"); FormMap formMap=getFormMap(); String message=couponService.insertCouponUserTrans(formMap); UIview view = UIView("couponsGive?validate_id="+formMap.getStr("validate_id")+"&validate_id_token="+formMap.getStr("validate_id_token"),true); if(message==null){ view.addPNotifyMessage("会员优惠券派送成功!"); }else{ view.addErrorMessage(message); } return view; } /** * 派发优惠券记录 * @return * @throws Exception */ @RequestMapping("/couponsUserList") public UIview couponsUserList(){ logger.info("进入CouponsController-couponsUserList,发优惠券记录"); UIview view = UIView("/center/ump/coupons/couponsUserList",false); FormMap formMap=getFormMap(); E coupon = couponService.selectOne(formMap); PageHelper.startPage(formMap.getPage(), formMap.getRows()); //查询该优惠券已经派发过的用户 List<E> list=couponService.selectCouponUserList(formMap); view.addObject("pageInfo", new PageInfo<E>(list)); view.addObject("queryParam", formMap); view.addObject("coupon", coupon); return view; } /** * 派发优惠券》回收 * @return * @throws Exception */ @RequestMapping("/couponsUserRemove") public UIview couponsUserRemove(){ logger.info("进入CouponsController-couponsUserRemove,派发优惠券 回收"); FormMap formMap=getFormMap(); String message=couponService.removeCouponUserTrans(formMap); UIview view = UIView("couponsUserList?validate_id="+formMap.getStr("validate_id")+"&validate_id_token="+formMap.getStr("validate_id_token"),true); if(message==null){ view.addPNotifyMessage("优惠券回收成功!"); }else{ view.addErrorMessage(message); } return view; } /** * 装修页面 获取优惠券列表 * * * */ @RequestMapping(value = "/getCouponList",method = RequestMethod.GET) @ResponseBody public E getCouponList(@RequestParam String token,String coupon_name) { logger.info("进入CouponsController-getCouponList,获取优惠券列表"); FormMap formMap=new FormMap(); E result = new E(); try { formMap.put("shop_id", DesUtil.decrypt(token)); } catch (Exception e) { e.printStackTrace(); logger.error("token 解密失败"); result.put("couponList",null); return result; } formMap.put("coupon_name",coupon_name); List<E> list = couponService.selectList(formMap); result.put("couponList",list); //绑定上一次参数 return result; } /** * 微页面 优惠券展示 不展示是否领取 过滤失效优惠券 * @author lhq * @date 2018年5月10日 * */ @RequestMapping(value = "/couponListByIds",method = RequestMethod.GET) @ResponseBody public String couponListByIds(@RequestParam String token,String coupon_ids,Integer couponType){ logger.info("ActivityController-couponListByIds,微页面 优惠券展示"); FormMap formMap = new FormMap(); try { formMap.put("shop_id", DesUtil.decrypt(token)); } catch (Exception e) { e.printStackTrace(); logger.error("token 解密失败"); return ""; } formMap.put("couponType",couponType); if (!StringUtils.isEmpty(coupon_ids) && couponType==0){ formMap.put("coupon_ids", StringUtils.strip(coupon_ids, "[]").split(",")); } formMap.put("end_time",new Date()); List<E> list = couponService.couponListByIds(formMap); return toJsonAPI(list); } }

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈   🍂个人博客首页: KJ.JK   欢迎大家点赞👍收藏💖评论💬关注🔒   💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者


作者:KJ.JK

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

相关文章

❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】

❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】...

【Rust指南】常用集合Vector基本操作 | 结合enum多类型存储

【Rust指南】常用集合Vector基本操作 | 结合enum多类型存储...

k8s查看pod日志的几种方法

k8s查看pod日志的几种方法...

整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶

整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶...

【Docker 那些事儿】如何安全地进入到容器内部

【Docker 那些事儿】如何安全地进入到容器内部...

C生万物 | 第一篇 —— 初识C语言【适合入门,建议收藏】

C生万物 | 第一篇 —— 初识C语言【适合入门,建议收藏】...