he2802 vor 2 Jahren
Ursprung
Commit
df3b102a4e
100 geänderte Dateien mit 5109 neuen und 554 gelöschten Zeilen
  1. 46 0
      .drone-trial.yml
  2. 4 0
      run-dev.sh
  3. 3 0
      run-pre.sh
  4. 5 0
      run-prod.sh
  5. 72 0
      run-trial.sh
  6. 2 1
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/AdminSaasApplication.java
  7. 92 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateController.java
  8. 105 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateGoodsController.java
  9. 118 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplatePosterController.java
  10. 105 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateRelationController.java
  11. 62 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/goods/TopGoodsController.java
  12. 38 43
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SuperSysLoginController.java
  13. 140 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysConfigController.java
  14. 174 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDeptController.java
  15. 125 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDictDataController.java
  16. 117 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDictTypeController.java
  17. 169 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysMenuController.java
  18. 192 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleController.java
  19. 285 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java
  20. 132 55
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  21. 38 28
      zhongzheng-admin-saas/src/main/resources/application.yml
  22. 2 4
      zhongzheng-admin/src/main/java/com/zhongzheng/ZhongZhengApplication.java
  23. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  24. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/CertificateTpController.java
  25. 6 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java
  26. 154 19
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  27. 12 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseBusinessController.java
  28. 1 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseChapterController.java
  29. 35 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java
  30. 105 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityController.java
  31. 105 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityGoodsController.java
  32. 105 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityPosterController.java
  33. 53 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  34. 34 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  35. 0 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassStudentController.java
  36. 3 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderBusinessConfigController.java
  37. 11 1
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderGoodsRefundController.java
  38. 21 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  39. 5 4
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysConfigController.java
  40. 62 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysOldOrgController.java
  41. 9 3
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java
  42. 84 54
      zhongzheng-admin/src/main/resources/application-dev.yml
  43. 5 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  44. 5 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  45. 148 0
      zhongzheng-admin/src/main/resources/application-trial.yml
  46. 3 1
      zhongzheng-admin/src/main/resources/application.yml
  47. 0 0
      zhongzheng-admin/src/main/resources/config/1342013901/apiclient_cert.p12
  48. BIN
      zhongzheng-admin/src/main/resources/config/1637492608/apiclient_cert.p12
  49. 2 5
      zhongzheng-api/src/main/java/com/zhongzheng/ZhongZhengApiApplication.java
  50. 94 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/ExamSimulateController.java
  51. 1 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java
  52. 7 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java
  53. 3 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityHomeController.java
  54. 52 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  55. 15 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonGoodsController.java
  56. 12 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java
  57. 11 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java
  58. 115 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/distribution/DistributionSellerController.java
  59. 75 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/distribution/SellerLoginController.java
  60. 54 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/distribution/SellerSmsController.java
  61. 55 12
      zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java
  62. 10 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  63. 16 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java
  64. 8 4
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/LoginController.java
  65. 11 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserBankRecordController.java
  66. 11 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java
  67. 4 6
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserExamWrongRecordController.java
  68. 23 13
      zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java
  69. 86 56
      zhongzheng-api/src/main/resources/application-dev.yml
  70. 5 0
      zhongzheng-api/src/main/resources/application-pre.yml
  71. 5 0
      zhongzheng-api/src/main/resources/application-prod.yml
  72. 160 0
      zhongzheng-api/src/main/resources/application-trial.yml
  73. 2 0
      zhongzheng-api/src/main/resources/application.yml
  74. BIN
      zhongzheng-api/src/main/resources/config/1342013901/apiclient_cert.p12
  75. BIN
      zhongzheng-api/src/main/resources/config/1637492608/apiclient_cert.p12
  76. 7 0
      zhongzheng-common/pom.xml
  77. 1 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/config/WxSmallConfig.java
  78. 14 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/constant/Constants.java
  79. 4 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysMenu.java
  80. 7 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java
  81. 11 3
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysUser.java
  82. 53 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/redis/RedisCache.java
  83. 78 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java
  84. 54 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java
  85. 40 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DictUtils.java
  86. 16 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/SecurityUtils.java
  87. 2 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ServletUtils.java
  88. 65 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  89. 6 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java
  90. 129 114
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/DruidConfig.java
  91. 22 3
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  92. 62 64
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/properties/DruidProperties.java
  93. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/manager/factory/AsyncFactory.java
  94. 3 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java
  95. 8 13
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java
  96. 26 9
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/filter/JwtAuthenticationTokenFilter.java
  97. 9 9
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/LogoutSuccessHandlerImpl.java
  98. 54 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/TopLogoutSuccessHandlerImpl.java
  99. 339 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/DistributionSellerServiceImpl.java
  100. 267 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SellerTokenService.java

+ 46 - 0
.drone-trial.yml

@@ -0,0 +1,46 @@
+kind: pipeline # 定义对象类型,还有secret和signature两种类型
+type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
+name: zz_backend-trial # 定义流水线名称
+trigger:
+  branch:
+    - trial
+
+steps: # 定义流水线执行步骤,这些步骤将顺序执行
+  - name: package-trial # 流水线名称
+    image: maven:3-jdk-8 # 定义创建容器的Docker镜像
+    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
+      - name: maven-cache
+        path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
+      - name: maven-build
+        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
+    commands: # 定义在Docker容器中执行的shell命令
+      - mvn clean package # 应用打包命令
+      - cp /drone/src/zhongzheng-api/target/zhongzheng-api.jar /app/build/zhongzheng-api.jar
+      - cp /drone/src/zhongzheng-admin/target/zhongzheng-admin.jar /app/build/zhongzheng-admin.jar
+      - cp /drone/src/zhongzheng-admin-saas/target/zhongzheng-admin-saas.jar /app/build/zhongzheng-admin-saas.jar
+      - cp Dockerfile /app/build/Dockerfile
+      - cp Dockerfile-admi /app/build/Dockerfile-admi
+      - cp Dockerfile-saas /app/build/Dockerfile-saas
+      - cp run-trial.sh /app/build/run-trial.sh
+
+  - name: build-start
+    image: appleboy/drone-ssh:latest # SSH工具镜像
+    settings:
+      host: 120.79.166.78 # 远程连接地址
+      username: root # 远程连接账号
+      key:
+        from_secret: ssh_password
+      port: 22 # 远程连接端口
+      command_timeout: 5m # 远程执行命令超时时间
+      script:
+        - cd /mydata-trial/maven/build # 进入宿主机构建目录
+        - chmod +x run-trial.sh # 更改为可执行脚本
+        - ./run-trial.sh # 运行脚本打包应用镜像并运行
+
+volumes: # 定义流水线挂载目录,用于共享数据
+  - name: maven-build
+    host:
+      path: /mydata-trial/maven/build # 从宿主机中挂载的目录
+  - name: maven-cache
+    host:
+      path: /mydata-trial/maven/cache

+ 4 - 0
run-dev.sh

@@ -22,8 +22,10 @@ docker run -p 5055:5055 --name ${app_name} \
 --link mysql:db \
 -e 'spring.profiles.active'=${profile_active} \
 -e TZ="Asia/Shanghai" \
+--add-host=gdxypx.xy.com:192.168.1.210 \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/dev_api:/logs \
 -v /mydata/app/${app_name}/logs:/var/logs \
 -d ${group_name}/${app_name}:${app_version}
 echo '----start container----'
@@ -62,7 +64,9 @@ docker run \
 --add-host=gdxypx.xy.com:192.168.1.210 \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/dev_admin:/logs \
 -v /mydata/app/${app_admin_name}/logs:/var/logs \
+-v /data/nginx/conf.d:/data/nginx/conf.d \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
 echo '----start container admin----'
 

+ 3 - 0
run-pre.sh

@@ -24,6 +24,7 @@ docker run -p 6055:5055 --name ${app_name} \
 -e TZ="Asia/Shanghai" \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/pre_api:/logs \
 -v /mydata-pre/app/${app_name}/logs:/var/logs \
 -d ${group_name}/${app_name}:${app_version}
 echo '----start container----'
@@ -65,7 +66,9 @@ docker run \
 -e TZ="Asia/Shanghai" \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/pre_admin:/logs \
 -v /mydata-pre/app/${app_admin_name}/logs:/var/logs \
+-v /data/nginx/conf.d:/data/nginx/conf.d \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
 echo '----start container admin----'
 

+ 5 - 0
run-prod.sh

@@ -21,8 +21,11 @@ docker run -p 5055:5055 --name ${app_name} \
 --restart=always \
 -e 'spring.profiles.active'=${profile_active} \
 -e TZ="Asia/Shanghai" \
+-m 10G \
+--cpus=4 \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/prod_api:/logs \
 -v /mydata/app/${app_name}/logs:/var/logs \
 -d ${group_name}/${app_name}:${app_version}
 echo '----start container----'
@@ -59,7 +62,9 @@ docker run \
 -e TZ="Asia/Shanghai" \
 -v /etc/localtime:/etc/localtime \
 -v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/prod_admin:/logs \
 -v /mydata/app/${app_admin_name}/logs:/var/logs \
+-v /data/nginx/conf.d:/data/nginx/conf.d \
 -d ${group_admin_name}/${app_admin_name}:${app_admin_version}
 echo '----start container admin----'
 

+ 72 - 0
run-trial.sh

@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+# 定义应用组名
+group_name='zhongzheng-trial'
+# 定义应用名称
+app_name='zhongzheng-saas-apitrial'
+# 定义应用版本
+app_version='1.0-SNAPSHOT'
+# 定义应用环境
+profile_active='trial'
+echo '----copy jar----'
+docker stop ${app_name}
+echo '----stop container----'
+docker rm ${app_name}
+echo '----rm container----'
+docker rmi ${group_name}/${app_name}:${app_version}
+echo '----rm image----'
+# 打包编译docker镜像
+docker build -f /mydata/maven/build/Dockerfile -t ${group_name}/${app_name}:${app_version} .
+echo '----build image----'
+docker run -p 6055:5055 --name ${app_name} \
+--restart=always \
+-e 'spring.profiles.active'=${profile_active} \
+-e TZ="Asia/Shanghai" \
+-v /etc/localtime:/etc/localtime \
+-v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/trial_api:/logs \
+-v /mydata/app/${app_name}/logs:/var/logs \
+-d ${group_name}/${app_name}:${app_version}
+echo '----start container----'
+
+echo "开始等待20秒..."
+# 1-10秒内随机
+sleep 5
+echo "等待后继续"
+
+#!/usr/bin/env bash
+# 定义应用组名
+group_admin_name='zhongzheng-trial'
+# 定义应用名称
+app_admin_name='zhongzheng-saas-admin-trial'
+# 定义应用版本
+app_admin_version='1.0-SNAPSHOT'
+# 定义应用环境
+profile_active='trial'
+echo '----copy jar admin----'
+docker stop ${app_admin_name}
+echo '----stop container admin----'
+docker rm ${app_admin_name}
+echo '----rm container admin----'
+docker rmi ${group_admin_name}/${app_admin_name}:${app_admin_version}
+echo '----rm image admin----'
+# 打包编译docker镜像
+docker build -f /mydata/maven/build/Dockerfile-admi -t ${group_admin_name}/${app_admin_name}:${app_admin_version} .
+echo '----build image admin----'
+docker run \
+-p 6030:5030 \
+--name ${app_admin_name} \
+--restart=always \
+-e 'spring.profiles.active'=${profile_active} \
+-e TZ="Asia/Shanghai" \
+-v /etc/localtime:/etc/localtime \
+-v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/trial_admin:/logs \
+-v /mydata/app/${app_admin_name}/logs:/var/logs \
+-v /data/nginx/conf.d:/data/nginx/conf.d \
+-d ${group_admin_name}/${app_admin_name}:${app_admin_version}
+echo '----start container admin----'
+
+
+
+
+

+ 2 - 1
zhongzheng-admin-saas/src/main/java/com/zhongzheng/AdminSaasApplication.java

@@ -1,11 +1,12 @@
 package com.zhongzheng;
 
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 
 
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DruidDataSourceAutoConfigure.class})
 public class AdminSaasApplication {
 
     public static void main(String[] args)

+ 92 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateController.java

@@ -0,0 +1,92 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityTemplateService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityTemplateVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【分销模板控制器】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api("分销模板控制器")
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/temp")
+public class DistributionActivityTemplateController extends BaseController {
+
+    private final IDistributionActivityTemplateService iDistributionActivityTemplateService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询分销活动模板列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityTemplateVo> list(DistributionActivityTemplateQueryBo bo) {
+        startPage();
+        List<DistributionActivityTemplateVo> list = iDistributionActivityTemplateService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityTemplateVo> export(DistributionActivityTemplateQueryBo bo) {
+        List<DistributionActivityTemplateVo> list = iDistributionActivityTemplateService.queryList(bo);
+        ExcelUtil<DistributionActivityTemplateVo> util = new ExcelUtil<DistributionActivityTemplateVo>(DistributionActivityTemplateVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取分销活动模板详细信息
+     */
+    @ApiOperation("获取分销活动模板详细信息")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionActivityTemplateVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionActivityTemplateService.queryById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增分销活动模板")
+    @PostMapping("/save")
+    public AjaxResult<Void> add(@RequestBody DistributionActivityTemplateAddBo bo) {
+        return toAjax(iDistributionActivityTemplateService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改分销活动模板")
+    @PutMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityTemplateEditBo bo) {
+        return toAjax(iDistributionActivityTemplateService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(iDistributionActivityTemplateService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 105 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateGoodsController.java

@@ -0,0 +1,105 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateGoodsAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateGoodsEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateGoodsQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityTemplateGoodsService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityTemplateGoodsVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/goods")
+public class DistributionActivityTemplateGoodsController extends BaseController {
+
+    private final IDistributionActivityTemplateGoodsService iDistributionActivityTemplateGoodsService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:goods:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityTemplateGoodsVo> list(DistributionActivityTemplateGoodsQueryBo bo) {
+        startPage();
+        List<DistributionActivityTemplateGoodsVo> list = iDistributionActivityTemplateGoodsService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:goods:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityTemplateGoodsVo> export(DistributionActivityTemplateGoodsQueryBo bo) {
+        List<DistributionActivityTemplateGoodsVo> list = iDistributionActivityTemplateGoodsService.queryList(bo);
+        ExcelUtil<DistributionActivityTemplateGoodsVo> util = new ExcelUtil<DistributionActivityTemplateGoodsVo>(DistributionActivityTemplateGoodsVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取【请填写功能名称】详细信息")
+    @PreAuthorize("@ss.hasPermi('system:goods:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionActivityTemplateGoodsVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionActivityTemplateGoodsService.queryById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:goods:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionActivityTemplateGoodsAddBo bo) {
+        return toAjax(iDistributionActivityTemplateGoodsService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:goods:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityTemplateGoodsEditBo bo) {
+        return toAjax(iDistributionActivityTemplateGoodsService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:goods:remove')")
+    @Log(title = "【请填写功能名称】" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(iDistributionActivityTemplateGoodsService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 118 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplatePosterController.java

@@ -0,0 +1,118 @@
+package com.zhongzheng.controller.distribution;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplatePosterAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplatePosterQueryBo;
+import com.zhongzheng.modules.distribution.bo.distributionActivityTemplatePosterEditBo;
+import com.zhongzheng.modules.distribution.domain.DistributionActivityTemplateImage;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityTemplateImageService;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityTemplatePosterService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityTemplateImageVo;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityTemplatePosterVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 【分销海报模板控制器】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api("分销海报模板控制器")
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/poster")
+public class DistributionActivityTemplatePosterController extends BaseController {
+
+    private final IDistributionActivityTemplatePosterService iDistributionActivityTemplatePosterService;
+
+    private final IDistributionActivityTemplateImageService iDistributionActivityTemplateImageService;
+
+    /**
+     * 查询海报模板列表
+     */
+    @ApiOperation("查询海报模板列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityTemplatePosterVo> list(DistributionActivityTemplatePosterQueryBo bo) {
+        startPage();
+        List<DistributionActivityTemplatePosterVo> list = iDistributionActivityTemplatePosterService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取模板底图列表
+     */
+    @ApiOperation("获取海报模板底图列表")
+    @GetMapping("/image/list")
+    public AjaxResult<List<DistributionActivityTemplateImageVo>> list() {
+        List<DistributionActivityTemplateImage> imageList = iDistributionActivityTemplateImageService.list();
+        List<DistributionActivityTemplateImageVo> voList = imageList.stream().map(item -> BeanUtil.toBean(item, DistributionActivityTemplateImageVo.class)).collect(Collectors.toList());
+        return AjaxResult.success(voList);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:poster:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityTemplatePosterVo> export(DistributionActivityTemplatePosterQueryBo bo) {
+        List<DistributionActivityTemplatePosterVo> list = iDistributionActivityTemplatePosterService.queryList(bo);
+        ExcelUtil<DistributionActivityTemplatePosterVo> util = new ExcelUtil<DistributionActivityTemplatePosterVo>(DistributionActivityTemplatePosterVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取海报模板详细信息")
+    @PreAuthorize("@ss.hasPermi('system:poster:query')")
+    @GetMapping("/{posterTempId}")
+    public AjaxResult<DistributionActivityTemplatePosterVo> getInfo(@PathVariable("posterTempId" ) Long posterTempId) {
+        return AjaxResult.success(iDistributionActivityTemplatePosterService.queryById(posterTempId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增海报模板")
+    @PostMapping("/save")
+    public AjaxResult<Void> add(@RequestBody DistributionActivityTemplatePosterAddBo bo) {
+        return toAjax(iDistributionActivityTemplatePosterService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改海报模板")
+    @PutMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody distributionActivityTemplatePosterEditBo bo) {
+        return toAjax(iDistributionActivityTemplatePosterService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:poster:remove')")
+    @Log(title = "【请填写功能名称】" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{posterTempIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] posterTempIds) {
+        return toAjax(iDistributionActivityTemplatePosterService.deleteWithValidByIds(Arrays.asList(posterTempIds), true) ? 1 : 0);
+    }
+}

+ 105 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateRelationController.java

@@ -0,0 +1,105 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateRelationAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateRelationEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityTemplateRelationQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityTemplateRelationService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityTemplateRelationVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/relation")
+public class DistributionActivityTemplateRelationController extends BaseController {
+
+    private final IDistributionActivityTemplateRelationService iDistributionActivityTemplateRelationService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:relation:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityTemplateRelationVo> list(DistributionActivityTemplateRelationQueryBo bo) {
+        startPage();
+        List<DistributionActivityTemplateRelationVo> list = iDistributionActivityTemplateRelationService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:relation:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityTemplateRelationVo> export(DistributionActivityTemplateRelationQueryBo bo) {
+        List<DistributionActivityTemplateRelationVo> list = iDistributionActivityTemplateRelationService.queryList(bo);
+        ExcelUtil<DistributionActivityTemplateRelationVo> util = new ExcelUtil<DistributionActivityTemplateRelationVo>(DistributionActivityTemplateRelationVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取【请填写功能名称】详细信息")
+    @PreAuthorize("@ss.hasPermi('system:relation:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionActivityTemplateRelationVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionActivityTemplateRelationService.queryById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:relation:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionActivityTemplateRelationAddBo bo) {
+        return toAjax(iDistributionActivityTemplateRelationService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:relation:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityTemplateRelationEditBo bo) {
+        return toAjax(iDistributionActivityTemplateRelationService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:relation:remove')")
+    @Log(title = "【请填写功能名称】" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(iDistributionActivityTemplateRelationService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 62 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/goods/TopGoodsController.java

@@ -0,0 +1,62 @@
+package com.zhongzheng.controller.goods;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.goods.vo.TopGoodsVo;
+import com.zhongzheng.modules.top.goods.bo.TopGoodsQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopGoodsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 商品Controller
+ *
+ * @author hjl
+ * @date 2021-10-12
+ */
+@Api(value = "商品控制器", tags = {"商品管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/goods")
+public class TopGoodsController extends BaseController {
+
+    private final ITopGoodsService iTopGoodsService;
+
+    /**
+     * 商品批量复制
+     */
+    @ApiOperation("商品批量复制(全量)")
+    @GetMapping("/batch/copy/all")
+    public AjaxResult<Void> goodsBatchCopyTenant() {
+        return toAjax(iTopGoodsService.goodsBatchCopyTenant() ? 1 : 0);
+    }
+
+    /**
+     * 商品关系ID处理(全量复制后的处理方法)
+     */
+    @ApiOperation("商品关系ID处理(全量复制后的处理方法)")
+    @GetMapping("/batch/copy/dispose")
+    public AjaxResult<Void> goodsBatchCopyDisposeTenant() {
+        return toAjax(iTopGoodsService.goodsBatchCopyDisposeTenant() ? 1 : 0);
+    }
+
+    /**
+     * 查询商品列表
+     */
+    @ApiOperation("查询商品列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopGoodsVo> list(TopGoodsQueryBo bo) {
+        startPage();
+        List<TopGoodsVo> list = iTopGoodsService.selectList(bo);
+        return getDataTable(list);
+    }
+
+}

+ 38 - 43
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SuperSysLoginController.java

@@ -2,35 +2,29 @@ package com.zhongzheng.controller.system;
 
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
-import com.zhongzheng.common.core.domain.entity.SysMenu;
 import com.zhongzheng.common.core.domain.model.LoginBody;
-import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.domain.model.TopLoginUser;
-import com.zhongzheng.common.exception.CustomException;
-import com.zhongzheng.common.exception.user.UserPasswordNotMatchException;
-import com.zhongzheng.common.utils.MessageUtils;
 import com.zhongzheng.common.utils.ServletUtils;
-import com.zhongzheng.framework.manager.AsyncManager;
-import com.zhongzheng.framework.manager.factory.AsyncFactory;
 import com.zhongzheng.framework.web.service.TokenService;
 import com.zhongzheng.framework.web.service.TopSysLoginService;
+import com.zhongzheng.framework.web.service.TopSysPermissionService;
 import com.zhongzheng.framework.web.service.TopTokenService;
-import com.zhongzheng.framework.web.service.SysPermissionService;
-import com.zhongzheng.modules.system.service.ISysMenuService;
-import com.zhongzheng.modules.system.service.ISysUserService;
+import com.zhongzheng.modules.top.user.domain.TopSysMenu;
+import com.zhongzheng.modules.top.user.service.ITopSysMenuService;
+import com.zhongzheng.modules.top.user.service.ITopSysUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.annotation.Resource;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 登录验证
@@ -45,10 +39,10 @@ public class SuperSysLoginController
     private TopSysLoginService loginService;
 
     @Autowired
-    private ISysMenuService menuService;
+    private ITopSysMenuService menuService;
 
     @Autowired
-    private SysPermissionService permissionService;
+    private TopSysPermissionService permissionService;
 
     @Autowired
     private TopTokenService topTokenService;
@@ -59,7 +53,7 @@ public class SuperSysLoginController
     private TokenService tokenService;
 
     @Autowired
-    private ISysUserService userService;
+    private ITopSysUserService userService;
     /**
      * 登录方法
      *
@@ -89,17 +83,18 @@ public class SuperSysLoginController
     {
         TopLoginUser loginUser = topTokenService.getLoginUser(ServletUtils.getRequest());
         TopSysUser user = loginUser.getUser();
+
         // 角色集合
-        Set<String> roles = new HashSet<String>();
-        roles.add("admin");
+        Set<String> roles = permissionService.getRolePermission(user);
         // 权限集合
-        Set<String> permissions = new HashSet<String>();
-        permissions.add("*:*:*");
+        Set<String> permissions = permissionService.getMenuPermission(user);
         Map<String,Object> map = new HashMap<>();
         map.put("user", user);
         map.put("roles", roles);
         map.put("permissions", permissions);
+
         return AjaxResult.success(map);
+
     }
 
     /**
@@ -114,25 +109,25 @@ public class SuperSysLoginController
         TopLoginUser loginUser = topTokenService.getLoginUser(ServletUtils.getRequest());
         // 用户信息
         TopSysUser user = loginUser.getUser();
-        List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
+        List<TopSysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
         return AjaxResult.success(menuService.buildMenus(menus));
     }
 
-    /**
-     * 获取子系统令牌
-     *
-     * @return 获取子系统令牌
-     */
-    @ApiOperation("获取子系统令牌")
-    @GetMapping("getChildToken")
-    public AjaxResult getChildToken()
-    {
-        //普通系统用户
-        SysUser user = userService.selectUserByUserName("admin");
-        LoginUser loginUser = new LoginUser(user, permissionService.getMenuPermission(user));
-        String token = tokenService.createToken(loginUser);
-        AjaxResult ajax = AjaxResult.success();
-        ajax.put(Constants.TOKEN, token);
-        return ajax;
-    }
+//    /**
+//     * 获取子系统令牌
+//     *
+//     * @return 获取子系统令牌
+//     */
+//    @ApiOperation("获取子系统令牌")
+//    @GetMapping("getChildToken")
+//    public AjaxResult getChildToken()
+//    {
+//        //普通系统用户
+//        TopSysUser user = userService.selectUserByUserName("admin");
+//        TopLoginUser loginUser = new TopLoginUser(user, permissionService.getMenuPermission(user));
+//        String token = tokenService.createToken(loginUser);
+//        AjaxResult ajax = AjaxResult.success();
+//        ajax.put(Constants.TOKEN, token);
+//        return ajax;
+//    }
 }

+ 140 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysConfigController.java

@@ -0,0 +1,140 @@
+package com.zhongzheng.controller.top;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.annotation.RepeatSubmit;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.modules.top.user.service.ITopSysConfigService;
+import com.zhongzheng.modules.top.user.vo.TopSysConfigVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/config")
+public class TopSysConfigController extends BaseController {
+    @Autowired
+    private ITopSysConfigService topConfigService;
+
+    /**
+     * 获取参数配置列表
+     */
+    @ApiOperation("配置列表")
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TopSysConfigVo config)
+    {
+        startPage();
+        List<TopSysConfigVo> list = topConfigService.selectConfigList(config);
+        return getDataTable(list);
+    }
+
+    /*@Log(title = "参数管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysConfig config)
+    {
+        List<SysConfig> list = topConfigService.selectConfigList(config);
+        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
+        return util.exportExcel(list, "参数数据");
+    }*/
+
+    /**
+     * 根据参数编号获取详细信息
+     */
+    @ApiOperation("通过ID配置详情")
+    @PreAuthorize("@ss.hasPermi('system:config:query')")
+    @GetMapping(value = "/{configId}")
+    public AjaxResult getInfo(@PathVariable Long configId)
+    {
+        return AjaxResult.success(topConfigService.selectConfigById(configId));
+    }
+
+    /**
+     * 根据参数键名查询参数值
+     */
+    @ApiOperation("通过KEY获取配置详情")
+    @GetMapping(value = "/configKey/{configKey}")
+    public AjaxResult getConfigKey(@PathVariable String configKey)
+    {
+        return AjaxResult.success("配置内容",topConfigService.selectConfigByKey(configKey));
+    }
+
+    /**
+     * 新增参数配置
+     */
+    @ApiOperation("新增配置")
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
+    @Log(title = "参数管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    @RepeatSubmit
+    public AjaxResult add(@Validated @RequestBody TopSysConfigVo config)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topConfigService.checkConfigKeyUnique(config)))
+        {
+            return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        config.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(topConfigService.insertConfig(config));
+    }
+
+    /**
+     * 修改参数配置
+     */
+    @ApiOperation("修改配置")
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
+    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody TopSysConfigVo config)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topConfigService.checkConfigKeyUnique(config)))
+        {
+            return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        config.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topConfigService.updateConfig(config));
+    }
+
+    /**
+     * 删除参数配置
+     */
+    @ApiOperation("删除配置")
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "参数管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{configIds}")
+    public AjaxResult remove(@PathVariable Long[] configIds)
+    {
+        return toAjax(topConfigService.deleteConfigByIds(configIds));
+    }
+
+    /**
+     * 清空缓存
+     */
+    @ApiOperation("刷新配置缓存")
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clearCache")
+    public AjaxResult clearCache()
+    {
+        topConfigService.clearCache();
+        return AjaxResult.success();
+    }
+}

+ 174 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDeptController.java

@@ -0,0 +1,174 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.util.StrUtil;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.modules.top.user.domain.TopSysDept;
+import com.zhongzheng.modules.top.user.service.ITopSysDeptService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "部门控制器", tags = {"部门管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/dept")
+public class TopSysDeptController extends BaseController {
+    @Autowired
+    private ITopSysDeptService topDeptService;
+
+    /**
+     * 获取部门列表
+     */
+    @ApiOperation("部门列表")
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list")
+    public AjaxResult list(TopSysDept dept)
+    {
+        List<TopSysDept> depts = topDeptService.selectDeptList(dept);
+        return AjaxResult.success(depts);
+    }
+
+    /**
+     * 查询部门列表(排除节点)
+     */
+    @ApiOperation("查询部门列表(节点)")
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list/exclude/{deptId}")
+    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
+    {
+        List<TopSysDept> depts = topDeptService.selectDeptList(new TopSysDept());
+        Iterator<TopSysDept> it = depts.iterator();
+        while (it.hasNext())
+        {
+            TopSysDept d = (TopSysDept) it.next();
+            if (d.getDeptId().intValue() == deptId
+                    || ArrayUtils.contains(StrUtil.split(d.getAncestors(), ","), deptId + ""))
+            {
+                it.remove();
+            }
+        }
+        return AjaxResult.success(depts);
+    }
+
+    /**
+     * 根据部门编号获取详细信息
+     */
+    @ApiOperation("根据部门编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:dept:query')")
+    @GetMapping(value = "/{deptId}")
+    public AjaxResult getInfo(@PathVariable Long deptId)
+    {
+        return AjaxResult.success(topDeptService.selectDeptById(deptId));
+    }
+
+    /**
+     * 获取部门下拉树列表
+     */
+    @ApiOperation("获取部门下拉树列表")
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(TopSysDept dept)
+    {
+        List<TopSysDept> depts = topDeptService.selectDeptList(dept);
+        return AjaxResult.success(topDeptService.buildDeptTreeSelect(depts));
+    }
+
+    /**
+     * 加载对应角色部门列表树
+     */
+    @ApiOperation("加载对应角色部门列表树")
+    @GetMapping(value = "/roleDeptTreeselect/{roleId}")
+    public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        List<TopSysDept> depts = topDeptService.selectDeptList(new TopSysDept());
+        Map<String,Object> map = new HashMap<>();
+        map.put("checkedKeys", topDeptService.selectDeptListByRoleId(roleId));
+        map.put("depts", topDeptService.buildDeptTreeSelect(depts));
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 新增部门
+     */
+    @ApiOperation("新增部门")
+    @ApiOperationSupport(includeParameters = {"deptName","parentId","orderNum","status"})
+    @PreAuthorize("@ss.hasPermi('system:dept:add')")
+    @Log(title = "部门管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysDept dept)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topDeptService.checkDeptNameUnique(dept)))
+        {
+            return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        dept.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(topDeptService.insertDept(dept));
+    }
+
+    /**
+     * 修改部门
+     */
+    @ApiOperation("修改部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
+    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody TopSysDept dept)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topDeptService.checkDeptNameUnique(dept)))
+        {
+            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        else if (dept.getParentId().equals(dept.getDeptId()))
+        {
+            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
+        }
+        else if (StrUtil.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
+                && topDeptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0)
+        {
+            return AjaxResult.error("该部门包含未停用的子部门!");
+        }
+        dept.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topDeptService.updateDept(dept));
+    }
+
+    /**
+     * 删除部门
+     */
+    @ApiOperation("删除部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
+    @Log(title = "部门管理", businessType = BusinessType.DELETE)
+    @PostMapping("/delete")
+    public AjaxResult remove(@PathVariable Long deptId)
+    {
+        if (topDeptService.hasChildByDeptId(deptId))
+        {
+            return AjaxResult.error("存在下级部门,不允许删除");
+        }
+        if (topDeptService.checkDeptExistUser(deptId))
+        {
+            return AjaxResult.error("部门存在用户,不允许删除");
+        }
+        return toAjax(topDeptService.deleteDeptById(deptId));
+    }
+}

+ 125 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDictDataController.java

@@ -0,0 +1,125 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.lang.Validator;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.top.user.domain.TopSysDictData;
+import com.zhongzheng.modules.top.user.service.ITopSysDictDataService;
+import com.zhongzheng.modules.top.user.service.ITopSysDictTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-13
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/dict/data")
+public class TopSysDictDataController extends BaseController {
+
+    private final ITopSysDictDataService dictDataService;
+
+    private final ITopSysDictTypeService dictTypeService;
+
+
+    @ApiOperation("获取字典数据列表")
+    //  @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TopSysDictData dictData)
+    {
+        startPage();
+        List<TopSysDictData> list = dictDataService.selectDictDataList(dictData);
+        return getDataTable(list);
+    }
+
+    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
+    //  @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @GetMapping("/export")
+    public AjaxResult export(TopSysDictData dictData)
+    {
+        List<TopSysDictData> list = dictDataService.selectDictDataList(dictData);
+        ExcelUtil<TopSysDictData> util = new ExcelUtil<TopSysDictData>(TopSysDictData.class);
+        return util.exportExcel(list, "字典数据");
+    }
+
+    /**
+     * 查询字典数据详细
+     */
+    @ApiOperation("查询字典数据详细")
+    // @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictCode}")
+    public AjaxResult getInfo(@PathVariable Long dictCode)
+    {
+        return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
+    }
+
+    /**
+     * 根据字典类型查询字典数据信息
+     */
+    @ApiOperation("根据字典类型查询字典数据信息")
+    @GetMapping(value = "/type/{dictType}")
+    public AjaxResult dictType(@PathVariable String dictType)
+    {
+        List<TopSysDictData> data = dictTypeService.selectDictDataByType(dictType);
+        if (Validator.isNull(data))
+        {
+            data = new ArrayList<TopSysDictData>();
+        }
+        return AjaxResult.success(data);
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @ApiOperation("新增字典数据")
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "字典数据", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysDictData dict)
+    {
+        dict.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(dictDataService.insertDictData(dict));
+    }
+
+    /**
+     * 修改保存字典类型
+     */
+    @ApiOperation("修改保存字典数据")
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody TopSysDictData dict)
+    {
+        dict.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(dictDataService.updateDictData(dict));
+    }
+
+    /**
+     * 删除字典类型
+     */
+    @ApiOperation("删除字典数据")
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
+    @PostMapping("/delete/{dictCodes}")
+    public AjaxResult remove(@PathVariable Long[] dictCodes)
+    {
+        return toAjax(dictDataService.deleteDictDataByIds(dictCodes));
+    }
+}

+ 117 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDictTypeController.java

@@ -0,0 +1,117 @@
+package com.zhongzheng.controller.top;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.modules.top.user.domain.TopSysDictType;
+import com.zhongzheng.modules.top.user.service.ITopSysDictTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-13
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/dict/type")
+public class TopSysDictTypeController extends BaseController {
+
+    private final ITopSysDictTypeService dictTypeService;
+
+    @ApiOperation("获取字典类型列表")
+    //   @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TopSysDictType dictType)
+    {
+        startPage();
+        List<TopSysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        return getDataTable(list);
+    }
+    
+
+    /**
+     * 查询字典类型详细
+     */
+    @ApiOperation("查询字典类型详细")
+    //   @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictId}")
+    public AjaxResult getInfo(@PathVariable Long dictId)
+    {
+        return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @ApiOperation("新增字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "字典类型", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysDictType dict)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
+        {
+            return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        dict.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(dictTypeService.insertDictType(dict));
+    }
+
+    /**
+     * 修改字典类型
+     */
+    @ApiOperation("修改字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "字典类型", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody TopSysDictType dict)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
+        {
+            return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        dict.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(dictTypeService.updateDictType(dict));
+    }
+
+    /**
+     * 删除字典类型
+     */
+    @ApiOperation("删除字典类型")
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
+    @PostMapping("/delete/{dictIds}")
+    public AjaxResult remove(@PathVariable Long[] dictIds)
+    {
+        return toAjax(dictTypeService.deleteDictTypeByIds(dictIds));
+    }
+
+    /**
+     * 清空缓存
+     */
+
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clearCache")
+    public AjaxResult clearCache()
+    {
+        dictTypeService.clearCache();
+        return AjaxResult.success();
+    }
+
+}

+ 169 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysMenuController.java

@@ -0,0 +1,169 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.util.StrUtil;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.top.user.domain.TopSysMenu;
+import com.zhongzheng.modules.top.user.service.ITopSysMenuService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/menu")
+public class TopSysMenuController extends BaseController {
+    @Autowired
+    private ITopSysMenuService topMenuService;
+
+    @Autowired
+    private TopTokenService tokenService;
+
+    /**
+     * 获取菜单列表
+     */
+    @ApiOperation("获取菜单列表")
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
+    @GetMapping("/list")
+    public AjaxResult list(TopSysMenu menu)
+    {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        List<TopSysMenu> menus = topMenuService.selectMenuList(menu, userId);
+        return AjaxResult.success(menus);
+    }
+
+    /**
+     * 根据菜单编号获取详细信息
+     */
+    @ApiOperation("根据菜单编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:menu:query')")
+    @GetMapping(value = "/{menuId}")
+    public AjaxResult getInfo(@PathVariable Long menuId)
+    {
+        return AjaxResult.success(topMenuService.selectMenuById(menuId));
+    }
+
+    /**
+     * 获取菜单下拉树列表
+     */
+    @ApiOperation("获取菜单下拉树列表")
+    @ApiOperationSupport(includeParameters = {})
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(TopSysMenu menu)
+    {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        List<TopSysMenu> menus = topMenuService.selectMenuList(menu, userId);
+        return AjaxResult.success(topMenuService.buildMenuTreeSelect(menus));
+    }
+
+    /**
+     * 加载对应角色菜单列表树
+     */
+    @ApiOperation("加载对应角色菜单列表树")
+    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
+    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        List<TopSysMenu> menus = topMenuService.selectMenuList(loginUser.getUser().getUserId());
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("checkedKeys", topMenuService.selectMenuListByRoleId(roleId));
+        ajax.put("menus", topMenuService.buildMenuTreeSelect(menus));
+        return ajax;
+    }
+
+    /**
+     * 新增菜单
+     */
+    @ApiOperation("新增菜单")
+    @ApiOperationSupport(ignoreParameters = {"children","createBy","createTime","menuId","params"
+            ,"parentName","remark","updateBy","updateTime"})
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
+    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysMenu menu)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topMenuService.checkMenuNameUnique(menu)))
+        {
+            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        }
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
+                && !StrUtil.startWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
+        {
+            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
+        }
+        menu.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(topMenuService.insertMenu(menu));
+    }
+
+    /**
+     * 修改菜单
+     */
+    @ApiOperation("修改菜单")
+    @ApiOperationSupport(ignoreParameters = {"children","createBy","createTime","params"
+            ,"parentName","remark","updateBy","updateTime"})
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
+    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody TopSysMenu menu)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topMenuService.checkMenuNameUnique(menu)))
+        {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        }
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
+                && !StrUtil.startWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
+        {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
+        }
+        else if (menu.getMenuId().equals(menu.getParentId()))
+        {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
+        }
+        menu.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topMenuService.updateMenu(menu));
+    }
+
+    /**
+     * 删除菜单
+     */
+    @ApiOperation("删除菜单")
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
+    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
+    @PostMapping("/delete/{menuId}")
+    public AjaxResult remove(@PathVariable Long menuId)
+    {
+        if (topMenuService.hasChildByMenuId(menuId))
+        {
+            return AjaxResult.error("存在子菜单,不允许删除");
+        }
+        if (topMenuService.checkMenuExistRole(menuId))
+        {
+            return AjaxResult.error("菜单已分配,不允许删除");
+        }
+        return toAjax(topMenuService.deleteMenuById(menuId));
+    }
+}

+ 192 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleController.java

@@ -0,0 +1,192 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.lang.Validator;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TopSysPermissionService;
+import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.top.user.domain.TopSysRole;
+import com.zhongzheng.modules.top.user.service.ITopSysRoleService;
+import com.zhongzheng.modules.top.user.service.ITopSysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 角色信息Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "角色信息控制器", tags = {"角色信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("system/role")
+public class TopSysRoleController extends BaseController {
+    @Autowired
+    private ITopSysRoleService topSysRoleService;
+
+    @Autowired
+    private TopTokenService tokenService;
+
+    @Autowired
+    private TopSysPermissionService topSysPermissionService;
+
+    @Autowired
+    private ITopSysUserService topSysUserService;
+
+    @ApiOperation("角色列表")
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TopSysRole role)
+    {
+        startPage();
+        List<TopSysRole> list = topSysRoleService.selectRoleList(role);
+        return getDataTable(list);
+    }
+
+    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:role:export')")
+    @GetMapping("/export")
+    public AjaxResult export(TopSysRole role)
+    {
+        List<TopSysRole> list = topSysRoleService.selectRoleList(role);
+        ExcelUtil<TopSysRole> util = new ExcelUtil<TopSysRole>(TopSysRole.class);
+        return util.exportExcel(list, "角色数据");
+    }
+
+    /**
+     * 根据角色编号获取详细信息
+     */
+    @ApiOperation("根据角色编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping(value = "/{roleId}")
+    public AjaxResult getInfo(@PathVariable Long roleId)
+    {
+        return AjaxResult.success(topSysRoleService.selectRoleById(roleId));
+    }
+
+    /**
+     * 新增角色
+     */
+    @ApiOperation("新增角色")
+    @ApiOperationSupport(ignoreParameters = {"createBy","createTime","dataScope","delFlag","updateTime"
+            ,"flag","params","roleId","updateBy","deptIds","deptCheckStrictly","menuCheckStrictly"})
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
+    @Log(title = "角色管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysRole role)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleNameUnique(role)))
+        {
+            return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleKeyUnique(role)))
+        {
+            return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        role.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(topSysRoleService.insertRole(role));
+
+    }
+
+    /**
+     * 修改保存角色
+     */
+    @ApiOperation("修改保存角色")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody TopSysRole role)
+    {
+        topSysRoleService.checkRoleAllowed(role);
+        if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleNameUnique(role)))
+        {
+            return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleKeyUnique(role)))
+        {
+            return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        role.setUpdateBy(SecurityUtils.getUsername());
+
+        if (topSysRoleService.updateRole(role) > 0)
+        {
+            // 更新缓存用户权限
+            TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            if (Validator.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
+            {
+                loginUser.setPermissions(topSysPermissionService.getMenuPermission(loginUser.getUser()));
+                loginUser.setUser(topSysUserService.selectUserByUserName(loginUser.getUser().getUserName()));
+                tokenService.setLoginUser(loginUser);
+            }
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
+    }
+
+    /**
+     * 修改保存数据权限
+     */
+    @ApiOperation("修改保存数据权限")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/dataScope")
+    public AjaxResult dataScope(@RequestBody TopSysRole role)
+    {
+        topSysRoleService.checkRoleAllowed(role);
+        return toAjax(topSysRoleService.authDataScope(role));
+    }
+
+    /**
+     * 状态修改
+     */
+    @ApiOperation("状态修改")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/changeStatus")
+    public AjaxResult changeStatus(@RequestBody TopSysRole role)
+    {
+        topSysRoleService.checkRoleAllowed(role);
+        role.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topSysRoleService.updateRoleStatus(role));
+    }
+
+    /**
+     * 删除角色
+     */
+    @ApiOperation("删除角色")
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
+    @Log(title = "角色管理", businessType = BusinessType.DELETE)
+    @PostMapping("/delete/{roleIds}")
+    public AjaxResult remove(@PathVariable Long[] roleIds)
+    {
+        return toAjax(topSysRoleService.deleteRoleByIds(roleIds));
+    }
+
+    /**
+     * 获取角色选择框列表
+     */
+    @ApiOperation("获取角色选择框列表")
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping("/optionselect")
+    public AjaxResult optionselect()
+    {
+        return AjaxResult.success(topSysRoleService.selectRoleAll());
+    }
+}

+ 285 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java

@@ -0,0 +1,285 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.bo.SysUserEditBo;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.entity.TopSysUser;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
+import com.zhongzheng.modules.top.user.domain.TopSysRole;
+import com.zhongzheng.modules.top.user.service.ITopSysPostService;
+import com.zhongzheng.modules.top.user.service.ITopSysRoleService;
+import com.zhongzheng.modules.top.user.service.ITopSysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户信息
+ *
+ * @author zhongzheng
+ */
+@Api(tags ="用户信息管理")
+@RestController
+@RequestMapping("/system/user")
+public class TopSysUserController extends BaseController
+{
+    @Autowired
+    private ITopSysUserService topSysUserService;
+
+    @Autowired
+    private ITopSysRoleService topSysRoleService;
+
+    @Autowired
+    private ITopSysPostService topSysPostService;
+
+    @Autowired
+    private TopTokenService tokenService;
+
+    @Resource
+    private AuthenticationManager authenticationManager;
+
+    /**
+     * 获取用户列表
+     */
+    @ApiOperation("获取用户列表")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TopSysUser user)
+    {
+        startPage();
+        List<TopSysUser> list = topSysUserService.selectUserList(user);
+        return getDataTable(list);
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
+    @GetMapping("/export")
+    public AjaxResult export(TopSysUser user)
+    {
+        List<TopSysUser> list = topSysUserService.selectUserList(user);
+        ExcelUtil<TopSysUser> util = new ExcelUtil<TopSysUser>(TopSysUser.class);
+        return util.exportExcel(list, "用户数据");
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:import')")
+    @PostMapping("/importData")
+  /*  public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<TopSysUser> util = new ExcelUtil<TopSysUser>(TopSysUser.class);
+        List<TopSysUser> userList = util.importExcel(file.getInputStream());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String operName = loginUser.getUsername();
+        String message = topSysUserService.importUser(userList, updateSupport, operName);
+        return AjaxResult.success(message);
+    }*/
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<TopSysUser> util = new ExcelUtil<TopSysUser>(TopSysUser.class);
+        return util.importTemplateExcel("用户数据");
+    }
+
+    /**
+     * 根据用户编号获取详细信息
+     */
+    @ApiOperation("获取用户详细")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
+    @GetMapping(value = {  "/{userId}" })
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        List<TopSysRole> roles = topSysRoleService.selectRoleAll();
+        TopSysUser sysUser = topSysUserService.selectUserById(userId);
+        ajax.put("roles", TopSysUser.isAdmin(sysUser.getUserName()) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        ajax.put("posts", topSysPostService.selectPostAll());
+        if (Validator.isNotNull(userId))
+        {
+            ajax.put(AjaxResult.DATA_TAG, topSysUserService.selectUserById(userId));
+            ajax.put("postIds", topSysPostService.selectPostListByUserId(userId));
+            ajax.put("roleIds", topSysRoleService.selectRoleListByUserId(userId));
+        }
+        return ajax;
+    }
+
+    /**
+     * 新增用户
+     */
+    @ApiOperation("新增用户")
+    @ApiOperationSupport(ignoreParameters = {"id","orderDate.id"})
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
+    @Log(title = "用户管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysUser user)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topSysUserService.checkUserNameUnique(user.getUserName())))
+        {
+            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
+        }
+        else if (Validator.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkPhoneUnique(user)))
+        {
+            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
+        }
+        else if (Validator.isNotEmpty(user.getEmail())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkEmailUnique(user)))
+        {
+            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }
+        user.setCreateBy(SecurityUtils.getUsername());
+        if(!ToolsUtils.verifPwd(user.getPassword())){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        return toAjax(topSysUserService.insertUser(user));
+    }
+
+    /**
+     * 修改用户
+     */
+    @ApiOperation("更新用户")
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody SysUserEditBo bo)
+    {
+        if (Validator.isNotEmpty(bo.getStatus())&&bo.getStatus().equals(-1)){
+            TopSysUser user = BeanUtil.toBean(bo, TopSysUser.class);
+            int result = topSysUserService.updateUser(user);
+            return toAjax(result);
+        }
+        TopSysUser user = BeanUtil.toBean(bo, TopSysUser.class);
+        topSysUserService.checkUserAllowed(user);
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(!loginUser.getUser().isAdmin()&& !loginUser.getUser().getUserId().equals(user.getUserId())){
+            return AjaxResult.error("您无权限修改本信息");
+        }
+
+        if (Validator.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkPhoneUnique(user)))
+        {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
+        }
+        else if (Validator.isNotEmpty(user.getEmail())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkEmailUnique(user)))
+        {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }
+        if(Validator.isNotEmpty(user.getPassword())){
+            //重置密码
+            if(!loginUser.getUser().isAdmin()){
+                //普通用户需传入旧密码修改
+                // 旧密码用户验证
+                Authentication authentication = null;
+                try
+                {
+                    // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+                    authentication = authenticationManager
+                            .authenticate(new UsernamePasswordAuthenticationToken(loginUser.getUser().getUserName(), bo.getOldPassword()));
+                }
+                catch (Exception e)
+                {
+                    return AjaxResult.error("旧密码错误");
+                }
+
+            }
+            if(!ToolsUtils.verifPwd(user.getPassword())){
+                throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+            }
+            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        }
+        user.setUpdateBy(SecurityUtils.getUsername());
+        int result = topSysUserService.updateUser(user);
+        if(result>0){
+            TopSysUser newUser = topSysUserService.selectUserByUserName(loginUser.getUser().getUserName());
+            //同个用户ID则更新用户信息,admin操作其他用户则不更新
+            if(newUser.getUserId().equals(loginUser.getUser().getUserId())){
+                // 更新缓存用户
+                loginUser.setUser(newUser);
+            }
+            tokenService.setLoginUser(loginUser);
+        }
+        return toAjax(result);
+    }
+
+    /**
+     * 删除用户
+     */
+  /*  @ApiOperation("删除用户信息")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
+    @Log(title = "用户管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(topSysUserService.deleteUserByIds(userIds));
+    }*/
+
+    /**
+     * 重置密码
+     */
+
+  /*  @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/resetPwd")
+    public AjaxResult resetPwd(@RequestBody TopSysUser user)
+    {
+        topSysUserService.checkUserAllowed(user);
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topSysUserService.resetPwd(user));
+    }*/
+
+    /**
+     * 状态修改
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public AjaxResult changeStatus(@RequestBody TopSysUser user)
+    {
+        topSysUserService.checkUserAllowed(user);
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topSysUserService.updateUserStatus(user));
+    }
+
+    /**
+     * 业务层次获取用户列表
+     */
+    @ApiOperation("业务层次获取用户列表")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/businessPeopleList")
+    public TableDataInfo queryBusinessPeopleList(CourseBusinessQueryBo bo)
+    {
+        startPage();
+        List<TopSysUser> list = topSysUserService.queryBusinessPeopleList(bo);
+        return getDataTable(list);
+    }
+}

+ 132 - 55
zhongzheng-admin-saas/src/main/resources/application-dev.yml

@@ -1,60 +1,85 @@
 # 数据源配置
 spring:
     datasource:
-        type: com.alibaba.druid.pool.DruidDataSource
-        driverClassName: com.mysql.cj.jdbc.Driver
-        druid:
-            # 主库数据源
-            master:
-                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
-                username: root
-                password: zhongzheng2021
-            # 从库数据源
-            slave:
-                # 从数据源开关/默认关闭
-                enabled: false
-                url:
-                username:
-                password:
-            # 初始连接数
-            initialSize: 5
-            # 最小连接池数量
-            minIdle: 10
-            # 最大连接池数量
-            maxActive: 20
-            # 配置获取连接等待超时的时间
-            maxWait: 60000
-            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-            timeBetweenEvictionRunsMillis: 60000
-            # 配置一个连接在池中最小生存的时间,单位是毫秒
-            minEvictableIdleTimeMillis: 300000
-            # 配置一个连接在池中最大生存的时间,单位是毫秒
-            maxEvictableIdleTimeMillis: 900000
-            # 配置检测连接是否有效
-            validationQuery: SELECT 1 FROM DUAL
-            testWhileIdle: true
-            testOnBorrow: false
-            testOnReturn: false
-            webStatFilter:
-                enabled: true
-            statViewServlet:
-                enabled: true
-                # 设置白名单,不填则允许所有访问
-                allow:
-                url-pattern: /druid/*
-                # 控制台管理用户名和密码
-                login-username: ruoyi
-                login-password: 123456
-            filter:
-                stat:
-                    enabled: true
-                    # 慢SQL记录
-                    log-slow-sql: true
-                    slow-sql-millis: 1000
-                    merge-sql: true
-                wall:
-                    config:
-                        multi-statement-allow: true
+        #配置hikari连接池
+        hikari:
+            minimum-idle: 10
+            maximum-pool-size: 20
+            connection-timeout: 10000
+            idle-timeout: 30000
+            connection-init-sql: set names utf8mb4
+        #动态数据源配置
+        dynamic:
+            primary: master #设置默认的数据源或者数据源组,默认值即为master
+            strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
+            datasource:
+                #数据源
+                master:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas_top?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                    username: root
+                    password: zhongzheng2021
+                #数据源
+                slave:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                    username: root
+                    password: zhongzheng2021
+#    datasource:
+#        type: com.alibaba.druid.pool.DruidDataSource
+#        driverClassName: com.mysql.cj.jdbc.Driver
+#        druid:
+#            # 主库数据源
+#            master:
+#                url: jdbc:mysql://192.168.1.222:3306/zz_edu_sass_top?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+#                username: root
+#                password:  zhongzheng2021
+#            # 从库数据源
+#            slave:
+#                # 从数据源开关/默认关闭
+#                enabled: true
+#                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+#                username: root
+#                password: zhongzheng2021
+#            # 初始连接数
+#            initialSize: 5
+#            # 最小连接池数量
+#            minIdle: 10
+#            # 最大连接池数量
+#            maxActive: 20
+#            # 配置获取连接等待超时的时间
+#            maxWait: 60000
+#            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+#            timeBetweenEvictionRunsMillis: 60000
+#            # 配置一个连接在池中最小生存的时间,单位是毫秒
+#            minEvictableIdleTimeMillis: 300000
+#            # 配置一个连接在池中最大生存的时间,单位是毫秒
+#            maxEvictableIdleTimeMillis: 900000
+#            # 配置检测连接是否有效
+#            validationQuery: SELECT 1 FROM DUAL
+#            testWhileIdle: true
+#            testOnBorrow: false
+#            testOnReturn: false
+#            webStatFilter:
+#                enabled: true
+#            statViewServlet:
+#                enabled: true
+#                # 设置白名单,不填则允许所有访问
+#                allow:
+#                url-pattern: /druid/*
+#                # 控制台管理用户名和密码
+#                login-username: ruoyi
+#                login-password: 123456
+#            filter:
+#                stat:
+#                    enabled: true
+#                    # 慢SQL记录
+#                    log-slow-sql: true
+#                    slow-sql-millis: 1000
+#                    merge-sql: true
+#                wall:
+#                    config:
+#                        multi-statement-allow: true
     # redis 配置
     redis:
         # 地址
@@ -85,13 +110,65 @@ aliyun:
         bucketName: zhongzheng-test # oss的存储空间
         policy:
             expire: 30 # 签名有效期(S)
-        maxSize: 10 # 上传文件大小(M)
+        maxSize: 100 # 上传文件大小(M)
         callback: http://120.79.166.78:19004/aliyun/oss/callback # 文件上传成功后的回调地址
         dir:
             prefix: oss/images/ # 上传文件夹路径前缀 `
+
 poliv:
     token:
         userid: d5f6d309fe
         writetoken: 8f14a371-9d02-4ec1-922d-54d7b4f79dca
         readtoken: f2c397b4-e2a3-46dc-9266-e6a43ac26a35
         secretkey: xpPrYdcbA1
+
+wx:
+    small:
+        appid: wxd3c8ae80cf43a305
+        appsecret: 193a001ebfd46f227008a21e9d13e750
+    gzh:
+        appid: wx6f48f721d18244eb
+        appsecret: 2f8b2b4ff66e2f6adfb9f08ae22d7474
+        studyNoteTpId: DndIixcAp15Sqgb4KOGTMf73VLF09NlCUifPSel5Y_s
+        qdyTpId: s981yq3SyIODNUEXFzVSWn0OYj90E72aKdtKtSp05_E
+        qdySubTpId: gzE6zddD7OzDLUtOO4GfU-KPCxpMqWFhCj86uXExqB8
+        qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
+        qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
+        qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
+    wepay:
+        mchid: 1342013901
+        key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
+        appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
+        notifyUrl: http://120.79.166.78:19012/wx/pay/callback
+    scanLogin:
+        host: https://testm.xyyxt.net/
+
+wisdomExamRoom:
+    mchid: 10001
+    appid: ZZ-YXT-GZ-20220820-0001
+    app_secret: mt70O1s/Xd5LwuH7yHLpj9R+tKUn5j9vTnCvmgBnbJDA11Hpl7+q4lEZliqPAjN+YHPn9bGmHkAbw5XwhhMiYg==
+    host:  http://bg.sam457.site:9020
+
+certificate:
+    host: http://192.168.1.38:8000/
+
+liveGotoURL: http://120.79.166.78:19014/
+
+enCodeVersion: develop
+
+oldStudySys:
+    syncPath: http://gdxypx.xy.com/System/BussinessApi/PostUserStudyRecords
+    sharePath: http://192.168.1.210:8086/witsystem/dataapi/SaleOrder
+    shareCanclePath: http://192.168.1.210:8086/witsystem/dataapi/ordercance
+    searchGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
+
+officialPush:
+    infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan
+    periodPath: http://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
+    infoAccount: peixunjigou
+    token: 0ca175b9c0f726a831d895e26933246

+ 38 - 28
zhongzheng-admin-saas/src/main/resources/application.yml

@@ -1,7 +1,7 @@
 # 项目相关配置
 zhongzheng:
   # 名称
-  name: zhongzheng-admin-saas
+  name: zhongzheng_saas
   # 版本
   version: 3.4.0
   # 版权年份
@@ -61,6 +61,9 @@ logging:
 
 # Spring配置
 spring:
+  mvc:
+    async:
+      request-timeout: 30000
   main:
     allow-bean-definition-overriding: true
   # 资源信息
@@ -71,11 +74,11 @@ spring:
     active: @profiles.active@
   # 文件上传
   servlet:
-     multipart:
-       # 单个文件大小
-       max-file-size:  10MB
-       # 设置总上传的文件大小
-       max-request-size:  20MB
+    multipart:
+      # 单个文件大小
+      max-file-size:  10MB
+      # 设置总上传的文件大小
+      max-request-size:  20MB
   # 服务模块
   devtools:
     restart:
@@ -109,12 +112,12 @@ management:
 
 # token配置
 token:
-    # 令牌自定义标识
-    header: AuthorizationToken
-    # 令牌密钥
-    secret: abcdefghijklmnopqrstuvwxyz
-    # 令牌有效期(默认30分钟)
-    expireTime: 360
+  # 令牌自定义标识
+  header: AuthorizationToken
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 360
 
 # MyBatis配置
 # https://baomidou.com/config/
@@ -138,6 +141,7 @@ mybatis-plus:
   executorType: SIMPLE
   # 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
   configurationProperties: null
+  typeHandlersPackage: com.zhongzheng.common.type
   configuration:
     # 自动驼峰命名规则(camel case)映射
     # 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
@@ -212,13 +216,16 @@ pagehelper:
   reasonable: true
   supportMethodsArguments: true
   params: count=countSql
-
 # Swagger配置
 swagger:
   # 是否开启swagger
   enabled: true
   # 请求前缀
   pathMapping:
+knife4j:
+  enable: true
+  setting:
+    enableFooter: false
 
 # 防止XSS攻击
 xss:
@@ -241,23 +248,17 @@ feign:
   hystrix:
     enabled: true
 
-wx:
-  small:
-    appid: wx8295c6fa6b0b3106
-    appsecret: 2a95e366da4c4b17a3963e9756b878fd
-  gzh:
-    appid: wx6f48f721d18244eb
-    appsecret: 2f8b2b4ff66e2f6adfb9f08ae22d7474
-  wepay:
-    mchid: 1342013901
-    key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
-    appsecret: 2f8b2b4ff66e2f6adfb9f08ae22d7474
-    notifyUrl: http://42.192.164.187:19005/wx/pay/callback
+poliv:
+  sdk:
+    userid: egsxlptzdq
+    appId: ezl5uy4zei
+    appSecret: 2bf5bb3c31d34531943df10284edd50b
 
 tencent:
   cloud:
     SecretId: AKIDd6XkjTw9D1atwkJceS2NSIuHPK1ThfOr
     SecretKey: GG2ZqrdCWcS6Yx72h6F7k7E4ey2qPnwq
+
 aliyun:
   sms:
     signName: 祥粤学校
@@ -265,13 +266,14 @@ aliyun:
     loginTemplateCode: SMS_228670005
     forgetTemplateCode: SMS_228685033
     pwdTemplateCode: SMS_230220381
+    bindNewTelCode: SMS_232178371
     accessKeyId: LTAIgC8O2WUXvXuR
     accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX
     OpenTheGoodsCode: SMS_230970155     #商品开通提醒
     informationNotificationCode: SMS_230965149  #完善报名资料通知
     materialReviewCode: SMS_230980165         #报名资料审核通过通知
     NotificationOfFailureCode: SMS_230980172  #报名资料审核不通过通知
-    remainingDaysValidityCode: SMS_230960174  #开通班级有效期还剩天数
+    remainingDaysValidityCode: SMS_236566823  #开通班级有效期还剩天数
     completionReminderCode: SMS_230965157   #学时学习完成提醒
     schoolHoursCode: SMS_230970166    #学时机构审核通过提醒
     auditFailedCode: SMS_230970167  #学时机构审核不通过提醒
@@ -282,7 +284,7 @@ aliyun:
     reservationSuccess: SMS_230980186 #考试预约成功提醒
     examinationRemind: SMS_230960195  #考试提醒
     newExamPass: SMS_230970179  #七大员新考考试通过提醒
-    newExamFail: SMS_230960198  #七大员新考考试不通过提醒
+    newExamFail: SMS_235491082  #七大员新考考试不通过提醒
     openingReminder: SMS_230970209  #七大员题库开通提醒(12-22
     classRemind: SMS_230965224  #二建继教开班提醒
     OverdueReminder: SMS_230980259  #班级过期提醒
@@ -292,4 +294,12 @@ aliyun:
     commitmentFailsCode: SMS_231215516     #承诺书审核不通过通知
     mockBookingReminder: SMS_243430276     #模考预约提醒
     mockRemind: SMS_243355276      #模考开始提醒
-    liveStartRemind: SMS_243345514      #直播开课提醒
+    liveStartRemind: SMS_243345514      #直播开课提醒
+    buyNotStudyStudentRemind : SMS_247745294  #学生购买未学习
+    buyNotStudyTeacherRemind : SMS_247935257  #学生购买未学习老师
+    longNotStudyStudentRemind: SMS_247910221  #学生长时间未学习
+    longNotStudyTeacherRemind: SMS_247765294  #学生长时间未学习老师
+    signCommitmentRemind: SMS_250390195  #签署承诺书提醒
+    todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
+    todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)
+    noFinishExamNoteCode: SMS_262460267  #未做完试卷通知

+ 2 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/ZhongZhengApplication.java

@@ -1,12 +1,10 @@
 package com.zhongzheng;
 
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.cloud.client.loadbalancer.LoadBalanced;
-import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.web.client.RestTemplate;
 
 /**
  * 启动程序
@@ -14,7 +12,7 @@ import org.springframework.web.client.RestTemplate;
  * @author zhongzheng
  */
 
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class })
 @EnableScheduling
 public class ZhongZhengApplication
 {

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -76,7 +76,7 @@ public class QuestionController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<QuestionVo> list(QuestionQueryBo bo) {
         startPage();
-        List<QuestionVo> list = iQuestionService.selectList(bo);
+        List<QuestionVo> list = iQuestionService.selectListByBo(bo);
         return getDataTable(list);
     }
 

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/CertificateTpController.java

@@ -51,7 +51,7 @@ public class CertificateTpController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<CertificateTpVo> list(CertificateTpQueryBo bo) {
         startPage();
-        List<CertificateTpVo> list = iCertificateTpService.selectList(bo);
+        List<CertificateTpVo> list = iCertificateTpService.selectListByBo(bo);
         return getDataTable(list);
     }
 

+ 6 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java

@@ -2,6 +2,7 @@ package com.zhongzheng.controller.base;
 
 import java.util.List;
 import java.util.Arrays;
+import java.util.stream.Collectors;
 
 import com.zhongzheng.modules.base.bo.ProfileTpAddBo;
 import com.zhongzheng.modules.base.bo.ProfileTpEditBo;
@@ -9,6 +10,7 @@ import com.zhongzheng.modules.base.bo.ProfileTpQueryBo;
 import com.zhongzheng.modules.base.service.IProfileTpService;
 import com.zhongzheng.modules.base.vo.ProfileTpVo;
 import lombok.RequiredArgsConstructor;
+import net.polyv.common.v1.util.StringUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -50,6 +52,10 @@ public class ProfileTpController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<ProfileTpVo> list(ProfileTpQueryBo bo) {
         startPage();
+        if (StringUtils.isNotBlank(bo.getStatus())){
+            List<Integer> collect = Arrays.asList(bo.getStatus().split(",")).stream().map(x -> Integer.valueOf(x)).collect(Collectors.toList());
+            bo.setStatusList(collect);
+        }
         List<ProfileTpVo> list = iProfileTpService.selectList(bo);
         return getDataTable(list);
     }

+ 154 - 19
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -1,11 +1,12 @@
 package com.zhongzheng.controller.common;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.zhongzheng.common.config.RuoYiConfig;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.core.domain.model.LoginBody;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUploadUtils;
@@ -13,23 +14,29 @@ import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.config.ServerConfig;
 import com.zhongzheng.framework.web.service.WxLoginService;
-import com.zhongzheng.modules.course.vo.CourseMenuVo;
+import com.zhongzheng.modules.base.bo.ConfigQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
+import com.zhongzheng.modules.goods.bo.GoodsStudyUrlBo;
+import com.zhongzheng.modules.goods.bo.UserGoodsListBo;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsJzsVo;
-import com.zhongzheng.modules.grade.bo.RollBackPeriodBo;
-import com.zhongzheng.modules.grade.bo.UserPeriodEditBo;
+import com.zhongzheng.modules.goods.vo.UserGoodsListVo;
+import com.zhongzheng.modules.grade.bo.*;
+import com.zhongzheng.modules.grade.service.IClassGradeService;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
-import com.zhongzheng.modules.grade.vo.ClassPeriodStudentExportAllVo;
 import com.zhongzheng.modules.grade.vo.SyncGoodsExport;
-import com.zhongzheng.modules.order.bo.OrderAddBo;
 import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
 import com.zhongzheng.modules.order.service.IOrderService;
-import com.zhongzheng.modules.order.service.impl.OrderServiceImpl;
-import com.zhongzheng.modules.system.service.ISysUserService;
-import com.zhongzheng.modules.user.vo.UserExportVo;
+import com.zhongzheng.modules.system.bo.SysTenantAdminBo;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.service.ISysWebService;
+import com.zhongzheng.modules.system.vo.SysTenantVo;
+import com.zhongzheng.modules.top.user.bo.TopSysTenantRegisterAddBo;
+import com.zhongzheng.modules.top.user.service.ITopSysTenantRegisterService;
+import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import io.swagger.annotations.ApiOperation;
@@ -49,6 +56,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 通用请求处理
@@ -78,7 +86,16 @@ public class CommonController
 
     @Autowired
     private IWxPayService iWxPayService;
-
+    @Autowired
+    private  IClassGradeService iClassGradeService;
+    @Autowired
+    private ISysTenantService iSysTenantService;
+    @Autowired
+    private IUserService iUserService;
+    @Autowired
+    private  ITopSysTenantRegisterService iTopSysTenantRegisterService;
+    @Autowired
+    private  ISysWebService webService;
     /**
      * 通用下载请求
      *
@@ -179,14 +196,14 @@ public class CommonController
 
 
     @ApiOperation("测试列表")
-    @GetMapping("common/jzs/test")
-    public AjaxResult<Void> testList()
+    @PostMapping("common/jzs/test")
+    public AjaxResult<Void> testList(@RequestBody UserPeriodEditBo bo)
     {
         UserPeriodEditBo queryBo = new UserPeriodEditBo();
-        queryBo.setGoodsId(975L);
-        queryBo.setGradeId(862L);
+        queryBo.setGoodsId(1085L);
+        queryBo.setGradeId(978L);
         queryBo.setUserId(114L);
-        iUserPeriodService.syncStudyLogToOld(queryBo);
+        iUserPeriodService.syncStudyLogToOld(bo);
         return AjaxResult.success();
     }
 
@@ -194,8 +211,7 @@ public class CommonController
     @PostMapping("common/rollback/period")
     public AjaxResult<Void> rollbackPeriod(@RequestBody RollBackPeriodBo bo)
     {
-        String sign = bo.getStamp().toString()+"pubilc2022";
-        if(!bo.getSign().equals(ToolsUtils.EncoderByMd5(sign))){
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
             return AjaxResult.error("签名错误");
         }
         UserPeriodEditBo queryBo = new UserPeriodEditBo();
@@ -205,11 +221,84 @@ public class CommonController
         return AjaxResult.success();
     }
 
-   @ApiOperation("测试分班")
+    @ApiOperation("旧系统获取用户商品信息")
+    @PostMapping("common/get/goods")
+    public AjaxResult getUserGoodsList(@RequestBody UserGoodsListBo bo)
+    {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        List<UserGoodsListVo> voList = iGoodsService.getUserGoodsList(bo);
+
+        return AjaxResult.success(voList);
+    }
+
+    @ApiOperation("旧系统获取商品学习中心路径")
+    @PostMapping("common/get/goods/studyUrl")
+    public AjaxResult getGoodsStudyUrl(@RequestBody GoodsStudyUrlBo bo)
+    {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        String studyUrl = iGoodsService.getGoodsStudyUrl(bo);
+        return AjaxResult.success(studyUrl);
+    }
+
+    @ApiOperation("批量查询官方班级人数")
+    @PostMapping("common/free/batch/officialGradeCount")
+    public AjaxResult batchOfficialGradeCount(@RequestBody ClassGradeBatchQueryBo bo)
+    {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        String[] list = bo.getOfficialNameStr().split(",");
+        List<Map<String,Object>> numList = new ArrayList<>();
+        for(String officialName : list){
+            Map<String,Object> map = new HashMap<>();
+            ClassGradeQueryBo queryBo = new ClassGradeQueryBo();
+            queryBo.setOfficialName(officialName);
+            map.put("officialName",officialName);
+            Integer num = iClassGradeService.queryOfficialGradeCount(queryBo);
+            map.put("num",num);
+            numList.add(map);
+        }
+        return AjaxResult.success(numList);
+    }
+
+    @ApiOperation("查询官方班级详情")
+    @PostMapping("common/free/officialGradeDetail")
+    public AjaxResult officialGradeDetail(@RequestBody ClassNpUserInfoBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        return AjaxResult.success(iClassGradeService.officialGradeDetail(bo));
+    }
+
+    @ApiOperation("查询预开班官方班级编号")
+    @PostMapping("common/free/officialGrade/num")
+    public AjaxResult getOfficialGradeNum(@RequestBody ClassOfficialNumBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        return AjaxResult.success(iClassGradeService.getOfficialGradeNum(bo));
+    }
+
+    @ApiOperation("预报名班级开班")
+    @PostMapping("common/free/open/class")
+    public AjaxResult openOfficialGrade(@RequestBody ClassGradeOpenBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        iClassGradeService.openOfficialGrade(bo);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("测试分班")
     @GetMapping("common/jzs/grade")
     public AjaxResult<Void> testGrade()
     {
-        iOrderService.arrangeGrade("安管继续教育网络班B类",890L,3097L,null,114L,"",174L);
+     //   iClassGradeService.checkEjjjPeopleNumLimit(195L,984L);
+        iUserService.batchUpdateTelId();
         return AjaxResult.success();
     }
 
@@ -234,4 +323,50 @@ public class CommonController
         iWxPayService.shareToOldSys(order,goodsList);
         return AjaxResult.success();
     }
+
+    @ApiOperation("创建新机构后台")
+    @PostMapping("common/create/tenant/admin")
+    public AjaxResult createTenantAdmin(@RequestBody SysTenantAdminBo bo) {
+        iSysTenantService.createTenantAdmin(bo);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("获取企业列表")
+    @GetMapping("common/tenant/list")
+    public AjaxResult<List<SysTenantVo>> getTenantList() {
+        String tenant = ServletUtils.getRequest().getHeader("TenantId");
+        List<SysTenant> list = iSysTenantService.list();
+        if (CollectionUtils.isEmpty(list)){
+            return AjaxResult.success(new ArrayList<>());
+        }
+        List<SysTenantVo> collect = list.stream().filter(x -> !x.getTenantId().equals(Long.valueOf(tenant)))
+                .map(item -> BeanUtil.toBean(item, SysTenantVo.class)).collect(Collectors.toList());
+        return AjaxResult.success(collect);
+    }
+
+    @ApiOperation("机构注册开通")
+    @PostMapping("common/free/tenant/register")
+    public AjaxResult tenantRegister(@RequestBody TopSysTenantRegisterAddBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        return AjaxResult.success("成功",iTopSysTenantRegisterService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("重启服务restart")
+    @PostMapping("common/free/webRestart")
+    public AjaxResult<Void> webRestart(@RequestBody ConfigQueryBo bo) {
+        if(!ToolsUtils.checkSignFromOldSys(bo.getStamp().toString(),bo.getSign())){
+            return AjaxResult.error("签名错误");
+        }
+        webService.restartWebService();
+        return AjaxResult.success();
+    }
+
+   /* @ApiOperation("nginx配置")
+    @PostMapping("common/free/configNginxFile")
+    public AjaxResult<Void> configNginxFile(@RequestBody SysNginxConfigAddBo bo) {
+        iTopSysTenantRegisterService.test(new TopSysTenantRegisterAddBo());
+        return AjaxResult.success();
+    }*/
 }

+ 12 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseBusinessController.java

@@ -156,4 +156,16 @@ public class CourseBusinessController extends BaseController {
     public AjaxResult<Void> editRefundPeriodUserIds(@RequestBody CourseBusinessEditBo bo) {
         return toAjax(iCourseBusinessService.editRefundPeriodUserIds(bo) ? 1 : 0);
     }
+
+
+    /**
+     * 根据名称查找业务层ID
+     */
+    @ApiOperation("根据名称查找业务层ID")
+    @PreAuthorize("@ss.hasPermi('course:business:list')")
+    @GetMapping("/queryFullId")
+    public AjaxResult<CourseBusinessVo> queryFullId(CourseBusinessQueryBo bo) {
+        CourseBusinessVo vo = iCourseBusinessService.queryFullId(bo);
+        return AjaxResult.success(vo);
+    }
 }

+ 1 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseChapterController.java

@@ -57,7 +57,7 @@ public class CourseChapterController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<CourseChapterVo> list(CourseChapterQueryBo bo) {
         startPage();
-        List<CourseChapterVo> list = iCourseChapterService.selectList(bo);
+        List<CourseChapterVo> list = iCourseChapterService.selectListByBo(bo);
         return getDataTable(list);
     }
 

+ 35 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -1,8 +1,6 @@
 package com.zhongzheng.controller.course;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Arrays;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -11,10 +9,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.course.bo.*;
 import com.zhongzheng.modules.course.service.ICourseService;
 import com.zhongzheng.modules.course.vo.CourseVo;
+import com.zhongzheng.modules.course.vo.GoodsBatchListVo;
 import com.zhongzheng.modules.goods.bo.GoodsBatchDelBo;
 import com.zhongzheng.modules.goods.vo.ExportLiveGoodsVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
@@ -206,7 +206,7 @@ public class CourseController extends BaseController {
     @GetMapping("/goodsList")
     public TableDataInfo<GoodsUserVo> goodsList(CourseQueryBo bo) {
         User user = iUserService.getOne(new LambdaQueryWrapper<User>()
-                .eq(User::getTelphone, bo.getTelphone()).last("limit 1"));
+                .eq(User::getTelphone, EncryptHandler.encrypt(bo.getTelphone())).last("limit 1"));
         if(Validator.isEmpty(user)){
             throw new CustomException("该用户不存在");
         }
@@ -216,4 +216,35 @@ public class CourseController extends BaseController {
         return getDataTable(list);
     }
 
+    @ApiOperation("批量查询用户拥有的商品进度")
+    @PostMapping("/goodsBatchList")
+    public AjaxResult<List<GoodsBatchListVo>> goodsBatchList(@RequestBody CourseQueryBo bo) {
+        List<GoodsBatchListVo> listVos = new ArrayList<>();
+        if (CollectionUtils.isEmpty(bo.getTelphoneList())){
+            return  AjaxResult.success(listVos);
+        }
+        for(CourseProgressQueryBo queryBo : bo.getTelphoneList()){
+            User user = iUserService.getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getTelphone, EncryptHandler.encrypt(queryBo.getTelphone())).last("limit 1"));
+            if(Validator.isEmpty(user)){
+                continue;
+            }
+            bo.setUserId(user.getUserId());
+            bo.setGoodsId(queryBo.getGoodsId());
+            List<GoodsUserVo> list = iCourseService.goodsProgressList(bo);
+            if (CollectionUtils.isNotEmpty(list)){
+                GoodsBatchListVo vo = new GoodsBatchListVo();
+                vo.setUserId(user.getUserId());
+                vo.setGoodsId(queryBo.getGoodsId());
+                vo.setTelphone(queryBo.getTelphone());
+                vo.setList(list);
+                listVos.add(vo);
+            }
+        }
+        if (CollectionUtils.isEmpty(listVos)){
+            return AjaxResult.success(listVos);
+        }
+        return AjaxResult.success(listVos);
+    }
+
 }

+ 105 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityController.java

@@ -0,0 +1,105 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityVo;
+import com.zhongzheng.system.bo.DistributionActivityAddBo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/activity")
+public class DistributionActivityController extends BaseController {
+
+    private final IDistributionActivityService iDistributionActivityService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:activity:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityVo> list(DistributionActivityQueryBo bo) {
+        startPage();
+        List<DistributionActivityVo> list = iDistributionActivityService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:activity:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityVo> export(DistributionActivityQueryBo bo) {
+        List<DistributionActivityVo> list = iDistributionActivityService.queryList(bo);
+        ExcelUtil<DistributionActivityVo> util = new ExcelUtil<DistributionActivityVo>(DistributionActivityVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取【请填写功能名称】详细信息")
+    @PreAuthorize("@ss.hasPermi('system:activity:query')")
+    @GetMapping("/{distributionId}")
+    public AjaxResult<DistributionActivityVo> getInfo(@PathVariable("distributionId" ) Long distributionId) {
+        return AjaxResult.success(iDistributionActivityService.queryById(distributionId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:activity:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionActivityAddBo bo) {
+        return toAjax(iDistributionActivityService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:activity:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityEditBo bo) {
+        return toAjax(iDistributionActivityService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:activity:remove')")
+    @Log(title = "【请填写功能名称】" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{distributionIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] distributionIds) {
+        return toAjax(iDistributionActivityService.deleteWithValidByIds(Arrays.asList(distributionIds), true) ? 1 : 0);
+    }
+}

+ 105 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityGoodsController.java

@@ -0,0 +1,105 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityGoodsVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/goods")
+public class DistributionActivityGoodsController extends BaseController {
+
+    private final IDistributionActivityGoodsService iDistributionActivityGoodsService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:goods:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityGoodsVo> list(DistributionActivityGoodsQueryBo bo) {
+        startPage();
+        List<DistributionActivityGoodsVo> list = iDistributionActivityGoodsService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:goods:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityGoodsVo> export(DistributionActivityGoodsQueryBo bo) {
+        List<DistributionActivityGoodsVo> list = iDistributionActivityGoodsService.queryList(bo);
+        ExcelUtil<DistributionActivityGoodsVo> util = new ExcelUtil<DistributionActivityGoodsVo>(DistributionActivityGoodsVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取【请填写功能名称】详细信息")
+    @PreAuthorize("@ss.hasPermi('system:goods:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionActivityGoodsVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionActivityGoodsService.queryById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:goods:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionActivityGoodsAddBo bo) {
+        return toAjax(iDistributionActivityGoodsService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:goods:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityGoodsEditBo bo) {
+        return toAjax(iDistributionActivityGoodsService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:goods:remove')")
+    @Log(title = "【请填写功能名称】" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(iDistributionActivityGoodsService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 105 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityPosterController.java

@@ -0,0 +1,105 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityPosterAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityPosterEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityPosterQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityPosterService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityPosterVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/poster")
+public class DistributionActivityPosterController extends BaseController {
+
+    private final IDistributionActivityPosterService iDistributionActivityPosterService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:poster:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityPosterVo> list(DistributionActivityPosterQueryBo bo) {
+        startPage();
+        List<DistributionActivityPosterVo> list = iDistributionActivityPosterService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @PreAuthorize("@ss.hasPermi('system:poster:export')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<DistributionActivityPosterVo> export(DistributionActivityPosterQueryBo bo) {
+        List<DistributionActivityPosterVo> list = iDistributionActivityPosterService.queryList(bo);
+        ExcelUtil<DistributionActivityPosterVo> util = new ExcelUtil<DistributionActivityPosterVo>(DistributionActivityPosterVo.class);
+        return util.exportExcel(list, "【请填写功能名称】");
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取【请填写功能名称】详细信息")
+    @PreAuthorize("@ss.hasPermi('system:poster:query')")
+    @GetMapping("/{posterId}")
+    public AjaxResult<DistributionActivityPosterVo> getInfo(@PathVariable("posterId" ) Long posterId) {
+        return AjaxResult.success(iDistributionActivityPosterService.queryById(posterId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:poster:add')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionActivityPosterAddBo bo) {
+        return toAjax(iDistributionActivityPosterService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:poster:edit')")
+    @Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityPosterEditBo bo) {
+        return toAjax(iDistributionActivityPosterService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @PreAuthorize("@ss.hasPermi('system:poster:remove')")
+    @Log(title = "【请填写功能名称】" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{posterIds}")
+    public AjaxResult<Void> remove(@PathVariable Long[] posterIds) {
+        return toAjax(iDistributionActivityPosterService.deleteWithValidByIds(Arrays.asList(posterIds), true) ? 1 : 0);
+    }
+}

+ 53 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -117,6 +117,12 @@ public class GoodsController extends BaseController {
         return toAjax(iGoodsService.updateSpecTemplate(bo) ? 1 : 0);
     }
 
+    @ApiOperation("取消商品默认规格模板")
+    @PostMapping("/cancel/spec")
+    public AjaxResult<Void> cancelSpecTemplate(@RequestBody GoodsSpecTempEditBo bo) {
+        return toAjax(iGoodsService.cancelSpecTemplate(bo) ? 1 : 0);
+    }
+
     /**
      * 导出商品列表
      */
@@ -314,4 +320,51 @@ public class GoodsController extends BaseController {
     public AjaxResult<Void> addGoodsExamTime(@RequestBody List<BankGoodsExamAddBo> addBo) {
         return toAjax(iQuestionService.addGoodsExamTime(addBo) ? 1 : 0);
     }
+
+    /**
+     * 商品批量复制(新机构)
+     */
+    @ApiOperation("商品批量复制(全量)")
+    @PostMapping("/batch/copy/all")
+    public AjaxResult<Void> goodsBatchCopyTenant(@RequestBody GoodsBatchCopyTenantBo bo) {
+        return toAjax(iGoodsService.goodsBatchCopyTenant(bo) ? 1 : 0);
+    }
+
+    /**
+     * 商品批量复制(新机构)
+     */
+    @ApiOperation("商品批量复制(增量)")
+    @PostMapping("/batch/copy/add")
+    public AjaxResult<Void> goodsBatchCopyAddTenant(@RequestBody GoodsBatchCopyTenantBo bo) {
+        return toAjax(iGoodsService.goodsBatchCopyIncrementTenant(bo) ? 1 : 0);
+    }
+
+    /**
+     * 商品关系ID处理(全量复制后的处理方法)
+     */
+    @ApiOperation("商品关系ID处理(全量复制后的处理方法)")
+    @GetMapping("/batch/copy/dispose")
+    public AjaxResult<Void> goodsBatchCopyDisposeTenant() {
+        return toAjax(iGoodsService.goodsBatchCopyDisposeTenant() ? 1 : 0);
+    }
+
+    /**
+     * 修改商品课程关联
+     */
+    @ApiOperation("修改商品课程关联")
+    @PostMapping("/update/course")
+    public AjaxResult<Void> updateCourse() {
+        return toAjax(iGoodsService.goodsBatchCopyDisposeTenant() ? 1 : 0);
+    }
+
+
+    /**
+     * 修复二建/二造商品(注意不接页面,自己使用)
+     */
+    @ApiOperation("修复二建/二造商品")
+    @PostMapping("/update/goods/repair")
+    public AjaxResult<Void> updateGoodsRepair(@RequestBody UpdateGoodsRepairBo bo) {
+        return toAjax(iGoodsService.updateGoodsRepair(bo) ? 1 : 0);
+    }
+
 }

+ 34 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -10,6 +10,7 @@ import java.util.stream.Collectors;
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import com.github.pagehelper.PageInfo;
 import com.zhongzheng.common.core.domain.entity.SysRole;
@@ -115,6 +116,27 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询其他平台班级详情
+     */
+    @ApiOperation("查询其他平台班级学员列表")
+    @GetMapping("/other/Class/user")
+    public AjaxResult<List<ClassNpUserInfoVo>> otherClassUserList(ClassNpUserInfoBo bo) {
+        return AjaxResult.success(iClassGradeService.otherClassUserList(bo));
+    }
+
+    /**
+     * 导出查询其他平台班级详情
+     */
+    @ApiOperation("查询其他平台班级学员列表")
+    @GetMapping("/other/Class/user/export")
+    public AjaxResult<List<ClassNpUserInfoVo>> otherClassUserListExport(ClassNpUserInfoBo bo) {
+        List<ClassNpUserInfoVo> list = iClassGradeService.otherClassUserList(bo);
+        List<ClassNpUserInfoExportVo> exportVos = list.stream().map(item -> BeanUtil.toBean(item,ClassNpUserInfoExportVo.class)).collect(Collectors.toList());
+        ExcelUtil<ClassNpUserInfoExportVo> util = new ExcelUtil<ClassNpUserInfoExportVo>(ClassNpUserInfoExportVo.class);
+        return util.exportExcel(exportVos, "班级学员列表");
+    }
+
     /**
      * 查询班级列表
      */
@@ -349,8 +371,9 @@ public class ClassGradeController extends BaseController {
     @GetMapping("/select")
     public AjaxResult<Integer> select(ClassGradeAddBo bo) {
         //自己公司的TenantId出现选择官方接口
-        boolean tenantId = ServletUtils.getRequest().getHeader("TenantId").equals("867735392558919680");
-        return AjaxResult.success(tenantId ? 1 : 0);
+//        boolean tenantId = ServletUtils.getRequest().getHeader("TenantId").equals("867735392558919680");
+//        return AjaxResult.success(tenantId ? 1 : 0);
+        return AjaxResult.success(1);
     }
 
     /**
@@ -641,4 +664,13 @@ public class ClassGradeController extends BaseController {
         iUserPeriodService.confirmRollbackPeriod(bo);
         return AjaxResult.success();
     }
+
+    @ApiOperation("获取官方班级人数")
+    @Log(title = "获取官方班级人数", businessType = BusinessType.UPDATE)
+    @GetMapping("/officialGradeCount")
+    public AjaxResult<Integer> queryOfficialGradeCount(ClassGradeQueryBo bo) {
+        return AjaxResult.success(iClassGradeService.queryOfficialGradeCount(bo));
+    }
+
+
 }

+ 0 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassStudentController.java

@@ -99,7 +99,6 @@ public class ClassStudentController extends BaseController {
     public TableDataInfo<GoodsStudyRecordVo> list(UserQueryBo bo) {
         startPage();
         List<GoodsStudyRecordVo> list = iUserStudyRecordService.queryGoods(bo);
-
         return getDataTable(list);
     }
 
@@ -112,7 +111,6 @@ public class ClassStudentController extends BaseController {
     public TableDataInfo<GoodsStudyRecordVo> listLive(UserQueryBo bo) {
         startPage();
         List<GoodsStudyRecordVo> list = iUserStudyRecordService.queryLiveGoods(bo);
-
         return getDataTable(list);
     }
 

+ 3 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderBusinessConfigController.java

@@ -74,7 +74,9 @@ public class OrderBusinessConfigController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:config:query')")
     @GetMapping("/{id}")
     public AjaxResult<OrderBusinessConfigVo> getInfo(@PathVariable("id" ) Long id) {
-        return AjaxResult.success(iOrderBusinessConfigService.queryById(id));
+        OrderBusinessConfigQueryBo queryBo = new OrderBusinessConfigQueryBo();
+        queryBo.setId(id);
+        return AjaxResult.success(iOrderBusinessConfigService.getDetail(queryBo));
     }
 
     /**

+ 11 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/order/OrderGoodsRefundController.java

@@ -51,10 +51,20 @@ public class OrderGoodsRefundController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<OrderGoodsRefundVo> list(OrderGoodsRefundQueryBo bo) {
         startPage();
-        List<OrderGoodsRefundVo> list = iOrderGoodsRefundService.selectList(bo);
+        List<OrderGoodsRefundVo> list = iOrderGoodsRefundService.selectListByQuery(bo);
         return getDataTable(list);
     }
 
+    /**
+     * 查询订单商品退款列表
+     */
+    @ApiOperation("查询退款订单所有商品信息")
+    @GetMapping("/listAll/goods")
+    public AjaxResult<List<OrderGoodsRefundVo>> listByOrderSn(OrderGoodsRefundQueryBo bo) {
+        List<OrderGoodsRefundVo> list = iOrderGoodsRefundService.listByOrderSn(bo);
+        return AjaxResult.success(list);
+    }
+
 
 
     /**

+ 21 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java

@@ -374,4 +374,25 @@ public class ScheduleController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("课程试卷未做完3天提醒")
+    @GetMapping("/noFinishExamToStudentThree")
+    public AjaxResult noFinishExamToStudentThree(UserQueryBo bo){
+        iScheduleService.noFinishExamToStudentThree(bo);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("课程试卷未做完5天提醒")
+    @GetMapping("/noFinishExamToStudentFive")
+    public AjaxResult noFinishExamToStudentFive(UserQueryBo bo){
+        iScheduleService.noFinishExamToStudentFive(bo);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("课程试卷未做完7天提醒")
+    @GetMapping("/noFinishExamToStudentSeven")
+    public AjaxResult noFinishExamToStudentSeven(UserQueryBo bo){
+        iScheduleService.noFinishExamToStudentSeven(bo);
+        return AjaxResult.success();
+    }
+
 }

+ 5 - 4
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysConfigController.java

@@ -2,6 +2,7 @@ package com.zhongzheng.controller.system;
 
 import java.util.List;
 
+import com.zhongzheng.modules.system.vo.SysConfigVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,10 +47,10 @@ public class SysConfigController extends BaseController
     @ApiOperation("配置列表")
     @PreAuthorize("@ss.hasPermi('system:config:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysConfig config)
+    public TableDataInfo list(SysConfigVo config)
     {
         startPage();
-        List<SysConfig> list = configService.selectConfigList(config);
+        List<SysConfigVo> list = configService.selectConfigList(config);
         return getDataTable(list);
     }
 
@@ -92,7 +93,7 @@ public class SysConfigController extends BaseController
     @Log(title = "参数管理", businessType = BusinessType.INSERT)
     @PostMapping
     @RepeatSubmit
-    public AjaxResult add(@Validated @RequestBody SysConfig config)
+    public AjaxResult add(@Validated @RequestBody SysConfigVo config)
     {
         if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
         {
@@ -109,7 +110,7 @@ public class SysConfigController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:config:edit')")
     @Log(title = "参数管理", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysConfig config)
+    public AjaxResult edit(@Validated @RequestBody SysConfigVo config)
     {
         if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
         {

+ 62 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysOldOrgController.java

@@ -0,0 +1,62 @@
+package com.zhongzheng.controller.system;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.annotation.RepeatSubmit;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.framework.web.domain.server.Sys;
+import com.zhongzheng.modules.order.bo.OrderUserCheckBuyBo;
+import com.zhongzheng.modules.system.domain.SysOldOrg;
+import com.zhongzheng.modules.system.domain.vo.SysOldOrgVo;
+import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysOldOrgService;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 参数配置 信息操作处理
+ *
+ * @author zhongzheng
+ */
+@Api(tags ="旧系统机构")
+@RestController
+@RequestMapping("/system/old/org")
+public class SysOldOrgController extends BaseController
+{
+    @Autowired
+    private ISysOldOrgService iSysOldOrgService;
+
+    /**
+     * 获取新/旧系统机构列表
+     */
+    @ApiOperation("获取新/旧系统机构列表")
+    @GetMapping("/list")
+    public AjaxResult<List<SysOldOrgVo>> list() {
+        List<SysOldOrg> list = iSysOldOrgService
+                .list(new LambdaQueryWrapper<SysOldOrg>()
+                .eq(SysOldOrg::getStatus, 1)
+                .eq(SysOldOrg::getShareClass,1));
+        if (CollectionUtils.isEmpty(list)){
+            return AjaxResult.success(new ArrayList<>());
+        }
+        List<SysOldOrgVo> result = list.stream().map(item -> BeanUtil.toBean(item, SysOldOrgVo.class)).collect(Collectors.toList());
+        return AjaxResult.success(result);
+    }
+
+}

+ 9 - 3
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java

@@ -18,9 +18,7 @@ import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.user.UserPasswordNotMatchException;
-import com.zhongzheng.common.utils.MessageUtils;
-import com.zhongzheng.common.utils.SecurityUtils;
-import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.*;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.manager.AsyncManager;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
@@ -163,7 +161,11 @@ public class SysUserController extends BaseController
             return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
         user.setCreateBy(SecurityUtils.getUsername());
+        if(!ToolsUtils.verifPwd(user.getPassword())){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        user.setPwdTime(DateUtils.getNowTime());
         return toAjax(userService.insertUser(user));
     }
 
@@ -216,7 +218,11 @@ public class SysUserController extends BaseController
                 }
 
             }
+            if(!ToolsUtils.verifPwd(user.getPassword())){
+                throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+            }
             user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+            user.setPwdTime(DateUtils.getNowTime());
         }
         user.setUpdateBy(SecurityUtils.getUsername());
         int result = userService.updateUser(user);

+ 84 - 54
zhongzheng-admin/src/main/resources/application-dev.yml

@@ -1,60 +1,85 @@
 # 数据源配置
 spring:
     datasource:
-        type: com.alibaba.druid.pool.DruidDataSource
-        driverClassName: com.mysql.cj.jdbc.Driver
-        druid:
-            # 主库数据源
-            master:
-                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
-                username: root
-                password:  zhongzheng2021
-            # 从库数据源
-            slave:
-                # 从数据源开关/默认关闭
-                enabled: false
-                url:
-                username:
-                password:
-            # 初始连接数
-            initialSize: 5
-            # 最小连接池数量
-            minIdle: 10
-            # 最大连接池数量
-            maxActive: 20
-            # 配置获取连接等待超时的时间
-            maxWait: 60000
-            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-            timeBetweenEvictionRunsMillis: 60000
-            # 配置一个连接在池中最小生存的时间,单位是毫秒
-            minEvictableIdleTimeMillis: 300000
-            # 配置一个连接在池中最大生存的时间,单位是毫秒
-            maxEvictableIdleTimeMillis: 900000
-            # 配置检测连接是否有效
-            validationQuery: SELECT 1 FROM DUAL
-            testWhileIdle: true
-            testOnBorrow: false
-            testOnReturn: false
-            webStatFilter:
-                enabled: true
-            statViewServlet:
-                enabled: true
-                # 设置白名单,不填则允许所有访问
-                allow:
-                url-pattern: /druid/*
-                # 控制台管理用户名和密码
-                login-username: ruoyi
-                login-password: 123456
-            filter:
-                stat:
-                    enabled: true
-                    # 慢SQL记录
-                    log-slow-sql: true
-                    slow-sql-millis: 1000
-                    merge-sql: true
-                wall:
-                    config:
-                        multi-statement-allow: true
+        #配置hikari连接池
+        hikari:
+            minimum-idle: 10
+            maximum-pool-size: 20
+            connection-timeout: 10000
+            idle-timeout: 30000
+            connection-init-sql: set names utf8mb4
+        #动态数据源配置
+        dynamic:
+            primary: master #设置默认的数据源或者数据源组,默认值即为master
+            strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
+            datasource:
+                #数据源
+                master:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas_top?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                    username: root
+                    password: zhongzheng2021
+                #数据源
+                slave:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                    username: root
+                    password: zhongzheng2021
+#    datasource:
+#        type: com.alibaba.druid.pool.DruidDataSource
+#        driverClassName: com.mysql.cj.jdbc.Driver
+#        druid:
+#            # 主库数据源
+#            master:
+#                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+#                username: root
+#                password:  zhongzheng2021
+#            # 从库数据源
+#            slave:
+#                # 从数据源开关/默认关闭
+#                enabled: false
+#                url:
+#                username:
+#                password:
+#            # 初始连接数
+#            initialSize: 5
+#            # 最小连接池数量
+#            minIdle: 10
+#            # 最大连接池数量
+#            maxActive: 20
+#            # 配置获取连接等待超时的时间
+#            maxWait: 60000
+#            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+#            timeBetweenEvictionRunsMillis: 60000
+#            # 配置一个连接在池中最小生存的时间,单位是毫秒
+#            minEvictableIdleTimeMillis: 300000
+#            # 配置一个连接在池中最大生存的时间,单位是毫秒
+#            maxEvictableIdleTimeMillis: 900000
+#            # 配置检测连接是否有效
+#            validationQuery: SELECT 1 FROM DUAL
+#            testWhileIdle: true
+#            testOnBorrow: false
+#            testOnReturn: false
+#            webStatFilter:
+#                enabled: true
+#            statViewServlet:
+#                enabled: true
+#                # 设置白名单,不填则允许所有访问
+#                allow:
+#                url-pattern: /druid/*
+#                # 控制台管理用户名和密码
+#                login-username: ruoyi
+#                login-password: 123456
+#            filter:
+#                stat:
+#                    enabled: true
+#                    # 慢SQL记录
+#                    log-slow-sql: true
+#                    slow-sql-millis: 1000
+#                    merge-sql: true
+#                wall:
+#                    config:
+#                        multi-statement-allow: true
     # redis 配置
     redis:
         # 地址
@@ -136,6 +161,11 @@ oldStudySys:
     syncPath: http://gdxypx.xy.com/System/BussinessApi/PostUserStudyRecords
     sharePath: http://192.168.1.210:8086/witsystem/dataapi/SaleOrder
     shareCanclePath: http://192.168.1.210:8086/witsystem/dataapi/ordercance
+    searchGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

+ 5 - 0
zhongzheng-admin/src/main/resources/application-pre.yml

@@ -136,6 +136,11 @@ oldStudySys:
     syncPath: http://test.jqbao.net/System/BussinessApi/PostUserStudyRecords
     sharePath: http://test.jqbao.net/witsystem/dataapi/SaleOrder
     shareCanclePath: http://test.jqbao.net/witsystem/dataapi/ordercance
+    searchGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

+ 5 - 0
zhongzheng-admin/src/main/resources/application-prod.yml

@@ -136,6 +136,11 @@ oldStudySys:
     syncPath: https://www.xyyxt.net/System/BussinessApi/PostUserStudyRecords
     sharePath: https://www.xyyxt.net/witsystem/dataapi/SaleOrder
     shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
+    searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: https://zs.gdzzkj.net/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan

+ 148 - 0
zhongzheng-admin/src/main/resources/application-trial.yml

@@ -0,0 +1,148 @@
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: com.mysql.cj.jdbc.Driver
+        druid:
+            # 主库数据源
+            master:
+                url: jdbc:mysql://rm-wz950fu2v70864v85.mysql.rds.aliyuncs.com/zz_edu_saas_trial?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                username: root
+                password: gdxy2021!@#zzjykj
+            # 从库数据源
+            slave:
+                # 从数据源开关/默认关闭
+                enabled: false
+                url:
+                username:
+                password:
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username: ruoyi
+                login-password: 123456
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 4000
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true
+    # redis 配置
+    redis:
+        # 地址
+        host: 172.18.19.227
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: zhongzheng2021_redis
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+aliyun:
+    oss:
+        endpoint: https://file.xyyxt.net # oss对外服务的访问域名
+        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
+        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        bucketName: zhongzheng-prod # oss的存储空间
+        policy:
+            expire: 30 # 签名有效期(S)
+        maxSize: 100 # 上传文件大小(M)
+        callback: https://cloud.gdzzkj.net/aliyun/oss/callback # 文件上传成功后的回调地址
+        dir:
+            prefix: oss/images/ # 上传文件夹路径前缀 `
+
+poliv:
+    token:
+        userid: d5f6d309fe
+        writetoken: 8f14a371-9d02-4ec1-922d-54d7b4f79dca
+        readtoken: f2c397b4-e2a3-46dc-9266-e6a43ac26a35
+        secretkey: xpPrYdcbA1
+
+wx:
+    small:
+        appid: wxd3c8ae80cf43a305
+        appsecret: 193a001ebfd46f227008a21e9d13e750
+    gzh:
+        appid: wx6f48f721d18244eb
+        appsecret: 2f8b2b4ff66e2f6adfb9f08ae22d7474
+        studyNoteTpId: DndIixcAp15Sqgb4KOGTMf73VLF09NlCUifPSel5Y_s
+        qdyTpId: s981yq3SyIODNUEXFzVSWn0OYj90E72aKdtKtSp05_E
+        qdySubTpId: gzE6zddD7OzDLUtOO4GfU-KPCxpMqWFhCj86uXExqB8
+        qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
+        qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
+        qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
+    wepay:
+        mchid: 1342013901
+        key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
+        appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
+        notifyUrl: https://api.xyyxt.net/wx/pay/callback
+    scanLogin:
+        host: https://m.xyyxt.net/
+
+wisdomExamRoom:
+    mchid: 10001
+    appid: ZZ-YXT-GZ-20220820-0001
+    app_secret: mt70O1s/Xd5LwuH7yHLpj9R+tKUn5j9vTnCvmgBnbJDA11Hpl7+q4lEZliqPAjN+YHPn9bGmHkAbw5XwhhMiYg==
+    host: http://bg.sam457.site:9020
+
+certificate:
+    host: https://m.xyyxt.net/
+
+liveGotoURL: https://web.xyyxt.net/
+
+enCodeVersion: release
+
+oldStudySys:
+    syncPath: https://www.xyyxt.net/System/BussinessApi/PostUserStudyRecords
+    sharePath: https://www.xyyxt.net/witsystem/dataapi/SaleOrder
+    shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
+    searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
+
+officialPush:
+    infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan
+    periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
+    infoAccount: GDSXY
+    token: 01b5d9833987efdff54483cdc9720da6

+ 3 - 1
zhongzheng-admin/src/main/resources/application.yml

@@ -117,7 +117,7 @@ token:
     # 令牌密钥
     secret: abcdefghijklmnopqrstuvwxyz
     # 令牌有效期(默认30分钟)
-    expireTime: 4320
+    expireTime: 360
 
 # MyBatis配置
 # https://baomidou.com/config/
@@ -141,6 +141,7 @@ mybatis-plus:
   executorType: SIMPLE
   # 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
   configurationProperties: null
+  typeHandlersPackage: com.zhongzheng.common.type
   configuration:
     # 自动驼峰命名规则(camel case)映射
     # 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
@@ -301,3 +302,4 @@ aliyun:
     signCommitmentRemind: SMS_250390195  #签署承诺书提醒
     todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
     todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)
+    noFinishExamNoteCode: SMS_262460267  #未做完试卷通知

+ 0 - 0
zhongzheng-api/src/main/resources/config/apiclient_cert.p12 → zhongzheng-admin/src/main/resources/config/1342013901/apiclient_cert.p12


BIN
zhongzheng-admin/src/main/resources/config/1637492608/apiclient_cert.p12


+ 2 - 5
zhongzheng-api/src/main/java/com/zhongzheng/ZhongZhengApiApplication.java

@@ -1,16 +1,13 @@
 package com.zhongzheng;
 
 
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.cloud.client.loadbalancer.LoadBalanced;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.web.client.RestTemplate;
 
 
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
 public class ZhongZhengApiApplication {
 
     public static void main(String[] args)

+ 94 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/ExamSimulateController.java

@@ -0,0 +1,94 @@
+package com.zhongzheng.controller.bank;
+
+import java.util.List;
+import java.util.Arrays;
+
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.bank.bo.ExamSimulateAddBo;
+import com.zhongzheng.modules.bank.bo.ExamSimulateEditBo;
+import com.zhongzheng.modules.bank.bo.ExamSimulateQueryBo;
+import com.zhongzheng.modules.bank.service.IExamSimulateService;
+import com.zhongzheng.modules.bank.vo.ExamSimulateVo;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 模拟考生成试卷Controller
+ *
+ * @author hjl
+ * @date 2022-12-09
+ */
+@Api(value = "模拟考生成试卷控制器", tags = {"模拟考生成试卷管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/bank/exam/simulate")
+public class ExamSimulateController extends BaseController {
+
+    private final IExamSimulateService iExamSimulateService;
+
+    private final WxTokenService wxTokenService;
+
+    /**
+     * 查询模拟考生成试卷列表
+     */
+    @ApiOperation("查询模拟考生成试卷列表")
+    @PreAuthorize("@ss.hasPermi('system:simulate:list')")
+    @GetMapping("/list")
+    public TableDataInfo<ExamSimulateVo> list(ExamSimulateQueryBo bo) {
+        startPage();
+        List<ExamSimulateVo> list = iExamSimulateService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("查询模拟考生成试卷列表1")
+    @PreAuthorize("@ss.hasPermi('system:simulate:list')")
+    @GetMapping("/getlist")
+    public AjaxResult<List<Long>> getlist(ExamSimulateQueryBo bo) {
+        return AjaxResult.success(iExamSimulateService.getQuestionList(bo));
+    }
+
+
+
+    /**
+     * 获取模拟考生成试卷详细信息
+     */
+    @ApiOperation("获取模拟考生成试卷详细信息")
+    @PreAuthorize("@ss.hasPermi('system:simulate:query')")
+    @GetMapping("/{examId}")
+    public AjaxResult<ExamSimulateVo> getInfo(@PathVariable("examId" ) Long examId) {
+        return AjaxResult.success(iExamSimulateService.queryById(examId));
+    }
+
+    /**
+     * 新增模拟考生成试卷
+     */
+    @ApiOperation("新增模拟考生成试卷")
+    @PreAuthorize("@ss.hasPermi('system:simulate:add')")
+    @Log(title = "模拟考生成试卷", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<ExamSimulateVo> add(@RequestBody ExamSimulateAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iExamSimulateService.insertByAddBo(bo));
+    }
+
+
+}

+ 1 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -195,4 +195,5 @@ public class QuestionController extends BaseController {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
         return AjaxResult.success(iQuestionService.getTodayExamWeekRecord(goodsId,loginUser.getUser().getUserId()));
     }
+
 }

+ 7 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/base/ProfileTpController.java

@@ -16,12 +16,15 @@ import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import net.polyv.common.v1.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 资料模板Controller
@@ -52,6 +55,10 @@ public class ProfileTpController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo<ProfileTpVo> list(ProfileTpQueryBo bo) {
         startPage();
+        if (StringUtils.isNotBlank(bo.getStatus())){
+            List<Integer> collect = Arrays.asList(bo.getStatus().split(",")).stream().map(x -> Integer.valueOf(x)).collect(Collectors.toList());
+            bo.setStatusList(collect);
+        }
         List<ProfileTpVo> list = iProfileTpService.selectList(bo);
         return getDataTable(list);
     }

+ 3 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/ActivityHomeController.java

@@ -10,6 +10,7 @@ import com.zhongzheng.modules.base.vo.ActivityAdvertisingLocationVo;
 import com.zhongzheng.modules.base.vo.ActivityAdvertisingVo;
 import com.zhongzheng.modules.system.domain.SysConfig;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -39,11 +40,11 @@ public class ActivityHomeController extends BaseController {
     @ApiOperation("首页配置列表")
     @PreAuthorize("@ss.hasPermi('system:config:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysConfig config)
+    public TableDataInfo list(SysConfigVo config)
     {
         startPage();
         config.setConfigModule("home");
-        List<SysConfig> list = configService.selectConfigList(config);
+        List<SysConfigVo> list = configService.selectConfigList(config);
         return getDataTable(list);
     }
 }

+ 52 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -26,7 +26,10 @@ import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.order.domain.Printer;
+import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
 import com.zhongzheng.modules.system.service.ISysConfigService;
+import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.service.ISysWebService;
 import com.zhongzheng.modules.wx.bo.WxInfoBo;
 import com.zhongzheng.modules.wx.bo.WxInfoQuery;
 import com.zhongzheng.modules.wx.bo.WxServerBody;
@@ -58,6 +61,10 @@ public class CommonController extends BaseController {
 
     private final WxLoginService wxLoginService;
 
+    private final ISysConfigService configService;
+
+
+
     @Autowired
     private RedisCache redisCache;
 
@@ -65,6 +72,8 @@ public class CommonController extends BaseController {
 
     private final IGoodsSpecTemplateService iGoodsSpecTemplateService;
 
+    private final ISysTenantService iSysTenantService;
+
     /**
      * 获取微信小程序信息(网页跳转小程序)
      */
@@ -120,8 +129,6 @@ public class CommonController extends BaseController {
         return AjaxResult.success(iCourseTopicService.getGoodsList(bo));
     }
 
-    private final ISysConfigService configService;
-
 
     /**
      * 查询课程列表
@@ -168,6 +175,13 @@ public class CommonController extends BaseController {
         return AjaxResult.success(map);
     }
 
+    @ApiOperation("登录双重验证")
+    @GetMapping("/dual_auth")
+    public AjaxResult<String> dual_auth() {
+        String dualAuth = configService.selectConfigByKey("login.dual.auth");
+        return AjaxResult.success("成功",dualAuth);
+    }
+
     /**
      * 公众号服务接口
      */
@@ -222,4 +236,40 @@ public class CommonController extends BaseController {
         return MessageUtil.autoReply(allMessage, ContentEnum.CONTENT_NONSUPPORT.getContent());
     }
 
+    /**
+     * 获取企业ID
+     */
+    @ApiOperation("获取企业ID")
+    @GetMapping("/findTenantId")
+    public AjaxResult<String> findTenantId(SysTenantQueryBo bo) {
+        Long tenantId = iSysTenantService.findTenantId(bo);
+        if(Validator.isNotEmpty(tenantId)){
+            return AjaxResult.success("成功",tenantId.toString());
+        }else{
+            if(Validator.isNotEmpty(bo.getHostH5())&&bo.getHostH5().equals("120.79.166.78:19012")){
+                return AjaxResult.success("成功","867735392558919680");
+            }
+            if(Validator.isNotEmpty(bo.getHostLive())&&bo.getHostLive().equals("120.79.166.78:19012")){
+                return AjaxResult.success("成功","867735392558919680");
+            }
+            if(Validator.isNotEmpty(bo.getHostPc())&&bo.getHostPc().equals("120.79.166.78:19012")){
+                return AjaxResult.success("成功","867735392558919680");
+            }
+            if(Validator.isNotEmpty(bo.getHostH5Seller())&&bo.getHostH5Seller().equals("120.79.166.78:19012")){
+                return AjaxResult.success("成功","867735392558919680");
+            }
+            return AjaxResult.error("失败",null);
+        }
+    }
+
+    @ApiOperation("移动端配置参数")
+    @GetMapping("/mobileConfig")
+    public AjaxResult<Map<String,Object>> mobileConfig(ConfigQueryBo bo) {
+        Map<String,Object> map = new HashMap<>();
+        String json = configService.selectConfigByKey("home.mobile");
+        map.put("mobileConfig",json);
+        return AjaxResult.success(map);
+    }
+
+
 }

+ 15 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonGoodsController.java

@@ -1,5 +1,6 @@
 package com.zhongzheng.controller.cmmon;
 
+import cn.hutool.core.lang.Validator;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.TableDataInfo;
@@ -14,6 +15,7 @@ import com.zhongzheng.modules.goods.vo.GoodsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -46,6 +48,9 @@ public class CommonGoodsController extends BaseController {
     @ApiOperation("查询商品列表")
     @GetMapping("/list")
     public TableDataInfo<GoodsVo> list(GoodsQueryBo bo) {
+        if(Validator.isNotEmpty(bo.getGoodsName())){
+            bo.setGoodsName(bo.getGoodsName().replaceAll(" ",""));
+        }
         bo.setStatus(new ArrayList<Integer>(Arrays.asList(1)));
         bo.setGoodsStatus(1);
         startPage();
@@ -53,6 +58,16 @@ public class CommonGoodsController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询分销商品列表
+     */
+    @ApiOperation("查询分销商品列表")
+    @GetMapping("/share/list/{time}")
+    public AjaxResult<List<GoodsVo>> getShareList(@PathVariable("time") Long time) {
+        List<GoodsVo> list = iGoodsService.getShareList(time);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 导出商品列表
      */

+ 12 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseController.java

@@ -97,6 +97,18 @@ public class CourseController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 获取商品重修目录结构
+     */
+    @ApiOperation("获取商品重修目录结构")
+    @GetMapping("/goods/rebuild/menu")
+    public AjaxResult<List<CourseUserMenuVo>> getGoodsRebuildMenuList(CourseMenuQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        List<CourseUserMenuVo> list = iCourseMenuService.getGoodsRebuildMenuList(bo);
+        return AjaxResult.success(list);
+    }
+
 
     @ApiOperation("查询模块与章关系列表")
     @GetMapping("/chapterList")

+ 11 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/course/CourseHandoutsController.java

@@ -21,7 +21,7 @@ import java.util.List;
 
 /**
  * 讲义列Controller
- * 
+ *
  * @author ruoyi
  * @date 2021-11-02
  */
@@ -44,7 +44,16 @@ public class CourseHandoutsController extends BaseController {
         return getDataTable(list);
     }
 
-
+    /**
+     * 查询讲义列列表
+     */
+    @ApiOperation("查询商品讲义列列表")
+    @GetMapping("/listByGoods")
+    public TableDataInfo<CourseHandoutsVo> listByGoods(CourseHandoutsQueryBo bo) {
+        startPage();
+        List<CourseHandoutsVo> list = iCourseHandoutsService.queryByGoodsList(bo);
+        return getDataTable(list);
+    }
 
     /**
      * 获取讲义列详细信息

+ 115 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/distribution/DistributionSellerController.java

@@ -0,0 +1,115 @@
+package com.zhongzheng.controller.distribution;
+
+import java.util.List;
+import java.util.Arrays;
+
+import cn.hutool.core.lang.Validator;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.SellerTokenService;
+import com.zhongzheng.modules.distribution.bo.DistributionSellerAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionSellerEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionSellerQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.user.bo.UserVisitLogAddBo;
+import com.zhongzheng.modules.user.domain.UserWxFollow;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.vo.UserVo;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 分销业务员Controller
+ *
+ * @author hjl
+ * @date 2023-03-13
+ */
+@Api(value = "分销业务员控制器", tags = {"分销业务员管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/seller")
+public class DistributionSellerController extends BaseController {
+
+    private final IDistributionSellerService iDistributionSellerService;
+
+    private final SellerTokenService sellerTokenService;
+
+    /**
+     * 查询分销业务员列表
+     */
+    @ApiOperation("查询分销业务员列表")
+    @PreAuthorize("@ss.hasPermi('system:seller:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionSellerVo> list(DistributionSellerQueryBo bo) {
+        startPage();
+        List<DistributionSellerVo> list = iDistributionSellerService.queryList(bo);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 获取分销业务员详细信息
+     */
+    @ApiOperation("获取分销业务员详细信息")
+    @PreAuthorize("@ss.hasPermi('system:seller:query')")
+    @GetMapping("/{salerId}")
+    public AjaxResult<DistributionSellerVo> getInfo(@PathVariable("salerId" ) Long salerId) {
+        return AjaxResult.success(iDistributionSellerService.queryById(salerId));
+    }
+
+    /**
+     * 新增分销业务员
+     */
+   /* @ApiOperation("新增分销业务员")
+    @PreAuthorize("@ss.hasPermi('system:seller:add')")
+    @Log(title = "分销业务员", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionSellerAddBo bo) {
+        return toAjax(iDistributionSellerService.insertByAddBo(bo) ? 1 : 0);
+    }*/
+
+    /**
+     * 修改分销业务员
+     */
+    @ApiOperation("修改分销业务员")
+    @PreAuthorize("@ss.hasPermi('system:seller:edit')")
+    @Log(title = "分销业务员", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody DistributionSellerEditBo bo) {
+        return toAjax(iDistributionSellerService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @return 用户信息
+     */
+    @ApiOperation("登录业务员用户信息")
+    @GetMapping("getInfo")
+    public AjaxResult<DistributionSellerVo> getInfo(UserVisitLogAddBo bo)
+    {
+        ClientLoginSeller loginUser = sellerTokenService.getLoginUser(ServletUtils.getRequest());
+        DistributionSellerVo vo = iDistributionSellerService.queryById(loginUser.getSeller().getSellerId());
+        vo.setNull();
+        return AjaxResult.success(vo);
+    }
+
+}

+ 75 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/distribution/SellerLoginController.java

@@ -0,0 +1,75 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.framework.web.service.SellerTokenService;
+import com.zhongzheng.modules.distribution.bo.SellerAppAccountLoginBo;
+import com.zhongzheng.modules.distribution.bo.SellerAppRegisterBo;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.service.IUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 客户端用户Controller
+ *
+ * @author hjl
+ * @date 2021-06-08
+ */
+@Api(value = "业务员登录控制器", tags = {"业务员登录控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/app/common/seller")
+public class SellerLoginController extends BaseController {
+
+    private final IDistributionSellerService iDistributionSellerService;
+
+    private final SellerTokenService sellerTokenService;
+
+    /**
+     * 用户注册
+     */
+    @ApiOperation("业务员客户端注册")
+    @PostMapping("/register")
+    public AjaxResult<Void> register(@RequestBody SellerAppRegisterBo bo) {
+        return toAjax(iDistributionSellerService.registerSeller(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("业务员忘记密码")
+    @PostMapping("/register_forget")
+    public AjaxResult<Void> register_forget(@RequestBody SellerAppRegisterBo bo) {
+        return toAjax(iDistributionSellerService.forgetUser(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("业务员短信登录")
+    @PostMapping("/sms_login")
+    public AjaxResult sms_login(@RequestBody SellerAppAccountLoginBo bo) {
+        Map<String,Object> map = iDistributionSellerService.smsLogin(bo);
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("业务员账号登录")
+    @PostMapping("/account_login")
+    public AjaxResult account_login(@RequestBody SellerAppAccountLoginBo bo) {
+        Map<String,Object> map = iDistributionSellerService.accountLogin(bo);
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("刷新业务员登录令牌")
+    @GetMapping("/refreshToken/{userAccount}")
+    public AjaxResult refreshToken(@PathVariable("userAccount") String userAccount)
+    {
+        String token = sellerTokenService.refreshSellerToken(userAccount);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, token);
+        return AjaxResult.success(map);
+    }
+}

+ 54 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/distribution/SellerSmsController.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.alisms.bo.SmsAddBo;
+import com.zhongzheng.modules.alisms.service.IAliSmsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 客户端用户Controller
+ *
+ * @author hjl
+ * @date 2021-06-08
+ */
+@Api(value = "短信控制器", tags = {"短信控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/app/common/seller/sms")
+public class SellerSmsController extends BaseController {
+
+    private final IAliSmsService iSmsService;
+
+
+    @ApiOperation("获取业务员注册短信")
+    @PostMapping("/register")
+    public AjaxResult register(@RequestBody SmsAddBo bo) {
+        iSmsService.sendSellerRegisterSms(bo.getTel());
+        return AjaxResult.success();
+    }
+
+
+    @ApiOperation("获取业务员登录短信")
+    @PostMapping("/login")
+    public AjaxResult login(@RequestBody SmsAddBo bo) {
+        iSmsService.sendSellerLoginSms(bo.getTel());
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("获取业务员忘记短信")
+    @PostMapping("/forget")
+    public AjaxResult forget(@RequestBody SmsAddBo bo) {
+        iSmsService.sendSellerForgetSms(bo.getTel());
+        return AjaxResult.success();
+    }
+
+
+}

+ 55 - 12
zhongzheng-api/src/main/java/com/zhongzheng/controller/goods/GoodsController.java

@@ -7,6 +7,7 @@ import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.PageDomain;
 import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.core.page.TableSupport;
+import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.bank.bo.QuestionChapterExamQueryBo;
@@ -22,14 +23,13 @@ import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.service.ICourseSectionService;
 import com.zhongzheng.modules.course.vo.CourseLiveVo;
 import com.zhongzheng.modules.course.vo.CourseSectionVo;
+import com.zhongzheng.modules.exam.domain.ExamPaper;
+import com.zhongzheng.modules.exam.service.IExamPaperService;
 import com.zhongzheng.modules.goods.bo.*;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.service.IGoodsSpecTemplateService;
-import com.zhongzheng.modules.goods.vo.GoodsAttachedVo;
-import com.zhongzheng.modules.goods.vo.GoodsExamTimeVo;
-import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
-import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.goods.vo.*;
 import com.zhongzheng.modules.grade.bo.UserPeriodQueryBo;
 import com.zhongzheng.modules.grade.service.IUserPeriodService;
 import com.zhongzheng.modules.order.domain.OrderGoods;
@@ -87,7 +87,7 @@ public class GoodsController extends BaseController {
 
     private final IOrderGoodsFreeService iOrderGoodsFreeService;
 
-
+    private final IExamPaperService iExamPaperService;
 
     /**
      * 获取商品详细信息
@@ -116,27 +116,31 @@ public class GoodsController extends BaseController {
         UserExamWrongRecordQueryBo wBo = new UserExamWrongRecordQueryBo();
         wBo.setOrderGoodsId(orderGoodsId);
         wBo.setUserId(loginUser.getUser().getUserId());
-        wBo.setDoMode(1L);
+        List<Long> listMode = new ArrayList<>();
+        listMode.add(1L);
+        listMode.add(3L);
+        wBo.setDoModes(listMode);
         Long wrongNum = iUserExamWrongRecordService.recordNum(wBo);
         numMap.put("wrongNum",wrongNum);
 
         CollectQuestionQueryBo collectQuestionQueryBo = new CollectQuestionQueryBo();
         collectQuestionQueryBo.setOrderGoodsId(orderGoodsId);
         collectQuestionQueryBo.setUserId(loginUser.getUser().getUserId());
-        collectQuestionQueryBo.setDoMode(1L);
+
+        collectQuestionQueryBo.setDoModes(listMode);
         Integer collectNum = iCollectQuestionService.collectNum(collectQuestionQueryBo);
         numMap.put("collectNum",collectNum);
 
         UserExamRecordQueryBo userExamRecordQueryBo = new UserExamRecordQueryBo();
         userExamRecordQueryBo.setOrderGoodsId(orderGoodsId);
         userExamRecordQueryBo.setUserId(loginUser.getUser().getUserId());
-        userExamRecordQueryBo.setDoMode(1L);
+        userExamRecordQueryBo.setDoModes(listMode);
         Long doNum = iUserExamRecordService.selectDoNum(userExamRecordQueryBo);
         numMap.put("doNum",doNum);
 
         userExamRecordQueryBo.setOrderGoodsId(orderGoodsId);
         userExamRecordQueryBo.setUserId(loginUser.getUser().getUserId());
-        userExamRecordQueryBo.setDoMode(1L);
+
         Long rightNum = iUserExamRecordService.selectRightNum(userExamRecordQueryBo);
         numMap.put("rightNum",rightNum);
         OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>()
@@ -165,8 +169,10 @@ public class GoodsController extends BaseController {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
 
         Map<String,Object> numMap = new HashMap<>();
-
-
+        ExamPaper examPaper = iExamPaperService.getOne(new LambdaQueryWrapper<ExamPaper>().eq(ExamPaper::getStatus, 1).eq(ExamPaper::getPaperName,"随机练习").last("limit 1"));
+        if(Validator.isEmpty(examPaper)){
+            throw new CustomException("系统不存在随机练习试卷类型");
+        }
 
         UserExamRecordQueryBo userExamRecordQueryBo = new UserExamRecordQueryBo();
         userExamRecordQueryBo.setOrderGoodsId(orderGoodsId);
@@ -186,7 +192,7 @@ public class GoodsController extends BaseController {
                 .eq(OrderGoods::getOrderGoodsId, orderGoodsId));
         if(Validator.isNotEmpty(orderGoods)){
             Long goodsId = orderGoods.getGoodsId();
-            Long totalNum = iGoodsService.getQuestionNum(goodsId);
+            Long totalNum = iGoodsService.getRandomQuestionNum(goodsId,examPaper.getPaperId());
             numMap.put("totalNum",totalNum);
         }
 
@@ -295,4 +301,41 @@ public class GoodsController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 校验商品状态
+     */
+    @ApiOperation("校验商品状态")
+    @PostMapping("/check/goods/status")
+    public AjaxResult<Void>  checkGoodsStatus(@RequestBody CheckGoodsStatusBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iOrderGoodsService.checkGoodsStatus(bo) ? 1 : 0);
+    }
+
+    /**
+     * 获取商品所有节列表
+     */
+    @ApiOperation("获取商品所有节列表")
+    @GetMapping("/section/list")
+    public AjaxResult<List<GoodsSectionListVo>> getGoodsSectionList(GoodsSectionListBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderGoodsService.getGoodsSectionList(bo));
+    }
+
+
+    /**
+     * 获取用户所有购买商品
+     */
+    @ApiOperation("获取用户所有购买商品")
+    @PostMapping("/user/all")
+    public TableDataInfo<GoodsListAllVo> getUserGoodsListAll(@RequestBody UserGoodsListAllBo bo) {
+        startPage();
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        List<GoodsListAllVo> result = iGoodsService.getUserGoodsListAll(bo);
+        return getDataTable(result);
+    }
+
+
 }

+ 10 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -63,6 +63,16 @@ public class ClassGradeController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询班级
+     */
+    @ApiOperation("查询班级")
+    @GetMapping("/class/{gradeId}")
+    public AjaxResult<ClassGradeVo> getClassGradeVo(@PathVariable("gradeId")Long gradeId) {
+        ClassGradeVo vo = iClassGradeService.getClassGradeVo(gradeId);
+        return AjaxResult.success(vo);
+    }
+
     /**
      * 获取班级详细信息
      */

+ 16 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/order/OrderController.java

@@ -102,6 +102,14 @@ public class OrderController extends BaseController {
         return AjaxResult.success(iOrderService.placeSmallOrder(bo));
     }
 
+    @ApiOperation("新增公众号订单")
+    @PostMapping("/placeGzhOrder")
+    public AjaxResult addGzh(@RequestBody OrderAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderService.placeGzhOrder(bo));
+    }
+
     @ApiOperation("继续支付小程序订单")
     @PostMapping("/resumeSmallOrder")
     public AjaxResult resumeSmallOrder(@RequestBody OrderAddBo bo) {
@@ -110,6 +118,14 @@ public class OrderController extends BaseController {
         return AjaxResult.success(iOrderService.resumeSmallOrder(bo));
     }
 
+    @ApiOperation("继续支付公众号订单")
+    @PostMapping("/resumePlaceGzhOrder")
+    public AjaxResult resumePlaceGzhOrder(@RequestBody OrderAddBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iOrderService.resumePlaceGzhOrder(bo));
+    }
+
     /**
      * 新增订单
      */

+ 8 - 4
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/LoginController.java

@@ -2,10 +2,7 @@ package com.zhongzheng.controller.user;
 
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.modules.user.bo.UserAppAccountLoginBo;
-import com.zhongzheng.modules.user.bo.UserAppForgetBo;
-import com.zhongzheng.modules.user.bo.UserAppRegisterBo;
-import com.zhongzheng.modules.user.bo.UserAppSmsLoginBo;
+import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -60,4 +57,11 @@ public class LoginController extends BaseController {
         Map<String,Object> map = iUserService.accountLogin(bo);
         return AjaxResult.success(map);
     }
+
+    @ApiOperation("手机号码自动登入")
+    @PostMapping("/telphone_login")
+    public AjaxResult telphone_login(@RequestBody UserAppTelphoneLoginBo bo) {
+        Map<String,Object> map = iUserService.telphone_login(bo);
+        return AjaxResult.success(map);
+    }
 }

+ 11 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserBankRecordController.java

@@ -133,4 +133,15 @@ public class UserBankRecordController extends BaseController {
         return AjaxResult.success(iUserBankRecordService.getUserExamDoNum(bo));
     }
 
+
+    /**
+     * 做题记录校验是否及格
+     */
+    @ApiOperation("做题校验是否及格")
+    @GetMapping("/check/bank/record")
+    public AjaxResult<Boolean> checkBankRecord(UserBankRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserBankRecordService.checkBankRecord(bo));
+    }
 }

+ 11 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -128,4 +128,15 @@ public class UserController extends BaseController {
         bo.setUserId(loginUser.getUser().getUserId());
         return toAjax(iUserService.updatePwd(bo)? 1 : 0);
     }
+
+    /**
+     * 修改用户活动邀请码
+     */
+    @ApiOperation("修改用户活动邀请码")
+    @PostMapping("/edit/shareActivityCode")
+    public AjaxResult<Void> editShareActivityCode(@RequestBody UserEditBo bo){
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(iUserService.editShareActivityCode(bo) ? 1 : 0);
+    }
 }

+ 4 - 6
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserExamWrongRecordController.java

@@ -118,13 +118,11 @@ public class UserExamWrongRecordController extends BaseController {
 
 
     @ApiOperation("获取用户报告错题数")
-    @GetMapping("/wrongNum/{recordId}")
-    public AjaxResult<Long> wrongNum(@PathVariable("recordId" ) Long recordId) {
+    @GetMapping("/wrongNum")
+    public AjaxResult<Long> wrongNum(UserExamWrongRecordQueryBo bo) {
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
-        UserExamWrongRecordQueryBo wBo = new UserExamWrongRecordQueryBo();
-        wBo.setRecordId(recordId);
-        wBo.setUserId(loginUser.getUser().getUserId());
-        return AjaxResult.success(iUserExamWrongRecordService.recordNum(wBo));
+        bo.setUserId(loginUser.getUser().getUserId());
+        return AjaxResult.success(iUserExamWrongRecordService.recordNum(bo));
     }
 
     /**

+ 23 - 13
zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.controller.wx;
 
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSON;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -19,6 +20,8 @@ import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -43,6 +46,7 @@ public class WxLoginController
     private  IUserService iUserService;
     @Autowired
     private  RedisCache redisCache;
+    private static final Logger log = LoggerFactory.getLogger(WxLoginController.class);
 
     /**
      * 登录方法
@@ -58,6 +62,20 @@ public class WxLoginController
         return AjaxResult.success(null);
     }
 
+    /**
+     * 公众号登录方法
+     *
+     * @param loginBody 登公众号录信息
+     * @return 结果
+     */
+    @ApiOperation("公众号登录")
+    @PostMapping("/app/common/gzh_login")
+    public AjaxResult gzh_login(@RequestBody WxLoginBody loginBody)
+    {
+        Map<String,String> map = wxLoginService.gzh_login(loginBody);
+        return AjaxResult.success(map);
+    }
+
     /**
      * 登录方法
      *
@@ -85,10 +103,14 @@ public class WxLoginController
     @PostMapping("/scan_login_check")
     public AjaxResult scanLoginCheck(@RequestBody WxLoginBody loginBody)
     {
+        log.info("loginBody:"+ JSON.toJSONString(loginBody));
         ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        log.info("loginUser:"+ JSON.toJSONString(loginUser));
         String scanCode = loginBody.getScanCode();
         String key = "SCAN_LOGIN_"+scanCode;
+        log.info("key:"+ key);
         String keyStatus = "SCAN_LOGIN_STATUS_"+scanCode; //0未扫码 1已扫码 2已登录
+        log.info("keyStatus:"+ keyStatus);
         Long status = redisCache.getCacheObject(keyStatus);
         if(Validator.isNotEmpty(status)&&status.equals(1L)){
             redisCache.setCacheObject(key, loginUser.getUser().getUserId(),60, TimeUnit.SECONDS);//60秒锁定
@@ -133,19 +155,7 @@ public class WxLoginController
     }
 
 
-    /**
-     * 公众号登录方法
-     *
-     * @param loginBody 登公众号录信息
-     * @return 结果
-     */
-    @ApiOperation("公众号登录")
-    @PostMapping("/gzh_login")
-    public AjaxResult gzh_login(@RequestBody WxLoginBody loginBody)
-    {
-        Map<String,String> map = wxLoginService.gzh_login(loginBody);
-        return AjaxResult.success(map);
-    }
+
 
     @ApiOperation("刷新登录令牌")
     @GetMapping("/refreshToken/{userAccount}")

+ 86 - 56
zhongzheng-api/src/main/resources/application-dev.yml

@@ -1,61 +1,86 @@
 # 数据源配置
 spring:
     datasource:
-        type: com.alibaba.druid.pool.DruidDataSource
-        driverClassName: com.mysql.cj.jdbc.Driver
-        druid:
-            # 主库数据源
-            master:
-                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
-#                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas_pre?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
-                username: root
-                password: zhongzheng2021
-            # 从库数据源
-            slave:
-                # 从数据源开关/默认关闭
-                enabled: false
-                url:
-                username:
-                password:
-            # 初始连接数
-            initialSize: 5
-            # 最小连接池数量
-            minIdle: 10
-            # 最大连接池数量
-            maxActive: 20
-            # 配置获取连接等待超时的时间
-            maxWait: 60000
-            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
-            timeBetweenEvictionRunsMillis: 60000
-            # 配置一个连接在池中最小生存的时间,单位是毫秒
-            minEvictableIdleTimeMillis: 300000
-            # 配置一个连接在池中最大生存的时间,单位是毫秒
-            maxEvictableIdleTimeMillis: 900000
-            # 配置检测连接是否有效
-            validationQuery: SELECT 1 FROM DUAL
-            testWhileIdle: true
-            testOnBorrow: false
-            testOnReturn: false
-            webStatFilter:
-                enabled: true
-            statViewServlet:
-                enabled: true
-                # 设置白名单,不填则允许所有访问
-                allow:
-                url-pattern: /druid/*
-                # 控制台管理用户名和密码
-                login-username: ruoyi
-                login-password: 123456
-            filter:
-                stat:
-                    enabled: true
-                    # 慢SQL记录
-                    log-slow-sql: true
-                    slow-sql-millis: 1000
-                    merge-sql: true
-                wall:
-                    config:
-                        multi-statement-allow: true
+        #配置hikari连接池
+        hikari:
+            minimum-idle: 10
+            maximum-pool-size: 20
+            connection-timeout: 10000
+            idle-timeout: 30000
+            connection-init-sql: set names utf8mb4
+        #动态数据源配置
+        dynamic:
+            primary: slave #设置默认的数据源或者数据源组,默认值即为master
+            strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
+            datasource:
+                #数据源
+                master:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas_top?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                    username: root
+                    password: zhongzheng2021
+                #数据源
+                slave:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                    username: root
+                    password: zhongzheng2021
+#    datasource:
+#        type: com.alibaba.druid.pool.DruidDataSource
+#        driverClassName: com.mysql.cj.jdbc.Driver
+#        druid:
+#            # 主库数据源
+#            master:
+#                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+##                url: jdbc:mysql://192.168.1.222:3306/zz_edu_saas_pre?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+#                username: root
+#                password: zhongzheng2021
+#            # 从库数据源
+#            slave:
+#                # 从数据源开关/默认关闭
+#                enabled: false
+#                url:
+#                username:
+#                password:
+#            # 初始连接数
+#            initialSize: 5
+#            # 最小连接池数量
+#            minIdle: 10
+#            # 最大连接池数量
+#            maxActive: 20
+#            # 配置获取连接等待超时的时间
+#            maxWait: 60000
+#            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+#            timeBetweenEvictionRunsMillis: 60000
+#            # 配置一个连接在池中最小生存的时间,单位是毫秒
+#            minEvictableIdleTimeMillis: 300000
+#            # 配置一个连接在池中最大生存的时间,单位是毫秒
+#            maxEvictableIdleTimeMillis: 900000
+#            # 配置检测连接是否有效
+#            validationQuery: SELECT 1 FROM DUAL
+#            testWhileIdle: true
+#            testOnBorrow: false
+#            testOnReturn: false
+#            webStatFilter:
+#                enabled: true
+#            statViewServlet:
+#                enabled: true
+#                # 设置白名单,不填则允许所有访问
+#                allow:
+#                url-pattern: /druid/*
+#                # 控制台管理用户名和密码
+#                login-username: ruoyi
+#                login-password: 123456
+#            filter:
+#                stat:
+#                    enabled: true
+#                    # 慢SQL记录
+#                    log-slow-sql: true
+#                    slow-sql-millis: 1000
+#                    merge-sql: true
+#                wall:
+#                    config:
+#                        multi-statement-allow: true
     # redis 配置
     redis:
         # 地址
@@ -131,12 +156,17 @@ certificate:
 
 liveGotoURL: http://120.79.166.78:19014/
 
-enCodeVersion: develop
+enCodeVersion: trial
 
 oldStudySys:
     syncPath: http://gdxypx.xy.com/System/PostUserStudyRecords
     sharePath: http://192.168.1.210:8086/witsystem/dataapi/SaleOrder
     shareCanclePath: http://192.168.1.210:8086/witsystem/dataapi/ordercance
+    searchGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: http://gdxypx.xy.com/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

+ 5 - 0
zhongzheng-api/src/main/resources/application-pre.yml

@@ -136,6 +136,11 @@ oldStudySys:
     syncPath: http://test.jqbao.net/System/PostUserStudyRecords
     sharePath: http://test.jqbao.net/witsystem/dataapi/SaleOrder
     shareCanclePath: http://test.jqbao.net/witsystem/dataapi/ordercance
+    searchGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: http://test.jqbao.net/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: http://192.168.1.210/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: http://gdxypx.xy.com/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: http://gdxypx.xy.com/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt-dev.gdcic.net/organjxjy/ShangBaoMingdan

+ 5 - 0
zhongzheng-api/src/main/resources/application-prod.yml

@@ -148,6 +148,11 @@ oldStudySys:
     syncPath: https://www.xyyxt.net/System/PostUserStudyRecords
     sharePath: https://www.xyyxt.net/witsystem/dataapi/SaleOrder
     shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
+    searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    educationalInspector: https://zs.gdzzkj.net/EduSystem/BusinessApi/NewYxtUserPrompt
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
 
 officialPush:
     infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan

+ 160 - 0
zhongzheng-api/src/main/resources/application-trial.yml

@@ -0,0 +1,160 @@
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: com.mysql.cj.jdbc.Driver
+        druid:
+            # 主库数据源
+            master:
+                url: jdbc:mysql://rm-wz950fu2v70864v85.mysql.rds.aliyuncs.com/zz_edu_saas_trial?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
+                username: root
+                password: gdxy2021!@#zzjykj
+            # 从库数据源
+            slave:
+                # 从数据源开关/默认关闭
+                enabled: false
+                url:
+                username:
+                password:
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username: ruoyi
+                login-password: 123456
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 400
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true
+    # redis 配置
+    redis:
+        # 地址
+        host: 172.18.19.227
+        # 端口,默认为6379
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: zhongzheng2021_redis
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+#aliyun:
+#    oss:
+#        endpoint: https://file.xyyxt.net  # oss对外服务的访问域名
+#        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
+#        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+#        bucketName: zhongzheng-prod # oss的存储空间
+#        policy:
+#            expire: 30 # 签名有效期(S)
+#        maxSize: 10 # 上传文件大小(M)
+#        callback: https://cloud.xyyxt.net/aliyun/oss/callback # 文件上传成功后的回调地址
+#        dir:
+#            prefix: oss/images/ # 上传文件夹路径前缀 `
+aliyun:
+    oss:
+        endpoint: https://file.xyyxt.net # oss对外服务的访问域名
+        accessKeyId: LTAIgC8O2WUXvXuR  # 访问身份验证中用到用户标识
+        accessKeySecret: 1yyCazuT1M6MruBXzgFjP0p9gdMlwX # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
+        bucketName: zhongzheng-prod # oss的存储空间
+        policy:
+            expire: 30 # 签名有效期(S)
+        maxSize: 100 # 上传文件大小(M)
+        callback: https://api.gdzzkj.net/aliyun/oss/callback # 文件上传成功后的回调地址
+        dir:
+            prefix: oss/images/ # 上传文件夹路径前缀 `
+
+poliv:
+    token:
+        userid: d5f6d309fe
+        writetoken: 8f14a371-9d02-4ec1-922d-54d7b4f79dca
+        readtoken: f2c397b4-e2a3-46dc-9266-e6a43ac26a35
+        secretkey: xpPrYdcbA1
+
+wx:
+    small:
+        appid: wxd3c8ae80cf43a305
+        appsecret: 193a001ebfd46f227008a21e9d13e750
+    gzh:
+        appid: wx6f48f721d18244eb
+        appsecret: 2f8b2b4ff66e2f6adfb9f08ae22d7474
+        studyNoteTpId: DndIixcAp15Sqgb4KOGTMf73VLF09NlCUifPSel5Y_s
+        qdyTpId: s981yq3SyIODNUEXFzVSWn0OYj90E72aKdtKtSp05_E
+        qdySubTpId: gzE6zddD7OzDLUtOO4GfU-KPCxpMqWFhCj86uXExqB8
+        qdySubStatusTpId: 7oKaAHmc4P7jqfonuiM1wnjfNLh9T662Ywm1OAFaUFA
+        qdyExamTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
+        qdyExamStatusTpId: J7nNogGhD38OD20gI-3CzwawfEMu7lOjR8fsi4LgJ5g
+        signatureTpId: 66LitnYp0AIWFclo0rLdyLQP4-_vVc4pM95fyFs6l-c
+    wepay:
+        mchid: 1342013901
+        key: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
+        appsecret: GdXyPxYjZx1234123yJzXgDxYpXyjpx9
+        notifyUrl: https://api.xyyxt.net/wx/pay/callback
+    scanLogin:
+        host: https://m.xyyxt.net/
+
+wisdomExamRoom:
+    mchid: 10001
+    appid: ZZ-YXT-GZ-20220820-0001
+    app_secret: mt70O1s/Xd5LwuH7yHLpj9R+tKUn5j9vTnCvmgBnbJDA11Hpl7+q4lEZliqPAjN+YHPn9bGmHkAbw5XwhhMiYg==
+    host: http://bg.sam457.site:9020
+
+certificate:
+    host: https://m.xyyxt.net/
+
+liveGotoURL: https://web.xyyxt.net/
+
+enCodeVersion: release
+
+oldStudySys:
+    syncPath: https://www.xyyxt.net/System/PostUserStudyRecords
+    sharePath: https://www.xyyxt.net/witsystem/dataapi/SaleOrder
+    shareCanclePath: https://www.xyyxt.net/witsystem/dataapi/ordercance
+    searchGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCount
+    pushGradeCount: https://www.xyyxt.net/System/BussinessApi/OfficialGradeCountAuto
+    classUserListPath: https://www.xyyxt.net/System/BussinessApi/UserCourseCategoryListcno
+    classOpenPath: https://www.xyyxt.net/System/BussinessApi/OpenClass
+
+officialPush:
+    infoPath: http://jypt.gdcic.net/organjxjy/ShangBaoMingdan
+    periodPath: http://jypt.gdcic.net/organjxjy/XueshiShenqing
+    infoAccount: GDSXY
+    token: 01b5d9833987efdff54483cdc9720da6

+ 2 - 0
zhongzheng-api/src/main/resources/application.yml

@@ -138,6 +138,7 @@ mybatis-plus:
   executorType: SIMPLE
   # 指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
   configurationProperties: null
+  typeHandlersPackage: com.zhongzheng.common.type
   configuration:
     # 自动驼峰命名规则(camel case)映射
     # 如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名
@@ -296,3 +297,4 @@ aliyun:
     signCommitmentRemind: SMS_250390195  #签署承诺书提醒
     todayExamNotRecordWarn: SMS_257713140  #学员打卡提醒(每日一练)
     todayExamNotRecordTeachWarn: SMS_257702971  #学员打卡教务提醒(每日一练)
+    noFinishExamNoteCode: SMS_262460267  #未做完试卷通知

BIN
zhongzheng-api/src/main/resources/config/1342013901/apiclient_cert.p12


BIN
zhongzheng-api/src/main/resources/config/1637492608/apiclient_cert.p12


+ 7 - 0
zhongzheng-common/pom.xml

@@ -182,6 +182,13 @@
             <version>3.1.479</version>
         </dependency>
 
+        <!-- dynamic -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>

+ 1 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/config/WxSmallConfig.java

@@ -60,11 +60,10 @@ public class WxSmallConfig extends WXPayConfig {
 
     }
 
-    //安全证书放在项目resources写法
     @Override
     public InputStream getCertStream() {
         try {
-            InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/apiclient_cert.p12");
+            InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/"+getMchID()+"/apiclient_cert.p12");
             this.certData = IOUtils.toByteArray(certStream);
             certStream.close();
         } catch (Exception e) {

+ 14 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/constant/Constants.java

@@ -64,6 +64,8 @@ public class Constants
 
     public static final String WX_LOGIN_TOKEN_KEY = "wx_login_tokens:";
 
+    public static final String SELLER_LOGIN_TOKEN_KEY = "se_login_tokens:";
+
     /**
      * 防重提交 redis key
      */
@@ -89,13 +91,15 @@ public class Constants
     /**
      * 超级管理员令牌前缀
      */
-    public static final String SUPER_TOKEN_PREFIX = "BearerSuper ";
+    public static final String SUPER_TOKEN_PREFIX = "Bearer ";
 
     /**
      * 微信令牌前缀
      */
     public static final String WX_TOKEN_PREFIX = "WX ";
 
+    public static final String SELLER_TOKEN_PREFIX = "SE ";
+
     public static final String REGISTER_SMS = "REGISTER-";
     public static final String FORGET_SMS = "FORGET-";
     public static final String LOGIN_SMS = "LOGIN-";
@@ -110,6 +114,10 @@ public class Constants
 
     public static final String WX_LOGIN_USER_KEY = "wx_login_user_key";
 
+    public static final String SELLER_LOGIN_USER_KEY = "seller_login_user_key";
+
+
+
 
     /**
      * 用户ID
@@ -146,6 +154,11 @@ public class Constants
      */
     public static final String SYS_DICT_KEY = "sys_dict:";
 
+    /**
+     * 字典管理 cache key
+     */
+    public static final String SYS_TOP_DICT_KEY = "sys_top_dict:";
+
     /**
      * 资源映射路径 前缀
      */

+ 4 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysMenu.java

@@ -112,6 +112,10 @@ public class SysMenu implements Serializable
     /** 备注 */
     private String remark;
 
+    /** 备注 */
+//    @TableField(exist = false)
+    private Long tenantId;
+
     /** 请求参数 */
     @TableField(exist = false)
     private Map<String, Object> params = new HashMap<>();

+ 7 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java

@@ -30,6 +30,7 @@ import java.util.Map;
 @Data
 @NoArgsConstructor
 @Accessors(chain = true)
+@TableName("sys_user")
 public class SysUser implements Serializable
 {
     private static final long serialVersionUID = 1L;
@@ -82,6 +83,7 @@ public class SysUser implements Serializable
     }
 
     /** 盐加密 */
+    @TableField(exist = false)
     private String salt;
 
     /** 帐号状态(1正常 0停用) */
@@ -157,11 +159,16 @@ public class SysUser implements Serializable
     @TableField(exist = false)
     private String roleName;
 
+    private Long tenantId;
+
     /** 上一次登录IP */
     private String preLoginIp;
     /** 上一次登录时间 */
     private Date preLoginDate;
 
+    /** 密码最后修改时间 */
+    private Long pwdTime;
+
     public SysUser(Long userId)
     {
         this.userId = userId;

+ 11 - 3
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysUser.java

@@ -72,6 +72,9 @@ public class TopSysUser implements Serializable
     /** 用户头像 */
     private String avatar;
 
+    /** 用户编码 */
+    private String code;
+
     /** 密码 */
     private String password;
 
@@ -82,6 +85,7 @@ public class TopSysUser implements Serializable
     }
 
     /** 盐加密 */
+    @TableField(exist = false)
     private String salt;
 
     /** 帐号状态(1正常 0停用) */
@@ -146,6 +150,10 @@ public class TopSysUser implements Serializable
     @TableField(exist = false)
     private Long[] roleIds;
 
+    /** 角色名称 */
+    @TableField(exist = false)
+    private String roleName;
+
     /** 岗位组 */
     @TableField(exist = false)
     private Long[] postIds;
@@ -157,12 +165,12 @@ public class TopSysUser implements Serializable
 
     public boolean isAdmin()
     {
-        return isAdmin(this.userId);
+        return isAdmin(this.userName);
     }
 
-    public static boolean isAdmin(Long userId)
+    public static boolean isAdmin(String userName)
     {
-        return userId != null && 1L == userId;
+        return userName != null && "admin".equals(userName) ;
     }
 
 }

+ 53 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/core/redis/RedisCache.java

@@ -3,6 +3,9 @@ package com.zhongzheng.common.core.redis;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
+import cn.hutool.core.lang.Validator;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,7 +39,14 @@ public class RedisCache
      */
     public <T> void setCacheObject(final String key, final T value)
     {
-        redisTemplate.opsForValue().set(key, value);
+        String unionKey = key;
+        if(Validator.isNotEmpty(ServletUtils.getRequest())){
+            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            if(Validator.isNotEmpty(tenantId)){
+                unionKey = tenantId + key;
+            }
+        }
+        redisTemplate.opsForValue().set(unionKey, value);
     }
 
     /**
@@ -48,8 +58,22 @@ public class RedisCache
      * @param timeUnit 时间颗粒度
      */
     public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
+    {
+        String unionKey = key;
+        if(Validator.isNotEmpty(ServletUtils.getRequest())){
+            String tenantId = ToolsUtils.getTenantId();
+            if(Validator.isNotEmpty(tenantId)){
+                unionKey = tenantId + key;
+            }
+        }
+        redisTemplate.opsForValue().set(unionKey, value, timeout, timeUnit);
+
+    }
+
+    public <T> void setCacheObjectTenant(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
     {
         redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+
     }
 
     /**
@@ -84,11 +108,31 @@ public class RedisCache
      * @return 缓存键值对应的数据
      */
     public <T> T getCacheObject(final String key)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        String unionKey = key;
+        if(Validator.isNotEmpty(ServletUtils.getRequest())){
+            String tenantId = ToolsUtils.getTenantId();
+            if(Validator.isNotEmpty(tenantId)){
+                unionKey = tenantId + key;
+            }
+        }
+        return operation.get(unionKey);
+    }
+
+    /**
+     * 获得缓存的基本对象。
+     *
+     * @param key 缓存键值
+     * @return 缓存键值对应的数据
+     */
+    public <T> T getCacheObjectNoTenant(final String key)
     {
         ValueOperations<String, T> operation = redisTemplate.opsForValue();
         return operation.get(key);
     }
 
+
     /**
      * 删除单个对象
      *
@@ -96,7 +140,14 @@ public class RedisCache
      */
     public boolean deleteObject(final String key)
     {
-        return redisTemplate.delete(key);
+        String unionKey = key;
+        if(Validator.isNotEmpty(ServletUtils.getRequest())){
+            String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+            if(Validator.isNotEmpty(tenantId)){
+                unionKey = tenantId + key;
+            }
+        }
+        return redisTemplate.delete(unionKey);
     }
 
     /**

+ 78 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java

@@ -0,0 +1,78 @@
+package com.zhongzheng.common.type;
+
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.symmetric.AES;
+import org.apache.ibatis.type.*;
+import org.springframework.util.StringUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+
+@MappedJdbcTypes(JdbcType.VARCHAR)
+public class EncryptHandler  implements TypeHandler<String> {
+
+    private static final byte[] KEYS = "base20230213zzkj".getBytes(StandardCharsets.UTF_8);
+
+    public static final boolean ENCRYPT_STATUS = true; //是否开启字段加密
+
+
+
+    public String decrypt(String value) {
+        if (null == value) {
+            return null;
+        }
+        if (value.length()<=20 ) {
+            return value;
+        }
+        return SecureUtil.aes(KEYS).decryptStr(value);
+    }
+
+    public static String encrypt(String value){
+        if (null == value) {
+            return null;
+        }
+        if(ENCRYPT_STATUS){
+            AES aes = SecureUtil.aes(KEYS);
+            String encrypt = aes.encryptHex(value);
+            return encrypt;
+        }else{
+            return value;
+        }
+
+    }
+
+    @Override
+    public void setParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
+        if (StringUtils.isEmpty(s)) {
+            preparedStatement.setString(i, null);
+            return;
+        }
+        String encrypt = encrypt(s);
+        preparedStatement.setString(i, encrypt);
+    }
+
+    @Override
+    public String getResult(ResultSet resultSet, String s) throws SQLException {
+        if(ENCRYPT_STATUS){
+            return decrypt(resultSet.getString(s));
+        }else{
+            return resultSet.getString(s);
+        }
+    }
+
+    @Override
+    public String getResult(ResultSet resultSet, int i) throws SQLException {
+        return null;
+    }
+
+    @Override
+    public String getResult(CallableStatement callableStatement, int i) throws SQLException {
+        return null;
+    }
+
+
+}

+ 54 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DateUtils.java

@@ -7,6 +7,8 @@ import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 import cn.hutool.core.lang.Validator;
 import org.apache.commons.lang3.RandomStringUtils;
@@ -245,6 +247,58 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return cal.getTime().getTime()/1000;
     }
 
+    /**
+     * 根据当前日期获得所在周的日期区间(周一和周日日期)
+     */
+    public static Map<String, Long> getTimeInterval(Date date){
+        Map<String, Long> map = new HashMap<>();
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
+        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
+        if(1 == dayWeek){
+            cal.add(Calendar.DAY_OF_MONTH,-1);
+        }
+        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
+        cal.setFirstDayOfWeek(Calendar.MONDAY);
+        // 获得当前日期是一个星期的第几天
+        int day = cal.get(Calendar.DAY_OF_WEEK);
+        // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
+        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
+        Long imptimeBegin = cal.getTime().getTime();
+        cal.add(Calendar.DATE,6);
+        Long imptimeEnd = cal.getTime().getTime();
+        map.put("start", imptimeBegin/1000);
+        map.put("end", imptimeEnd/1000);
+        return map;
+    }
+
+
+    /**
+     * 根据当前日期获得上周的日期区间(上周周一和周日日期)
+     */
+    public static Map<String, Long> getLastTimeInterval(Date date){
+        Map<String, Long> map = new HashMap<>();
+        Calendar calendar1 = Calendar.getInstance();
+        Calendar calendar2 = Calendar.getInstance();
+        calendar1.setTime(date);
+        calendar2.setTime(date);
+        int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1;
+        if(dayOfWeek <= 0){
+            dayOfWeek = 7;
+        }
+        int offset1 = 1 - dayOfWeek;
+        int offset2 = 7 - dayOfWeek;
+        calendar1.add(Calendar.DATE, offset1 - 7);
+        calendar2.add(Calendar.DATE, offset2 - 7);
+        // last Monday
+        Long lastBeginDate = calendar1.getTime().getTime();
+        // last Sunday
+        Long lastEndDate = calendar2.getTime().getTime();
+        map.put("laststart", lastBeginDate/1000);
+        map.put("lastend", lastEndDate/1000);
+        return map;
+    }
 
     /**
      * 获取日期格式订单号

+ 40 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DictUtils.java

@@ -34,6 +34,17 @@ public class DictUtils
         SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas);
     }
 
+    /**
+     * 设置字典缓存
+     *
+     * @param key 参数键
+     * @param dictDatas 字典数据列表
+     */
+    public static void setTopDictCache(String key, List<SysDictData> dictDatas)
+    {
+        SpringUtils.getBean(RedisCache.class).setCacheObject(getTopCacheKey(key), dictDatas);
+    }
+
     /**
      * 获取字典缓存
      * 
@@ -51,6 +62,24 @@ public class DictUtils
         return null;
     }
 
+    /**
+     * 获取字典缓存
+     *
+     * @param key 参数键
+     * @return dictDatas 字典数据列表
+     */
+    public static List<SysDictData> getTopDictCache(String key)
+    {
+        Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getTopCacheKey(key));
+        if (Validator.isNotNull(cacheObj))
+        {
+            List<SysDictData> dictDatas = (List<SysDictData>)cacheObj;
+            return dictDatas;
+        }
+        return null;
+    }
+
+
     /**
      * 根据字典类型和字典值获取字典标签
      * 
@@ -174,4 +203,15 @@ public class DictUtils
     {
         return Constants.SYS_DICT_KEY + configKey;
     }
+
+    /**
+     * 设置cache key
+     *
+     * @param configKey 参数键
+     * @return 缓存键key
+     */
+    public static String getTopCacheKey(String configKey)
+    {
+        return Constants.SYS_TOP_DICT_KEY + configKey;
+    }
 }

+ 16 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/SecurityUtils.java

@@ -118,6 +118,21 @@ public class SecurityUtils
      */
     public static boolean isAdmin(Long userId)
     {
-        return userId != null && 1L == userId;
+        LoginUser user= (LoginUser) getAuthentication().getPrincipal();
+        return user != null && "admin".equals(user.getUser().getUserName());
+     //   return userId != null && 1L == userId;
+    }
+
+    /**
+     * 是否为管理员
+     *
+     * @param userId 用户ID
+     * @return 结果
+     */
+    public static boolean isTopAdmin(Long userId)
+    {
+        TopLoginUser user= (TopLoginUser) getAuthentication().getPrincipal();
+        return user != null && "admin".equals(user.getUser().getUserName());
+        //   return userId != null && 1L == userId;
     }
 }

+ 2 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ServletUtils.java

@@ -25,13 +25,13 @@ public class ServletUtils
     public static String getEncoded(String tag)
     {
         String time = String.valueOf(System.currentTimeMillis()/1000);
-        return tag+Integer.valueOf(time.substring(1))+(int)((Math.random()*10));
+        return tag+Integer.valueOf(time.substring(1))+""+(((int)(Math.random() * 90 + 10)));
     }
     //导入生成编号使用
     public static String getImportEncoded(String tag)
     {
         String time = String.valueOf(System.currentTimeMillis()/1000);
-        return tag+Integer.valueOf(time.substring(2));
+        return tag+Integer.valueOf(time.substring(2))+(int)((Math.random()*100));
     }
     /**
      * 获取String参数

+ 65 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java

@@ -1,7 +1,15 @@
 package com.zhongzheng.common.utils;
 
 
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import com.zhongzheng.common.core.domain.AjaxResult;
+
 import io.micrometer.core.lang.NonNull;
+import net.sf.jsqlparser.expression.LongValue;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
@@ -9,9 +17,16 @@ import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
 
+
 import static org.apache.xmlbeans.impl.util.Base64.encode;
 
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+
 public class ToolsUtils {
 
     public static final int EMU_PER_PX = 9525;
@@ -280,6 +295,17 @@ public class ToolsUtils {
         return result;
     }
 
+    public static Boolean checkSignFromOldSys(String stamp,String sign) {
+        String newSign = stamp+"pubilc2022";
+        if(!sign.equals(ToolsUtils.EncoderByMd5(newSign))){
+            return false;
+        }
+        if((Long.parseLong(stamp)+10L>(DateUtils.getNowTime().longValue()))&&(Long.parseLong(stamp)<(DateUtils.getNowTime().longValue()-10L))){
+            return false;
+        }
+        return true;
+    }
+
     public static String EncoderByMd5(String str) {
         String result = "";
         MessageDigest md5 = null;
@@ -310,4 +336,43 @@ public class ToolsUtils {
         return result;
     }
 
+    public static boolean verifPwd(String passWord) {
+        if(Validator.isEmpty(passWord)){
+            return false;
+        }
+        /*if(passWord.length()<8||passWord.length()>18){
+            return false;
+        }*/
+        String regExp = "^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\\d)(?=.*?[!#@*&.])[a-zA-Z\\d!#@*&.]{8,16}$";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(passWord);
+        if (m.matches()){
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public static String getTenantId() {
+        String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if(!StrUtil.isNotBlank(TenantId)||TenantId==null){
+            TenantId = ServletUtils.getResponse().getHeader("TenantId");
+        }
+        return TenantId;
+    }
+
+    private static int getRandom(int count) {
+        return (int) Math.round(Math.random() * (count));
+    }
+
+    public static String getRandomString(int length){
+        String string = "abcdefghijklmnopqrstuvwxyz";
+        StringBuffer sb = new StringBuffer();
+        int len = string.length();
+        for (int i = 0; i < length; i++) {
+            sb.append(string.charAt(getRandom(len-1)));
+        }
+        return sb.toString();
+    }
+
 }

+ 6 - 1
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/http/HttpUtils.java

@@ -487,7 +487,12 @@ public class HttpUtils
         return post(url, httpPost, encoding, new DataParse<String>() {
             @Override
             public String parseData(HttpEntity httpEntity, String encoding) throws IOException {
-                return EntityUtils.toString(httpEntity, encoding);
+                if(Validator.isNotEmpty(httpEntity)){
+                    return EntityUtils.toString(httpEntity, encoding);
+                }else{
+                    return null;
+                }
+
             }
         });
     }

+ 129 - 114
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/DruidConfig.java

@@ -1,29 +1,6 @@
 package com.zhongzheng.framework.config;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.sql.DataSource;
-
-import com.zhongzheng.framework.config.properties.DruidProperties;
-import com.zhongzheng.framework.datasource.DynamicDataSource;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import com.alibaba.druid.pool.DruidDataSource;
-import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
-import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
-import com.alibaba.druid.util.Utils;
-import com.zhongzheng.common.enums.DataSourceType;
-import com.zhongzheng.common.utils.spring.SpringUtils;
 
 /**
  * druid 配置多数据源
@@ -33,95 +10,133 @@ import com.zhongzheng.common.utils.spring.SpringUtils;
 @Configuration
 public class DruidConfig
 {
-    @Bean
-    @ConfigurationProperties("spring.datasource.druid.master")
-    public DataSource masterDataSource(DruidProperties druidProperties)
-    {
-        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
-        return druidProperties.dataSource(dataSource);
-    }
-
-    @Bean
-    @ConfigurationProperties("spring.datasource.druid.slave")
-    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
-    public DataSource slaveDataSource(DruidProperties druidProperties)
-    {
-        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
-        return druidProperties.dataSource(dataSource);
-    }
-
-    @Bean(name = "dynamicDataSource")
-    @Primary
-    public DynamicDataSource dataSource(DataSource masterDataSource)
-    {
-        Map<Object, Object> targetDataSources = new HashMap<>();
-        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
-        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
-        return new DynamicDataSource(masterDataSource, targetDataSources);
-    }
-    
-    /**
-     * 设置数据源
-     * 
-     * @param targetDataSources 备选数据源集合
-     * @param sourceName 数据源名称
-     * @param beanName bean名称
-     */
-    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
-    {
-        try
-        {
-            DataSource dataSource = SpringUtils.getBean(beanName);
-            targetDataSources.put(sourceName, dataSource);
-        }
-        catch (Exception e)
-        {
-        }
-    }
-
-    /**
-     * 去除监控页面底部的广告
-     */
-    @SuppressWarnings({ "rawtypes", "unchecked" })
-    @Bean
-    @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
-    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
-    {
-        // 获取web监控页面的参数
-        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
-        // 提取common.js的配置路径
-        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
-        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
-        final String filePath = "support/http/resources/js/common.js";
-        // 创建filter进行过滤
-        Filter filter = new Filter()
-        {
-            @Override
-            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
-            {
-            }
-            @Override
-            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-                    throws IOException, ServletException
-            {
-                chain.doFilter(request, response);
-                // 重置缓冲区,响应头不会被重置
-//                response.resetBuffer();
-                // 获取common.js
-                String text = Utils.readFromResource(filePath);
-                // 正则替换banner, 除去底部的广告信息
-                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
-                text = text.replaceAll("powered.*?shrek.wang</a>", "");
-                response.getWriter().write(text);
-            }
-            @Override
-            public void destroy()
-            {
-            }
-        };
-        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
-        registrationBean.setFilter(filter);
-        registrationBean.addUrlPatterns(commonJsPattern);
-        return registrationBean;
-    }
+//
+//    /**
+//     * 主库数据源bean名称
+//     */
+//    public static final String MASTER_DATASOURCE = "masterDataSource";
+//    /**
+//     * 从库数据源bean名称
+//     */
+//    public static final String SLAVE_DATASOURCE = "slaveDataSource";
+//
+//
+//    @Bean(MASTER_DATASOURCE)
+//    @ConfigurationProperties("spring.datasource.druid.master")
+//    public DruidDataSource masterDataSource(DruidProperties druidProperties)
+//    {
+//        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+//        return druidProperties.dataSource(dataSource);
+//    }
+//
+//    @Bean(SLAVE_DATASOURCE)
+//    @ConfigurationProperties("spring.datasource.druid.slave")
+//    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
+//    public DruidDataSource slaveDataSource(DruidProperties druidProperties)
+//    {
+//        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+//        return druidProperties.dataSource(dataSource);
+//    }
+//
+////    @Bean(name = "dynamicDataSource")
+////    @Primary
+////    public DynamicDataSource dataSource(DataSource masterDataSource)
+////    {
+////        Map<Object, Object> targetDataSources = new HashMap<>();
+////        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
+////        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
+////        return new DynamicDataSource(masterDataSource, targetDataSources);
+////    }
+//
+//    /**
+//     * 数据源配置
+//     * @param masterDataSource      主库数据源对象
+//     * @param slaveDataSource       从库数据源对象
+//     * @return                      DataSource
+//     * @Primary                     优先使用这个DataSource对象bean
+//     */
+//    @Bean
+//    @Primary
+//    @DependsOn(value = {MASTER_DATASOURCE, SLAVE_DATASOURCE})
+//    public DataSource routingDataSource(@Qualifier(MASTER_DATASOURCE) DruidDataSource masterDataSource,
+//                                        @Qualifier(SLAVE_DATASOURCE) DruidDataSource slaveDataSource) {
+//        if (StringUtils.isBlank(slaveDataSource.getUrl())) {
+//            return masterDataSource;
+//        }
+//        Map<Object, Object> map = new HashMap<>();
+//        map.put(DruidConfig.MASTER_DATASOURCE, masterDataSource);
+//        map.put(DruidConfig.SLAVE_DATASOURCE, slaveDataSource);
+//        //设置动态数据源
+//        DynamicDataSource routing = new DynamicDataSource(masterDataSource,map);
+////        //设置动态数据源
+////        routing.setTargetDataSources(map);
+////        //设置默认数据源
+////        routing.setDefaultTargetDataSource(masterDataSource);
+//        return routing;
+//    }
+//
+////    /**
+////     * 设置数据源
+////     *
+////     * @param targetDataSources 备选数据源集合
+////     * @param sourceName 数据源名称
+////     * @param beanName bean名称
+////     */
+////    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
+////    {
+////        try
+////        {
+////            DataSource dataSource = SpringUtils.getBean(beanName);
+////            targetDataSources.put(sourceName, dataSource);
+////        }
+////        catch (Exception e)
+////        {
+////        }
+////    }
+//
+//    /**
+//     * 去除监控页面底部的广告
+//     */
+//    @SuppressWarnings({ "rawtypes", "unchecked" })
+//    @Bean
+//    @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
+//    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
+//    {
+//        // 获取web监控页面的参数
+//        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+//        // 提取common.js的配置路径
+//        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+//        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+//        final String filePath = "support/http/resources/js/common.js";
+//        // 创建filter进行过滤
+//        Filter filter = new Filter()
+//        {
+//            @Override
+//            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
+//            {
+//            }
+//            @Override
+//            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+//                    throws IOException, ServletException
+//            {
+//                chain.doFilter(request, response);
+//                // 重置缓冲区,响应头不会被重置
+////                response.resetBuffer();
+//                // 获取common.js
+//                String text = Utils.readFromResource(filePath);
+//                // 正则替换banner, 除去底部的广告信息
+//                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+//                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+//                response.getWriter().write(text);
+//            }
+//            @Override
+//            public void destroy()
+//            {
+//            }
+//        };
+//        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+//        registrationBean.setFilter(filter);
+//        registrationBean.addUrlPatterns(commonJsPattern);
+//        return registrationBean;
+//    }
 }

+ 22 - 3
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -3,12 +3,14 @@ package com.zhongzheng.framework.config;
 import com.zhongzheng.framework.security.filter.JwtAuthenticationTokenFilter;
 import com.zhongzheng.framework.security.handle.AuthenticationEntryPointImpl;
 import com.zhongzheng.framework.security.handle.LogoutSuccessHandlerImpl;
+import com.zhongzheng.framework.security.handle.TopLogoutSuccessHandlerImpl;
 import com.zhongzheng.framework.web.service.TopUserDetailsServiceImpl;
 import com.zhongzheng.framework.web.service.UserDetailsServiceImpl;
 import de.codecentric.boot.admin.server.config.AdminServerProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpMethod;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
@@ -16,7 +18,6 @@ import org.springframework.security.config.annotation.method.configuration.Enabl
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.security.web.authentication.logout.LogoutFilter;
@@ -39,7 +40,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
     @Autowired
     private TopUserDetailsServiceImpl topUserDetailsService;
 
-    @Value("${mybatis-plus.tenant.enabled-tenant:true}")
+    @Value("${mybatis-plus.tenant.enabled-tenant:false}")
     private boolean enabledTenant;
 
     /**
@@ -52,8 +53,16 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
      * 退出处理类
      */
     @Autowired
+    @Lazy
     private LogoutSuccessHandlerImpl logoutSuccessHandler;
 
+    /**
+     * 总平台退出处理类
+     */
+    @Autowired
+    @Lazy
+    private TopLogoutSuccessHandlerImpl topLogoutSuccessHandlerImpl;
+
     /**
      * token认证过滤器
      */
@@ -125,6 +134,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/profile/**").anonymous()
                 .antMatchers("/common/jzs/**").anonymous()
                 .antMatchers("/common/rollback/period").anonymous()
+                .antMatchers("/common/get/goods").anonymous()
+                .antMatchers("/common/get/goods/studyUrl").anonymous()
+                .antMatchers("/common/create/tenant/admin").anonymous()
+                .antMatchers("/common/free/**").anonymous()
                 .antMatchers("/common/download**").anonymous()
                 .antMatchers("/common/download/resource**").anonymous()
                 .antMatchers("/swagger-ui.html").anonymous()
@@ -143,7 +156,13 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .anyRequest().authenticated()
                 .and()
                 .headers().frameOptions().disable();
-        httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
+        if(enabledTenant){
+            //开启多租户
+            httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
+        }else{
+            httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(topLogoutSuccessHandlerImpl);
+        }
+
         // 添加JWT filter
         httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
         // 添加CORS filter

+ 62 - 64
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/properties/DruidProperties.java

@@ -1,8 +1,6 @@
 package com.zhongzheng.framework.config.properties;
 
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
-import com.alibaba.druid.pool.DruidDataSource;
 
 /**
  * druid 配置属性
@@ -12,66 +10,66 @@ import com.alibaba.druid.pool.DruidDataSource;
 @Configuration
 public class DruidProperties
 {
-    @Value("${spring.datasource.druid.initialSize}")
-    private int initialSize;
-
-    @Value("${spring.datasource.druid.minIdle}")
-    private int minIdle;
-
-    @Value("${spring.datasource.druid.maxActive}")
-    private int maxActive;
-
-    @Value("${spring.datasource.druid.maxWait}")
-    private int maxWait;
-
-    @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
-    private int timeBetweenEvictionRunsMillis;
-
-    @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
-    private int minEvictableIdleTimeMillis;
-
-    @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
-    private int maxEvictableIdleTimeMillis;
-
-    @Value("${spring.datasource.druid.validationQuery}")
-    private String validationQuery;
-
-    @Value("${spring.datasource.druid.testWhileIdle}")
-    private boolean testWhileIdle;
-
-    @Value("${spring.datasource.druid.testOnBorrow}")
-    private boolean testOnBorrow;
-
-    @Value("${spring.datasource.druid.testOnReturn}")
-    private boolean testOnReturn;
-
-    public DruidDataSource dataSource(DruidDataSource datasource)
-    {
-        /** 配置初始化大小、最小、最大 */
-        datasource.setInitialSize(initialSize);
-        datasource.setMaxActive(maxActive);
-        datasource.setMinIdle(minIdle);
-
-        /** 配置获取连接等待超时的时间 */
-        datasource.setMaxWait(maxWait);
-
-        /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
-        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
-
-        /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
-        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
-        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
-
-        /**
-         * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
-         */
-        datasource.setValidationQuery(validationQuery);
-        /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
-        datasource.setTestWhileIdle(testWhileIdle);
-        /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
-        datasource.setTestOnBorrow(testOnBorrow);
-        /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
-        datasource.setTestOnReturn(testOnReturn);
-        return datasource;
-    }
+//    @Value("${spring.datasource.druid.initialSize}")
+//    private int initialSize;
+//
+//    @Value("${spring.datasource.druid.minIdle}")
+//    private int minIdle;
+//
+//    @Value("${spring.datasource.druid.maxActive}")
+//    private int maxActive;
+//
+//    @Value("${spring.datasource.druid.maxWait}")
+//    private int maxWait;
+//
+//    @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
+//    private int timeBetweenEvictionRunsMillis;
+//
+//    @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
+//    private int minEvictableIdleTimeMillis;
+//
+//    @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
+//    private int maxEvictableIdleTimeMillis;
+//
+//    @Value("${spring.datasource.druid.validationQuery}")
+//    private String validationQuery;
+//
+//    @Value("${spring.datasource.druid.testWhileIdle}")
+//    private boolean testWhileIdle;
+//
+//    @Value("${spring.datasource.druid.testOnBorrow}")
+//    private boolean testOnBorrow;
+//
+//    @Value("${spring.datasource.druid.testOnReturn}")
+//    private boolean testOnReturn;
+//
+//    public DruidDataSource dataSource(DruidDataSource datasource)
+//    {
+//        /** 配置初始化大小、最小、最大 */
+//        datasource.setInitialSize(initialSize);
+//        datasource.setMaxActive(maxActive);
+//        datasource.setMinIdle(minIdle);
+//
+//        /** 配置获取连接等待超时的时间 */
+//        datasource.setMaxWait(maxWait);
+//
+//        /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
+//        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
+//
+//        /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */
+//        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
+//        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
+//
+//        /**
+//         * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
+//         */
+//        datasource.setValidationQuery(validationQuery);
+//        /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */
+//        datasource.setTestWhileIdle(testWhileIdle);
+//        /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
+//        datasource.setTestOnBorrow(testOnBorrow);
+//        /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */
+//        datasource.setTestOnReturn(testOnReturn);
+//        return datasource;
+//    }
 }

+ 1 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/manager/factory/AsyncFactory.java

@@ -52,7 +52,7 @@ public class AsyncFactory
                 s.append(getBlock(status));
                 s.append(getBlock(message));
                 // 打印信息到日志
-                sys_user_logger.info(s.toString(), args);
+//                sys_user_logger.info(s.toString(), args);
                 // 获取客户端操作系统
                 String os = userAgent.getOs().getName();
                 // 获取客户端浏览器

+ 3 - 2
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.framework.mybatisplus;
 
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import org.apache.ibatis.reflection.MetaObject;
 
@@ -18,7 +19,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
 		//根据属性名字设置要填充的值
 		if (metaObject.hasGetter("createTime")) {
 			if (metaObject.getValue("createTime") == null) {
-				this.setFieldValByName("createTime", new Date(), metaObject);
+				this.setFieldValByName("createTime", DateUtils.getNowTime(), metaObject);
 			}
 		}
 		if (metaObject.hasGetter("createBy")) {
@@ -37,7 +38,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
 		}
 		if (metaObject.hasGetter("updateTime")) {
 			if (metaObject.getValue("updateTime") == null) {
-				this.setFieldValByName("updateTime", new Date(), metaObject);
+				this.setFieldValByName("updateTime", DateUtils.getNowTime(), metaObject);
 			}
 		}
 	}

+ 8 - 13
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java

@@ -5,22 +5,15 @@ import cn.hutool.http.HttpStatus;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.ServletUtils;
 import lombok.SneakyThrows;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.LongValue;
-import org.apache.commons.compress.utils.Lists;
-
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.xml.soap.MimeHeaders;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 多租户处理插件
@@ -46,13 +39,11 @@ public class CustomTenantLineHandler implements TenantLineHandler {
      */
     private final static List<String> IGNORE_TABLE_NAMES = new ArrayList<String>(){{
         add("sys_tenant");
-        add("top_sys_user");
-        add("top_sys_dept");
-        add("top_sys_role");
-        add("top_sys_user_role");
         add("tables");
         add("columns");
         add("sys_logininfor");
+        add("sys_old_org");
+        add("top_sys_tenant_register");
     }};
 
     /**
@@ -97,6 +88,10 @@ public class CustomTenantLineHandler implements TenantLineHandler {
      */
     @Override
     public boolean ignoreTable(String tableName) {
+        if (!enabledTenant){
+            //总平台忽略tenantId
+            return true;
+        }
         return IGNORE_TABLE_NAMES.contains(tableName);
     }
 

+ 26 - 9
zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -7,7 +7,9 @@ import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
+import com.zhongzheng.framework.web.service.SellerTokenService;
 import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.utils.SecurityUtils;
@@ -45,6 +47,9 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
     @Autowired
     private TopTokenService topTokenService;
 
+    @Autowired
+    private SellerTokenService sellerTokenService;
+
     @Value("${mybatis-plus.tenant.enabled-tenant:true}")
     private boolean enabledTenant;
 
@@ -54,7 +59,6 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
     {
         try{
             String wxToken = wxTokenService.getToken(request);
-
             if(StringUtils.isNoneEmpty(wxToken)){
                 ClientLoginUser clientLoginUser = wxTokenService.getLoginUser(request);
                 if(clientLoginUser!=null){
@@ -75,18 +79,31 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
                         SecurityContextHolder.getContext().setAuthentication(authenticationToken);
                     }
                 }else{
+                    String sellerToken = sellerTokenService.getToken(request);
+                    if(StringUtils.isNoneEmpty(sellerToken)){
+                        //业务员系统
+                        ClientLoginSeller clientLoginSeller = sellerTokenService.getLoginUser(request);
+                        if(clientLoginSeller!=null){
+                            sellerTokenService.verifyToken(clientLoginSeller);
+                            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(clientLoginSeller, null,null);
+                            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+                            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+                        }
+                    }else{
                         //子系统
-                    LoginUser loginUser = null;
+                        LoginUser loginUser = null;
 
-                       loginUser = tokenService.getLoginUser(request);
+                        loginUser = tokenService.getLoginUser(request);
 
-                    if (Validator.isNotNull(loginUser) && Validator.isNull(SecurityUtils.getAuthentication()))
-                    {
-                        tokenService.verifyToken(loginUser);
-                        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
-                        authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
-                        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+                        if (Validator.isNotNull(loginUser) && Validator.isNull(SecurityUtils.getAuthentication()))
+                        {
+                            tokenService.verifyToken(loginUser);
+                            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
+                            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+                            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+                        }
                     }
+
                 }
 
             }

+ 9 - 9
zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/LogoutSuccessHandlerImpl.java

@@ -40,15 +40,15 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
     public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
             throws IOException, ServletException
     {
-        LoginUser loginUser = tokenService.getLoginUser(request);
-        if (Validator.isNotNull(loginUser))
-        {
-            String userName = loginUser.getUsername();
-            // 删除用户缓存记录
-            tokenService.delLoginUser(loginUser.getToken());
-            // 记录用户退出日志
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
-        }
+            LoginUser loginUser = tokenService.getLoginUser(request);
+            if (Validator.isNotNull(loginUser))
+            {
+                String userName = loginUser.getUsername();
+                // 删除用户缓存记录
+                tokenService.delLoginUser(loginUser.getToken());
+                // 记录用户退出日志
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
+            }
         ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.HTTP_OK, "退出成功")));
     }
 }

+ 54 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/TopLogoutSuccessHandlerImpl.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.framework.security.handle;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.http.HttpStatus;
+import com.alibaba.fastjson.JSON;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.manager.AsyncManager;
+import com.zhongzheng.framework.manager.factory.AsyncFactory;
+import com.zhongzheng.framework.web.service.TopTokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 自定义退出处理类 返回成功
+ * 
+ * @author zhongzheng
+ */
+@Configuration
+public class TopLogoutSuccessHandlerImpl implements LogoutSuccessHandler
+{
+    @Autowired
+    private TopTokenService tokenService;
+
+    /**
+     * 退出处理
+     * 
+     * @return
+     */
+    @Override
+    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
+            throws IOException, ServletException
+    {
+            TopLoginUser loginUser = tokenService.getLoginUser(request);
+            if (Validator.isNotNull(loginUser))
+            {
+                String userName = loginUser.getUsername();
+                // 删除用户缓存记录
+                tokenService.delLoginUser(loginUser.getToken());
+                // 记录用户退出日志
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
+            }
+        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.HTTP_OK, "退出成功")));
+    }
+}

+ 339 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/DistributionSellerServiceImpl.java

@@ -0,0 +1,339 @@
+package com.zhongzheng.framework.web.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.enums.UserStatus;
+import com.zhongzheng.common.exception.BaseException;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.type.EncryptHandler;
+import com.zhongzheng.common.utils.*;
+import com.zhongzheng.modules.distribution.bo.*;
+import com.zhongzheng.modules.distribution.domain.DistributionSeller;
+import com.zhongzheng.modules.distribution.mapper.DistributionSellerMapper;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.user.bo.UserAppRegisterBo;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+import java.io.InputStream;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 分销业务员Service业务层处理
+ *
+ * @author hjl
+ * @date 2023-03-13
+ */
+@Service
+public class DistributionSellerServiceImpl extends ServiceImpl<DistributionSellerMapper, DistributionSeller> implements IDistributionSellerService {
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IUserService iUserService;
+
+    @Autowired
+    private SellerTokenService sellerTokenService;
+
+    @Override
+    public Boolean registerSeller(SellerAppRegisterBo bo) {
+        if(StringUtils.isBlank(bo.getIdcard())){
+            throw new CustomException("身份证不能为空");
+        }
+        if(bo.getTel()==null){
+            throw new CustomException("手机号不能为空");
+        }
+        if(bo.getPwd()==null){
+            throw new CustomException("密码不能为空");
+        }
+        if(Validator.isEmpty(bo.getRealname())){
+            throw new CustomException("姓名不能为空");
+        }
+        if(!ToolsUtils.verifPwd(bo.getPwd())){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
+        String key = Constants.REGISTER_SMS + bo.getTel();
+        String code =  redisCache.getCacheObject(key);
+        if(code==null){
+            throw new CustomException("验证码错误");
+        }
+        if(!code.equals(bo.getCode())){
+            throw new CustomException("验证码错误");
+        }
+        DistributionSeller seller = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getTelphone, EncryptHandler.encrypt(bo.getTel())).last("limit 1"));
+        if(Validator.isNotNull(seller)){
+            throw new CustomException("该手机号已注册");
+        }
+        DistributionSeller sellerIdCard = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
+        if(Validator.isNotNull(sellerIdCard)){
+            throw new CustomException("该身份证已注册");
+        }
+        DistributionSeller inertData = new DistributionSeller();
+        inertData.setTelphone(bo.getTel());
+        inertData.setIdCard(bo.getIdcard());
+        inertData.setRealname(bo.getRealname());
+        inertData.setAvatar(Constants.DEFAULT_AVATAR);
+        inertData.setPassword(SecurityUtils.encryptPassword(bo.getPwd()));
+        inertData.setUserAccount(ServletUtils.getEncoded("YW"));
+        inertData.setCreateTime(DateUtils.getNowTime());
+        inertData.setUpdateTime(DateUtils.getNowTime());
+        inertData.setShareCode(ToolsUtils.getRandomString(8));
+        inertData.setAvatar(bo.getAvatar());
+        User userIdCard = iUserService.getOne(new LambdaQueryWrapper<User>()
+                .eq(User::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
+        if(Validator.isNotEmpty(userIdCard)){
+            inertData.setUserId(userIdCard.getUserId());
+        }
+        if(Validator.isNotEmpty(bo.getShareCode())){
+            DistributionSeller sellerShare = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                    .eq(DistributionSeller::getShareCode,bo.getShareCode()).last("limit 1"));
+            if(Validator.isNotEmpty(sellerShare)){
+                inertData.setParentId(sellerShare.getSellerId());
+            }
+        }
+        if(!save(inertData)){
+            throw new CustomException("注册失败");
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean forgetUser(SellerAppRegisterBo bo) {
+        if(bo.getTel()==null){
+            throw new CustomException("手机号不能为空");
+        }
+        if(bo.getPwd()==null){
+            throw new CustomException("密码不能为空");
+        }
+        String key = Constants.FORGET_SMS + bo.getTel();
+        String code =  redisCache.getCacheObject(key);
+        if(code==null){
+            throw new CustomException("验证码错误");
+        }
+        if(!code.equals(bo.getCode())){
+            throw new CustomException("验证码错误");
+        }
+        redisCache.deleteObject(key);
+        DistributionSeller seller = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getTelphone,EncryptHandler.encrypt(bo.getTel())).last("limit 1"));
+        if(Validator.isEmpty(seller)){
+            throw new CustomException("该手机号未注册");
+        }
+        seller.setPassword(SecurityUtils.encryptPassword(bo.getPwd()));
+        seller.setUpdateTime(DateUtils.getNowTime());
+
+        DistributionSeller sellerSync = new DistributionSeller();
+        sellerSync.setUserId(seller.getUserId());
+        sellerSync.setPassword(seller.getPassword());
+        syncSellerToUser(sellerSync,null,1);
+        return updateById(seller);
+    }
+
+    /**
+     *
+     * @param seller
+     * @param user
+     * @param type 1业务员更新到用户 2用户更新到业务员
+     * @return
+     */
+    @Override
+    public Boolean syncSellerToUser(DistributionSeller seller, User user, Integer type) {
+        if(type==1){
+            if(Validator.isNotEmpty(seller.getUserId())){
+                iUserService.update(new LambdaUpdateWrapper<User>()
+                        .eq(User::getUserId,seller.getUserId())
+                        .set(User::getUpdateTime,DateUtils.getNowTime())
+                        .set(Validator.isNotEmpty(seller.getTelphone()),User::getTelphone,seller.getTelphone())
+                        .set(Validator.isNotEmpty(seller.getIdCard()),User::getIdCard,seller.getIdCard())
+                        .set(Validator.isNotEmpty(seller.getAvatar()),User::getAvatar,seller.getAvatar())
+                        .set(Validator.isNotEmpty(seller.getRealname()),User::getRealname,seller.getRealname())
+                        .set(Validator.isNotEmpty(seller.getPassword()),User::getPassword,seller.getPassword()));
+            }
+        }
+        else if(type==2){
+            DistributionSeller sellerUser = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                    .eq(DistributionSeller::getUserId,user.getUserId()).last("limit 1"));
+            if(Validator.isNotEmpty(sellerUser)){
+                update(new LambdaUpdateWrapper<DistributionSeller>()
+                        .eq(DistributionSeller::getSellerId,sellerUser.getSellerId())
+                        .set(DistributionSeller::getUpdateTime,DateUtils.getNowTime())
+                        .set(Validator.isNotEmpty(user.getTelphone()),DistributionSeller::getTelphone,user.getTelphone())
+                        .set(Validator.isNotEmpty(user.getIdCard()),DistributionSeller::getIdCard,user.getIdCard())
+                        .set(Validator.isNotEmpty(user.getAvatar()),DistributionSeller::getAvatar,user.getAvatar())
+                        .set(Validator.isNotEmpty(user.getRealname()),DistributionSeller::getRealname,user.getRealname())
+                        .set(Validator.isNotEmpty(user.getPassword()),DistributionSeller::getPassword,user.getPassword()));
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public Map<String, Object> accountLogin(SellerAppAccountLoginBo bo) {
+        if(Validator.isEmpty(bo.getAccount())){
+            throw new CustomException("账号不能为空");
+        }
+        LambdaQueryWrapper<DistributionSeller> queryWrapper =new LambdaQueryWrapper<DistributionSeller>();
+        queryWrapper.and(wq -> wq
+                .eq(DistributionSeller::getTelphone,EncryptHandler.encrypt(bo.getAccount()))
+                .or()
+                .eq(DistributionSeller::getIdCard,EncryptHandler.encrypt(bo.getAccount())));
+        DistributionSeller seller = getOne(queryWrapper);
+        if(Validator.isEmpty(seller)){
+            throw new CustomException("登录信息错误");
+        }
+        else if (UserStatus.DISABLE.getCode().equals(seller.getStatus()))
+        {
+            throw new BaseException("对不起,您的账号:已停用");
+        }
+        String password = null;
+        if(bo.getPwd().length()>20){
+            String rsaPrivate = null;
+            try {
+                InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/pri.key");
+                rsaPrivate = AES.getStringByInputStream_1(certStream);
+                certStream.close();
+                password = AES.decrypt(bo.getPwd(),rsaPrivate);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }else{
+            password = bo.getPwd();
+        }
+        if (!SecurityUtils.matchesPassword(password,seller.getPassword()))
+        {
+            throw new BaseException("登录信息错误");
+        }
+        ClientLoginSeller loginSeller = new ClientLoginSeller();
+        loginSeller.setSeller(seller);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN,sellerTokenService.createToken(loginSeller));
+        map.put("user_account",seller.getUserAccount());
+        map.put("full_info",Validator.isEmpty(seller.getIdCard())?false:true); //是否完善身份信息
+        return map;
+    }
+
+    @Override
+    public Map<String, Object> smsLogin(SellerAppAccountLoginBo bo) {
+        if(bo.getTel()==null){
+            throw new CustomException("手机号不能为空");
+        }
+        String key = Constants.LOGIN_SMS + bo.getTel();
+        String code =  redisCache.getCacheObject(key);
+        if(code==null){
+            throw new CustomException("验证码错误");
+        }
+        if(!code.equals(bo.getCode())){
+            throw new CustomException("验证码错误");
+        }
+        redisCache.deleteObject(key);
+        DistributionSeller seller = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getTelphone,EncryptHandler.encrypt(bo.getTel())).last("limit 1"));
+        if(Validator.isEmpty(seller)){
+            throw new CustomException("该手机号未注册");
+        }
+
+        ClientLoginSeller loginSeller = new ClientLoginSeller();
+        loginSeller.setSeller(seller);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN,sellerTokenService.createToken(loginSeller));
+        map.put("user_account",seller.getUserAccount());
+        map.put("full_info",Validator.isEmpty(seller.getIdCard())?false:true); //是否完善身份信息
+        return map;
+    }
+
+    @Override
+    public DistributionSellerVo queryById(Long sellerId){
+        DistributionSeller db = this.baseMapper.selectById(sellerId);
+        return BeanUtil.toBean(db, DistributionSellerVo.class);
+    }
+
+    @Override
+    public List<DistributionSellerVo> queryList(DistributionSellerQueryBo bo) {
+        LambdaQueryWrapper<DistributionSeller> lqw = Wrappers.lambdaQuery();
+        lqw.like(StrUtil.isNotBlank(bo.getRealname()), DistributionSeller::getRealname, bo.getRealname());
+        lqw.eq(StrUtil.isNotBlank(bo.getIdCard()), DistributionSeller::getIdCard, bo.getIdCard());
+        lqw.eq(StrUtil.isNotBlank(bo.getTelphone()), DistributionSeller::getTelphone, bo.getTelphone());
+        lqw.eq(bo.getStatus() != null, DistributionSeller::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getAvatar()), DistributionSeller::getAvatar, bo.getAvatar());
+        lqw.eq(bo.getUserId() != null, DistributionSeller::getUserId, bo.getUserId());
+        lqw.eq(StrUtil.isNotBlank(bo.getUserAccount()), DistributionSeller::getUserAccount, bo.getUserAccount());
+        lqw.eq(StrUtil.isNotBlank(bo.getGzhOpenId()), DistributionSeller::getGzhOpenId, bo.getGzhOpenId());
+        lqw.eq(StrUtil.isNotBlank(bo.getUnionId()), DistributionSeller::getUnionId, bo.getUnionId());
+        lqw.eq(StrUtil.isNotBlank(bo.getPassword()), DistributionSeller::getPassword, bo.getPassword());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<DistributionSellerVo> entity2Vo(Collection<DistributionSeller> collection) {
+        List<DistributionSellerVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, DistributionSellerVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<DistributionSeller> page = (Page<DistributionSeller>)collection;
+            Page<DistributionSellerVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(DistributionSellerAddBo bo) {
+        DistributionSeller add = BeanUtil.toBean(bo, DistributionSeller.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(DistributionSellerEditBo bo) {
+        DistributionSeller update = BeanUtil.toBean(bo, DistributionSeller.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(DistributionSeller entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+
+}

+ 267 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SellerTokenService.java

@@ -0,0 +1,267 @@
+package com.zhongzheng.framework.web.service;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ip.AddressUtils;
+import com.zhongzheng.common.utils.ip.IpUtils;
+import com.zhongzheng.modules.distribution.domain.DistributionSeller;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.order.domain.Order;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserService;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * token验证处理
+ *
+ * @author zhongzheng
+ */
+@Component
+public class SellerTokenService
+{
+    // 令牌自定义标识
+    @Value("${token.header}")
+    private String header;
+
+    // 令牌秘钥
+    @Value("${token.secret}")
+    private String secret;
+
+    // 令牌有效期(默认30分钟)
+    @Value("${token.expireTime}")
+    private int expireTime;
+
+    protected static final long MILLIS_SECOND = 1000;
+
+    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
+
+    private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IDistributionSellerService iDistributionSellerService;
+
+
+
+    @Resource
+    private AuthenticationManager authenticationManager;
+
+    /**
+     * 获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public ClientLoginSeller getLoginUser(HttpServletRequest request)
+    {
+        //测试用户
+        String test_token = request.getHeader("X-Auth-Token");
+        if("test-seller".equals(test_token)){
+            return getTestUser();
+        }
+        // 获取请求携带的令牌
+        String token = getToken(request);
+        if (Validator.isNotEmpty(token))
+        {
+            Claims claims = parseToken(token);
+            // 解析对应的权限以及用户信息
+            String uuid = (String) claims.get(Constants.SELLER_LOGIN_USER_KEY);
+            String userKey = getTokenKey(uuid);
+            ClientLoginSeller user = redisCache.getCacheObject(userKey);
+            return user;
+        }
+        return null;
+    }
+
+    private ClientLoginSeller getTestUser(){
+        DistributionSeller seller = iDistributionSellerService.getOne(new LambdaQueryWrapper<DistributionSeller>().eq(DistributionSeller::getSellerId, 1L));
+        ClientLoginSeller loginUser = new ClientLoginSeller();
+        loginUser.setSeller(seller);
+        loginUser.setExpireTime(System.currentTimeMillis()+200);
+        return loginUser;
+    }
+
+    /**
+     * 设置用户身份信息
+     */
+    public void setLoginUser(ClientLoginSeller loginUser)
+    {
+        if (Validator.isNotNull(loginUser) && Validator.isNotEmpty(loginUser.getToken()))
+        {
+            refreshToken(loginUser);
+        }
+    }
+
+    /**
+     * 删除用户身份信息
+     */
+    public void delLoginUser(String token)
+    {
+        if (Validator.isNotEmpty(token))
+        {
+            String userKey = getTokenKey(token);
+            redisCache.deleteObject(userKey);
+        }
+    }
+
+    /**
+     * 创建令牌
+     *
+     * @param loginUser 用户信息
+     * @return 令牌
+     */
+    public String createToken(ClientLoginSeller loginUser)
+    {
+        String token = IdUtil.simpleUUID()+loginUser.getSeller().getUserAccount();
+        loginUser.setToken(token);
+        setUserAgent(loginUser);
+        refreshToken(loginUser);
+        Map<String, Object> claims = new HashMap<>();
+        claims.put(Constants.SELLER_LOGIN_USER_KEY, token);
+        return createToken(claims);
+    }
+
+    /**
+     * 验证令牌有效期,相差不足20分钟,自动刷新缓存
+     *
+     * @param loginUser
+     * @return 令牌
+     */
+    public void verifyToken(ClientLoginSeller loginUser)
+    {
+        long expireTime = loginUser.getExpireTime();
+        long currentTime = System.currentTimeMillis();
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
+        {
+            refreshToken(loginUser);
+        }
+    }
+
+    /**
+     * 刷新令牌有效期
+     *
+     * @param loginUser 登录信息
+     */
+    public void refreshToken(ClientLoginSeller loginUser)
+    {
+        loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 根据uuid将loginUser缓存
+        String userKey = getTokenKey(loginUser.getToken());
+        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    }
+
+    /**
+     * 设置用户代理信息
+     *
+     * @param loginUser 登录信息
+     */
+    public void setUserAgent(ClientLoginSeller loginUser)
+    {
+        UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
+        String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+        loginUser.setIpaddr(ip);
+        loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
+        loginUser.setBrowser(userAgent.getBrowser().getName());
+        loginUser.setOs(userAgent.getOs().getName());
+    }
+
+    /**
+     * 从数据声明生成令牌
+     *
+     * @param claims 数据声明
+     * @return 令牌
+     */
+    private String createToken(Map<String, Object> claims)
+    {
+        String token = Jwts.builder()
+                .setClaims(claims)
+                .signWith(SignatureAlgorithm.HS512, secret).compact();
+        return token;
+    }
+
+    /**
+     * 从令牌中获取数据声明
+     *
+     * @param token 令牌
+     * @return 数据声明
+     */
+    private Claims parseToken(String token)
+    {
+        return Jwts.parser()
+                .setSigningKey(secret)
+                .parseClaimsJws(token)
+                .getBody();
+    }
+
+    /**
+     * 从令牌中获取用户名
+     *
+     * @param token 令牌
+     * @return 用户名
+     */
+    public String getUsernameFromToken(String token)
+    {
+        Claims claims = parseToken(token);
+        return claims.getSubject();
+    }
+
+    /**
+     * 获取请求token
+     *
+     * @param request
+     * @return token
+     */
+    public String getToken(HttpServletRequest request)
+    {
+        String token = request.getHeader(header);
+        if (Validator.isNotEmpty(token) && token.startsWith(Constants.SELLER_TOKEN_PREFIX))
+        {
+            token = token.replace(Constants.SELLER_TOKEN_PREFIX, "");
+            return token;
+        }else{
+            return null;
+        }
+
+    }
+
+    private String getTokenKey(String uuid)
+    {
+        return Constants.SELLER_LOGIN_TOKEN_KEY + uuid;
+    }
+
+
+    public String refreshSellerToken(String userAccount) {
+        DistributionSeller seller = iDistributionSellerService.getOne(new LambdaQueryWrapper<DistributionSeller>().eq(DistributionSeller::getUserAccount, userAccount));
+        if (seller == null) {
+            throw new CustomException("userAccount不存在");
+        }
+
+        ClientLoginSeller loginUser = new ClientLoginSeller();
+        loginUser.setSeller(seller);
+        return createToken(loginUser);
+    }
+}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.