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

这篇具有很好参考价值的文章主要介绍了基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、什么是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)系统设置模块: 该模块包含一些常用的系统设置


五、系统部分功能演示


🚩店铺管理功能演示图


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


🚩商品管理功能演示图


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


🚩订单功能演示图


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


🚩营销管理功能演示图


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


spring cloud saas,Java开源项目实战,spring cloud,SaaS数字商城,SaaS系统,电商系统,微信小程序


六、系统部分源代码


/**
 * 营销管理-》优惠券
 * @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

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习文章来源地址https://www.toymoban.com/news/detail-808352.html

到了这里,关于基于SpringCloud + Oauth2.0 + ShiroRedis + JWT + Gateway + Nacos + Nginx + Vue实现的SaaS数字商城系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringSecurity+Oauth2+JWT

    快速入门 1. 创建基础项目 file == new == project == Spring Initializr ==next == web(Spring Web)、Security(Spring Security) ==一直下一步 2. 编写代码进行测试 创建controller static下创建login.html、main.html 3. 启动项目进行测试 访问http://localhost:8080/login.html 会进入SpringSecurity框架自带的登入页面 用户默认

    2024年02月12日
    浏览(11)
  • Spring Security Oauth2.1 最新版 1.1.0 整合 (基于 springboot 3.1.0)gateway 完成授权认证

    Spring Security Oauth2.1 最新版 1.1.0 整合 (基于 springboot 3.1.0)gateway 完成授权认证

    目录 背景 demo地址 版本 Spring Boot 3.1 Spring Authorization Server 1.1.0 基础 spring security OAuth2 模块构成 授权方式 认证方式 集成过程 官方demo 代码集成 依赖 授权服务AuthorizationServerConfig配置 重要组件 测试 查看授权服务配置 访问授权服务 授权 回调 获取 access_token 获取用户信息 个性

    2024年02月11日
    浏览(11)
  • SpringSecurity+ Oauth2.0+JWT 0-1

    SpringSecurity+ Oauth2.0+JWT 0-1

    AuthorizationServer 需要继承AuthorizationServerConfigurerAdapter AuthorizationServerConfigurerAdapter源码 AuthorizationServerSecurityConfigurer:配置令牌端点(Token Endpoint)的安全约束 ClientDetailsServiceConfigurer:配置OAuth2客户端 AuthorizationServerEndpointsConfigurer:配置授权(authorization)以及令牌(token)的访

    2024年02月07日
    浏览(10)
  • 权限管理 springboot集成springSecurity Oauth2 JWT

    权限管理 springboot集成springSecurity Oauth2 JWT

    目录 一、SpringSeurity的基础操作 1、引入主要依赖 2、加密器 3、实现自定义登录逻辑 4、访问限制 5、自定义异常处理  6、通过注解的方式配置访问控制 二、Auth2认证方案 1、什么是Auth2认证 2、Oauth2最常用的授权模式  3、依赖引入 4、添加配置类 5、测试 6、存在到Redis里,后续

    2023年04月14日
    浏览(15)
  • spring-security -oauth2 整合 JWT

    spring-security -oauth2 整合 JWT

    在这个基础上,进行整合。 spring security oauth2学习 -- 快速入门_本郡主是喵的博客-CSDN博客 先把  reids,common-pools  等依赖删掉。 删掉redis的下相关配置 1.1 导入依赖 1.2 核心代码 创建 jwtTokenConfig.java 在 AuthenticationServer.java 里面新增这些。  运行,启动!  复制这个token去官网解析

    2024年02月09日
    浏览(13)
  • Go语言的API安全: OAuth2与JWT

    在当今的互联网时代,API(应用程序接口)已经成为了应用程序之间的通信和数据共享的重要工具。然而,API安全也是一个重要的问题,因为不安全的API可能导致数据泄露、伪造和其他安全风险。为了解决这个问题,我们需要一种安全的方法来保护API,这就是OAuth2和JWT(JSON Web

    2024年03月12日
    浏览(9)
  • 微服务统一认证方案Spring Cloud OAuth2+JWT

    微服务统一认证方案Spring Cloud OAuth2+JWT

    目录 前言 一、微服务架构下的统一认证场景 二、微服务架构下的统一认证思路 1.基于Session的认证方式 2.基于token的认证方式(主流) 三、OAuth2开放授权协议/标准 1.OAuth2介绍 2.OAuth2协议角色和流程 3.什么情况下需要使用OAuth2? 4.OAuth2的颁发Token授权方式 四、Spring Cloud OAuth2+JWT实现

    2023年04月09日
    浏览(11)
  • JWT VS OAuth2, 如何设计一个安全的API接口?

    JWT VS OAuth2, 如何设计一个安全的API接口?

    Client Profile客户端描述 OAuth2框架也指定了集中客户端描述,用来表示应用程序的类型: Web应用 用户代理 原声应用 Authorization Grants认证授权 认证授权代表资源拥有者授权给客户端应用程序的一组权限,可以是下边几种形式: 授权码 隐式授权 资源拥有者密码证书 客户端证书

    2024年04月11日
    浏览(9)
  • 【OAuth2系列】Spring Cloud Gateway 作为OAuth2 Client接入第三方单点登录代码实践

    【OAuth2系列】Spring Cloud Gateway 作为OAuth2 Client接入第三方单点登录代码实践

            在年初的时候我参与了一个项目,当时是很多家公司协同完成这个项目,其中一个公司专门负责登录这块的内容,需要我们的后端接入他们的单点登录(OAuth2 授权码模式),这块接入工作是由我来负责,我们的项目是微服务架构,经过网上各种查阅资料发现网关作为

    2024年02月04日
    浏览(14)
  • SpringSecurity(二十四)--OAuth2:使用JWT和加密签名(下)非对称密钥加密

    SpringSecurity(二十四)--OAuth2:使用JWT和加密签名(下)非对称密钥加密

    由于上文对称密钥涉及到的内容比较多,所以这一节的非对称密钥加密拆开成这一节单独讲解。 所以大家尽量先阅读完上一章的内容后再浏览这一章内容会更好。 本节将实现OAuth2身份验证的一个示例,其中授权服务器和资源服务器会使用一个非对称密钥对来对令牌签名和验

    2024年02月16日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包