소스 검색

认证通会员part1

Aslee 3 년 전
부모
커밋
5a2e2e1c6b
94개의 변경된 파일4030개의 추가작업 그리고 175개의 파일을 삭제
  1. 11 0
      pom.xml
  2. 2 4
      src/main/java/com/caimei/controller/auth/AddressApi.java
  3. 2 2
      src/main/java/com/caimei/controller/auth/ArticleApi.java
  4. 2 4
      src/main/java/com/caimei/controller/auth/AuthApi.java
  5. 2 10
      src/main/java/com/caimei/controller/auth/AuthClubApi.java
  6. 2 3
      src/main/java/com/caimei/controller/auth/AuthProductApi.java
  7. 1 1
      src/main/java/com/caimei/controller/auth/DefaultApi.java
  8. 2 4
      src/main/java/com/caimei/controller/auth/DoctorApi.java
  9. 2 14
      src/main/java/com/caimei/controller/auth/DownloadApi.java
  10. 39 7
      src/main/java/com/caimei/controller/auth/ShopApi.java
  11. 2 13
      src/main/java/com/caimei/controller/auth/UploadApi.java
  12. 7 2
      src/main/java/com/caimei/controller/auth/UserApi.java
  13. 2 2
      src/main/java/com/caimei/controller/data/FileApi.java
  14. 2 2
      src/main/java/com/caimei/controller/data/ImageApi.java
  15. 2 2
      src/main/java/com/caimei/controller/data/VideoApi.java
  16. 138 0
      src/main/java/com/caimei/controller/pay/PayApi.java
  17. 101 0
      src/main/java/com/caimei/controller/sys/SysMenuApi.java
  18. 91 0
      src/main/java/com/caimei/controller/sys/SysRoleApi.java
  19. 122 0
      src/main/java/com/caimei/controller/sys/SysUserApi.java
  20. 173 0
      src/main/java/com/caimei/controller/vip/VipApi.java
  21. 2 2
      src/main/java/com/caimei/controller/wechat/LoginApi.java
  22. 2 2
      src/main/java/com/caimei/controller/wechat/SDKApi.java
  23. 4 4
      src/main/java/com/caimei/controller/wechat/WxAuthApi.java
  24. 5 2
      src/main/java/com/caimei/controller/wechat/WxDataApi.java
  25. 7 1
      src/main/java/com/caimei/mapper/ShopMapper.java
  26. 207 0
      src/main/java/com/caimei/mapper/SystemMapper.java
  27. 9 0
      src/main/java/com/caimei/mapper/UserMapper.java
  28. 60 0
      src/main/java/com/caimei/mapper/VipMapper.java
  29. 33 0
      src/main/java/com/caimei/model/dto/PackageDto.java
  30. 50 0
      src/main/java/com/caimei/model/dto/PayVipDto.java
  31. 41 0
      src/main/java/com/caimei/model/po/AuthVipPo.java
  32. 100 0
      src/main/java/com/caimei/model/po/SysMenu.java
  33. 37 0
      src/main/java/com/caimei/model/po/SysMenuTree.java
  34. 31 0
      src/main/java/com/caimei/model/po/SysPermission.java
  35. 52 0
      src/main/java/com/caimei/model/po/SysRole.java
  36. 72 0
      src/main/java/com/caimei/model/po/SysUser.java
  37. 47 0
      src/main/java/com/caimei/model/po/UserProfile.java
  38. 41 0
      src/main/java/com/caimei/model/po/UserVipPo.java
  39. 75 0
      src/main/java/com/caimei/model/po/VipHistoryPo.java
  40. 8 0
      src/main/java/com/caimei/model/vo/ShopFormVo.java
  41. 6 0
      src/main/java/com/caimei/model/vo/ShopListVo.java
  42. 5 0
      src/main/java/com/caimei/model/vo/UserLoginVo.java
  43. 28 0
      src/main/java/com/caimei/model/vo/VipConfigurationVo.java
  44. 50 0
      src/main/java/com/caimei/model/vo/VipHistoryListVo.java
  45. 57 0
      src/main/java/com/caimei/model/vo/VipInfoVo.java
  46. 49 0
      src/main/java/com/caimei/model/vo/VipListVo.java
  47. 32 0
      src/main/java/com/caimei/model/vo/VipPackageVo.java
  48. 23 0
      src/main/java/com/caimei/model/vo/VipServiceVo.java
  49. 1 1
      src/main/java/com/caimei/service/auth/AddressService.java
  50. 1 1
      src/main/java/com/caimei/service/auth/ArticleService.java
  51. 1 1
      src/main/java/com/caimei/service/auth/AuthClubService.java
  52. 1 1
      src/main/java/com/caimei/service/auth/AuthProductService.java
  53. 1 1
      src/main/java/com/caimei/service/auth/AuthService.java
  54. 1 1
      src/main/java/com/caimei/service/auth/DoctorService.java
  55. 1 1
      src/main/java/com/caimei/service/auth/DownloadService.java
  56. 20 2
      src/main/java/com/caimei/service/auth/ShopService.java
  57. 1 1
      src/main/java/com/caimei/service/auth/UploadService.java
  58. 5 1
      src/main/java/com/caimei/service/auth/UserService.java
  59. 2 4
      src/main/java/com/caimei/service/auth/impl/AddressServiceImpl.java
  60. 2 2
      src/main/java/com/caimei/service/auth/impl/ArticleServiceImpl.java
  61. 2 4
      src/main/java/com/caimei/service/auth/impl/AuthClubServiceImpl.java
  62. 3 4
      src/main/java/com/caimei/service/auth/impl/AuthProductServiceImpl.java
  63. 4 4
      src/main/java/com/caimei/service/auth/impl/AuthServiceImpl.java
  64. 2 2
      src/main/java/com/caimei/service/auth/impl/DoctorServiceImpl.java
  65. 3 3
      src/main/java/com/caimei/service/auth/impl/DownloadServiceImpl.java
  66. 101 4
      src/main/java/com/caimei/service/auth/impl/ShopServiceImpl.java
  67. 2 2
      src/main/java/com/caimei/service/auth/impl/UploadServiceImpl.java
  68. 22 16
      src/main/java/com/caimei/service/auth/impl/UserServiceImpl.java
  69. 1 1
      src/main/java/com/caimei/service/data/FileService.java
  70. 1 1
      src/main/java/com/caimei/service/data/ImageService.java
  71. 1 1
      src/main/java/com/caimei/service/data/VideoService.java
  72. 2 2
      src/main/java/com/caimei/service/data/impl/FileServiceImpl.java
  73. 3 10
      src/main/java/com/caimei/service/data/impl/ImageServiceImpl.java
  74. 2 2
      src/main/java/com/caimei/service/data/impl/VideoServiceImpl.java
  75. 55 0
      src/main/java/com/caimei/service/sys/SysMenuService.java
  76. 41 0
      src/main/java/com/caimei/service/sys/SysRoleService.java
  77. 74 0
      src/main/java/com/caimei/service/sys/SysUserService.java
  78. 356 0
      src/main/java/com/caimei/service/sys/impl/SysMenuServiceImpl.java
  79. 165 0
      src/main/java/com/caimei/service/sys/impl/SysRoleServiceImpl.java
  80. 310 0
      src/main/java/com/caimei/service/sys/impl/SysUserServiceImpl.java
  81. 88 0
      src/main/java/com/caimei/service/vip/VipService.java
  82. 264 0
      src/main/java/com/caimei/service/vip/impl/VipServiceImpl.java
  83. 1 1
      src/main/java/com/caimei/service/wechat/LoginService.java
  84. 1 1
      src/main/java/com/caimei/service/wechat/SDKService.java
  85. 2 2
      src/main/java/com/caimei/service/wechat/impl/LoginServiceImpl.java
  86. 2 2
      src/main/java/com/caimei/service/wechat/impl/SDKServiceImpl.java
  87. 37 0
      src/main/java/com/caimei/utils/CommonUtil.java
  88. 116 0
      src/main/java/com/caimei/utils/RequestUtil.java
  89. 1 1
      src/main/resources/config/dev/application-dev.yml
  90. 24 3
      src/main/resources/mapper/ShopMapper.xml
  91. 278 0
      src/main/resources/mapper/SystemMapper.xml
  92. 17 1
      src/main/resources/mapper/UserMapper.xml
  93. 174 0
      src/main/resources/mapper/VipMapper.xml
  94. 0 10
      src/test/java/com/caimei/AdminApplicationTests.java

+ 11 - 0
pom.xml

@@ -41,6 +41,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
@@ -303,6 +307,13 @@
             <version>3.3.0</version>
         </dependency>
 
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
     </dependencies>
 
     <profiles>

+ 2 - 4
src/main/java/com/caimei/controller/AddressApi.java → src/main/java/com/caimei/controller/auth/AddressApi.java

@@ -1,16 +1,14 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.AddressSelectVo;
-import com.caimei.service.AddressService;
-import com.github.pagehelper.PageInfo;
+import com.caimei.service.auth.AddressService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;

+ 2 - 2
src/main/java/com/caimei/controller/ArticleApi.java → src/main/java/com/caimei/controller/auth/ArticleApi.java

@@ -1,10 +1,10 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.ArticleFormVo;
 import com.caimei.model.vo.ArticleListVo;
-import com.caimei.service.ArticleService;
+import com.caimei.service.auth.ArticleService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 2 - 4
src/main/java/com/caimei/controller/AuthApi.java → src/main/java/com/caimei/controller/auth/AuthApi.java

@@ -1,13 +1,11 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.CmBrandAuthPo;
 import com.caimei.model.vo.AuthFormVo;
 import com.caimei.model.vo.AuthVo;
-import com.caimei.model.vo.BrandVo;
-import com.caimei.model.vo.ShopFormVo;
-import com.caimei.service.AuthService;
+import com.caimei.service.auth.AuthService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 2 - 10
src/main/java/com/caimei/controller/AuthClubApi.java → src/main/java/com/caimei/controller/auth/AuthClubApi.java

@@ -1,12 +1,10 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
-import com.caimei.model.vo.AuthVo;
 import com.caimei.model.vo.ClubUserVo;
 import com.caimei.model.vo.ClubVo;
-import com.caimei.service.AuthClubService;
-import com.caimei.service.AuthService;
+import com.caimei.service.auth.AuthClubService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -14,13 +12,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * 供应商API

+ 2 - 3
src/main/java/com/caimei/controller/AuthProductApi.java → src/main/java/com/caimei/controller/auth/AuthProductApi.java

@@ -1,13 +1,12 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.dto.ProductSaveDto;
 import com.caimei.model.vo.ProductFormVo;
 import com.caimei.model.vo.ProductListVo;
-import com.caimei.service.AuthProductService;
+import com.caimei.service.auth.AuthProductService;
 import com.github.pagehelper.PageInfo;
-import com.google.gson.JsonObject;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;

+ 1 - 1
src/main/java/com/caimei/controller/DefaultApi.java → src/main/java/com/caimei/controller/auth/DefaultApi.java

@@ -1,4 +1,4 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.caimei.module.base.entity.bo.JsonModel;
 import io.swagger.annotations.Api;

+ 2 - 4
src/main/java/com/caimei/controller/DoctorApi.java → src/main/java/com/caimei/controller/auth/DoctorApi.java

@@ -1,11 +1,11 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.CmBrandDoctorPo;
 import com.caimei.model.vo.DoctorFormVo;
 import com.caimei.model.vo.DoctorListVo;
-import com.caimei.service.DoctorService;
+import com.caimei.service.auth.DoctorService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -14,9 +14,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 

+ 2 - 14
src/main/java/com/caimei/controller/DownloadApi.java → src/main/java/com/caimei/controller/auth/DownloadApi.java

@@ -1,34 +1,22 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
-import com.caimei.model.ResponseJson;
-import com.caimei.service.DownloadService;
-import com.caimei.service.UploadService;
-import com.caimei.utils.OSSUtils;
+import com.caimei.service.auth.DownloadService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
 import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
 
 /**
  * @author Aslee

+ 39 - 7
src/main/java/com/caimei/controller/ShopApi.java → src/main/java/com/caimei/controller/auth/ShopApi.java

@@ -1,12 +1,10 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.dto.ShopInfoDto;
-import com.caimei.model.dto.ShopSaveDto;
-import com.caimei.model.po.ShopInfoPo;
 import com.caimei.model.vo.*;
-import com.caimei.service.ShopService;
+import com.caimei.service.auth.ShopService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -42,8 +40,9 @@ public class ShopApi {
      */
     @ApiOperation("供应商列表")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "listType", required = false, value = "列表类型:1供应商列表,2授权信息审核列表,3资料审核列表"),
+            @ApiImplicitParam(name = "listType", required = false, value = "列表类型:1供应商列表,2授权信息审核列表,3资料审核列表,4医师审核列表,5添加会员列表"),
             @ApiImplicitParam(name = "shopName", required = false, value = "供应商名称"),
+            @ApiImplicitParam(name = "loginAccount", required = false, value = "登录账号"),
             @ApiImplicitParam(name = "shopType", required = false, value = "供应商类型:1品牌方,2代理商"),
             @ApiImplicitParam(name = "brandId", required = false, value = "所属品牌id"),
             @ApiImplicitParam(name = "mobile", required = false, value = "手机号"),
@@ -53,10 +52,10 @@ public class ShopApi {
             @ApiImplicitParam(name = "pageSize", required = false, value = "一页多少条")
     })
     @GetMapping("/list")
-    public ResponseJson<PageInfo<ShopListVo>> getShopList(Integer listType, String shopName, Integer shopType, Integer brandId, String mobile, String linkMan, Integer lowerAuditStatus,
+    public ResponseJson<PageInfo<ShopListVo>> getShopList(Integer listType, String shopName,String loginAccount, Integer shopType, Integer brandId, String mobile, String linkMan, Integer lowerAuditStatus,
                                                           @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                                           @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-        return shopService.getShopList(listType, shopName, shopType, brandId, mobile, linkMan, lowerAuditStatus, pageNum, pageSize);
+        return shopService.getShopList(listType, shopName, loginAccount, shopType, brandId, mobile, linkMan, lowerAuditStatus, pageNum, pageSize);
     }
 
     /**
@@ -262,4 +261,37 @@ public class ShopApi {
         String handleResult = paramsMap.getString("handleResult");
         return shopService.handleFeedback(feedbackId, handleResult);
     }
+
+    @ApiOperation("修改手机号/登录账号:验证码发送")
+    @ApiImplicitParam(name = "params", value = "mobile:手机号", required = true)
+    @PostMapping("/verify/code/send")
+    public ResponseJson sendVerifyCode(@RequestBody String params) {
+        JSONObject parseObject = JSONObject.parseObject(params);
+        String mobile = parseObject.getString("mobile");
+        return shopService.sendVerifyCode(mobile);
+    }
+
+    @ApiOperation("修改手机号")
+    @ApiImplicitParam(name = "params", value = "authUserId:供应商用户id;oldMobile:旧手机号;verifyCode:验证码;newMobile:新手机号;", required = true)
+    @PostMapping("/mobile/change")
+    public ResponseJson changeMobile(@RequestBody String params) {
+        JSONObject parseObject = JSONObject.parseObject(params);
+        Integer authUserId = parseObject.getInteger("authUserId");
+        String verifyCode = parseObject.getString("verifyCode");
+        String oldMobile = parseObject.getString("oldMobile");
+        String newMobile = parseObject.getString("newMobile");
+        return shopService.changeMobile(authUserId, oldMobile, verifyCode, newMobile);
+    }
+
+    @ApiOperation("登录账号绑定")
+    @ApiImplicitParam(name = "params", value = "authUserId:供应商用户id;mobile:手机号;verifyCode:验证码;loginAccount:登录账号;", required = true)
+    @PostMapping("/account/bind")
+    public ResponseJson bindLoginAccount(@RequestBody String params) {
+        JSONObject parseObject = JSONObject.parseObject(params);
+        Integer authUserId = parseObject.getInteger("authUserId");
+        String verifyCode = parseObject.getString("verifyCode");
+        String mobile = parseObject.getString("mobile");
+        String loginAccount = parseObject.getString("loginAccount");
+        return shopService.bindLoginAccount(authUserId, mobile, verifyCode, loginAccount);
+    }
 }

+ 2 - 13
src/main/java/com/caimei/controller/UploadApi.java → src/main/java/com/caimei/controller/auth/UploadApi.java

@@ -1,31 +1,20 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
-import com.caimei.config.FastDfsClient;
-import com.caimei.mapper.FileMapper;
-import com.caimei.model.po.FilePo;
-import com.caimei.service.UploadService;
-import com.caimei.utils.CodeUtil;
+import com.caimei.service.auth.UploadService;
 import com.caimei.utils.OSSUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;

+ 7 - 2
src/main/java/com/caimei/controller/UserApi.java → src/main/java/com/caimei/controller/auth/UserApi.java

@@ -1,15 +1,20 @@
-package com.caimei.controller;
+package com.caimei.controller.auth;
 
 import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.PackageDto;
 import com.caimei.model.dto.PasswordDto;
 import com.caimei.model.vo.UserLoginVo;
-import com.caimei.service.UserService;
+import com.caimei.model.vo.VipConfigurationVo;
+import com.caimei.service.auth.UserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 import java.util.Map;
 
 

+ 2 - 2
src/main/java/com/caimei/controller/FileApi.java → src/main/java/com/caimei/controller/data/FileApi.java

@@ -1,10 +1,10 @@
-package com.caimei.controller;
+package com.caimei.controller.data;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.CourseFileListVo;
 import com.caimei.model.vo.FileListVo;
-import com.caimei.service.FileService;
+import com.caimei.service.data.FileService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 2 - 2
src/main/java/com/caimei/controller/ImageApi.java → src/main/java/com/caimei/controller/data/ImageApi.java

@@ -1,11 +1,11 @@
-package com.caimei.controller;
+package com.caimei.controller.data;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.ImageFormVo;
 import com.caimei.model.vo.ImageListVo;
-import com.caimei.service.ImageService;
+import com.caimei.service.data.ImageService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 2 - 2
src/main/java/com/caimei/controller/VideoApi.java → src/main/java/com/caimei/controller/data/VideoApi.java

@@ -1,9 +1,9 @@
-package com.caimei.controller;
+package com.caimei.controller.data;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.VideoListVo;
-import com.caimei.service.VideoService;
+import com.caimei.service.data.VideoService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 138 - 0
src/main/java/com/caimei/controller/pay/PayApi.java

@@ -0,0 +1,138 @@
+package com.caimei.controller.pay;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.PayVipDto;
+import com.caimei.utils.RequestUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 二手发布支付,升级超级会员支付
+ *
+ * @author : Charles
+ * @date : 2021/9/27
+ */
+@Api(tags="支付API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/pay")
+public class PayApi {
+
+
+    @Value("${caimei.core}")
+    private String core;
+
+    /**
+     * 获取线上支付全局开关状态
+     */
+    @ApiOperation("获取线上支付全局开关状态")
+    @GetMapping("/online/switch")
+    public ResponseJson<String> getPayOnLineSwitch() throws Exception {
+        String url = core + "/order/pay/online/switch";
+        String result = RequestUtil.sendGet(url);
+        return getResponseJson(result);
+    }
+
+    @ApiOperation("银行通道码获取")
+    @GetMapping("/bankcode")
+    public ResponseJson<String> bankcode() throws Exception {
+        String url = core + "/order/pay/bankcode";
+        String result = RequestUtil.sendGet(url);
+        return getResponseJson(result);
+    }
+
+    /**
+     * 开通认证通会员-微信线上支付
+     * @param param {
+     *                  vipRecordId   会员购买记录Id
+     *                  returnUrl     页面回调地址
+     *                  code          微信小程序code
+     *                  state         微信公众号state参数
+     * }
+     */
+    @ApiOperation("开通认证通会员-微信线上支付")
+    @PostMapping("/auth/vip/wechat")
+    public ResponseJson<String> payAuthVipByWeChat(@RequestBody Map<String,Object> param) throws Exception {
+        String url = core + "/order/pay/auth/vip/wechat";
+        String result = RequestUtil.sendPost(url, param);
+        return getResponseJson(result);
+    }
+
+    /**
+     * 开通认证通会员-支付宝线上支付
+     * @param param {
+     *                  vipRecordId   会员购买记录Id
+     *                  returnUrl     页面回调地址
+     * }
+     */
+    @ApiOperation("开通认证通会员-支付宝线上支付")
+    @PostMapping("/auth/vip/alipay")
+    public ResponseJson<String> payAuthVipByAlipay(@RequestBody Map<String,Object> param) throws Exception {
+        String url = core + "/order/pay/auth/vip/alipay";
+        String result = RequestUtil.sendPost(url, param);
+        return getResponseJson(result);
+    }
+
+    /**
+     * 开通认证通会员-银联线上支付
+     * @param param {
+     *               vipRecordId   会员购买记录Id
+     *               returnUrl     页面回调地址
+     *               bankCode      银行编码(银联支付使用)
+     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     * }
+     */
+    @ApiOperation("开通认证通会员-银联线上支付")
+    @PostMapping("/auth/vip/union")
+    public ResponseJson<String> payAuthVipByUnionPay(@RequestBody Map<String,Object> param) throws Exception {
+        String url = core + "/order/pay/auth/vip/union";
+        String result = RequestUtil.sendPost(url, param);
+        return getResponseJson(result);
+    }
+
+    /**
+     * 开通认证通会员-支付回调
+     */
+    @ApiOperation("开通认证通会员-支付回调")
+    @ApiImplicitParam(required = false, name = "data", value = "回调数据")
+    @GetMapping("/auth/vip/callback")
+    public String paymentAuthVipCallback(String data) throws Exception {
+        String url = core + "/order/pay/auth/vip/callback?data=" + data;
+        return RequestUtil.sendGet(url);
+    }
+
+    @ApiOperation("购买认证通会员-查询是否购买成功")
+    @ApiImplicitParam(required = false, name = "vipRecordId", value = "会员购买记录id")
+    @GetMapping("/auth/vip/check")
+    public ResponseJson<String> authVipCheck(Integer vipRecordId) throws Exception {
+        String url = core + "/order/pay/auth/vip/check?vipRecordId=" + vipRecordId;
+        String result = RequestUtil.sendGet(url);
+        return getResponseJson(result);
+    }
+
+    @ApiOperation("查询本次支付订单结果")
+    @ApiImplicitParam(required = false, name = "mbOrderId", value = "平台唯一流水号")
+    @GetMapping("/result/json")
+    public ResponseJson<String> getPayOrderResult(String mbOrderId) throws Exception {
+        String url = core + "/order/pay/result/json?mbOrderId=" + mbOrderId;
+        String result = RequestUtil.sendGet(url);
+        return getResponseJson(result);
+    }
+
+    private ResponseJson<String> getResponseJson(String parameters) {
+        JSONObject object = JSONObject.parseObject(parameters);
+        Integer code = object.getInteger("code");
+        String msg = object.getString("msg");
+        String data = object.getString("data");
+        return ResponseJson.success(code, msg, data);
+    }
+
+}

+ 101 - 0
src/main/java/com/caimei/controller/sys/SysMenuApi.java

@@ -0,0 +1,101 @@
+package com.caimei.controller.sys;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.SysMenuTree;
+import com.caimei.service.sys.SysMenuService;
+import com.github.pagehelper.PageInfo;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+@RestController
+@RequestMapping("/sys/menu")
+public class SysMenuApi {
+
+    @Resource
+    private SysMenuService sysMenuService;
+
+    /**
+     * 获取菜单列表
+     *
+     * @param parentId 父级菜单Id
+     * @param status   状态:0启用,1停用
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    @GetMapping("/list")
+    public ResponseJson<PageInfo<SysMenu>> menuList(Integer status, Integer menuType,
+                                                    @RequestParam(value = "parentId", defaultValue = "0") Integer parentId,
+                                                    @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                    @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return sysMenuService.getMenuList(parentId, menuType, status, pageNum, pageSize);
+    }
+
+    /**
+     * 获取所有启用的菜单列表(树状结构返回)
+     */
+    @GetMapping("/tree")
+    public ResponseJson<List<SysMenuTree>> menuTree() {
+        return sysMenuService.getMenuTree();
+    }
+
+    /**
+     * 根据ID获取菜单
+     */
+    @GetMapping("/{id}")
+    public ResponseJson<SysMenu> getMenu(@PathVariable("id") Integer id) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("菜单Id不能为空!", null);
+        }
+        return sysMenuService.getMenu(id);
+    }
+
+    /**
+     * 根据ID更新菜单
+     */
+    @PostMapping("/update/{id}")
+    public ResponseJson<Void> updateMenu(@PathVariable("id") Integer id, @RequestBody SysMenu menu) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("菜单Id不能为空!", null);
+        }
+        return sysMenuService.updateMenu(id, menu);
+    }
+
+    /**
+     * 根据ID(可选择的)更新菜单字段
+     */
+    @PostMapping("/update/selective/{id}")
+    public ResponseJson<Void> updateMenuSelective(@PathVariable("id") Integer id, @RequestBody SysMenu menu) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("菜单Id不能为空!", null);
+        }
+        return sysMenuService.updateMenuSelective(id, menu);
+    }
+
+    /**
+     * 添加菜单
+     */
+    @PostMapping("/create")
+    public ResponseJson<Void> addMenu(@RequestBody SysMenu menu) {
+        return sysMenuService.addMenu(menu);
+    }
+
+    /**
+     * 根据ID删除菜单
+     */
+    @PostMapping("/delete/{id}")
+    public ResponseJson<Void> deleteMenu(@PathVariable("id") Integer id) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("菜单Id不能为空!", null);
+        }
+        return sysMenuService.deleteMenu(id);
+    }
+}

+ 91 - 0
src/main/java/com/caimei/controller/sys/SysRoleApi.java

@@ -0,0 +1,91 @@
+package com.caimei.controller.sys;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysRole;
+import com.caimei.service.sys.SysRoleService;
+import com.github.pagehelper.PageInfo;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+@RestController
+@RequestMapping("/sys/role")
+public class SysRoleApi {
+
+    @Resource
+    private SysRoleService sysRoleService;
+
+    /**
+     * 获取角色列表
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    @GetMapping("/list")
+    public ResponseJson<PageInfo<SysRole>> roleList(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                    @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return sysRoleService.getRoleList(pageNum, pageSize);
+    }
+
+    /**
+     * 根据ID获取角色
+     */
+    @GetMapping("/{id}")
+    public ResponseJson<SysRole> getRole(@PathVariable("id") Integer id) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("角色Id不能为空!", null);
+        }
+        return sysRoleService.getRoleInfo(id);
+    }
+
+    /**
+     * 根据ID更新角色
+     */
+    @PostMapping("/update/{id}")
+    public ResponseJson<Void> updateRole(@PathVariable("id") Integer id, @RequestBody SysRole sysRole) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("角色Id不能为空!", null);
+        }
+        return sysRoleService.updateRole(id, sysRole);
+    }
+
+    /**
+     * 添加角色
+     */
+    @PostMapping("/create")
+    public ResponseJson<Void> addRole(@RequestBody SysRole sysRole) {
+        return sysRoleService.addRole(sysRole);
+    }
+
+    /**
+     * 根据ID删除角色
+     */
+    @PostMapping("/delete/{id}")
+    public ResponseJson<Void> deleteRole(@PathVariable("id") Integer id) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("角色Id不能为空!", null);
+        }
+        return sysRoleService.deleteRole(id);
+    }
+
+    /**
+     * 角色授权菜单
+     */
+    @PostMapping("/auth/{id}")
+    public ResponseJson<Void> setRoleMenu(@PathVariable("id") Integer id, @RequestBody SysRole sysRole) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("角色Id不能为空!", null);
+        }
+        if (!StringUtils.hasLength(sysRole.getMenuIds())){
+            return ResponseJson.error("菜单Id不能为空!", null);
+        }
+        return sysRoleService.setRoleMenu(id, sysRole);
+    }
+
+}

+ 122 - 0
src/main/java/com/caimei/controller/sys/SysUserApi.java

@@ -0,0 +1,122 @@
+package com.caimei.controller.sys;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysUser;
+import com.caimei.model.po.UserProfile;
+import com.caimei.service.sys.SysUserService;
+import com.github.pagehelper.PageInfo;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/2
+ */
+@RestController
+@RequestMapping("/sys/user")
+public class SysUserApi {
+
+    @Resource
+    private SysUserService sysUserService;
+
+    /**
+     * 获取用户信息
+     */
+    @GetMapping("/info")
+    public ResponseJson<SysUser> getUserInfo(Integer authUserId) {
+//        String token = request.getHeader(ConstantKey.TOKEN_NAME);
+//        String username = jwtService.getUsername(token);
+        return sysUserService.getInfoByUserId(authUserId);
+    }
+
+    /**
+     * 退出登录
+     */
+    /*@PostMapping("/logout")
+    public ResponseJson<Void> logout(HttpServletRequest request) {
+        String token = request.getHeader(ConstantKey.TOKEN_NAME);
+        return sysUserService.logout(token);
+    }*/
+
+    /**
+     * 获取用户列表
+     *
+     * @param username 用户名
+     * @param linkMan 姓名
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    @GetMapping("/list")
+    public ResponseJson<PageInfo<SysUser>> userList(String username, String linkMan,
+                                                    @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                    @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return sysUserService.getUserList(username, linkMan, pageNum, pageSize);
+    }
+
+    /**
+     * 根据ID获取用户
+     */
+    @GetMapping("/{id}")
+    public ResponseJson<SysUser> getUser(@PathVariable("id") Integer id) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        return sysUserService.getUser(id);
+    }
+
+    /**
+     * 根据ID更新用户
+     */
+    @PostMapping("/update/{id}")
+    public ResponseJson<Void> updateUser(@PathVariable("id") Integer id, @RequestBody SysUser sysUser) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        return sysUserService.updateUser(id, sysUser);
+    }
+
+    /**
+     * 添加管理员
+     */
+    @PostMapping("/admin/create")
+    public ResponseJson<Void> addAdmin(@RequestBody SysUser sysUser) {
+        return sysUserService.addAdmin(sysUser);
+    }
+
+    /**
+     * 根据ID删除用户
+     */
+    @PostMapping("/delete/{id}")
+    public ResponseJson<Void> deleteUser(@PathVariable("id") Integer id) {
+        if (null == id || id <= 0) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        return sysUserService.deleteUser(id);
+    }
+/*
+    *//**
+     * 用户修改资料
+     *//*
+    @PostMapping("/update/profile")
+    public ResponseJson<Void> updateUserProfile( @RequestBody UserProfile profile) {
+        if (null == profile.getUserId() || profile.getUserId()<= 0) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        return sysUserService.updateUserProfile(profile);
+    }
+
+    *//**
+     * 用户修改密码
+     *//*
+    @PostMapping("/update/password")
+    public ResponseJson<Void> updateUserPassword( @RequestBody UserProfile profile) {
+        if (null == profile.getUserId() || profile.getUserId()<= 0) {
+            return ResponseJson.error("用户Id不能为空!", null);
+        }
+        return sysUserService.updateUserPassword(profile);
+    }*/
+}

+ 173 - 0
src/main/java/com/caimei/controller/vip/VipApi.java

@@ -0,0 +1,173 @@
+package com.caimei.controller.vip;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.SysRole;
+import com.caimei.model.vo.*;
+import com.caimei.service.vip.VipService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户公共API
+ *
+ * @author : Aslee
+ * @date : 2021/5/11
+ */
+@Api(tags = "会员API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/vip")
+public class VipApi {
+
+    private final VipService vipService;
+
+
+    @ApiOperation("会员套餐/订制服务配置")
+    @ApiImplicitParam(name = "params", value = "packageList([{duration:2;unit:1;orginalPrice:999;price:888}]):套餐列表;serviceList([{name:111}]):订制服务列表;", required = true)
+    @PostMapping("/configure")
+    public ResponseJson configureVip(@RequestBody String params) {
+        JSONObject parseObject = JSONObject.parseObject(params);
+        List<Map<String,Object>> packageList = (List<Map<String,Object>>) parseObject.get("packageList");
+        List<Map<String,String>> serviceList = (List<Map<String,String>>) parseObject.get("serviceList");
+        if (null == packageList || packageList.size() <= 0) {
+            return ResponseJson.error("参数异常,套餐列表不能为空");
+        }
+        if (null == serviceList || serviceList.size() <= 0) {
+            return ResponseJson.error("参数异常,订制服务列表不能为空");
+        }
+        return vipService.configureVip(packageList, serviceList);
+    }
+
+    @ApiOperation("会员套餐/订制服务回显数据")
+    @GetMapping("/configure/form")
+    public ResponseJson<VipConfigurationVo> configureVipForm() {
+        return vipService.configureVipForm();
+    }
+
+
+    @ApiOperation("在线支付开通会员")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = false, name = "authUserId", value = "用户id"),
+            @ApiImplicitParam(required = false, name = "packageId", value = "会员套餐id"),
+            @ApiImplicitParam(required = false, name = "services", value = "订制服务,以,分开")
+    })
+    @GetMapping("/pay")
+    public ResponseJson<Integer> payVip(Integer authUserId, Integer packageId, String services) {
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,用户id不能为空", null);
+        }
+        if (null == packageId) {
+            return ResponseJson.error("参数异常,套餐id不能为空", null);
+        }
+        return vipService.payVip(authUserId, packageId, services, 1, 0, null);
+    }
+
+    @ApiOperation("会员列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "shopName", required = false, value = "供应商名称"),
+            @ApiImplicitParam(name = "shopType", required = false, value = "供应商类型:1品牌方,2代理商"),
+            @ApiImplicitParam(name = "vipStatus", required = false, value = "会员状态:0已过期,1生效中"),
+            @ApiImplicitParam(name = "mobile", required = false, value = "手机号"),
+            @ApiImplicitParam(name = "linkMan", required = false, value = "联系人"),
+            @ApiImplicitParam(name = "pageNum", required = false, value = "第几页"),
+            @ApiImplicitParam(name = "pageSize", required = false, value = "一页多少条")
+    })
+    @GetMapping("/list")
+    public ResponseJson<PageInfo<VipListVo>> vipList(String shopName, Integer shopType,Integer vipStatus, String mobile, String linkMan,
+                                                     @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+                                                     @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        return vipService.vipList(shopName, shopType, vipStatus, mobile, linkMan, pageNum, pageSize);
+    }
+
+    @ApiOperation("供应商会员购买记录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "authUserId", required = false, value = "供应商用户id"),
+            @ApiImplicitParam(name = "vipPackageId", required = false, value = "会员套餐id"),
+            @ApiImplicitParam(name = "vipStatus", required = false, value = "会员状态:0已过期,1生效中,2待生效"),
+            @ApiImplicitParam(name = "payBeginTime", required = false, value = "购买开始时间"),
+            @ApiImplicitParam(name = "payEndTime", required = false, value = "购买结束时间"),
+            @ApiImplicitParam(name = "endBeginTime", required = false, value = "到期开始时间"),
+            @ApiImplicitParam(name = "endEndTime", required = false, value = "到期结束时间"),
+            @ApiImplicitParam(name = "pageNum", required = false, value = "第几页"),
+            @ApiImplicitParam(name = "pageSize", required = false, value = "一页多少条")
+    })
+    @GetMapping("/history/list")
+    public ResponseJson<PageInfo<VipHistoryListVo>> vipHistoryList(Integer authUserId, Integer vipPackageId, Integer vipStatus, String payBeginTime,
+                                                                   String payEndTime, String endBeginTime, String endEndTime,
+                                                                   @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+                                                                   @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        return vipService.vipHistoryList(authUserId, vipPackageId, vipStatus, payBeginTime, payEndTime, endBeginTime, endEndTime, pageNum, pageSize);
+    }
+
+    @ApiOperation("会员数据")
+    @ApiImplicitParam(name = "authUserId", required = false, value = "供应商用户id")
+    @GetMapping("/info")
+    public ResponseJson<VipInfoVo> vipInfo(Integer authUserId) {
+        return vipService.getVipInfo(authUserId);
+    }
+
+    @ApiOperation("会员套餐列表")
+    @GetMapping("/package/list")
+    public ResponseJson<List<VipPackageVo>> packageList() {
+        return vipService.vipPackageList();
+    }
+
+    @ApiOperation("赠送会员")
+    @ApiImplicitParam(name = "params", value = "authUserId:用户id;packageId:会员套餐id;", required = true)
+    @PostMapping("/send")
+    public ResponseJson sendVip(@RequestBody String params) {
+        JSONObject parseObject = JSONObject.parseObject(params);
+        Integer authUserId = parseObject.getInteger("authUserId");
+        Integer packageId = parseObject.getInteger("packageId");
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,套餐列表不能为空");
+        }
+        if (null == packageId) {
+            return ResponseJson.error("参数异常,会员套餐id不能为空");
+        }
+        return vipService.payVip(authUserId, packageId, null, 2, 1, new Date());
+    }
+
+    @ApiOperation("会员服务配置表单数据")
+    @GetMapping("/menus/form")
+    public ResponseJson<Map<String,Object>> vipMenusForm(){
+        return vipService.vipMenusForm();
+    }
+
+    @ApiOperation("会员服务配置")
+    @PostMapping("/menus/configure")
+    public ResponseJson vipMenusConfigure(@RequestBody String params){
+        JSONObject parseObject = JSONObject.parseObject(params);
+        List<Map<String,Object>> baseMenuList = (List<Map<String,Object>>) parseObject.get("baseMenuList");
+        List<Map<String,Object>> upMenuList = (List<Map<String,Object>>) parseObject.get("upMenuList");
+        return vipService.vipMenusConfigure(baseMenuList,upMenuList);
+    }
+
+    @ApiOperation("会员订制化服务配置表单")
+    @ApiImplicitParam(name = "authUserId", value = "authUserId:用户id", required = true)
+    @GetMapping("/services/form")
+    public ResponseJson<List<SysMenu>> vipServicesForm(Integer authUserId){
+        return vipService.vipServicesForm(authUserId);
+    }
+
+    @ApiOperation("会员订制化服务配置表单")
+    @ApiImplicitParam(name = "params", value = "authUserId:用户id;roleIds:配置的角色id,以,隔开", required = true)
+    @PostMapping("/services/configure")
+    public ResponseJson vipServicesConfigure(@RequestBody String params){
+        JSONObject parseObject = JSONObject.parseObject(params);
+        Integer authUserId = parseObject.getInteger("authUserId");
+        String roleIds = parseObject.getString("roleIds");
+        return vipService.vipServicesConfigure(authUserId, roleIds);
+    }
+}

+ 2 - 2
src/main/java/com/caimei/wxController/LoginApi.java → src/main/java/com/caimei/controller/wechat/LoginApi.java

@@ -1,9 +1,9 @@
-package com.caimei.wxController;
+package com.caimei.controller.wechat;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.WxClubUserVo;
-import com.caimei.service.LoginService;
+import com.caimei.service.wechat.LoginService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;

+ 2 - 2
src/main/java/com/caimei/wxController/SDKApi.java → src/main/java/com/caimei/controller/wechat/SDKApi.java

@@ -1,7 +1,7 @@
-package com.caimei.wxController;
+package com.caimei.controller.wechat;
 
 import com.caimei.model.ResponseJson;
-import com.caimei.service.SDKService;
+import com.caimei.service.wechat.SDKService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;

+ 4 - 4
src/main/java/com/caimei/wxController/WxAuthApi.java → src/main/java/com/caimei/controller/wechat/WxAuthApi.java

@@ -1,11 +1,11 @@
-package com.caimei.wxController;
+package com.caimei.controller.wechat;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.*;
 import com.caimei.module.base.entity.vo.AuthProductVo;
-import com.caimei.service.AuthClubService;
-import com.caimei.service.AuthProductService;
-import com.caimei.service.DoctorService;
+import com.caimei.service.auth.AuthClubService;
+import com.caimei.service.auth.AuthProductService;
+import com.caimei.service.auth.DoctorService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 5 - 2
src/main/java/com/caimei/wxController/WxDataApi.java → src/main/java/com/caimei/controller/wechat/WxDataApi.java

@@ -1,9 +1,12 @@
-package com.caimei.wxController;
+package com.caimei.controller.wechat;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.*;
-import com.caimei.service.*;
+import com.caimei.service.auth.*;
+import com.caimei.service.data.FileService;
+import com.caimei.service.data.ImageService;
+import com.caimei.service.data.VideoService;
 import com.github.pagehelper.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 7 - 1
src/main/java/com/caimei/mapper/ShopMapper.java

@@ -18,7 +18,7 @@ import java.util.List;
 @Mapper
 public interface ShopMapper {
 
-    List<ShopListVo> getShopList(@Param("listType") Integer listType, @Param("shopName") String shopName, @Param("shopType") Integer shopType, @Param("brandId") Integer brandId, @Param("mobile") String mobile, @Param("linkMan") String linkMan, @Param("lowerAuditStatus") Integer lowerAuditStatus);
+    List<ShopListVo> getShopList(@Param("listType") Integer listType, @Param("shopName") String shopName,@Param("loginAccount")  String loginAccount, @Param("shopType") Integer shopType, @Param("brandId") Integer brandId, @Param("mobile") String mobile, @Param("linkMan") String linkMan, @Param("lowerAuditStatus") Integer lowerAuditStatus);
 
     void updateShopStatusByUserId(@Param("authUserId") Integer authUserId, @Param("status") Integer status);
 
@@ -87,4 +87,10 @@ public interface ShopMapper {
     WxShopVo getWxShopInfo(String appId);
 
     Integer getWxAccountTypeByAppId(String appId);
+
+    void updateShopMobile(@Param("authUserId") Integer authUserId, @Param("newMobile") String newMobile);
+
+    String getLoginAccount(Integer authUserId);
+
+    void bindLoginAccount(@Param("authUserId") Integer authUserId, @Param("loginAccount") String loginAccount);
 }

+ 207 - 0
src/main/java/com/caimei/mapper/SystemMapper.java

@@ -0,0 +1,207 @@
+package com.caimei.mapper;
+
+
+import com.caimei.model.po.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/2
+ */
+@Mapper
+public interface SystemMapper {
+    /**
+     * 根据用户名称查找可登录用户
+     */
+    SysUser findByUsername(String username);
+    /**
+     * 根据用户Id查找可登录用户
+     */
+    SysUser findByUserId(Integer authUserId);
+    Integer getUserIdByUsername(String username);
+    /**
+     * 新增用户角色关系表
+     */
+    void insertUserRoleRelation(Integer userId, Integer roleId);
+    /**
+     * 获取用户角色名称列表
+     */
+    List<String> getRoleNamesByUserId(Integer userId);
+    /**
+     * 获取用户角色Id列表
+     */
+    List<String> getRoleIdsByUserId(Integer userId);
+//    /**
+//     * 获取用户角色Id列表
+//     */
+//    List<Integer> getRoleIdsByUsername(String username);
+    /**
+     * 删除用户原有角色关联
+     */
+    void deleteUserRoleRelation(Integer userId);
+    /**
+     * 根据角色Ids获取菜单列表
+     */
+    List<SysMenu> getMenusByRoleIds(@Param("roleIds") List<Integer> roleIds);
+    /**
+     * 根据角色Id获取按钮权限列表
+     */
+    List<String> getPermissionNames(@Param("roleIds") List<Integer> roleIds);
+
+    /**
+     * 获取用户列表
+     */
+    List<SysUser> getUserList(String username, String linkMan);
+    /**
+     * 根据ID获取用户
+     */
+    SysUser getUser(Integer id);
+    /**
+     * 根据ID更新用户
+     */
+    void updateSysUser(SysUser sysUser);
+    /**
+     * 根据ID删除用户
+     */
+    void deleteSysUser(Integer id);
+
+    /**
+     * 根据用户Id获取用户角色列表
+     */
+    List<SysRole> getRoleListByUserId(Integer userId);
+    /**
+     * 获取角色列表
+     */
+    List<SysRole> getRoleList();
+    /**
+     * 根据ID获取角色
+     */
+    SysRole getRole(Integer id);
+    /**
+     * 根据角色名称获取角色
+     */
+    SysRole getRoleByRoleName(String roleName);
+    /**
+     * 根据ID更新角色
+     */
+    void updateRole(SysRole sysRole);
+    /**
+     * 添加角色
+     */
+    void insertRole(SysRole sysRole);
+    /**
+     * 根据ID删除角色
+     */
+    void deleteRole(Integer id);
+    /**
+     * 根据角色ID获取菜单Ids
+     */
+    List<Integer> getMenuIdsByRoleId(Integer roleId);
+    /**
+     * 根据角色ID获取(权限-菜单)Ids
+     */
+    List<String> getPermissionMenuIdsByRoleId(Integer roleId);
+    /**
+     * 保存角色菜单关系
+     */
+    void insertRoleMenuRelation(Integer roleId, Integer menuId);
+    /**
+     * 保存角色权限关系
+     */
+    void insertRolePermissionRelation(Integer roleId, Integer permissionId);
+    /**
+     * 删除原有角色菜单关联
+     */
+    void deleteRoleMenuRelation(Integer roleId);
+    /**
+     * 删除原有角色权限关联
+     */
+    void deleteRolePermissionRelation(Integer roleId);
+
+    /**
+     * 获取菜单列表
+     *
+     * @param parentId 父级菜单Id
+     * @param status   状态:0启用,1停用
+     */
+    List<SysMenu> getMenuList(Integer parentId, Integer menuType, Integer status);
+    /**
+     * 获取树状菜单列表
+     * @param parentId 父级菜单Id
+     */
+    List<SysMenuTree> getMenuTree(String parentId);
+    /**
+     * 获取当前菜单的按钮权限
+     * @param menuId 菜单Id
+     */
+    List<SysMenuTree> getTreePermissions(String menuId);
+    /**
+     * 根据ID获取菜单
+     */
+    SysMenu getMenu(Integer id);
+    /**
+     * 根据路由名称查询菜单
+     */
+    SysMenu getMenuByName(String name);
+    /**
+     * 根据ID更新菜单
+     */
+    void updateMenu(SysMenu menu);
+    /**
+     * 根据ID删除菜单
+     */
+    void deleteMenu(Integer id);
+    /**
+     * 添加菜单
+     */
+    void insertMenu(SysMenu menu);
+    /**
+     * 获取菜单的按钮权限列表
+     * @param menuId 菜单Id
+     */
+    List<SysPermission> getPermissionList(Integer menuId);
+    /**
+     * 根据菜单Id获取权限ids
+     */
+    List<Integer> getPermissionIds(Integer menuId);
+    /**
+     * 权限ID更新权限
+     */
+    void updatePermission(SysPermission permission);
+    /**
+     * 权限ID删除权限
+     */
+    void deletePermission(Integer id);
+    /**
+     * 添加按钮权限
+     */
+    void insertPermission(SysPermission permission);
+
+    void insertAdminUser(SysUser sysUser);
+
+    /**
+     * 根据菜单id删除会员菜单角色
+     * @param menuId
+     */
+    void deleteVipRoleByMenuId(Integer menuId);
+
+    /**
+     * 根据菜单id查询会员菜单角色id
+     */
+    Integer getVipRoleIdByMenuId(Integer menuId);
+
+    /**
+     * 更新供应商菜单
+     * @param menu
+     */
+    void updateShopMenu(SysMenu menu);
+
+    List<SysMenu> getVipMenuList();
+
+    List<Integer> getVipRoleIdList(Integer authUserId);
+}

+ 9 - 0
src/main/java/com/caimei/mapper/UserMapper.java

@@ -1,9 +1,16 @@
 package com.caimei.mapper;
 
+import com.caimei.model.dto.PackageDto;
+import com.caimei.model.po.VipHistoryPo;
+import com.caimei.model.vo.VipPackageVo;
 import com.caimei.model.vo.UserLoginVo;
+import com.caimei.model.vo.VipServiceVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * Description
  *
@@ -20,4 +27,6 @@ public interface UserMapper {
     String getPasswordByUserId(Integer authUserId);
 
     void updatePasswordByUserId(@Param("authUserId") Integer authUserId, @Param("newPassword") String newPassword);
+
+    UserLoginVo getShopUserByAccount(String account);
 }

+ 60 - 0
src/main/java/com/caimei/mapper/VipMapper.java

@@ -0,0 +1,60 @@
+package com.caimei.mapper;
+
+import com.caimei.model.dto.PackageDto;
+import com.caimei.model.po.AuthVipPo;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.VipHistoryPo;
+import com.caimei.model.vo.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/5/11
+ */
+@Mapper
+public interface VipMapper {
+
+    void deleteVipPackages();
+
+    void deleteVipServices();
+
+    void insertVipPackage(PackageDto pac);
+
+    void insertVipService(String service);
+
+    List<VipPackageVo> getVipPackageList();
+
+    List<VipServiceVo> getVipServiceList();
+
+    Date getVipEndTime(Integer authUserId);
+
+    VipPackageVo getVipPackageById(Integer packageId);
+
+    Integer getVipHistoryId(@Param("authUserId") Integer authUserId, @Param("packageId") Integer packageId);
+
+    void updateVipHistory(VipHistoryPo vipHistory);
+
+    void insertVipHistory(VipHistoryPo vipHistory);
+
+    List<VipListVo> getVipList(@Param("shopName") String shopName, @Param("shopType") Integer shopType, Integer vipStatus, @Param("mobile") String mobile, @Param("linkMan") String linkMan);
+
+    List<VipHistoryListVo> getVipHistoryList(@Param("authUserId") Integer authUserId, @Param("vipPackageId") Integer vipPackageId, @Param("vipStatus") Integer vipStatus, @Param("payBeginTime") String payBeginTime, @Param("payEndTime") String payEndTime, @Param("endBeginTime") String endBeginTime, @Param("endEndTime") String endEndTime);
+
+    VipInfoVo getVipInfo(Integer authUserId);
+
+    AuthVipPo getAuthVipInfo(Integer authUserId);
+
+    void updateAuthVipInfo(AuthVipPo authVip);
+
+    void insertAuthVipInfo(AuthVipPo authVip);
+
+    List<SysMenu> getBaseMenuList();
+
+    List<SysMenu> getUpMenuList();
+}

+ 33 - 0
src/main/java/com/caimei/model/dto/PackageDto.java

@@ -0,0 +1,33 @@
+package com.caimei.model.dto;
+
+
+import com.caimei.model.po.ProductParamPo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/14
+ */
+@Data
+public class PackageDto {
+    @ApiModelProperty("套餐时长")
+    private Integer duration;
+
+    @ApiModelProperty("套餐规格:1月,2年")
+    private Integer unit;
+
+    @ApiModelProperty("原价")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty("现价")
+    private BigDecimal price;
+}

+ 50 - 0
src/main/java/com/caimei/model/dto/PayVipDto.java

@@ -0,0 +1,50 @@
+package com.caimei.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/9/27
+ */
+@Data
+public class PayVipDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 会员购买记录Id
+     */
+    @ApiModelProperty("会员购买记录Id")
+    private Integer vipRecordId;
+    /**
+     * 页面回调地址
+     */
+    @ApiModelProperty("页面回调地址")
+    private String returnUrl;
+    /**
+     * 微信小程序code,微信小程序支付使用
+     */
+    @ApiModelProperty("微信小程序code")
+    private String code;
+    /**
+     * 微信公众号state参数
+     */
+    @ApiModelProperty("微信公众号state参数")
+    private String state;
+    /**
+     * 银行编码(银联支付使用)
+     */
+    @ApiModelProperty("银行编码(银联支付使用)")
+    private String bankCode;
+    /**
+     * 用户类型(银联支付使用)
+     * 企业:ENTERPRISE
+     * 个人:USER
+     */
+    @ApiModelProperty("用户类型(银联支付使用)企业:ENTERPRISE,个人:USER")
+    private String userType;
+}
+

+ 41 - 0
src/main/java/com/caimei/model/po/AuthVipPo.java

@@ -0,0 +1,41 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/10/12
+ */
+@Data
+public class AuthVipPo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer authUserId;
+    /**
+     * 开始时间
+     */
+    private Date beginTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 结束时间
+     */
+    private Date updateTime;
+    /**
+     * 删除标记 0否,其余是
+     */
+    private Integer delFlag;
+}

+ 100 - 0
src/main/java/com/caimei/model/po/SysMenu.java

@@ -0,0 +1,100 @@
+package com.caimei.model.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/10
+ */
+@Data
+public class SysMenu {
+    /**
+     * Id
+     */
+    private Integer id;
+    /**
+     * 菜单名称
+     */
+    private String title;
+    /**
+     * 菜单名称
+     */
+    private String name;
+    /**
+     * 图标
+     */
+    private String icon;
+    /**
+     * 子菜单数量
+     */
+    private Integer childCount;
+    /**
+     * 父级菜单Id
+     */
+    private Integer parentId;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date createTime;
+    /**
+     * 隐藏状态:0显示,1隐藏
+     */
+    private Integer hidden;
+    /**
+     * 菜单类型:1管理员菜单,2供应商菜单
+     */
+    private Integer menuType;
+    /**
+     * 供应商基础功能标记:0不是,1是
+     */
+    private Integer baseFlag;
+    /**
+     * 功能类型能否更改标记:0不能,1能
+     */
+    private Integer moveFlag;
+    /**
+     * 状态:0启用,1停用
+     */
+    private Integer status;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 删除标记:0未删,其他删除
+     */
+    private Integer delFlag;
+    /**
+     * 按钮权限
+     */
+    private List<SysPermission> permissions;
+    /**
+     * 按钮权限JSON数据:[
+     *            { "id":         "ID"
+     *              "title":      "按钮标题",
+     *              "name":       "权限标识",
+     *            },
+     *            {多条数据结构同上}
+     *         ]
+     */
+    private String permissionJson;
+
+    /**
+     * 会员菜单对应的角色id
+     */
+    private Integer roleId;
+    /**
+     * 用户是否拥有该菜单权限:0没有,1有
+     */
+    private Integer checkFlag;
+
+    private static final long serialVersionUID = 1L;
+
+}

+ 37 - 0
src/main/java/com/caimei/model/po/SysMenuTree.java

@@ -0,0 +1,37 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/2/7
+ */
+@Data
+public class SysMenuTree {
+    /**
+     * Id
+     */
+    private String id;
+    /**
+     * 菜单名称
+     */
+    private String title;
+    /**
+     * 菜单名称
+     */
+    private String name;
+    /**
+     * 父级菜单Id
+     */
+    private String parentId;
+    /**
+     * 子菜单
+     */
+    private List<SysMenuTree> subMenus;
+
+    private static final long serialVersionUID = 1L;
+}

+ 31 - 0
src/main/java/com/caimei/model/po/SysPermission.java

@@ -0,0 +1,31 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/2/7
+ */
+@Data
+public class SysPermission {
+    /**
+     * Id
+     */
+    private Integer id;
+    /**
+     * 菜单名称
+     */
+    private String title;
+    /**
+     * 菜单名称
+     */
+    private String name;
+    /**
+     * 父级菜单Id
+     */
+    private Integer menuId;
+
+    private static final long serialVersionUID = 1L;
+}

+ 52 - 0
src/main/java/com/caimei/model/po/SysRole.java

@@ -0,0 +1,52 @@
+package com.caimei.model.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/17
+ */
+@Data
+public class SysRole {
+    /**
+     * 角色ID
+     */
+    private Integer id;
+    /**
+     * 角色名称
+     */
+    private String roleName;
+    /**
+     * 描述
+     */
+    private String roleDesc;
+    /**
+     * 角色类型:1管理员角色,2供应商角色
+     */
+    private Integer roleType;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date updateTime;
+    /**
+     * 删除标记:0未删,其他删除
+     */
+    private Integer delFlag;
+    /**
+     * 角色授权菜单
+     */
+    private String menuIds;
+
+    private static final long serialVersionUID = 1L;
+}

+ 72 - 0
src/main/java/com/caimei/model/po/SysUser.java

@@ -0,0 +1,72 @@
+package com.caimei.model.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/2
+ */
+@Data
+public class SysUser {
+    /**
+     * 用户Id
+     */
+    private Integer id;
+    /**
+     * 用户名
+     */
+    private String username;
+    /**
+     * 手机号
+     */
+    private String mobile;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 联系人
+     */
+    private String linkMan;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
+    private Date createTime;
+    /**
+     * 创建人用户id
+     */
+    private Integer createBy;
+    /**
+     * 状态:0停用,1启用
+     */
+    private Integer status;
+    /**
+     * 角色Ids,用","隔开
+     */
+    private String roleIds;
+    /**
+     * 角色名称集合
+     */
+    private List<String> roles;
+    /**
+     * 角色描述,用" "隔开
+     */
+    private String roleDesc;
+    /**
+     * 可访问菜单集合
+     */
+    private List<SysMenu> menus;
+    /**
+     * 指令权限集合
+     */
+    List<String> permissions;
+
+    private static final long serialVersionUID = 1L;
+}

+ 47 - 0
src/main/java/com/caimei/model/po/UserProfile.java

@@ -0,0 +1,47 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/4
+ */
+@Data
+public class UserProfile {
+    /**
+     * 用户Id
+     */
+    private Integer userId;
+    /**
+     * 用户名
+     */
+    private String username;
+    /**
+     * 头像
+     */
+    private String avatar;
+    /**
+     * 姓名
+     */
+    private String fullName;
+    /**
+     * 电话
+     */
+    private String phone;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 密码
+     */
+    private String oldPassword;
+    /**
+     * 密码
+     */
+    private String confirmPassword;
+
+    private static final long serialVersionUID = 1L;
+}

+ 41 - 0
src/main/java/com/caimei/model/po/UserVipPo.java

@@ -0,0 +1,41 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/10/12
+ */
+@Data
+public class UserVipPo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * id
+     */
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 开始时间
+     */
+    private Date beginTime;
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+    /**
+     * 结束时间
+     */
+    private Date updateTime;
+    /**
+     * 删除标记 0否,其余是
+     */
+    private Integer delFlag;
+}

+ 75 - 0
src/main/java/com/caimei/model/po/VipHistoryPo.java

@@ -0,0 +1,75 @@
+package com.caimei.model.po;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/14
+ */
+@Data
+public class VipHistoryPo {
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    private Integer authUserId;
+
+    /**
+     *会员套餐id
+     */
+    private Integer packageId;
+
+    /**
+     *套餐时长
+     */
+    private String duration;
+
+    /**
+     *生效时间
+     */
+    private Date beginTime;
+
+    /**
+     *到期时间
+     */
+    private Date endTime;
+
+    /**
+     *支付状态: 0未付款 1 已付款
+     */
+    private Integer payStatus;
+
+    /**
+     *用户付款方式:1线上,2系统赠送
+     */
+    private Integer payWay;
+
+    /**
+     *付款类型:1建设银行7297、2广发银行0115、3中信银行7172、4中信银行0897、5中信银行0897-财付通、6中信银行0897-支付宝、7线上-支付宝、8线上-微信支付、9线上-快钱支付、10口头返佣、11广发银行5461、12PC-B2B网银、13PC-微信支付、14PC-支付宝、15小程序-微信支付、16余额抵扣、17PC-B2C网银
+     */
+    private Integer payType;
+
+    /**
+     *支付金额
+     */
+    private BigDecimal price;
+
+    /**
+     *订制服务,以,分开
+     */
+    private String services;
+
+    /**
+     *购买时间
+     */
+    private Date payTime;
+}

+ 8 - 0
src/main/java/com/caimei/model/vo/ShopFormVo.java

@@ -22,6 +22,9 @@ public class ShopFormVo implements Serializable {
     @ApiModelProperty("供应商名称")
     private String shopName;
 
+    @ApiModelProperty("登录账号")
+    private String loginAccount;
+
     @ApiModelProperty("供应商类型")
     private Integer shopType;
 
@@ -54,4 +57,9 @@ public class ShopFormVo implements Serializable {
 
     @ApiModelProperty("已存在商品的品牌id,以,隔开")
     private String existProductBrandIds;
+
+    /**
+     * 会员状态:0已过期,1生效中,2待生效,3非会员
+     */
+    private Integer vipStatus;
 }

+ 6 - 0
src/main/java/com/caimei/model/vo/ShopListVo.java

@@ -28,6 +28,12 @@ public class ShopListVo implements Serializable {
     @ApiModelProperty("供应商名称")
     private String name;
 
+    /**
+     * 登录账号
+     */
+    @ApiModelProperty("登录账号")
+    private String loginAccount;
+
     /**
      * 供应商类型:1代理商 2品牌方
      */

+ 5 - 0
src/main/java/com/caimei/model/vo/UserLoginVo.java

@@ -27,6 +27,11 @@ public class UserLoginVo implements Serializable {
      */
     @ApiModelProperty("用户名")
     private String name;
+    /**
+     * 登录账号
+     */
+    @ApiModelProperty("登录账号")
+    private String loginAccount;
     /**
      * 密码
      */

+ 28 - 0
src/main/java/com/caimei/model/vo/VipConfigurationVo.java

@@ -0,0 +1,28 @@
+package com.caimei.model.vo;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/14
+ */
+@Data
+public class VipConfigurationVo {
+    /**
+     * 套餐列表
+     */
+    private List<VipPackageVo> packageList;
+
+    /**
+     * 服务列表
+     */
+    private List<VipServiceVo> serviceList;
+}

+ 50 - 0
src/main/java/com/caimei/model/vo/VipHistoryListVo.java

@@ -0,0 +1,50 @@
+package com.caimei.model.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/15
+ */
+@Data
+public class VipHistoryListVo {
+    /**
+     * 购买记录id
+     */
+    private Integer historyId;
+    /**
+     * 购买套餐
+     */
+    private String duration;
+    /**
+     * 购买价格
+     */
+    private BigDecimal price;
+    /**
+     * 购买方式:1平台赠送,2支付宝,3微信,4企业网银,5个人网银
+     */
+    private Integer payWay;
+    /**
+     * 会员状态:0已过期,1生效中,2待生效,3非会员
+     */
+    private Integer vipStatus;
+    /**
+     * 购买时间
+     */
+    private Date payTime;
+    /**
+     * 到期时间
+     */
+    private Date endTime;
+    /**
+     * 订制需求
+     */
+    private String services;
+}

+ 57 - 0
src/main/java/com/caimei/model/vo/VipInfoVo.java

@@ -0,0 +1,57 @@
+package com.caimei.model.vo;
+
+
+import lombok.Data;
+
+import java.util.Date;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/15
+ */
+@Data
+public class VipInfoVo {
+    /**
+     * 会员id
+     */
+    private Integer vipUserId;
+    /**
+     * 用户id
+     */
+    private Integer authUserId;
+    /**
+     * 手机号
+     */
+    private String mobile;
+    /**
+     * 登录账号
+     */
+    private String loginAccount;
+    /**
+     * 会员到期时间
+     */
+    private Date endTime;
+    /**
+     * 会员剩余天数
+     */
+    private Integer endDayLeft;
+    /**
+     * 试用期剩余天数
+     */
+    private Integer freeDayLeft;
+    /**
+     * 会员状态:0已过期,1生效中,2待生效,3非会员
+     */
+    private Integer vipStatus;
+    /**
+     * 是否在免费试用期内:0不是,1是
+     */
+    private Integer freeUseFlag;
+    /**
+     * 提示弹窗类型:0不弹窗,1试用即将到期,2试用已到期,3会员即将到期,4会员已到期
+     */
+    private Integer tipType;
+}

+ 49 - 0
src/main/java/com/caimei/model/vo/VipListVo.java

@@ -0,0 +1,49 @@
+package com.caimei.model.vo;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/15
+ */
+@Data
+public class VipListVo {
+    /**
+     * 会员id
+     */
+    private Integer vipUserId;
+    /**
+     * 用户id
+     */
+    private Integer authUserId;
+    /**
+     * 供应商名称
+     */
+    private String shopName;
+    /**
+     * 供应商类型:1品牌方,2代理商
+     */
+    private Integer shopType;
+    /**
+     * 登录账号
+     */
+    private String loginAccount;
+    /**
+     * 手机号
+     */
+    private String mobile;
+    /**
+     * 联系人
+     */
+    private String linkMan;
+    /**
+     * 会员状态:0已过期,1生效中,2待生效,3非会员
+     */
+    private String vipStatus;
+}

+ 32 - 0
src/main/java/com/caimei/model/vo/VipPackageVo.java

@@ -0,0 +1,32 @@
+package com.caimei.model.vo;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/14
+ */
+@Data
+public class VipPackageVo {
+    @ApiModelProperty("id")
+    private Integer id;
+
+    @ApiModelProperty("套餐时长")
+    private Integer duration;
+
+    @ApiModelProperty("套餐规格:1月,2年")
+    private Integer unit;
+
+    @ApiModelProperty("原价")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty("现价")
+    private BigDecimal price;
+}

+ 23 - 0
src/main/java/com/caimei/model/vo/VipServiceVo.java

@@ -0,0 +1,23 @@
+package com.caimei.model.vo;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2022/2/14
+ */
+@Data
+public class VipServiceVo {
+    @ApiModelProperty("id")
+    private Integer id;
+
+    @ApiModelProperty("订制服务名称")
+    private String name;
+}

+ 1 - 1
src/main/java/com/caimei/service/AddressService.java → src/main/java/com/caimei/service/auth/AddressService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 
 import com.caimei.model.ResponseJson;

+ 1 - 1
src/main/java/com/caimei/service/ArticleService.java → src/main/java/com/caimei/service/auth/ArticleService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.ArticleFormVo;

+ 1 - 1
src/main/java/com/caimei/service/AuthClubService.java → src/main/java/com/caimei/service/auth/AuthClubService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.*;

+ 1 - 1
src/main/java/com/caimei/service/AuthProductService.java → src/main/java/com/caimei/service/auth/AuthProductService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.dto.ProductSaveDto;

+ 1 - 1
src/main/java/com/caimei/service/AuthService.java → src/main/java/com/caimei/service/auth/AuthService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.CmBrandAuthPo;

+ 1 - 1
src/main/java/com/caimei/service/DoctorService.java → src/main/java/com/caimei/service/auth/DoctorService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.CmBrandDoctorPo;

+ 1 - 1
src/main/java/com/caimei/service/DownloadService.java → src/main/java/com/caimei/service/auth/DownloadService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

+ 20 - 2
src/main/java/com/caimei/service/ShopService.java → src/main/java/com/caimei/service/auth/ShopService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.dto.ShopInfoDto;
@@ -21,6 +21,7 @@ public interface ShopService {
      *
      * @param listType  列表类型:1供应商列表,2审核列表
      * @param shopName  供应商名称
+     * @param loginAccount
      * @param shopType  供应商类型:1品牌方,2代理商
      * @param brandId   所属品牌Id
      * @param mobile    手机号
@@ -30,7 +31,7 @@ public interface ShopService {
      * @param pageSize  一页多少条
      * @return PageInfo<ShopVo>
      */
-    ResponseJson<PageInfo<ShopListVo>> getShopList(Integer listType, String shopName, Integer shopType, Integer brandId, String mobile, String linkMan, Integer lowerAuditStatus, Integer pageNum, Integer pageSize);
+    ResponseJson<PageInfo<ShopListVo>> getShopList(Integer listType, String shopName, String loginAccount, Integer shopType, Integer brandId, String mobile, String linkMan, Integer lowerAuditStatus, Integer pageNum, Integer pageSize);
 
     /**
      * 更新供应商状态
@@ -144,4 +145,21 @@ public interface ShopService {
      * @return
      */
     List<String> getShopBrands(Integer authUserId);
+
+    /**
+     * 发送验证码
+     * @param mobile
+     * @return
+     */
+    ResponseJson sendVerifyCode(String mobile);
+
+    /**
+     * 更改手机号
+     */
+    ResponseJson changeMobile(Integer authUserId, String oldMobile, String verifyCode, String newMobile);
+
+    /**
+     * 绑定登录账号
+     */
+    ResponseJson bindLoginAccount(Integer authUserId, String mobile, String verifyCode, String loginAccount);
 }

+ 1 - 1
src/main/java/com/caimei/service/UploadService.java → src/main/java/com/caimei/service/auth/UploadService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.alibaba.fastjson.JSONArray;
 import com.caimei.model.po.UploadFilePo;

+ 5 - 1
src/main/java/com/caimei/service/UserService.java → src/main/java/com/caimei/service/auth/UserService.java

@@ -1,8 +1,12 @@
-package com.caimei.service;
+package com.caimei.service.auth;
 
 import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.PackageDto;
 import com.caimei.model.dto.PasswordDto;
 import com.caimei.model.vo.UserLoginVo;
+import com.caimei.model.vo.VipConfigurationVo;
+
+import java.util.List;
 
 /**
  * Description

+ 2 - 4
src/main/java/com/caimei/service/impl/AddressServiceImpl.java → src/main/java/com/caimei/service/auth/impl/AddressServiceImpl.java

@@ -1,11 +1,9 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.mapper.AddressMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.AddressSelectVo;
-import com.caimei.service.AddressService;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
+import com.caimei.service.auth.AddressService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 

+ 2 - 2
src/main/java/com/caimei/service/impl/ArticleServiceImpl.java → src/main/java/com/caimei/service/auth/impl/ArticleServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.mapper.ArticleMapper;
 import com.caimei.model.ResponseJson;
@@ -6,7 +6,7 @@ import com.caimei.model.po.ArticlePo;
 import com.caimei.model.vo.ArticleFormVo;
 import com.caimei.model.vo.ArticleListVo;
 import com.caimei.model.vo.WxArticleListVo;
-import com.caimei.service.ArticleService;
+import com.caimei.service.auth.ArticleService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 4
src/main/java/com/caimei/service/impl/AuthClubServiceImpl.java → src/main/java/com/caimei/service/auth/impl/AuthClubServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.mapper.AuthMapper;
 import com.caimei.mapper.AuthProductMapper;
@@ -6,15 +6,13 @@ import com.caimei.mapper.ClubMapper;
 import com.caimei.mapper.ShopMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.ClubUserPo;
-import com.caimei.model.po.CmBrandAuthPo;
 import com.caimei.model.vo.*;
-import com.caimei.service.AuthClubService;
+import com.caimei.service.auth.AuthClubService;
 import com.caimei.utils.CodeUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;

+ 3 - 4
src/main/java/com/caimei/service/impl/AuthProductServiceImpl.java → src/main/java/com/caimei/service/auth/impl/AuthProductServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
@@ -10,12 +10,11 @@ import com.caimei.model.po.ProductParamPo;
 import com.caimei.model.po.ProductPo;
 import com.caimei.model.vo.ProductFormVo;
 import com.caimei.model.vo.ProductListVo;
-import com.caimei.model.vo.WxDoctorListVo;
 import com.caimei.model.vo.WxProductListVo;
 import com.caimei.module.base.entity.vo.AuthProductVo;
 import com.caimei.module.base.entity.vo.StatementFileVo;
-import com.caimei.service.AuthProductService;
-import com.caimei.service.UploadService;
+import com.caimei.service.auth.AuthProductService;
+import com.caimei.service.auth.UploadService;
 import com.caimei.utils.Base64Util;
 import com.caimei.utils.ImageUtils;
 import com.github.pagehelper.PageHelper;

+ 4 - 4
src/main/java/com/caimei/service/impl/AuthServiceImpl.java → src/main/java/com/caimei/service/auth/impl/AuthServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.config.FastDfsClient;
 import com.caimei.mapper.AuthMapper;
@@ -11,9 +11,9 @@ import com.caimei.model.po.ProductParamPo;
 import com.caimei.model.vo.AuthFormVo;
 import com.caimei.model.vo.AuthVo;
 import com.caimei.model.vo.ProductFormVo;
-import com.caimei.service.AuthProductService;
-import com.caimei.service.AuthService;
-import com.caimei.service.ShopService;
+import com.caimei.service.auth.AuthProductService;
+import com.caimei.service.auth.AuthService;
+import com.caimei.service.auth.ShopService;
 import com.caimei.utils.ExcelOperateUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;

+ 2 - 2
src/main/java/com/caimei/service/impl/DoctorServiceImpl.java → src/main/java/com/caimei/service/auth/impl/DoctorServiceImpl.java

@@ -1,10 +1,10 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.mapper.DoctorMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.CmBrandDoctorPo;
 import com.caimei.model.vo.*;
-import com.caimei.service.DoctorService;
+import com.caimei.service.auth.DoctorService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;

+ 3 - 3
src/main/java/com/caimei/service/impl/DownloadServiceImpl.java → src/main/java/com/caimei/service/auth/impl/DownloadServiceImpl.java

@@ -1,11 +1,11 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.mapper.FileMapper;
 import com.caimei.model.en.QrCodeSize;
 import com.caimei.model.po.ProductImagePo;
 import com.caimei.model.po.UploadFilePo;
-import com.caimei.service.DownloadService;
-import com.caimei.service.UploadService;
+import com.caimei.service.auth.DownloadService;
+import com.caimei.service.auth.UploadService;
 import com.caimei.utils.ImageUtils;
 import com.caimei.utils.OSSUtils;
 import lombok.extern.slf4j.Slf4j;

+ 101 - 4
src/main/java/com/caimei/service/impl/ShopServiceImpl.java → src/main/java/com/caimei/service/auth/impl/ShopServiceImpl.java

@@ -1,5 +1,6 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
+import com.caimei.components.RedisService;
 import com.caimei.mapper.ShopMapper;
 import com.caimei.mapper.UserMapper;
 import com.caimei.model.ResponseJson;
@@ -7,13 +8,15 @@ import com.caimei.model.dto.ShopInfoDto;
 import com.caimei.model.po.CmBrandAuthFilePo;
 import com.caimei.model.po.UserPo;
 import com.caimei.model.vo.*;
-import com.caimei.service.ShopService;
+import com.caimei.service.auth.ShopService;
+import com.caimei.service.sys.SysUserService;
 import com.caimei.utils.*;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -32,16 +35,24 @@ import java.util.*;
 @Service
 public class ShopServiceImpl implements ShopService {
 
+    @Resource
+    private RedisService redisService;
     @Resource
     private ShopMapper shopMapper;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private SysUserService sysUserService;
+
+
+    @Value("${spring.profiles.active}")
+    private static String active;
 
     @Override
-    public ResponseJson<PageInfo<ShopListVo>> getShopList(Integer listType, String shopName, Integer shopType, Integer brandId, String mobile, String linkMan, Integer lowerAuditStatus, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PageInfo<ShopListVo>> getShopList(Integer listType, String shopName, String loginAccount, Integer shopType, Integer brandId, String mobile, String linkMan, Integer lowerAuditStatus, Integer pageNum, Integer pageSize) {
         listType = null == listType ? 1 : listType;
         PageHelper.startPage(pageNum, pageSize);
-        List<ShopListVo> shopList = shopMapper.getShopList(listType, shopName, shopType, brandId, mobile, linkMan, lowerAuditStatus);
+        List<ShopListVo> shopList = shopMapper.getShopList(listType, shopName, loginAccount, shopType, brandId, mobile, linkMan, lowerAuditStatus);
         ListIterator<ShopListVo> iterator = shopList.listIterator();
         while (iterator.hasNext()) {
             // 根据是否完成商品信息审核筛选项,设置下级审核状态
@@ -256,6 +267,8 @@ public class ShopServiceImpl implements ShopService {
                 // 短信发送失败重试一次
                 AliyunSmsUtil.sendSms(mobile, 14, "{password:\"" + password + "\"}");
             }
+            // 给供应商分配供应商基础角色和试用期会员基础角色
+            sysUserService.saveRoleRelation(shop.getAuthUserId(), "1,2");
             log.info("添加供应商,供应商用户id:" + shop.getAuthUserId());
         } else {
             shop.setAuthUserId(authUserId);
@@ -401,4 +414,88 @@ public class ShopServiceImpl implements ShopService {
     public List<String> getShopBrands(Integer authUserId) {
         return shopMapper.getShopBrands(authUserId);
     }
+
+    @Override
+    public ResponseJson sendVerifyCode(String mobile) {
+        if (StringUtils.isEmpty(mobile)) {
+            return ResponseJson.error("参数异常,请输入手机号");
+        }
+        String verifyCode = CodeUtil.generateCodeInt(6);
+        String content = "您的短信验证码为:" + verifyCode + ",该验证码 5 分钟内有效,请勿泄漏于他人。";
+        Boolean sendSms = SmsUtils.sendSms(11, mobile, content);
+        if (!sendSms) {
+            log.info("短信验证码发送失败,手机号:" + mobile);
+            return ResponseJson.error("发送失败,请确认手机号无误");
+        } else {
+            log.info("短信验证码发送成功,手机号:" + mobile + ",验证码:" + verifyCode);
+        }
+        redisService.set("code:" + mobile, verifyCode, 300L);
+        return ResponseJson.success("发送成功");
+    }
+
+    @Override
+    public ResponseJson changeMobile(Integer authUserId, String oldMobile, String verifyCode, String newMobile) {
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,供应商用户id不能为空");
+        }
+        if (StringUtils.isEmpty(verifyCode)) {
+            return ResponseJson.error("参数异常,验证码不能为空");
+        }
+        if (StringUtils.isEmpty(oldMobile)) {
+            return ResponseJson.error("参数异常,旧手机号不能为空");
+        }
+        if (StringUtils.isEmpty(newMobile)) {
+            return ResponseJson.error("参数异常,新手机号不能为空");
+        }
+        // 校验验证码是否正确
+        String redisVerifyCode = null == redisService.get("code:" + oldMobile) ? null : redisService.get("code:" + oldMobile).toString();
+        if (!"prod".equals(active)) {
+            // 本地和测试环境默认验证码为666666
+            redisVerifyCode = "666666";
+        }
+        if (!verifyCode.equals(redisVerifyCode)) {
+            return ResponseJson.error("验证码错误,请重新输入", null);
+        }
+        Integer userIdByMobile = shopMapper.getUserIdByMobile(newMobile);
+        // 验证新手机号是否已被使用
+        if (null != userIdByMobile) {
+            return ResponseJson.error("该手机号已被使用,请重新输入", null);
+        }
+        // 更改手机号
+        shopMapper.updateShopMobile(authUserId, newMobile);
+        return ResponseJson.success("修改成功");
+    }
+
+    @Override
+    public ResponseJson bindLoginAccount(Integer authUserId, String mobile, String verifyCode, String loginAccount) {
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,供应商用户id不能为空");
+        }
+        if (StringUtils.isEmpty(verifyCode)) {
+            return ResponseJson.error("参数异常,验证码不能为空");
+        }
+        if (StringUtils.isEmpty(mobile)) {
+            return ResponseJson.error("参数异常,手机号不能为空");
+        }
+        if (StringUtils.isEmpty(loginAccount)) {
+            return ResponseJson.error("参数异常,登录账号不能为空");
+        }
+        // 校验该账号是否已绑定登录账号
+        String dbLoginAccount = shopMapper.getLoginAccount(authUserId);
+        if (StringUtils.isNotEmpty(dbLoginAccount)) {
+            return ResponseJson.error("您已绑定过登录号码,请勿重复绑定");
+        }
+        // 校验验证码是否正确
+        String redisVerifyCode = null == redisService.get("code:" + mobile) ? null : redisService.get("code:" + mobile).toString();
+        if (!"prod".equals(active)) {
+            // 本地和测试环境默认验证码为666666
+            redisVerifyCode = "666666";
+        }
+        if (!verifyCode.equals(redisVerifyCode)) {
+            return ResponseJson.error("验证码错误,请重新输入", null);
+        }
+        // 绑定登录账号
+        shopMapper.bindLoginAccount(authUserId, loginAccount);
+        return ResponseJson.success("绑定成功");
+    }
 }

+ 2 - 2
src/main/java/com/caimei/service/impl/UploadServiceImpl.java → src/main/java/com/caimei/service/auth/impl/UploadServiceImpl.java

@@ -1,9 +1,9 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.caimei.config.FastDfsClient;
 import com.caimei.model.po.UploadFilePo;
-import com.caimei.service.UploadService;
+import com.caimei.service.auth.UploadService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;

+ 22 - 16
src/main/java/com/caimei/service/impl/UserServiceImpl.java → src/main/java/com/caimei/service/auth/impl/UserServiceImpl.java

@@ -1,11 +1,11 @@
-package com.caimei.service.impl;
+package com.caimei.service.auth.impl;
 
 import com.caimei.components.RedisService;
 import com.caimei.mapper.UserMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.dto.PasswordDto;
 import com.caimei.model.vo.UserLoginVo;
-import com.caimei.service.UserService;
+import com.caimei.service.auth.UserService;
 import com.caimei.utils.JwtUtil;
 import com.caimei.utils.Md5Util;
 import lombok.extern.slf4j.Slf4j;
@@ -16,6 +16,9 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
 
 /**
  * Description
@@ -48,7 +51,8 @@ public class UserServiceImpl implements UserService {
         }
         // 根据账户名和手机号获取管理员账号和供应商账号
         UserLoginVo adminUser = userMapper.getAdminUserByName(mobileOrName);
-        UserLoginVo shopUser = userMapper.getShopUserByMobile(mobileOrName);
+        UserLoginVo shopUserByMobile = userMapper.getShopUserByMobile(mobileOrName);
+        UserLoginVo shopUserByAccount = userMapper.getShopUserByAccount(mobileOrName);
         // 密码校验
         Boolean passwordVerify;
         if (adminUser != null) {
@@ -57,18 +61,20 @@ public class UserServiceImpl implements UserService {
             passwordVerify = passwordVerify(password, adminUser.getPassword());
             if (passwordVerify) {
                 return logonVerify(adminUser);
-            } else if (shopUser != null) {
-                // 管理员登录失败,尝试供应商登录
-                passwordVerify = passwordVerify(password, shopUser.getPassword());
-                if (passwordVerify) {
-                    return logonVerify(shopUser);
-                }
             }
-        } else if (shopUser != null) {
+        }
+        if (shopUserByMobile != null) {
             // 供应商登录
-            passwordVerify = passwordVerify(password, shopUser.getPassword());
+            passwordVerify = passwordVerify(password, shopUserByMobile.getPassword());
             if (passwordVerify) {
-                return logonVerify(shopUser);
+                return logonVerify(shopUserByMobile);
+            }
+        }
+        if (shopUserByAccount != null) {
+            // 供应商登录
+            passwordVerify = passwordVerify(password, shopUserByAccount.getPassword());
+            if (passwordVerify) {
+                return logonVerify(shopUserByAccount);
             }
         }
         return ResponseJson.error("输入的密码和账户名不匹配", null);
@@ -80,6 +86,10 @@ public class UserServiceImpl implements UserService {
         String oldPassword = passwordDto.getOldPassword();
         String newPassword = passwordDto.getNewPassword();
         String confirmPwd = passwordDto.getConfirmPwd();
+        // 参数校验
+        if (null == authUserId) {
+            return ResponseJson.error("用户id不能为空");
+        }
         // 获取登录用户的用户id
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
         HttpServletRequest request = attributes.getRequest();
@@ -89,10 +99,6 @@ public class UserServiceImpl implements UserService {
         if (loginUserId != authUserId) {
             return ResponseJson.error("修改失败,只能修改自己账户的密码!");
         }
-        // 参数校验
-        if (null == authUserId) {
-            return ResponseJson.error("用户id不能为空");
-        }
         if (StringUtils.isBlank(oldPassword)) {
             return ResponseJson.error("请输入旧密码");
         }

+ 1 - 1
src/main/java/com/caimei/service/FileService.java → src/main/java/com/caimei/service/data/FileService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.data;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.CourseFileListVo;

+ 1 - 1
src/main/java/com/caimei/service/ImageService.java → src/main/java/com/caimei/service/data/ImageService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.data;
 
 import com.alibaba.fastjson.JSONArray;
 import com.caimei.model.ResponseJson;

+ 1 - 1
src/main/java/com/caimei/service/VideoService.java → src/main/java/com/caimei/service/data/VideoService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.data;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.VideoListVo;

+ 2 - 2
src/main/java/com/caimei/service/impl/FileServiceImpl.java → src/main/java/com/caimei/service/data/impl/FileServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.data.impl;
 
 import com.caimei.mapper.FileMapper;
 import com.caimei.model.ResponseJson;
@@ -8,7 +8,7 @@ import com.caimei.model.po.FilePo;
 import com.caimei.model.vo.CourseFileListVo;
 import com.caimei.model.vo.FileListVo;
 import com.caimei.model.vo.WxFileListVo;
-import com.caimei.service.FileService;
+import com.caimei.service.data.FileService;
 import com.caimei.utils.OSSUtils;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;

+ 3 - 10
src/main/java/com/caimei/service/impl/ImageServiceImpl.java → src/main/java/com/caimei/service/data/impl/ImageServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.data.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.caimei.mapper.ImageMapper;
@@ -6,10 +6,9 @@ import com.caimei.model.ResponseJson;
 import com.caimei.model.po.ImagePo;
 import com.caimei.model.vo.ImageFormVo;
 import com.caimei.model.vo.ImageListVo;
-import com.caimei.model.vo.WxArticleListVo;
 import com.caimei.model.vo.WxImageListVo;
-import com.caimei.service.ImageService;
-import com.caimei.service.UploadService;
+import com.caimei.service.data.ImageService;
+import com.caimei.service.auth.UploadService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
@@ -18,14 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.net.URI;
 import java.util.Date;
 import java.util.List;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
 
 /**
  * Description

+ 2 - 2
src/main/java/com/caimei/service/impl/VideoServiceImpl.java → src/main/java/com/caimei/service/data/impl/VideoServiceImpl.java

@@ -1,11 +1,11 @@
-package com.caimei.service.impl;
+package com.caimei.service.data.impl;
 
 import com.caimei.mapper.VideoMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.VideoPo;
 import com.caimei.model.vo.VideoListVo;
 import com.caimei.model.vo.WxVideoListVo;
-import com.caimei.service.VideoService;
+import com.caimei.service.data.VideoService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;

+ 55 - 0
src/main/java/com/caimei/service/sys/SysMenuService.java

@@ -0,0 +1,55 @@
+package com.caimei.service.sys;
+
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.SysMenuTree;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+public interface SysMenuService {
+    /**
+     * 获取菜单列表
+     * @param parentId 父级菜单Id
+     * @param menuType 菜单类型:1管理员菜单,2供应商菜单
+     * @param status   状态:0启用,1停用
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    ResponseJson<PageInfo<SysMenu>> getMenuList(Integer parentId, Integer menuType, Integer status, int pageNum, int pageSize);
+    /**
+     * 获取所有启用的菜单列表(树状结构返回)
+     */
+    ResponseJson<List<SysMenuTree>> getMenuTree();
+    /**
+     * 根据ID获取菜单
+     */
+    ResponseJson<SysMenu> getMenu(Integer id);
+    /**
+     * 根据ID更新菜单
+     */
+    ResponseJson<Void> updateMenu(Integer id, SysMenu menu);
+    /**
+     * 根据ID更新供应商菜单
+     */
+    ResponseJson<Void> updateShopMenu(SysMenu menu);
+    /**
+     * 根据ID(可选择的)更新菜单字段
+     */
+    ResponseJson<Void> updateMenuSelective(Integer id, SysMenu menu);
+    /**
+     * 添加菜单
+     */
+    ResponseJson<Void> addMenu(SysMenu menu);
+    /**
+     * 根据ID删除菜单
+     */
+    ResponseJson<Void> deleteMenu(Integer id);
+}

+ 41 - 0
src/main/java/com/caimei/service/sys/SysRoleService.java

@@ -0,0 +1,41 @@
+package com.caimei.service.sys;
+
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysRole;
+import com.github.pagehelper.PageInfo;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+public interface SysRoleService {
+    /**
+     * 获取角色列表
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    ResponseJson<PageInfo<SysRole>> getRoleList(int pageNum, int pageSize);
+    /**
+     * 根据ID获取角色
+     */
+    ResponseJson<SysRole> getRoleInfo(Integer id);
+    /**
+     * 根据ID更新角色
+     */
+    ResponseJson<Void> updateRole(Integer id, SysRole sysRole);
+    /**
+     * 添加角色
+     */
+    ResponseJson<Void> addRole(SysRole sysRole);
+    /**
+     * 根据ID删除角色
+     */
+    ResponseJson<Void> deleteRole(Integer id);
+    /**
+     * 角色授权菜单
+     */
+    ResponseJson<Void> setRoleMenu(Integer id, SysRole sysRole);
+}

+ 74 - 0
src/main/java/com/caimei/service/sys/SysUserService.java

@@ -0,0 +1,74 @@
+package com.caimei.service.sys;
+
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysUser;
+import com.github.pagehelper.PageInfo;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/2
+ */
+
+public interface SysUserService {
+    /**
+     * 获取用户信息
+     */
+    ResponseJson<SysUser> getInfoByUsername(String username);
+    /**
+     * 获取用户信息
+     */
+    ResponseJson<SysUser> getInfoByUserId(Integer id);
+    /**
+     * 退出登录
+     */
+    ResponseJson<Void> logout(String token);
+
+    /**
+     * 获取用户列表
+     *
+     * @param username 用户名
+     * @param linkName 联系人名称
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    ResponseJson<PageInfo<SysUser>> getUserList(String username, String linkName, int pageNum, int pageSize);
+    /**
+     * 根据ID获取用户
+     */
+    ResponseJson<SysUser> getUser(Integer id);
+    /**
+     * 根据ID更新用户
+     */
+    ResponseJson<Void> updateUser(Integer id, SysUser sysUser);
+    /**
+     * 添加用户
+     */
+//    ResponseJson<Void> addUser(SysUser sysUser);
+    /**
+     * 根据ID删除用户
+     */
+    ResponseJson<Void> deleteUser(Integer id);
+    /**
+     * 添加管理员
+     */
+    ResponseJson<Void> addAdmin(SysUser sysUser);
+
+    /*    *//**
+     * 用户修改资料
+     *//*
+    ResponseJson<Void> updateUserProfile(UserProfile profile);
+    */
+
+    /**
+     * 用户修改密码
+     *//*
+    ResponseJson<Void> updateUserPassword(UserProfile profile);*/
+
+    /**
+     * 保存用户角色关系
+     */
+    ResponseJson<Void> saveRoleRelation(Integer userId, String roleIds);
+}

+ 356 - 0
src/main/java/com/caimei/service/sys/impl/SysMenuServiceImpl.java

@@ -0,0 +1,356 @@
+package com.caimei.service.sys.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.mapper.SystemMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.SysMenuTree;
+import com.caimei.model.po.SysPermission;
+import com.caimei.model.po.SysRole;
+import com.caimei.service.sys.SysMenuService;
+import com.caimei.service.sys.SysRoleService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.alibaba.fastjson.JSON.parseArray;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+@Slf4j
+@Service
+public class SysMenuServiceImpl implements SysMenuService {
+
+    @Resource
+    private SystemMapper systemMapper;
+
+    @Resource
+    private SysRoleService sysRoleService;
+
+    /**
+     * 获取菜单列表
+     *
+     * @param parentId 父级菜单Id
+     * @param status   状态:0启用,1停用
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    @Override
+    public ResponseJson<PageInfo<SysMenu>> getMenuList(Integer parentId, Integer menuType, Integer status, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<SysMenu> menus = systemMapper.getMenuList(parentId, menuType, status);
+        PageInfo<SysMenu> pageData = new PageInfo<>(menus);
+        return ResponseJson.success(pageData);
+    }
+
+    /**
+     * 获取所有启用的菜单列表(树状结构返回)
+     */
+    @Override
+    public ResponseJson<List<SysMenuTree>> getMenuTree() {
+        List<SysMenuTree> menus = systemMapper.getMenuTree("0");
+        // 递归设置子菜单
+        setSubMenusData(menus);
+        return ResponseJson.success(menus);
+    }
+
+    /**
+     * 递归设置子菜单(树状结构)
+     */
+    private void setSubMenusData(List<SysMenuTree> menus) {
+        if (!CollectionUtils.isEmpty(menus)) {
+            for (SysMenuTree menu : menus) {
+                // 获取子菜单
+                List<SysMenuTree> submenus = systemMapper.getMenuTree(menu.getId());
+                if (!CollectionUtils.isEmpty(submenus)) {
+                    setSubMenusData(submenus);
+                    menu.setSubMenus(submenus);
+                } else {
+                    // 获取当前菜单的按钮权限
+                    List<SysMenuTree> permissions = systemMapper.getTreePermissions(menu.getId());
+                    if (!CollectionUtils.isEmpty(permissions)) {
+                        menu.setSubMenus(permissions);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 根据ID获取菜单
+     */
+    @Override
+    public ResponseJson<SysMenu> getMenu(Integer id) {
+        SysMenu menu = systemMapper.getMenu(id);
+        // 获取按钮权限
+        List<SysPermission> permissions = systemMapper.getPermissionList(menu.getId());
+        if (!CollectionUtils.isEmpty(permissions)) {
+            menu.setPermissions(permissions);
+        }
+        return ResponseJson.success(menu);
+    }
+
+    /**
+     * 根据ID更新菜单
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> updateMenu(Integer id, SysMenu menu) {
+        menu.setId(id);
+        menu.setDelFlag(0);
+        systemMapper.updateMenu(menu);
+        // 移除菜单与供应商基础角色的关联
+        removeShopRoleRelation(menu.getId());
+        if (2 == menu.getMenuType() && 1 == menu.getBaseFlag() && 0 == menu.getParentId()) {
+            // 供应商基础菜单
+            addShopRoleRelation(menu.getId());
+        } else if (2 == menu.getMenuType() && 0 == menu.getBaseFlag() && 0 == menu.getParentId()) {
+            // 供应商会员菜单
+            ResponseJson<Void> result = saveVipRole(menu);
+            if (0 != result.getCode()) {
+                return result;
+            }
+        }
+        // 按钮权限JSON数据解析
+        ResponseJson<Void> error = parsePermissionJson(menu.getId(), menu.getPermissionJson());
+        if (error != null) {
+            return error;
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 根据ID更新供应商菜单
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> updateShopMenu(SysMenu menu) {
+        systemMapper.updateShopMenu(menu);
+        // 移除菜单与供应商基础角色的关联
+        removeShopRoleRelation(menu.getId());
+        if (1 == menu.getBaseFlag()) {
+            // 供应商基础菜单
+            addShopRoleRelation(menu.getId());
+        } else if (0 == menu.getBaseFlag()) {
+            // 供应商会员菜单
+            ResponseJson<Void> result = saveVipRole(menu);
+            if (0 != result.getCode()) {
+                return result;
+            }
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 根据ID(可选择的)更新菜单字段
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> updateMenuSelective(Integer id, SysMenu menu) {
+        SysMenu dbMenu = systemMapper.getMenu(id);
+        if (StringUtils.hasLength(menu.getTitle())){
+            dbMenu.setTitle(menu.getTitle());
+        }
+        if (StringUtils.hasLength(menu.getName())){
+            dbMenu.setName(menu.getName());
+        }
+        if (StringUtils.hasLength(menu.getIcon())){
+            dbMenu.setIcon(menu.getIcon());
+        }
+        if (null != menu.getParentId()){
+            dbMenu.setParentId(menu.getParentId());
+        }
+        if (null != menu.getSort()){
+            dbMenu.setSort(menu.getSort());
+        }
+        if (null != menu.getHidden()){
+            dbMenu.setHidden(menu.getHidden());
+        }
+        if (null != menu.getStatus()){
+            dbMenu.setStatus(menu.getStatus());
+        }
+        systemMapper.updateMenu(dbMenu);
+        // 按钮权限JSON数据解析
+        ResponseJson<Void> error = parsePermissionJson(menu.getId(), menu.getPermissionJson());
+        if (error != null) {
+            return error;
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 添加菜单
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> addMenu(SysMenu menu) {
+        if (null == menu.getParentId()) {
+            menu.setParentId(0);
+        }
+        if (!StringUtils.hasLength(menu.getName())) {
+            return ResponseJson.error("菜单路由名不能为空!", null);
+        }
+        if (!StringUtils.hasLength(menu.getTitle())) {
+            return ResponseJson.error("菜单名称不能为空!", null);
+        }
+        // 根据路由名称查询菜单
+        SysMenu dbMenu = systemMapper.getMenuByName(menu.getName());
+        if (null == dbMenu) {
+            // 按钮权限JSON数据解析
+            ResponseJson<Void> error = parsePermissionJson(menu.getId(), menu.getPermissionJson());
+            if (error != null) {
+                return error;
+            }
+            systemMapper.insertMenu(menu);
+            if (2 == menu.getMenuType()) {
+                if (0 == menu.getParentId()) {
+                    // 首层菜单
+                    if (1 == menu.getBaseFlag()) {
+                        // 会员基础菜单
+                        addShopRoleRelation(menu.getId());
+                    } else {
+                        // 会员订制菜单
+                        ResponseJson<Void> result = saveVipRole(menu);
+                        if (0 != result.getCode()) {
+                            systemMapper.deleteMenu(menu.getId());
+                            return result;
+                        }
+                    }
+                } else {
+                    // 母菜单为会员基础菜单
+
+                    // 母菜单为会员订制菜单
+                }
+            }
+        }else {
+            return ResponseJson.error("菜单路由名已存在", null);
+        }
+        return ResponseJson.success();
+    }
+
+    private ResponseJson<Void> saveVipRole(SysMenu menu) {
+        // 保存会员菜单角色
+        SysRole vipMenuRole = new SysRole();
+        vipMenuRole.setRoleName(menu.getTitle() + "会员菜单角色");
+        vipMenuRole.setRoleDesc(menu.getTitle() + "会员菜单角色");
+        vipMenuRole.setMenuIds(menu.getId().toString());
+        vipMenuRole.setRoleType(2);
+        Integer dbVipRoleId = systemMapper.getVipRoleIdByMenuId(menu.getId());
+        if (null == dbVipRoleId) {
+            return sysRoleService.addRole(vipMenuRole);
+        } else {
+            return sysRoleService.updateRole(dbVipRoleId, vipMenuRole);
+        }
+    }
+
+    private void addShopRoleRelation(Integer menuId) {
+        // 添加供应商基础菜单时将该菜单与供应商基础角色关联
+        ResponseJson<SysRole> roleInfo = sysRoleService.getRoleInfo(2);
+        SysRole vipBaseRole = roleInfo.getData();
+        String menuIds = vipBaseRole.getMenuIds();
+        if (!menuIds.contains(menuId.toString())) {
+            menuIds += "," + menuId;
+            vipBaseRole.setMenuIds(menuIds);
+            sysRoleService.updateRole(2, vipBaseRole);
+        }
+    }
+
+    private void removeShopRoleRelation(Integer menuId) {
+        ResponseJson<SysRole> roleInfo = sysRoleService.getRoleInfo(2);
+        SysRole vipBaseRole = roleInfo.getData();
+        String menuIds = vipBaseRole.getMenuIds();
+        if (menuIds.contains(menuId.toString())) {
+            menuIds = menuIds.replace("," + menuId, "");
+            menuIds = menuIds.replace(menuId.toString(), "");
+            vipBaseRole.setMenuIds(menuIds);
+            sysRoleService.updateRole(2, vipBaseRole);
+        }
+    }
+
+    /**
+     * 根据ID删除菜单
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> deleteMenu(Integer id) {
+        systemMapper.deleteMenu(id);
+        // 删除该菜单对应的会员角色和关联
+        Integer vipRoleId = systemMapper.getVipRoleIdByMenuId(id);
+        if (null != vipRoleId) {
+            systemMapper.deleteRole(vipRoleId);
+            systemMapper.deleteRoleMenuRelation(vipRoleId);
+        }
+        List<Integer> permissionIds = systemMapper.getPermissionIds(id);
+        // 删除该菜单权限按钮
+        for (Integer permissionId : permissionIds) {
+           systemMapper.deletePermission(permissionId);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 按钮权限JSON数据解析
+     * @param menuId 菜单Id
+     * @param jsonStr 按钮权限JSON串
+     */
+    private ResponseJson<Void> parsePermissionJson(Integer menuId, String jsonStr) {
+        // 按钮权限JSON数据解析
+        JSONArray permissionJson = null;
+        List<SysPermission> permissionList = new ArrayList<>();
+        if (StringUtils.hasLength(jsonStr) && !"[]".equals(jsonStr)) {
+            try {
+                permissionJson = parseArray(jsonStr);
+                if (null != permissionJson && !permissionJson.isEmpty()) {
+                    return ResponseJson.error("按钮权限JSON数据异常!", null);
+                }
+                for (Object permissionObject : permissionJson) {
+                    JSONObject detail = (JSONObject) permissionObject;
+                    Integer permissionId = (Integer) detail.get("id");
+                    String permissionName = (String) detail.get("name");
+                    String permissionTitle = (String) detail.get("title");
+                    SysPermission item = new SysPermission();
+                    item.setId(permissionId);
+                    item.setMenuId(menuId);
+                    item.setName(permissionName);
+                    item.setTitle(permissionTitle);
+                    permissionList.add(item);
+                }
+            } catch (Exception e) {
+                log.error("按钮权限JSON数据解析异常try-catch:", e);
+                return ResponseJson.error("按钮权限JSON数据解析异常!", null);
+            }
+        }
+        List<Integer> dbPermissionIds = systemMapper.getPermissionIds(menuId);
+        List<Integer> permissionIds = new ArrayList<>();
+        for (SysPermission permission : permissionList) {
+            if (null != permission.getId() && permission.getId() > 0 && dbPermissionIds.contains(permission.getId())) {
+                systemMapper.updatePermission(permission);
+                permissionIds.add(permission.getId());
+            } else {
+                systemMapper.insertPermission(permission);
+            }
+        }
+        for (Integer id : dbPermissionIds) {
+            if (!permissionIds.contains(id)){
+                systemMapper.deletePermission(id);
+            }
+        }
+        return null;
+    }
+
+
+
+}

+ 165 - 0
src/main/java/com/caimei/service/sys/impl/SysRoleServiceImpl.java

@@ -0,0 +1,165 @@
+package com.caimei.service.sys.impl;
+
+import com.caimei.mapper.SystemMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysRole;
+import com.caimei.service.sys.SysRoleService;
+import com.caimei.utils.CommonUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+@Slf4j
+@Service
+public class SysRoleServiceImpl implements SysRoleService {
+
+    @Resource
+    private SystemMapper systemMapper;
+
+    /**
+     * 获取角色列表
+     *
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    @Override
+    public ResponseJson<PageInfo<SysRole>> getRoleList(int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<SysRole> roles = systemMapper.getRoleList();
+        PageInfo<SysRole> pageData = new PageInfo<>(roles);
+        return ResponseJson.success(pageData);
+    }
+
+    /**
+     * 根据ID获取角色
+     */
+    @Override
+    public ResponseJson<SysRole> getRoleInfo(Integer id) {
+        SysRole sysRole = getRole(id);
+        if (null != sysRole) {
+            // 根据角色ID获取菜单Ids
+            List<Integer> menuIdList = systemMapper.getMenuIdsByRoleId(id);
+            String menuIds = CommonUtil.idListToString(menuIdList, ",");
+            // 根据角色ID获取(权限-菜单)Ids
+            List<String> permissionIdList = systemMapper.getPermissionMenuIdsByRoleId(id);
+            StringBuilder ids = new StringBuilder(menuIds);
+            for (String permissionId : permissionIdList) {
+                ids.append(",").append(permissionId);
+            }
+            sysRole.setMenuIds(ids.toString());
+        }
+        return ResponseJson.success(sysRole);
+    }
+
+    private SysRole getRole(Integer id) {
+        return systemMapper.getRole(id);
+    }
+
+    /**
+     * 根据ID更新角色
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> updateRole(Integer id, SysRole sysRole) {
+        sysRole.setId(id);
+        sysRole.setDelFlag(0);
+        // 删除原有角色菜单关联
+        systemMapper.deleteRoleMenuRelation(id);
+        // 菜单Ids,用","隔开
+        String menuIds = sysRole.getMenuIds();
+        systemMapper.updateRole(sysRole);
+        // 保存角色菜单关系
+        saveRoleMenuRelation(sysRole.getId(), menuIds);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 添加角色
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> addRole(SysRole sysRole) {
+        if (StringUtils.hasLength(sysRole.getRoleName())) {
+            // 查询是否存在当前角色
+            SysRole dbRole  = systemMapper.getRoleByRoleName(sysRole.getRoleName());
+            if (null == dbRole) {
+                String menuIds = sysRole.getMenuIds();
+                // 保存角色
+                sysRole.setRoleType(null == sysRole.getRoleType() ? 1 : sysRole.getRoleType());
+                systemMapper.insertRole(sysRole);
+                // 保存角色菜单关系
+                saveRoleMenuRelation(sysRole.getId(), menuIds);
+                return ResponseJson.success();
+            }else {
+                return ResponseJson.error("角色名已存在", null);
+            }
+        }
+        return ResponseJson.error("角色名称不能为空", null);
+    }
+
+    /**
+     * 根据ID删除角色
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> deleteRole(Integer id) {
+        // 删除角色菜单关联
+        systemMapper.deleteRoleMenuRelation(id);
+        // 删除原有角色权限关联
+        systemMapper.deleteRolePermissionRelation(id);
+        // 删除角色
+        systemMapper.deleteRole(id);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 角色授权菜单
+     */
+    @Override
+    public ResponseJson<Void> setRoleMenu(Integer id, SysRole sysRole) {
+        // 删除原有角色菜单关联
+        systemMapper.deleteRoleMenuRelation(id);
+        // 保存角色菜单关系
+        String menuIds = sysRole.getMenuIds();
+        saveRoleMenuRelation(id, menuIds);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 保存角色菜单关系
+     */
+    private void saveRoleMenuRelation(Integer roleId, String menuIds) {
+        if (StringUtils.hasLength(menuIds)) {
+            // 删除原有角色菜单关联
+            systemMapper.deleteRoleMenuRelation(roleId);
+            // 删除原有角色权限关联
+            systemMapper.deleteRolePermissionRelation(roleId);
+            // 设置角色菜单
+            String[] split = menuIds.split(",");
+            for (String s : split) {
+                if (StringUtils.hasLength(s)) {
+                    if (s.contains("-")) {
+                        // 保存角色权限关系
+                        String[] ids = s.split("-");
+                        systemMapper.insertRolePermissionRelation(roleId, Integer.valueOf(ids[0]));
+                    } else {
+                        // 保存角色菜单关系
+                        systemMapper.insertRoleMenuRelation(roleId, Integer.valueOf(s));
+                    }
+                }
+            }
+        }
+    }
+}

+ 310 - 0
src/main/java/com/caimei/service/sys/impl/SysUserServiceImpl.java

@@ -0,0 +1,310 @@
+package com.caimei.service.sys.impl;
+
+import com.caimei.components.RedisService;
+import com.caimei.mapper.SystemMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.SysRole;
+import com.caimei.model.po.SysUser;
+import com.caimei.service.sys.SysUserService;
+import com.caimei.utils.CommonUtil;
+import com.caimei.utils.Md5Util;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/12/10
+ */
+@Service
+public class SysUserServiceImpl implements SysUserService {
+
+    @Resource
+    private SystemMapper systemMapper;
+
+    /*@Resource
+    private BCryptPasswordEncoder bCryptPasswordEncoder;*/
+
+    @Resource
+    private RedisService redisService;
+
+    /**
+     * 获取用户信息
+     */
+    @Override
+    public ResponseJson<SysUser> getInfoByUsername(String username) {
+        if (StringUtils.hasLength(username)) {
+            SysUser sysUser = systemMapper.findByUsername(username);
+            if (null != sysUser) {
+                List<Integer> roleIds = setUserRoleInfo(sysUser);
+                List<SysMenu> menus = null;
+                if (!CollectionUtils.isEmpty(roleIds)) {
+                    // 根据角色Id获取菜单列表
+                    menus = systemMapper.getMenusByRoleIds(roleIds);
+                    // 根据角色Id获取按钮权限列表
+                    List<String> permissions = systemMapper.getPermissionNames(roleIds);
+                    sysUser.setPermissions(permissions);
+                }
+                sysUser.setMenus(menus);
+            }
+
+            return ResponseJson.success(sysUser);
+        }
+        return ResponseJson.error("用户数据异常", null);
+    }
+
+    /**
+     * 获取用户信息
+     */
+    @Override
+    public ResponseJson<SysUser> getInfoByUserId(Integer id) {
+        if (null == id) {
+            return ResponseJson.error("用户id不能为空", null);
+        }
+        SysUser sysUser = systemMapper.findByUserId(id);
+        if (null != sysUser) {
+            List<Integer> roleIds = setUserRoleInfo(sysUser);
+            List<SysMenu> menus = null;
+            if (!CollectionUtils.isEmpty(roleIds)) {
+                // 根据角色Id获取菜单列表
+                menus = systemMapper.getMenusByRoleIds(roleIds);
+                // 根据角色Id获取按钮权限列表
+                List<String> permissions = systemMapper.getPermissionNames(roleIds);
+                sysUser.setPermissions(permissions);
+            }
+            sysUser.setMenus(menus);
+        }
+        return ResponseJson.success(sysUser);
+    }
+
+    private List<Integer> setUserRoleInfo(SysUser sysUser) {
+        List<Integer> roleIds = new ArrayList<>();
+        if (null != sysUser) {
+            List<String> roleNames = new ArrayList<>();
+            StringBuilder roleDesc = new StringBuilder();
+            // 根据用户Id获取用户角色列表
+            List<SysRole> roleList = systemMapper.getRoleListByUserId(sysUser.getId());
+            if (!CollectionUtils.isEmpty(roleList)) {
+                for (SysRole role : roleList) {
+                    if (null != role) {
+                        roleNames.add(role.getRoleName());
+                        roleDesc.append(role.getRoleDesc()).append(" ");
+                        roleIds.add(role.getId());
+                    }
+                }
+            }
+            sysUser.setRoles(roleNames);
+            sysUser.setRoleDesc(roleDesc.toString());
+        }
+        return roleIds;
+    }
+
+    /**
+     * 退出登录
+     */
+    @Override
+    public ResponseJson<Void> logout(String token) {
+        if (StringUtils.hasLength(token)) {
+            redisService.remove(token);
+        }
+        return ResponseJson.success();
+    }
+
+    /**
+     * 获取用户列表
+     *
+     * @param username 用户名
+     * @param linkName 姓名
+     * @param pageNum  页码
+     * @param pageSize 每页大小
+     */
+    @Override
+    public ResponseJson<PageInfo<SysUser>> getUserList(String username, String linkMan, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<SysUser> userList = systemMapper.getUserList(username, linkMan);
+        for (SysUser sysUser : userList) {
+            List<Integer> roleIdList = setUserRoleInfo(sysUser);
+            String roleIds = CommonUtil.idListToString(roleIdList, ",");
+            sysUser.setRoleIds(roleIds);
+        }
+        PageInfo<SysUser> pageData = new PageInfo<>(userList);
+        return ResponseJson.success(pageData);
+    }
+
+    /**
+     * 根据ID获取用户
+     */
+    @Override
+    public ResponseJson<SysUser> getUser(Integer id) {
+        SysUser sysUser = systemMapper.getUser(id);
+        sysUser.setPassword("");
+        List<Integer> roleIdList = setUserRoleInfo(sysUser);
+        String roleIds = CommonUtil.idListToString(roleIdList, ",");
+        sysUser.setRoleIds(roleIds);
+        return ResponseJson.success(sysUser);
+    }
+
+    /**
+     * 根据ID更新用户
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> updateUser(Integer id, SysUser sysUser) {
+        sysUser.setId(id);
+        if (StringUtils.hasLength(sysUser.getPassword())){
+            // 密码加密
+            String encodePassword = Md5Util.md5(sysUser.getPassword());
+            sysUser.setPassword(encodePassword);
+        }
+        // 删除原有角色关联
+        systemMapper.deleteUserRoleRelation(id);
+        // 前端传入角色Ids,用","隔开
+        String roleIds = sysUser.getRoleIds();
+        // 保存用户角色关系
+        saveRoleRelation(sysUser.getId(), roleIds);
+        systemMapper.updateSysUser(sysUser);
+        return ResponseJson.success();
+    }
+
+    /**
+     * 添加用户
+     */
+    /*@Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> addUser(SysUser sysUser) {
+        if (StringUtils.hasLength(sysUser.getUsername()) && StringUtils.hasLength(sysUser.getPassword())) {
+            // 查询是否存在当前用户名的用户
+            SysUser dbUser = systemMapper.findByUsername(sysUser.getUsername());
+            if (null == dbUser) {
+                // 密码加密
+                String encodePassword = bCryptPasswordEncoder.encode(sysUser.getPassword());
+                sysUser.setPassword(encodePassword);
+                // 新增用户
+                systemMapper.insertSysUser(sysUser);
+                // 角色Ids,用","隔开
+                String roleIds = sysUser.getRoleIds();
+                // 保存用户角色关系
+                saveRoleRelation(sysUser.getId(), roleIds);
+                return ResponseJson.success("添加用户成功", null);
+            } else {
+                return ResponseJson.error("用户名已存在", null);
+            }
+        }
+        return ResponseJson.error("用户名或密码不能为空", null);
+    }*/
+
+    /**
+     * 根据ID删除用户
+     */
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> deleteUser(Integer id) {
+        // 删除用户角色关联
+        systemMapper.deleteUserRoleRelation(id);
+        // 删除用户
+        systemMapper.deleteSysUser(id);
+        return ResponseJson.success();
+    }
+
+    @Transactional(rollbackFor=Exception.class)
+    @Override
+    public ResponseJson<Void> addAdmin(SysUser sysUser) {
+        if (StringUtils.hasLength(sysUser.getUsername()) && StringUtils.hasLength(sysUser.getPassword())) {
+            // 查询是否存在当前用户名的用户
+            SysUser dbUser = systemMapper.findByUsername(sysUser.getUsername());
+            if (null == dbUser) {
+                // 密码加密
+                String encodePassword = Md5Util.md5(sysUser.getPassword());
+                sysUser.setPassword(encodePassword);
+                // 新增用户
+                systemMapper.insertAdminUser(sysUser);
+                // 角色Ids,用","隔开
+                String roleIds = sysUser.getRoleIds();
+                // 保存用户角色关系
+                saveRoleRelation(sysUser.getId(), roleIds);
+                return ResponseJson.success("添加管理员成功", null);
+            } else {
+                return ResponseJson.error("用户名已存在", null);
+            }
+        }
+        return ResponseJson.error("用户名或密码不能为空", null);
+    }
+
+    /**
+     * 保存用户角色关系
+     */
+    @Override
+    public ResponseJson<Void> saveRoleRelation(Integer userId, String roleIds) {
+        if (StringUtils.hasLength(roleIds)) {
+            // 设置用户角色
+            String[] split = roleIds.split(",");
+            for (String s : split) {
+                if (StringUtils.hasLength(s)) {
+                    // 保存用户角色关系
+                    systemMapper.insertUserRoleRelation(userId, Integer.valueOf(s));
+                }
+            }
+        }
+        return ResponseJson.success();
+    }
+/*
+    *//**
+     * 用户修改资料
+     *//*
+    @Override
+    public ResponseJson<Void> updateUserProfile(UserProfile profile) {
+        SysUser sysUser = systemMapper.getUser(profile.getUserId());
+        if (null == sysUser) {
+            return ResponseJson.error("用户异常!", null);
+        }
+        if (StringUtils.hasLength(profile.getUsername())){
+            sysUser.setUsername(profile.getUsername());
+        }
+        if (StringUtils.hasLength(profile.getFullName())){
+            sysUser.setFullName(profile.getFullName());
+        }
+        if (StringUtils.hasLength(profile.getPhone())){
+            sysUser.setPhone(profile.getPhone());
+        }
+        if (StringUtils.hasLength(profile.getAvatar())){
+            sysUser.setAvatar(profile.getAvatar());
+        }
+        systemMapper.updateSysUser(sysUser);
+        return ResponseJson.success();
+    }
+
+    *//**
+     * 用户修改密码
+     *//*
+    @Override
+    public ResponseJson<Void> updateUserPassword(UserProfile profile) {
+        SysUser sysUser = systemMapper.getUser(profile.getUserId());
+        if (null == sysUser) {
+            return ResponseJson.error("用户异常!", null);
+        }
+        if (!StringUtils.hasLength(profile.getPassword())){
+            return ResponseJson.error("新密码不能为空!", null);
+        }
+        if (!profile.getPassword().equals(profile.getConfirmPassword())){
+            return ResponseJson.error("两次密码输入不一致!", null);
+        }
+        if (!bCryptPasswordEncoder.matches(profile.getOldPassword(), sysUser.getPassword())) {
+            return ResponseJson.error("旧密码输入错误!", null);
+        }
+        // 密码加密
+        String encodePassword = bCryptPasswordEncoder.encode(profile.getPassword());
+        sysUser.setPassword(encodePassword);
+        systemMapper.updateSysUser(sysUser);
+        return ResponseJson.success();
+    }*/
+}

+ 88 - 0
src/main/java/com/caimei/service/vip/VipService.java

@@ -0,0 +1,88 @@
+package com.caimei.service.vip;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.vo.*;
+import com.github.pagehelper.PageInfo;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/5/11
+ */
+public interface VipService {
+
+    /**
+     * 在线支付开通会员
+     *
+     * @param authUserId
+     * @param packageId
+     * @param services
+     * @return
+     */
+    ResponseJson<Integer> payVip(Integer authUserId, Integer packageId, String services, Integer payWay, Integer payStatus, Date payTime);
+
+    /**
+     * 配置vip套餐/订制服务
+     * @param packageList
+     * @param serviceList
+     * @return
+     */
+    ResponseJson configureVip(List<Map<String,Object>> packageList, List<Map<String, String>> serviceList);
+
+    /**
+     * vip套餐/订制服务回显数据
+     * @return
+     */
+    ResponseJson<VipConfigurationVo> configureVipForm();
+
+    /**
+     * 会员列表
+     * @return
+     */
+    ResponseJson<PageInfo<VipListVo>> vipList(String shopName, Integer shopType, Integer vipStatus, String mobile, String linkMan, Integer pageNum, Integer pageSize);
+
+    /**
+     * 会员购买记录
+     */
+    ResponseJson<PageInfo<VipHistoryListVo>> vipHistoryList(Integer authUserId, Integer vipPackageId, Integer vipStatus, String payBeginTime, String payEndTime, String endBeginTime, String endEndTime, Integer pageNum, Integer pageSize);
+
+    /**
+     * 查询会员数据
+     */
+    ResponseJson<VipInfoVo> getVipInfo(Integer authUserId);
+
+    /**
+     * 会员套餐列表
+     * @return
+     */
+    ResponseJson<List<VipPackageVo>> vipPackageList();
+
+    /**
+     * 会员服务配置表单
+     * @return
+     */
+    ResponseJson<Map<String, Object>> vipMenusForm();
+
+    /**
+     * 配置会员服务
+     * @param baseMenuList
+     * @param upMenuList
+     */
+    ResponseJson vipMenusConfigure(List<Map<String, Object>> baseMenuList, List<Map<String, Object>> upMenuList);
+
+    /**
+     * 单独订制供应商会员服务表单
+     */
+    ResponseJson<List<SysMenu>> vipServicesForm(Integer authUserId);
+
+    /**
+     * 单独订制供应商会员服务
+     */
+    ResponseJson vipServicesConfigure(Integer authUserId, String roleIds);
+}

+ 264 - 0
src/main/java/com/caimei/service/vip/impl/VipServiceImpl.java

@@ -0,0 +1,264 @@
+package com.caimei.service.vip.impl;
+
+import com.caimei.mapper.SystemMapper;
+import com.caimei.mapper.VipMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.PackageDto;
+import com.caimei.model.po.AuthVipPo;
+import com.caimei.model.po.SysMenu;
+import com.caimei.model.po.VipHistoryPo;
+import com.caimei.model.vo.*;
+import com.caimei.service.sys.SysMenuService;
+import com.caimei.service.sys.SysUserService;
+import com.caimei.service.vip.VipService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/5/11
+ */
+@Slf4j
+@Service
+public class VipServiceImpl implements VipService {
+    @Resource
+    private VipMapper vipMapper;
+    @Resource
+    private SystemMapper systemMapper;
+    @Resource
+    private SysMenuService sysMenuService;
+    @Resource
+    private SysUserService sysUserService;
+
+    @Override
+    public ResponseJson<Integer> payVip(Integer authUserId, Integer packageId, String services, Integer payWay, Integer payStatus, Date payTime) {
+        // 查询购买套餐信息
+        VipPackageVo packageVo = vipMapper.getVipPackageById(packageId);
+        if (null == packageVo) {
+            return ResponseJson.error("会员套餐不存在", null);
+        }
+        // 会员生效日期
+        Date beginTime = new Date();
+        /*
+         * 构建会员信息
+         */
+        AuthVipPo authVip = new AuthVipPo();
+        AuthVipPo dbAuthVip = vipMapper.getAuthVipInfo(authUserId);
+        if (null != dbAuthVip) {
+            authVip.setId(dbAuthVip.getId());
+            if (dbAuthVip.getEndTime().compareTo(beginTime) > 0) {
+                // 有效期内续费,用原结束时间作为开始时间来计算结束时间
+                beginTime = dbAuthVip.getEndTime();
+            } else {
+                // 过期重新续费,重置生效时间
+                authVip.setBeginTime(beginTime);
+            }
+        } else {
+            // 新会员
+            authVip.setBeginTime(beginTime);
+        }
+        // 计算会员到期时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(beginTime);
+        calendar.add(1 == packageVo.getUnit() ? Calendar.MONTH : Calendar.YEAR, packageVo.getDuration());
+        Date endTime = calendar.getTime();
+        // 查询未支付的当前会员套餐购买记录
+        Integer dbHistoryId = vipMapper.getVipHistoryId(authUserId, packageId);
+        VipHistoryPo vipHistory = new VipHistoryPo();
+        vipHistory.setAuthUserId(authUserId);
+        vipHistory.setPackageId(packageId);
+        vipHistory.setDuration(packageVo.getDuration() + (1 == packageVo.getUnit() ? "月" : "年"));
+        vipHistory.setBeginTime(beginTime);
+        vipHistory.setEndTime(endTime);
+        vipHistory.setPayStatus(payStatus);
+        vipHistory.setPayWay(payWay);
+        vipHistory.setPrice(packageVo.getPrice());
+        vipHistory.setServices(services);
+        vipHistory.setPayTime(payTime);
+        if (null != dbHistoryId) {
+            vipHistory.setId(dbHistoryId);
+            // 更新未支付的当前会员购买记录
+            vipMapper.updateVipHistory(vipHistory);
+        } else {
+            // 新增会员购买记录
+            vipMapper.insertVipHistory(vipHistory);
+        }
+        if (2 == payWay) {
+            // 赠送会员保存会员信息
+            authVip.setAuthUserId(authUserId);
+            authVip.setUpdateTime(new Date());
+            authVip.setEndTime(endTime);
+            authVip.setDelFlag(0);
+            if (null != authVip.getId()) {
+                // 更新会员信息
+                vipMapper.updateAuthVipInfo(authVip);
+                if (authVip.getBeginTime().compareTo(beginTime) >= 0) {
+                    // 删除原有角色关联
+                    systemMapper.deleteUserRoleRelation(authUserId);
+                    // 续费重新分配角色
+                    sysUserService.saveRoleRelation(authUserId, "1,2");
+                }
+            } else {
+                // 新增会员信息
+                vipMapper.insertAuthVipInfo(authVip);
+                // 删除原有角色关联
+                systemMapper.deleteUserRoleRelation(authUserId);
+                // 分配角色
+                sysUserService.saveRoleRelation(authUserId, "1,2");
+            }
+        }
+        if (null != vipHistory.getId() && vipHistory.getId() > 0) {
+            return ResponseJson.success(vipHistory.getId());
+        }
+        return ResponseJson.error("支付开通会员异常!", null);
+    }
+
+    @Override
+    public ResponseJson configureVip(List<Map<String,Object>> packageList, List<Map<String, String>> serviceList) {
+        // 删除原有的套餐及订制服务
+        vipMapper.deleteVipPackages();
+        vipMapper.deleteVipServices();
+        // 保存套餐及订制服务
+        packageList.forEach(pac->{
+            PackageDto packageDto = new PackageDto();
+            packageDto.setDuration(Integer.parseInt(pac.get("duration").toString()));
+            packageDto.setUnit(Integer.parseInt(pac.get("unit").toString()));
+            packageDto.setOriginalPrice(new BigDecimal(pac.get("originalPrice").toString()) );
+            packageDto.setPrice(new BigDecimal(pac.get("price").toString()));
+            vipMapper.insertVipPackage(packageDto);
+        });
+        serviceList.forEach(service -> vipMapper.insertVipService(service.get("name")));
+        return ResponseJson.success();
+    }
+
+    @Override
+    public ResponseJson<VipConfigurationVo> configureVipForm() {
+        List<VipPackageVo> packageList = vipMapper.getVipPackageList();
+        List<VipServiceVo> serviceList = vipMapper.getVipServiceList();
+        VipConfigurationVo vipConfiguration = new VipConfigurationVo();
+        vipConfiguration.setPackageList(packageList);
+        vipConfiguration.setServiceList(serviceList);
+        return ResponseJson.success(vipConfiguration);
+    }
+
+    @Override
+    public ResponseJson<PageInfo<VipListVo>> vipList(String shopName, Integer shopType, Integer vipStatus, String mobile, String linkMan, Integer pageNum, Integer pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<VipListVo> vipList = vipMapper.getVipList(shopName, shopType, vipStatus, mobile, linkMan);
+        PageInfo<VipListVo> pageData = new PageInfo<>(vipList);
+        return ResponseJson.success(pageData);
+    }
+
+    @Override
+    public ResponseJson<PageInfo<VipHistoryListVo>> vipHistoryList(Integer authUserId, Integer vipPackageId, Integer vipStatus, String payBeginTime, String payEndTime, String endBeginTime, String endEndTime, Integer pageNum, Integer pageSize) {
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,供应商用户id不能为空", null);
+        }
+        PageHelper.startPage(pageNum, pageSize);
+        List<VipHistoryListVo> vipHistoryList = vipMapper.getVipHistoryList(authUserId, vipPackageId, vipStatus, payBeginTime, payEndTime, endBeginTime, endEndTime);
+        PageInfo<VipHistoryListVo> pageData = new PageInfo<>(vipHistoryList);
+        return ResponseJson.success(pageData);
+    }
+
+    @Override
+    public ResponseJson<VipInfoVo> getVipInfo(Integer authUserId) {
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,供应商用户id不能为空", null);
+        }
+        VipInfoVo vipInfo = vipMapper.getVipInfo(authUserId);
+        if (null == vipInfo) {
+            return ResponseJson.error("供应商用户不存在", null);
+        }
+        Integer freeDayLeft = vipInfo.getFreeDayLeft();
+        vipInfo.setFreeUseFlag(freeDayLeft > 0 ? 1 : 0);
+        vipInfo.setTipType(0);
+        if (0 == vipInfo.getVipStatus()) {
+            // 会员到期
+            vipInfo.setTipType(4);
+        } else if (1 == vipInfo.getVipStatus() && vipInfo.getEndDayLeft() <= 30) {
+            // 会员即将到期
+            vipInfo.setTipType(3);
+        } else if (3 == vipInfo.getVipStatus()) {
+            if (freeDayLeft > 0 && freeDayLeft <= 30) {
+                // 试用即将到期
+                vipInfo.setTipType(1);
+            } else if (freeDayLeft < 0) {
+                // 试用到期
+                vipInfo.setTipType(2);
+            }
+        }
+        return ResponseJson.success(vipInfo);
+    }
+
+    @Override
+    public ResponseJson<List<VipPackageVo>> vipPackageList() {
+        List<VipPackageVo> vipPackageList = vipMapper.getVipPackageList();
+        return ResponseJson.success(vipPackageList);
+    }
+
+    @Override
+    public ResponseJson<Map<String, Object>> vipMenusForm() {
+        HashMap<String, Object> map = new HashMap<>();
+        List<SysMenu> baseMenuList = vipMapper.getBaseMenuList();
+        List<SysMenu> upMenuList = vipMapper.getUpMenuList();
+        map.put("baseMenuList", baseMenuList);
+        map.put("upMenuList", upMenuList);
+        return ResponseJson.success(map);
+    }
+
+    @Override
+    public ResponseJson vipMenusConfigure(List<Map<String, Object>> baseMenuList, List<Map<String, Object>> upMenuList) {
+        baseMenuList.forEach(menu->{
+            SysMenu baseMenu = new SysMenu();
+            baseMenu.setBaseFlag(1);
+            baseMenu.setId(Integer.parseInt(menu.get("id").toString()));
+            baseMenu.setStatus(Integer.parseInt(menu.get("status").toString()));
+            baseMenu.setTitle(menu.get("title").toString());
+            sysMenuService.updateShopMenu(baseMenu);
+        });
+        upMenuList.forEach(menu->{
+            SysMenu upMenu = new SysMenu();
+            upMenu.setBaseFlag(0);
+            upMenu.setId(Integer.parseInt(menu.get("id").toString()));
+            upMenu.setStatus(Integer.parseInt(menu.get("status").toString()));
+            upMenu.setTitle(menu.get("title").toString());
+            sysMenuService.updateShopMenu(upMenu);
+        });
+        return ResponseJson.success();
+    }
+
+    @Override
+    public ResponseJson<List<SysMenu>> vipServicesForm(Integer authUserId) {
+        List<SysMenu> vipServiceList = systemMapper.getVipMenuList();
+        List<Integer> vipRoleList = systemMapper.getVipRoleIdList(authUserId);
+        vipServiceList.forEach(vipService->{
+            vipService.setCheckFlag(0);
+            vipRoleList.forEach(roleId->{
+                if (roleId.equals(vipService.getRoleId())) {
+                    vipService.setCheckFlag(1);
+                }
+            });
+        });
+        return ResponseJson.success(vipServiceList);
+    }
+
+    @Override
+    public ResponseJson vipServicesConfigure(Integer authUserId, String roleIds) {
+        if (null == authUserId) {
+            return ResponseJson.error("参数异常,用户id不能为空");
+        }
+        // 删除原有角色关联
+        systemMapper.deleteUserRoleRelation(authUserId);
+        // 保存用户角色关系
+        sysUserService.saveRoleRelation(authUserId, roleIds + ",2");
+        return ResponseJson.success();
+    }
+}

+ 1 - 1
src/main/java/com/caimei/service/LoginService.java → src/main/java/com/caimei/service/wechat/LoginService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.wechat;
 
 import com.caimei.model.ResponseJson;
 import com.caimei.model.vo.WxClubUserVo;

+ 1 - 1
src/main/java/com/caimei/service/SDKService.java → src/main/java/com/caimei/service/wechat/SDKService.java

@@ -1,4 +1,4 @@
-package com.caimei.service;
+package com.caimei.service.wechat;
 
 import com.caimei.model.ResponseJson;
 

+ 2 - 2
src/main/java/com/caimei/service/impl/LoginServiceImpl.java → src/main/java/com/caimei/service/wechat/impl/LoginServiceImpl.java

@@ -1,4 +1,4 @@
-package com.caimei.service.impl;
+package com.caimei.service.wechat.impl;
 
 import com.caimei.components.RedisService;
 import com.caimei.mapper.AuthMapper;
@@ -9,7 +9,7 @@ import com.caimei.model.ResponseJson;
 import com.caimei.model.po.ClubUserPo;
 import com.caimei.model.po.CmBrandAuthPo;
 import com.caimei.model.vo.WxClubUserVo;
-import com.caimei.service.LoginService;
+import com.caimei.service.wechat.LoginService;
 import com.caimei.utils.CodeUtil;
 import com.caimei.utils.SmsUtils;
 import com.caimei.utils.WxUtils;

+ 2 - 2
src/main/java/com/caimei/service/impl/SDKServiceImpl.java → src/main/java/com/caimei/service/wechat/impl/SDKServiceImpl.java

@@ -1,9 +1,9 @@
-package com.caimei.service.impl;
+package com.caimei.service.wechat.impl;
 
 import com.caimei.components.RedisService;
 import com.caimei.mapper.ShopMapper;
 import com.caimei.model.ResponseJson;
-import com.caimei.service.SDKService;
+import com.caimei.service.wechat.SDKService;
 import com.caimei.utils.CodeUtil;
 import com.caimei.utils.SHA1;
 import com.caimei.utils.WxUtils;

+ 37 - 0
src/main/java/com/caimei/utils/CommonUtil.java

@@ -0,0 +1,37 @@
+package com.caimei.utils;
+
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * 通用代码工具类
+ *
+ * @author : Charles
+ * @date : 2022/1/6
+ */
+public class CommonUtil {
+    /**
+     * 列表拼接成字符串
+     * @param list List<Integer>
+     * @param join 分隔符,默认','
+     * @return String
+     */
+    public static String idListToString(List<Integer> list, String join){
+        String split = ",";
+        if (StringUtils.hasLength(join)){
+            split = join;
+        }
+        StringBuilder str = new StringBuilder();
+        for (int i = 0; i < list.size(); i++) {
+            if (StringUtils.hasLength(list.get(i).toString())){
+                if (i == 0) {
+                    str.append(list.get(i).toString());
+                } else {
+                    str.append(split).append(list.get(i).toString());
+                }
+            }
+        }
+        return str.toString();
+    }
+}

+ 116 - 0
src/main/java/com/caimei/utils/RequestUtil.java

@@ -0,0 +1,116 @@
+package com.caimei.utils;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 请求工具类
+ *
+ * @author : Charles
+ * @date : 2021/3/8
+ */
+public class RequestUtil {
+
+    /**
+     * 向指定URL发送GET方法的请求
+     *
+     * @param url   发送请求的URL,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 远程资源的响应结果
+     */
+    public static String sendGet(String url) throws Exception {
+        StringBuilder result = new StringBuilder();
+        BufferedReader in = null;
+        try {
+
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            URLConnection connection = realUrl.openConnection();
+            // 设置通用的请求属性
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("Accept-Charset", "utf-8");
+            connection.setRequestProperty("contentType", "utf-8");
+            connection.setConnectTimeout(5000);
+            // 建立实际的连接
+            connection.connect();
+            // 获取所有响应头字段
+            Map<String, List<String>> map = connection.getHeaderFields();
+            // 定义 BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(
+                    connection.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+        }
+        // 使用finally块来关闭输入流
+        finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param paramMap 请求参数
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, Map<String, ?> paramMap) throws Exception{
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+
+        StringBuilder param = new StringBuilder();
+
+        for (String key : paramMap.keySet()) {
+            param.append(key).append("=").append(paramMap.get(key)).append("&");
+        }
+
+        try {
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            URLConnection conn = realUrl.openConnection();
+            // 设置通用的请求属性
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(conn.getOutputStream());
+            // 发送请求参数
+            out.print(param);
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+        }
+        //使用finally块来关闭输出流、输入流
+        finally{
+            if(out!=null){
+                out.close();
+            }
+            if(in!=null){
+                in.close();
+            }
+        }
+        return result.toString();
+    }
+
+}

+ 1 - 1
src/main/resources/config/dev/application-dev.yml

@@ -59,7 +59,7 @@ caimei:
   zplmapi: http://192.168.2.68:8012
   #图片服务器
   imageDomain: http://192.168.2.100
-  core: https://core-b.caimei365.com
+  core: http://localhost:18002
   #公众号
   appid: wx6512b1dfb84c28e1
   secret: 10f94918f59f630351319382bb29cab1

+ 24 - 3
src/main/resources/mapper/ShopMapper.xml

@@ -96,6 +96,16 @@
             handleTime   = NOW()
         where id = #{feedbackId}
     </update>
+    <update id="updateShopMobile">
+        update cm_brand_auth_user
+        set mobile = #{newMobile}
+        where authUserId = #{authUserId}
+    </update>
+    <update id="bindLoginAccount">
+        update cm_brand_auth_user
+        set loginAccount = #{loginAccount}
+        where authUserId = #{authUserId}
+    </update>
     <delete id="deleteStatementFile">
         delete from cm_brand_auth_file where id = #{id}
     </delete>
@@ -103,7 +113,7 @@
         delete from cm_brand_auth_shop_info where id = #{infoId}
     </delete>
     <select id="getShopList" resultType="com.caimei.model.vo.ShopListVo">
-        select u.authUserId,u.name,u.shopType,group_concat(cb.name) as brandName,group_concat(cb.id) as brandId,
+        select u.authUserId,u.name,u.loginAccount,u.shopType,group_concat(cb.name) as brandName,group_concat(cb.id) as brandId,
         u.mobile,u.linkMan,u.status as shopStatus,u.createTime,
         (select au.name from cm_brand_auth_user au where au.authUserId = u.createBy) as createBy,
         (ifnull(aw.authWaitNum,0)+ifnull(pw.productWaitNum,0)) as waitAuditNum,
@@ -127,6 +137,12 @@
         <if test="shopName != null and shopName !=''">
             AND u.name like CONCAT('%',#{shopName},'%')
         </if>
+        <if test="listType == 5">
+            AND u.status = 1
+        </if>
+        <if test="loginAccount != null and loginAccount != ''">
+            AND u.loginAccount like CONCAT('%',#{loginAccount},'%')
+        </if>
         <if test="shopType != null ">
             AND u.shopType = #{shopType}
         </if>
@@ -205,9 +221,11 @@
         select count(*) from cm_brand_auth_file where md5Hex = #{md5Hex}
     </select>
     <select id="getShopByUserId" resultType="com.caimei.model.vo.ShopFormVo">
-        select u.authUserId, u.name as shopName, u.mobile, u.linkMan, u.status as shopStatus, u.shopType as shopType,
-               u.wxAccountType, u.logo, u.qrCodeImage, u.appId, u.appSecret
+        select u.authUserId, u.name as shopName, u.loginAccount, u.mobile, u.linkMan, u.status as shopStatus, u.shopType as shopType,
+               u.wxAccountType, u.logo, u.qrCodeImage, u.appId, u.appSecret,
+               if(avu.id is null, 3, (if(NOW() <![CDATA[<]]> avu.endTime, 1, 0))) as vipStatus
         from cm_brand_auth_user u
+                 left join auth_vip_user avu on u.authUserId = avu.authUserId
         where u.authUserId = #{authUserId};
     </select>
     <select id="getBrandList" resultType="com.caimei.model.vo.BrandVo">
@@ -337,5 +355,8 @@
     <select id="getWxAccountTypeByAppId" resultType="java.lang.Integer">
         select wxAccountType from cm_brand_auth_user where appId = #{appId} and status = 1
     </select>
+    <select id="getLoginAccount" resultType="java.lang.String">
+        select loginAccount from cm_brand_auth_user where authUserId = #{authUserId}
+    </select>
 
 </mapper>

+ 278 - 0
src/main/resources/mapper/SystemMapper.xml

@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei.mapper.SystemMapper">
+    <!--<select id="findByUsername" resultType="com.caimei.model.po.SysUser">
+        SELECT id, username, PASSWORD, avatar, fullName, phone, login_flag AS loginFlag, del_flag AS delFlag
+        FROM auth_user WHERE login_flag=0 AND username=#{username}
+    </select>
+    <select id="getUserIdByUsername" resultType="java.lang.Integer">
+        SELECT id FROM auth_user WHERE username=#{username}
+    </select>-->
+    <select id="getRoleNamesByUserId" resultType="java.lang.String">
+        SELECT DISTINCT r.role_name FROM auth_role r
+            LEFT JOIN auth_role_user ru ON r.id = ru.role_id
+        WHERE ru.user_id = #{userId}
+    </select>
+    <select id="getRoleIdsByUserId" resultType="java.lang.String">
+        SELECT DISTINCT r.id FROM auth_role r
+            LEFT JOIN auth_role_user ru ON r.id = ru.role_id
+        WHERE ru.user_id = #{userId}
+    </select>
+<!--    <select id="getRoleIdsByUsername" resultType="java.lang.Integer">-->
+<!--        SELECT DISTINCT ru.role_id FROM auth_role_user ru-->
+<!--        LEFT JOIN auth_user u ON ru.user_id = u.id-->
+<!--        WHERE u.username=#{username}-->
+<!--    </select>-->
+    <!--<select id="getUserList" resultType="com.caimei.model.po.SysUser">
+        SELECT u.id, u.username, u.avatar, u.fullName, u.phone, u.create_time AS createTime ,u.update_time AS updateTime, login_flag AS loginFlag, del_flag AS delFlag
+        FROM auth_user u
+        WHERE u.del_flag = 0
+        <if test="username != null and username != ''">
+            AND u.username=#{username}
+        </if>
+        <if test="fullName != null and fullName != ''">
+            AND u.fullName=#{fullName}
+        </if>
+    </select>
+    <select id="getUser" resultType="com.caimei.model.po.SysUser">
+        SELECT u.id, u.username, u.PASSWORD, u.avatar, u.fullName, u.phone, u.create_time AS createTime ,u.update_time AS updateTime, login_flag AS loginFlag, del_flag AS delFlag
+        FROM auth_user u
+        WHERE u.id = #{id}
+    </select>
+    <insert id="insertSysUser" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
+        INSERT INTO auth_user(username, password, avatar, fullName, phone, create_time)
+        VALUES(#{username}, #{password}, #{avatar}, #{fullName}, #{phone}, NOW())
+    </insert>
+    <update id="updateSysUser">
+        UPDATE auth_user SET username=#{username},
+        <if test="password != null and password != ''">
+            password=#{password},
+        </if>
+        avatar=#{avatar}, fullName=#{fullName}, phone=#{phone}, login_flag=#{loginFlag}, del_flag=#{delFlag}, update_time=NOW()
+        WHERE id = #{id}
+    </update>
+    <update id="deleteSysUser">
+        UPDATE auth_user SET del_flag=1, update_time=NOW() WHERE id = #{id}
+    </update>-->
+    <insert id="insertUserRoleRelation">
+        INSERT INTO auth_role_user(user_id, role_id) VALUES(#{userId}, #{roleId})
+    </insert>
+    <delete id="deleteUserRoleRelation">
+        DELETE FROM auth_role_user WHERE user_id = #{userId}
+    </delete>
+    <select id="getRoleListByUserId" resultType="com.caimei.model.po.SysRole">
+        SELECT DISTINCT r.id, r.role_name AS roleName, r.role_desc AS roleDesc, r.create_time AS createTime, r.update_time AS updateTime, del_flag AS delFlag
+        FROM auth_role r
+        LEFT JOIN auth_role_user ru ON r.id = ru.role_id
+        WHERE ru.user_id = #{userId} AND r.del_flag = 0
+    </select>
+    <select id="getRoleList" resultType="com.caimei.model.po.SysRole">
+        SELECT  r.id, r.role_name AS roleName, r.role_desc AS roleDesc, r.create_time AS createTime, r.update_time AS updateTime, del_flag AS delFlag
+        FROM auth_role r WHERE r.del_flag = 0 and role_type = 1
+    </select>
+    <select id="getRole" resultType="com.caimei.model.po.SysRole">
+        SELECT  r.id, r.role_name AS roleName, r.role_desc AS roleDesc, r.create_time AS createTime, r.update_time AS updateTime, del_flag AS delFlag
+        FROM auth_role r WHERE r.id = #{id}
+    </select>
+    <select id="getRoleByRoleName" resultType="com.caimei.model.po.SysRole">
+        SELECT  r.id, r.role_name AS roleName, r.role_desc AS roleDesc, r.create_time AS createTime, r.update_time AS updateTime, del_flag AS delFlag
+        FROM auth_role r WHERE r.role_name = #{roleName}
+    </select>
+    <insert id="insertRole" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
+        INSERT INTO auth_role(role_name, role_desc, role_type, create_time)
+        VALUES (#{roleName}, #{roleDesc}, #{roleType}, NOW())
+    </insert>
+    <select id="getMenuIdsByRoleId" resultType="java.lang.Integer">
+        SELECT DISTINCT menu_id FROM auth_role_menu WHERE role_id = #{roleId}
+    </select>
+    <select id="getPermissionMenuIdsByRoleId" resultType="java.lang.String">
+        SELECT DISTINCT CONCAT(p.id, '-', p.menu_id) FROM auth_permission p
+        LEFT JOIN auth_role_permission srp on p.id = srp.permission_id
+        WHERE srp.role_id = #{roleId}
+    </select>
+    <insert id="insertRoleMenuRelation">
+        INSERT INTO auth_role_menu(role_id, menu_id) VALUES(#{roleId}, #{menuId})
+    </insert>
+    <insert id="insertRolePermissionRelation">
+        INSERT INTO auth_role_permission(role_id, permission_id) VALUES(#{roleId}, #{permissionId})
+    </insert>
+    <delete id="deleteRoleMenuRelation">
+        DELETE FROM auth_role_menu WHERE role_id = #{roleId}
+    </delete>
+    <delete id="deleteRolePermissionRelation">
+        DELETE FROM auth_role_permission WHERE role_id = #{roleId}
+    </delete>
+    <update id="updateRole">
+        UPDATE auth_role SET role_name=#{roleName}, role_desc=#{roleDesc}, del_flag=#{delFlag}, update_time=NOW()
+        WHERE id = #{id}
+    </update>
+    <delete id="deleteRole">
+        delete from auth_role WHERE id = #{id}
+    </delete>
+    <select id="getMenusByRoleIds" resultType="com.caimei.model.po.SysMenu">
+        SELECT m.id, m.title , m.name, m.icon, m.parent_id AS parentId, m.hidden, m.status, m.sort, m.create_time AS createTime, del_flag AS delFlag
+        FROM auth_menu m
+        LEFT JOIN auth_role_menu rm ON m.id = rm.menu_id
+        WHERE m.del_flag = 0 AND m.status = 0 AND rm.role_id IN
+        <foreach item="roleId" collection="roleIds" open="(" separator="," close=")">
+            #{roleId}
+        </foreach>
+        ORDER BY m.sort
+    </select>
+    <select id="getPermissionNames" resultType="java.lang.String">
+        SELECT DISTINCT p.name FROM auth_permission p
+        LEFT JOIN auth_role_permission rp ON p.id = rp.permission_id
+        WHERE rp.role_id IN
+        <foreach item="roleId" collection="roleIds" open="(" separator="," close=")">
+            #{roleId}
+        </foreach>
+    </select>
+    <select id="getMenuList" resultType="com.caimei.model.po.SysMenu">
+        SELECT m.id, m.title, m.name, m.icon, m.parent_id AS parentId, m.status, m.hidden, m.sort, m.create_time AS createTime, del_flag AS delFlag,
+        (SELECT COUNT(*) FROM auth_menu WHERE parent_id=m.id) AS childCount
+        FROM auth_menu m
+        WHERE m.del_flag = 0
+        <if test="parentId != null or parentId == 0">
+            AND m.parent_id = #{parentId}
+        </if>
+        <if test="menuType != null">
+            AND m.menu_type = #{menuType}
+        </if>
+        <if test="status != null or status == 0">
+            AND m.status = #{status}
+        </if>
+        ORDER BY m.sort
+    </select>
+    <select id="getMenuTree" resultType="com.caimei.model.po.SysMenuTree">
+        SELECT m.id, m.name, m.title, m.parent_id AS parentId
+        FROM auth_menu m
+        WHERE m.del_flag = 0 and menu_type = 1
+        <if test="parentId != null or parentId == 0">
+            AND m.parent_id = #{parentId}
+        </if>
+        ORDER BY m.sort
+    </select>
+    <select id="getTreePermissions" resultType="com.caimei.model.po.SysMenuTree">
+        SELECT CONCAT(p.id, '-', p.menu_id) AS id, p.name, CONCAT('[按钮]', p.title) AS title
+        FROM auth_permission p WHERE p.menu_id = #{menuId}
+    </select>
+    <select id="getMenu" resultType="com.caimei.model.po.SysMenu">
+        SELECT m.id, m.title , m.name, m.menu_type as menuType,m.base_flag as baseFlag, m.move_flag as moveFlag, m.icon, m.parent_id AS parentId, m.hidden, m.status, m.sort, m.create_time AS createTime, del_flag AS delFlag,
+               (SELECT COUNT(*) FROM auth_menu WHERE parent_id=m.id) AS childCount
+        FROM auth_menu m
+        WHERE m.id = #{id}
+    </select>
+    <select id="getMenuByName" resultType="com.caimei.model.po.SysMenu">
+        SELECT m.id,
+               m.title,
+               m.name,
+               m.icon,
+               m.parent_id   AS parentId,
+               m.hidden,
+               m.menu_type   as menuType,
+               m.base_flag   as baseFlag,
+               m.move_flag   as moveFlag,
+               m.status,
+               m.sort,
+               m.create_time AS createTime,
+               del_flag      AS delFlag
+        FROM auth_menu m
+        WHERE m.name = #{name}
+    </select>
+    <update id="updateMenu">
+        UPDATE auth_menu
+        SET title=#{title},
+            name=#{name},
+            icon=#{icon},
+            parent_id=#{parentId},
+            hidden=#{hidden},
+            menu_type = #{menuType},
+            base_flag = #{baseFlag},
+            move_flag = #{moveFlag},
+            status=#{status},
+            sort=#{sort},
+            del_flag=#{delFlag},
+            update_time=NOW()
+        WHERE id = #{id}
+    </update>
+    <insert id="insertMenu" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
+        INSERT INTO auth_menu(title, name, icon, parent_id, hidden, menu_type, base_flag, move_flag, status, sort,
+                              create_time)
+        VALUES (#{title}, #{name}, #{icon}, #{parentId}, #{hidden}, #{menuType}, #{baseFlag}, #{moveFlag}, #{status},
+                #{sort}, NOW());
+    </insert>
+    <delete id="deleteMenu">
+        delete from auth_menu WHERE id = #{id}
+    </delete>
+    <select id="getPermissionList" resultType="com.caimei.model.po.SysPermission">
+        SELECT p.id, p.name, p.title AS title, p.menu_id AS menuId
+        FROM auth_permission p WHERE p.menu_id = #{menuId}
+    </select>
+    <select id="getPermissionIds" resultType="java.lang.Integer">
+        SELECT id FROM auth_permission WHERE menu_id = #{menuId}
+    </select>
+    <select id="findByUserId" resultType="com.caimei.model.po.SysUser">
+        select authUserId as id from cm_brand_auth_user where authUserId = #{authUserId} and status = 1
+    </select>
+    <select id="getVipRoleIdByMenuId" resultType="java.lang.Integer">
+        select role_id from auth_role_menu arm left join auth_role r on arm.role_id = r.id
+        where menu_id = #{menuId} and role_id != 2 and role_type = 2 limit 1
+    </select>
+    <select id="getUserList" resultType="com.caimei.model.po.SysUser">
+        SELECT u.authUserId as id, u.name as username, u.linkMan, u.mobile, u.createTime, u.status,u.createBy
+        FROM cm_brand_auth_user u
+        where userIdentity = 1
+        <if test="username != null and username != ''">
+            AND u.name like concat('%',#{username},'%')
+        </if>
+        <if test="linkMan != null and linkMan != ''">
+            AND u.linkMan like concat('%',#{fullName},'%')
+        </if>
+    </select>
+    <select id="getVipMenuList" resultType="com.caimei.model.po.SysMenu">
+        select m.title,arm.role_id as roleId from auth_menu m left join auth_role_menu arm on m.id = arm.menu_id where menu_type = 2 and base_flag = 0 and status = 0
+    </select>
+    <select id="getVipRoleIdList" resultType="java.lang.Integer">
+        select role_id from auth_role_user where user_id = #{authUserId}
+    </select>
+    <select id="getUser" resultType="com.caimei.model.po.SysUser">
+        select authUserId as id, name as username, mobile, linkMan, password,status
+        from cm_brand_auth_user
+        where authUserId = #{id}
+    </select>
+    <select id="findByUsername" resultType="com.caimei.model.po.SysUser">
+        select authUserId as id from cm_brand_auth_user where name = #{username}
+    </select>
+    <update id="updatePermission">
+        UPDATE auth_permission SET name=#{name}, title=#{title}, menu_id = #{menuId}
+        WHERE id = #{id}
+    </update>
+    <update id="updateSysUser">
+        update cm_brand_auth_user set name = #{username},mobile = #{mobile},linkMan = #{linkMan}
+        <if test="password != null and password != ''">
+            ,password = #{password}
+        </if>
+        where authUserId = #{id}
+    </update>
+    <update id="updateShopMenu">
+        update auth_menu set base_flag = #{baseFlag},status = #{status} where id = #{id}
+    </update>
+    <delete id="deletePermission">
+        DELETE FROM auth_permission WHERE id = #{id}
+    </delete>
+    <delete id="deleteVipRoleByMenuId">
+        delete from auth_role where id = (select role_id from auth_role_menu where menu_id = #{menuId} and role_id != 2)
+    </delete>
+    <delete id="deleteSysUser">
+        delete from cm_brand_auth_user where authUserId = #{id}
+    </delete>
+    <insert id="insertPermission" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
+        INSERT INTO auth_permission(title, name, menu_id)
+        VALUES (#{title}, #{name}, #{menuId})
+    </insert>
+    <insert id="insertAdminUser" keyProperty="id" keyColumn="id" useGeneratedKeys="true" parameterType="com.caimei.model.po.SysUser">
+        insert into cm_brand_auth_user (name, mobile, password, linkMan, userIdentity, createTime, createBy,
+                                        status)
+        values (#{username}, #{mobile}, #{password}, #{linkMan}, 1, NOW(), #{createBy}, 1)
+    </insert>
+</mapper>

+ 17 - 1
src/main/resources/mapper/UserMapper.xml

@@ -16,6 +16,7 @@
     <select id="getShopUserByMobile" resultType="com.caimei.model.vo.UserLoginVo">
         select u.authUserId,
                u.name,
+               u.loginAccount,
                password,
                userIdentity,
                u.status as shopStatus,
@@ -24,7 +25,7 @@
         from cm_brand_auth_user u
                  left join cm_brand_auth_shop_info i on u.authUserId = i.authUserId
                  left join cm_brand b on i.brandId = b.id
-        where mobile = #{mobile}
+        where mobile = #{mobile} and u.status = 1
         limit 1;
     </select>
     <select id="getPasswordByUserId" resultType="java.lang.String">
@@ -32,4 +33,19 @@
         from cm_brand_auth_user
         where authUserId = #{authUserId};
     </select>
+    <select id="getShopUserByAccount" resultType="com.caimei.model.vo.UserLoginVo">
+        select u.authUserId,
+               u.name,
+               u.loginAccount,
+               password,
+               userIdentity,
+               u.status as shopStatus,
+               shopType,
+               if(u.shopType = 1, b.id, null) as brandId
+        from cm_brand_auth_user u
+                 left join cm_brand_auth_shop_info i on u.authUserId = i.authUserId
+                 left join cm_brand b on i.brandId = b.id
+        where loginAccount = #{account} and u.status = 1
+        limit 1;
+    </select>
 </mapper>

+ 174 - 0
src/main/resources/mapper/VipMapper.xml

@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei.mapper.VipMapper">
+    <insert id="insertVipPackage">
+        insert into auth_vip_package(originalPrice, price, duration, unit, addTime)
+        VALUES (#{originalPrice}, #{price}, #{duration}, #{unit}, NOW());
+    </insert>
+    <insert id="insertVipService">
+        insert into auth_vip_service(name)
+        values (#{service})
+    </insert>
+    <insert id="insertVipHistory" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei.model.po.VipHistoryPo" useGeneratedKeys="true">
+        insert into auth_vip_history (authUserId, packageId, duration, beginTime, endTime, payStatus, payWay, payType, price, services, payTime)
+        values (#{authUserId}, #{packageId}, #{duration}, #{beginTime}, #{endTime}, #{payStatus}, #{payWay}, null, #{price}, #{services}, #{payTime})
+    </insert>
+    <insert id="insertAuthVipInfo">
+        INSERT INTO auth_vip_user(authUserId, beginTime, endTime, delFlag, updateTime)
+        VALUES (#{authUserId}, #{beginTime}, #{endTime}, #{delFlag}, #{updateTime})
+    </insert>
+    <update id="updateVipHistory">
+        UPDATE auth_vip_history
+        set payStatus=#{payStatus},
+            payWay=#{payWay},
+            payType=#{payType},
+            duration=#{duration},
+            beginTime=#{beginTime},
+            endTime=#{endTime},
+            price=#{price},
+            services=#{services},
+            payTime=#{payTime}
+        WHERE id = #{id}
+    </update>
+    <update id="updateAuthVipInfo">
+        UPDATE auth_vip_user set authUserId=#{authUserId}, beginTime=#{beginTime}, endTime=#{endTime}, delFlag=#{delFlag}, updateTime=#{updateTime}
+        WHERE authUserId = #{authUserId}
+    </update>
+    <delete id="deleteVipPackages">
+        delete from auth_vip_package;
+    </delete>
+    <delete id="deleteVipServices">
+        delete from auth_vip_service;
+    </delete>
+    <select id="getVipPackageList" resultType="com.caimei.model.vo.VipPackageVo">
+        select id, originalPrice, price, duration, unit from auth_vip_package;
+    </select>
+    <select id="getVipServiceList" resultType="com.caimei.model.vo.VipServiceVo">
+        select id, name from auth_vip_service;
+    </select>
+    <select id="getVipEndTime" resultType="java.util.Date">
+        select endTime from auth_vip_user where authUserId = #{authUserId} and endTime > now()
+    </select>
+    <select id="getVipPackageById" resultType="com.caimei.model.vo.VipPackageVo">
+        select duration, unit, price
+        from auth_vip_package
+        where id = #{packageId}
+    </select>
+    <select id="getVipHistoryId" resultType="java.lang.Integer">
+        SELECT id
+        FROM auth_vip_history
+        WHERE payStatus = 0
+          AND authUserId = #{authUserId}
+          AND packageId = #{packageId}
+        ORDER BY id DESC
+        LIMIT 1
+    </select>
+    <select id="getVipList" resultType="com.caimei.model.vo.VipListVo">
+        select avu.id as vipUserId, avu.authUserId, u.name as shopName, u.shopType,
+               u.loginAccount, u.mobile, u.linkMan, if(avu.endTime >NOW(),1,0) as vipStatus
+        from auth_vip_user avu
+                 left join cm_brand_auth_user u on avu.authUserId = u.authUserId
+        <where>
+            <if test="shopName != null and shopName != ''">
+                and u.name like concat('%',#{shopName},'%')
+            </if>
+            <if test="mobile != null and mobile != ''">
+                and u.mobile like concat('%',#{mobile},'%')
+            </if>
+            <if test="linkMan != null and linkMan != ''">
+                and u.linkMan like concat('%',#{linkMan},'%')
+            </if>
+            <if test="shopType != null">
+                and u.shopType = #{shopType}
+            </if>
+            <if test="vipStatus != null">
+                <if test="vipStatus == 0">
+                    and NOW() <![CDATA[>]]> avu.endTime
+                </if>
+                <if test="vipStatus == 1">
+                    and NOW() <![CDATA[<]]> avu.endTime and NOW() <![CDATA[>]]> avu.beginTime
+                </if>
+            </if>
+        </where>
+        order by avu.id desc
+    </select>
+    <select id="getVipHistoryList" resultType="com.caimei.model.vo.VipHistoryListVo">
+        select id as historyId,duration,price,
+        if(payWay=2,1,(case payType when 14 then 2
+        when 13 or 15 then 3
+        when 12 then 4
+        when 17 then 5
+        end )) as payWay,
+        case when NOW() <![CDATA[>]]> endTime then 0
+        when NOW() <![CDATA[<]]> beginTime then 2
+        else 1 end
+        as vipStatus,
+        payTime,endTime,services
+        from auth_vip_history
+        where authUserId = #{authUserId}
+        <if test="vipPackageId != null">
+            and packageId = #{vipPackageId}
+        </if>
+        <if test="vipStatus != null">
+            <if test="vipStatus == 0">
+                and NOW() <![CDATA[>]]> endTime
+            </if>
+            <if test="vipStatus == 1">
+                and NOW() <![CDATA[<]]> endTime and NOW() <![CDATA[>]]> beginTime
+            </if>
+            <if test="vipStatus == 2">
+                and NOW() <![CDATA[<]]> beginTime
+            </if>
+        </if>
+        <if test="payBeginTime != null and payBeginTime != ''">
+            and payTime <![CDATA[>=]]> #{payBeginTime}
+        </if>
+        <if test="payEndTime != null and payEndTime != ''">
+            and payTime <![CDATA[<=]]> #{payEndTime}
+        </if>
+        <if test="endBeginTime != null and endBeginTime != ''">
+            and endTime <![CDATA[>=]]> #{endBeginTime}
+        </if>
+        <if test="endEndTime != null and endEndTime != ''">
+            and endTime <![CDATA[<=]]> #{endEndTime}
+        </if>
+        order by payTime desc
+    </select>
+    <select id="getVipInfo" resultType="com.caimei.model.vo.VipInfoVo">
+        select avu.id                                                    as vipUserId,
+               u.authUserId,
+               u.mobile,
+               u.loginAccount,
+               avu.endTime,
+               if(avu.id is null, 3, (if(NOW() <![CDATA[<]]> avu.endTime, 1, 0))) as vipStatus,
+               90 - timestampdiff(day, u.createTime, NOW()) as freeDayLeft,
+               timestampdiff(day,NOW(),avu.endTime) as endDayLeft,
+               date_add(u.createTime, interval 90 day)                   as freeEndTime
+        from cm_brand_auth_user u
+                 left join auth_vip_user avu on u.authUserId = avu.authUserId
+        where u.authUserId = #{authUserId}
+          and u.userIdentity = 2
+          and u.status = 1
+    </select>
+    <select id="getAuthVipInfo" resultType="com.caimei.model.po.AuthVipPo">
+        SELECT id, authUserId as userId, beginTime, endTime, updateTime, delFlag
+        FROM auth_vip_user
+        WHERE authUserId = #{authUserId};
+    </select>
+    <select id="getBaseMenuList" resultType="com.caimei.model.po.SysMenu">
+        select m.id, m.title,m.base_flag as baseFlag, m.move_flag as moveFlag, m.status
+        from auth_menu m
+                 left join auth_role_menu arm on m.id = arm.menu_id
+        where m.menu_type = 2
+          and m.base_flag = 1
+          and m.parent_id = 0
+    </select>
+    <select id="getUpMenuList" resultType="com.caimei.model.po.SysMenu">
+        select m.id, m.title,m.base_flag as baseFlag, m.move_flag as moveFlag, m.status
+        from auth_menu m
+        where m.menu_type = 2
+          and m.base_flag = 0
+          and m.parent_id = 0
+    </select>
+</mapper>

+ 0 - 10
src/test/java/com/caimei/AdminApplicationTests.java

@@ -1,26 +1,16 @@
 package com.caimei;
 
 import com.alibaba.fastjson.JSONObject;
-import com.caimei.config.FastDfsClient;
-import com.caimei.service.AuthProductService;
-import com.caimei.utils.Base64Util;
 import com.caimei.utils.ImageUtils;
-import com.caimei.utils.JwtUtil;
 import com.caimei.utils.OSSUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.core.io.ClassPathResource;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.UUID;
 
 @SpringBootTest
 public class AdminApplicationTests {