基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统
Posted KJ.JK
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统相关的知识,希望对你有一定的参考价值。
文章目录
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: 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基于RBAC的SpringCloud分布式权限管理系统
往期精彩推荐:
基于Spring Boot 2.3.0、 Spring Cloud Hoxton & Alibaba、 OAuth2 的RBAC 权限管理系统。记得右上角点个star 关注更新
https://pig4cloud.com
https://gitee.com/log4j/pig
基于 Spring Cloud Hoxton 、Spring Boot 2.3、 OAuth2 的RBAC权限管理系统
基于数据驱动视图的理念封装 element-ui,即使没有 vue 的使用经验也能快速上手
提供对常见容器化支持 Docker、Kubernetes、Rancher2 支持
提供 lambda 、stream api 、webflux 的生产实践
部署文档 | 前端解决方案 | PigX在线体验 | PigX白皮书 | pig4cloud initializr
快速构架微服务应用
<!-- pig-gen archetype -->
<dependency>
<groupId>com.pig4cloud.archetype</groupId>
<artifactId>pig-gen</artifactId>
<version>last.version</version>
</dependency>
核心依赖
依赖
版本
Spring Boot
2.3.0.RELEASE
Spring Cloud
Hoxton.SR4
Spring Security OAuth2
2.3.6
Mybatis Plus
3.3.1
hutool
5.3.5
Avue
2.5.2
模块说明
pig-ui -- https://gitee.com/log4j/pig-ui
pig
├── pig-auth -- 授权服务提供[3000]
├── pig-codegen -- 图形化代码生成[5002]
└── pig-common -- 系统公共模块
├── pig-common-core -- 公共工具类核心包
├── pig-common-datasource -- 动态数据源包
├── pig-common-log -- 日志服务
├── pig-common-mybatis -- mybatis 扩展封装
├── pig-common-security -- 安全工具类
└── pig-common-swagger -- 接口文档
├── pig-register -- Nacos Server[8848]
├── pig-gateway -- Spring Cloud Gateway网关[9999]
├── pig-monitor -- Spring Boot Admin监控 [5001]
└── pig-upms -- 通用用户权限管理模块
└── pig-upms-api -- 通用用户权限管理系统公共api模块
└── pig-upms-biz -- 通用用户权限管理系统业务处理模块[4000]
加锋哥微信 拉你进微信群扯淡^_^:
以上是关于基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Oauth2 + Security 填坑记
前后端分离项目 — 基于SpringSecurity OAuth2.0用户认证
SpringCloud Alibaba微服务实战十四 - SpringCloud Gateway集成Oauth2.0
pig 2.0 发布,基于 OAuth2.0 的 Spring Cloud 权限管理系统
JavaB2B2C多用户商城springcloud架构-SSO单点登录OAuth2.0登录认证
Oauth2.0 整合springCloud的Zuul 解决关键BUG 报错信息:Principal must not be null