he2802 2 tahun lalu
induk
melakukan
3a78bf3d25
100 mengubah file dengan 5020 tambahan dan 569 penghapusan
  1. 2 1
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/AdminSaasApplication.java
  2. 73 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/alioss/OssController.java
  3. 42 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseBusinessController.java
  4. 42 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseEducationTypeController.java
  5. 42 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseProjectTypeController.java
  6. 42 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseSubjectController.java
  7. 42 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopMajorController.java
  8. 43 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopSchoolController.java
  9. 165 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateController.java
  10. 92 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateGoodsController.java
  11. 90 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplatePosterController.java
  12. 92 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateRelationController.java
  13. 62 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/goods/TopGoodsController.java
  14. 38 43
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SuperSysLoginController.java
  15. 140 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysConfigController.java
  16. 174 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDeptController.java
  17. 125 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDictDataController.java
  18. 117 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDictTypeController.java
  19. 169 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysMenuController.java
  20. 192 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleController.java
  21. 285 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java
  22. 135 55
      zhongzheng-admin-saas/src/main/resources/application-dev.yml
  23. 3 0
      zhongzheng-admin-saas/src/main/resources/application-pre.yml
  24. 2 0
      zhongzheng-admin-saas/src/main/resources/application-prod.yml
  25. 41 28
      zhongzheng-admin-saas/src/main/resources/application.yml
  26. 2 4
      zhongzheng-admin/src/main/java/com/zhongzheng/ZhongZhengApplication.java
  27. 31 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  28. 41 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/CommonDistributionController.java
  29. 161 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityController.java
  30. 36 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityGoodsController.java
  31. 145 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityPosterController.java
  32. 76 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionAdminCashWithdrawalController.java
  33. 55 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionCashLogController.java
  34. 99 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionCashWithdrawalController.java
  35. 56 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionLinkController.java
  36. 172 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionSellerController.java
  37. 71 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/SellerLoginController.java
  38. 54 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/SellerSmsController.java
  39. 6 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/schedule/ScheduleController.java
  40. 7 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysLoginController.java
  41. 53 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java
  42. 83 54
      zhongzheng-admin/src/main/resources/application-dev.yml
  43. 3 0
      zhongzheng-admin/src/main/resources/application-pre.yml
  44. 3 0
      zhongzheng-admin/src/main/resources/application-prod.yml
  45. 2 7
      zhongzheng-api/src/main/java/com/zhongzheng/ZhongZhengApiApplication.java
  46. 13 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/alioss/OssController.java
  47. 44 1
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java
  48. 27 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonGoodsController.java
  49. 11 2
      zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java
  50. 0 8
      zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxPayController.java
  51. 87 56
      zhongzheng-api/src/main/resources/application-dev.yml
  52. 3 0
      zhongzheng-api/src/main/resources/application-pre.yml
  53. 3 0
      zhongzheng-api/src/main/resources/application-prod.yml
  54. 7 0
      zhongzheng-common/pom.xml
  55. 11 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/constant/Constants.java
  56. 3 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/bo/SysUserEditBo.java
  57. 2 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysRole.java
  58. 6 2
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java
  59. 11 3
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysUser.java
  60. 5 4
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/model/LoginUser.java
  61. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/type/EncryptHandler.java
  62. 40 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/DictUtils.java
  63. 13 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/SecurityUtils.java
  64. 1 1
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ServletUtils.java
  65. 56 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/ToolsUtils.java
  66. 129 114
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/DruidConfig.java
  67. 18 3
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  68. 62 64
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/properties/DruidProperties.java
  69. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/manager/factory/AsyncFactory.java
  70. 3 2
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java
  71. 6 14
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java
  72. 3 6
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/filter/JwtAuthenticationTokenFilter.java
  73. 9 9
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/LogoutSuccessHandlerImpl.java
  74. 54 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/handle/TopLogoutSuccessHandlerImpl.java
  75. 494 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/DistributionSellerServiceImpl.java
  76. 3 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java
  77. 9 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java
  78. 5 6
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TokenService.java
  79. 19 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopSysLoginService.java
  80. 67 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopSysPermissionService.java
  81. 9 12
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopUserDetailsServiceImpl.java
  82. 1 6
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserDetailsServiceImpl.java
  83. 37 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  84. 4 1
      zhongzheng-generator/src/main/java/com/zhongzheng/generator/service/GenTableServiceImpl.java
  85. 1 1
      zhongzheng-quartz/src/main/java/com/zhongzheng/quartz/config/ScheduleConfig.java
  86. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ActivityGoodsPrice.java
  87. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ActivityGoodsPriceMapper.java
  88. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IActivityGoodsPriceService.java
  89. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityGoodsPriceServiceImpl.java
  90. 56 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/vo/ActivityGoodsPriceVo.java
  91. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/IAliSmsService.java
  92. 106 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java
  93. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionChapterExamService.java
  94. 6 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamQuestionServiceImpl.java
  95. 10 9
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamServiceImpl.java
  96. 6 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionBusinessServiceImpl.java
  97. 11 9
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionChapterExamServiceImpl.java
  98. 14 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionChapterServiceImpl.java
  99. 6 8
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionModuleChapterServiceImpl.java
  100. 6 6
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionModuleServiceImpl.java

+ 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)

+ 73 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/alioss/OssController.java

@@ -0,0 +1,73 @@
+package com.zhongzheng.controller.alioss;
+
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.alioss.bo.OssRequest;
+import com.zhongzheng.modules.alioss.service.OssService;
+import com.zhongzheng.modules.alioss.vo.ResultBean;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 阿里OSS
+ *
+ * @author change
+ * @date 2021-05-17
+ */
+@Api(value = "阿里OSS上传文件控制器", tags = {"阿里OSS上传文件"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/aliyun/oss")
+public class OssController extends BaseController {
+
+    private static Logger log = LoggerFactory.getLogger(OssController.class);
+
+    private final OssService ossService;
+
+    /**
+     * policy获得
+     */
+    @ApiOperation("policy获得")
+    @GetMapping("/policy")
+    public AjaxResult<ResultBean> policy(@Validated OssRequest ossRequest) {
+        ResultBean result = ossService.getPolicy(ossRequest);
+        log.info("服务端生成签名:{}",result);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 阿里回调OSS返回参数到前端
+     */
+    @ApiOperation("回调")
+    @PostMapping("/callback")
+    public ResultBean callback(HttpServletRequest request) {
+        ResultBean ossCallbackResult = ossService.callback(request);
+        log.info("oss成功的回调:{}",ossCallbackResult);
+        return ossCallbackResult;
+    }
+
+
+    /**
+     * upload上传文件
+     */
+    @ApiOperation("上传file图片")
+    @PostMapping("/upload")
+    public AjaxResult<String> upload( OssRequest file) throws Exception {
+        String result = ossService.upload(file);
+        log.info("服务端生成签名:{}",result);
+        return AjaxResult.success("返回图片路径",result);
+    }
+
+}

+ 42 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseBusinessController.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.controller.course;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseBusinessQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopCourseBusinessService;
+import com.zhongzheng.modules.top.goods.vo.TopCourseBusinessVo;
+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 ruoyi
+ * @date 2021-10-08
+ */
+@Api(value = "业务层次控制器", tags = {"业务层次管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/course/business")
+public class TopCourseBusinessController extends BaseController {
+
+    private final ITopCourseBusinessService iCourseBusinessService;
+
+    /**
+     * 查询业务层次列表
+     */
+    @ApiOperation("查询业务层次列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopCourseBusinessVo> list(TopCourseBusinessQueryBo bo) {
+        startPage();
+        List<TopCourseBusinessVo> list = iCourseBusinessService.queryList(bo);
+        return getDataTable(list);
+    }
+}

+ 42 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseEducationTypeController.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.controller.course;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseEducationTypeQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopCourseEducationTypeService;
+import com.zhongzheng.modules.top.goods.vo.TopCourseEducationTypeVo;
+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 ruoyi
+ * @date 2021-10-08
+ */
+@Api(value = "教育类型控制器", tags = {"教育类型管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/course/educationType")
+public class TopCourseEducationTypeController extends BaseController {
+
+    private final ITopCourseEducationTypeService iCourseEducationTypeService;
+
+    /**
+     * 查询教育类型列表
+     */
+    @ApiOperation("查询教育类型列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopCourseEducationTypeVo> list(TopCourseEducationTypeQueryBo bo) {
+        startPage();
+        List<TopCourseEducationTypeVo> list = iCourseEducationTypeService.queryList(bo);
+        return getDataTable(list);
+    }
+}

+ 42 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseProjectTypeController.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.controller.course;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseProjectTypeQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopCourseProjectTypeService;
+import com.zhongzheng.modules.top.goods.vo.TopCourseProjectTypeVo;
+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 ruoyi
+ * @date 2021-10-08
+ */
+@Api(value = "项目类型控制器", tags = {"项目类型管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/course/projectType")
+public class TopCourseProjectTypeController extends BaseController {
+
+    private final ITopCourseProjectTypeService iCourseProjectTypeService;
+
+    /**
+     * 查询项目类型列表
+     */
+    @ApiOperation("查询项目类型列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopCourseProjectTypeVo> list(TopCourseProjectTypeQueryBo bo) {
+        startPage();
+        List<TopCourseProjectTypeVo> list = iCourseProjectTypeService.queryList(bo);
+        return getDataTable(list);
+    }
+}

+ 42 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopCourseSubjectController.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.controller.course;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopCourseSubjectQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopCourseSubjectService;
+import com.zhongzheng.modules.top.goods.vo.TopCourseSubjectVo;
+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 ruoyi
+ * @date 2021-10-09
+ */
+@Api(value = "科目控制器", tags = {"科目管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/course/subject")
+public class TopCourseSubjectController extends BaseController {
+
+    private final ITopCourseSubjectService iCourseSubjectService;
+
+    /**
+     * 查询科目列表
+     */
+    @ApiOperation("查询科目列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopCourseSubjectVo> list(TopCourseSubjectQueryBo bo) {
+        startPage();
+        List<TopCourseSubjectVo> list = iCourseSubjectService.queryList(bo);
+        return getDataTable(list);
+    }
+}

+ 42 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopMajorController.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.controller.course;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopMajorQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopMajorService;
+import com.zhongzheng.modules.top.goods.vo.TopMajorVo;
+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 ruoyi
+ * @date 2021-10-09
+ */
+@Api(value = "专业控制器", tags = {"专业管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/course/major")
+public class TopMajorController extends BaseController {
+
+    private final ITopMajorService iTopMajorService;
+
+    /**
+     * 查询专业列表
+     */
+    @ApiOperation("查询专业列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopMajorVo> list(TopMajorQueryBo bo) {
+        startPage();
+        List<TopMajorVo> list = iTopMajorService.queryList(bo);
+        return getDataTable(list);
+    }
+}

+ 43 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/course/TopSchoolController.java

@@ -0,0 +1,43 @@
+package com.zhongzheng.controller.course;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.modules.top.goods.bo.TopSchoolQueryBo;
+import com.zhongzheng.modules.top.goods.service.ITopSchoolService;
+import com.zhongzheng.modules.top.goods.vo.TopSchoolVo;
+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 ruoyi
+ * @date 2021-10-09
+ */
+@Api(value = "高校控制器", tags = {"高校管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/user/school")
+public class TopSchoolController extends BaseController {
+
+    private final ITopSchoolService iTopSchoolService;
+
+    /**
+     * 查询高校列表
+     */
+    @ApiOperation("查询高校列表")
+    @GetMapping("/list")
+    public TableDataInfo<TopSchoolVo> list(TopSchoolQueryBo bo) {
+        startPage();
+        List<TopSchoolVo> list = iTopSchoolService.queryList(bo);
+        return getDataTable(list);
+    }
+
+}

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

@@ -0,0 +1,165 @@
+package com.zhongzheng.controller.distribution;
+
+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.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TopTokenService;
+import com.zhongzheng.modules.distribution.bo.DistributionStatusEditBo;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.top.distribution.bo.*;
+import com.zhongzheng.modules.top.distribution.service.IDistributionActivityTemplateService;
+import com.zhongzheng.modules.top.distribution.vo.*;
+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.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;
+
+    private final TopTokenService tokenService;
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @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) {
+        TopLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setCreateTopSysUserId(loginUser.getUser().getUserId());
+        return toAjax(iDistributionActivityTemplateService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改分销活动模板")
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityTemplateEditBo bo) {
+        return toAjax(iDistributionActivityTemplateService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 启用/禁用
+     */
+    @ApiOperation("启用/禁用")
+    @PostMapping("/update/status")
+    public AjaxResult<Void> updateStatus(@RequestBody DistributionStatusEditBo bo) {
+        return toAjax(iDistributionActivityTemplateService.updateStatus(bo) ? 1 : 0);
+    }
+
+    /**
+     * 活动模板发布
+     */
+    @ApiOperation("活动模板发布")
+    @GetMapping("/publish/{templateId}")
+    public AjaxResult<Void> publishActivity(@PathVariable("templateId") Long templateId) {
+        return toAjax(iDistributionActivityTemplateService.publishActivity(templateId) ? 1 : 0);
+    }
+
+
+    /**
+     * 分销业务员列表
+     */
+    @ApiOperation("分销业务员列表")
+    @GetMapping("/seller/list")
+    public TableDataInfo<DistributionSellerVo> sellerList(DistributionSellerQuery query) {
+        startPage();
+        List<DistributionSellerVo> list = iDistributionActivityTemplateService.sellerList(query);
+        return getDataTable(list);
+    }
+
+    /**
+     * 机构分销排行榜
+     */
+    @ApiOperation("机构分销排行榜")
+    @GetMapping("/sort/notice")
+    public TableDataInfo<TenantSortNoticeVo> getTenantSortNotice(TenantSortNoticeQueryBo bo) {
+        startPage();
+        List<TenantSortNoticeVo> list = iDistributionActivityTemplateService.getTenantSortNotice(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 机构所有分销订单
+     */
+    @ApiOperation("机构所有分销订单")
+    @GetMapping("/org/order")
+    public TableDataInfo<TenantOrderVo> getOrgOrder(TenantOrderQueryBo bo) {
+        startPage();
+        List<TenantOrderVo> list = iDistributionActivityTemplateService.getOrgOrder(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 佣金列表
+     */
+    @ApiOperation("佣金列表")
+    @GetMapping("/cash/list")
+    public TableDataInfo<DistributionCashTopVo> getOrgCashList(DistributionCashTopQueryBo bo) {
+        startPage();
+        List<DistributionCashTopVo> list = iDistributionActivityTemplateService.getOrgCashList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 佣金详情
+     */
+    @ApiOperation("佣金详情")
+    @GetMapping("/cash/detail")
+    public TableDataInfo<TopSellerOrderVo> getOrgCashDetail(TopSellerOrderQueryBo bo) {
+        startPage();
+        List<TopSellerOrderVo> list = iDistributionActivityTemplateService.getOrgCashDetail(bo);
+        return getDataTable(list);
+    }
+
+
+}

+ 92 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateGoodsController.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.top.distribution.bo.DistributionActivityTemplateGoodsAddBo;
+import com.zhongzheng.modules.top.distribution.bo.DistributionActivityTemplateGoodsEditBo;
+import com.zhongzheng.modules.top.distribution.bo.DistributionActivityTemplateGoodsQueryBo;
+import com.zhongzheng.modules.top.distribution.service.IDistributionActivityTemplateGoodsService;
+import com.zhongzheng.modules.top.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.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("查询【请填写功能名称】列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityTemplateGoodsVo> list(DistributionActivityTemplateGoodsQueryBo bo) {
+        startPage();
+        List<DistributionActivityTemplateGoodsVo> list = iDistributionActivityTemplateGoodsService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @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("获取【请填写功能名称】详细信息")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionActivityTemplateGoodsVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionActivityTemplateGoodsService.queryById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PostMapping("/save")
+    public AjaxResult<Void> add(@RequestBody DistributionActivityTemplateGoodsAddBo bo) {
+        return toAjax(iDistributionActivityTemplateGoodsService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PostMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityTemplateGoodsEditBo bo) {
+        return toAjax(iDistributionActivityTemplateGoodsService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@PathVariable Long[] ids) {
+        return toAjax(iDistributionActivityTemplateGoodsService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

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

@@ -0,0 +1,90 @@
+package com.zhongzheng.controller.distribution;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.top.distribution.bo.DistributionActivityTemplatePosterAddBo;
+import com.zhongzheng.modules.top.distribution.bo.DistributionActivityTemplatePosterQueryBo;
+import com.zhongzheng.modules.top.distribution.bo.distributionActivityTemplatePosterEditBo;
+import com.zhongzheng.modules.top.distribution.domain.DistributionActivityTemplateImage;
+import com.zhongzheng.modules.top.distribution.service.IDistributionActivityTemplateImageService;
+import com.zhongzheng.modules.top.distribution.service.IDistributionActivityTemplatePosterService;
+import com.zhongzheng.modules.top.distribution.vo.DistributionActivityTemplateImageVo;
+import com.zhongzheng.modules.top.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.web.bind.annotation.*;
+
+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(new LambdaQueryWrapper<DistributionActivityTemplateImage>().eq(DistributionActivityTemplateImage::getStatus,1));
+        List<DistributionActivityTemplateImageVo> voList = imageList.stream().map(item -> BeanUtil.toBean(item, DistributionActivityTemplateImageVo.class)).collect(Collectors.toList());
+        return AjaxResult.success(voList);
+    }
+
+    /**
+     * 获取【请填写功能名称】详细信息
+     */
+    @ApiOperation("获取海报模板详细信息")
+    @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("修改海报模板")
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody distributionActivityTemplatePosterEditBo bo) {
+        return toAjax(iDistributionActivityTemplatePosterService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+}

+ 92 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/distribution/DistributionActivityTemplateRelationController.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.top.distribution.bo.DistributionActivityTemplateRelationAddBo;
+import com.zhongzheng.modules.top.distribution.bo.DistributionActivityTemplateRelationEditBo;
+import com.zhongzheng.modules.top.distribution.bo.DistributionActivityTemplateRelationQueryBo;
+import com.zhongzheng.modules.top.distribution.service.IDistributionActivityTemplateRelationService;
+import com.zhongzheng.modules.top.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.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("查询【请填写功能名称】列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityTemplateRelationVo> list(DistributionActivityTemplateRelationQueryBo bo) {
+        startPage();
+        List<DistributionActivityTemplateRelationVo> list = iDistributionActivityTemplateRelationService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @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("获取【请填写功能名称】详细信息")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionActivityTemplateRelationVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionActivityTemplateRelationService.queryById(id));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PostMapping("/save")
+    public AjaxResult<Void> add(@RequestBody DistributionActivityTemplateRelationAddBo bo) {
+        return toAjax(iDistributionActivityTemplateRelationService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PostMapping()
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityTemplateRelationEditBo bo) {
+        return toAjax(iDistributionActivityTemplateRelationService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除【请填写功能名称】
+     */
+    @ApiOperation("删除【请填写功能名称】")
+    @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);
+    }
+}

+ 135 - 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,68 @@ 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
+
+distributionOldPay:
+    host: http://gdxypx.xy.com/System/BussinessApi/AddRedPackData

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

@@ -95,3 +95,6 @@ poliv:
         writetoken: 8f14a371-9d02-4ec1-922d-54d7b4f79dca
         readtoken: f2c397b4-e2a3-46dc-9266-e6a43ac26a35
         secretkey: xpPrYdcbA1
+
+distributionOldPay:
+    host: http://test.jqbao.net/System/BussinessApi/AddRedPackData

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

@@ -108,3 +108,5 @@ poliv:
         readtoken: f2c397b4-e2a3-46dc-9266-e6a43ac26a35
         secretkey: xpPrYdcbA1
 
+distributionOldPay:
+    host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData

+ 41 - 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,15 @@ 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  #未做完试卷通知
+
+distributionOldPay:
+      host: http://test.jqbao.net/System/BussinessApi/AddRedPackData

+ 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
 {

+ 31 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -7,9 +7,12 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 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.config.RuoYiConfig;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.type.EncryptHandler;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.common.utils.file.FileUploadUtils;
@@ -18,6 +21,9 @@ import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.config.ServerConfig;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
+import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalPayBo;
+import com.zhongzheng.modules.distribution.bo.DistributionCheckQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionCashWithdrawalService;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsStudyUrlBo;
 import com.zhongzheng.modules.goods.bo.UserGoodsListBo;
@@ -39,8 +45,8 @@ 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.system.vo.SysTenantVo;
-import com.zhongzheng.modules.top.bo.TopSysTenantRegisterAddBo;
-import com.zhongzheng.modules.top.service.ITopSysTenantRegisterService;
+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;
@@ -49,6 +55,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -103,6 +110,8 @@ public class CommonController
     private  ISysWebService webService;
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private IDistributionCashWithdrawalService iDistributionCashWithdrawalService;
     /**
      * 通用下载请求
      *
@@ -384,6 +393,23 @@ public class CommonController
         return AjaxResult.success("成功",dualAuth);
     }
 
+
+
+    @ApiOperation("decodeTel")
+    @GetMapping("common/free/decodeTel")
+    public AjaxResult<String> decodeTel(String key) {
+
+        return AjaxResult.success("成功", EncryptHandler.decrypt(key));
+    }
+
+    @ApiOperation("分销打款结果回调")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "打款", businessType = BusinessType.INSERT)
+    @PostMapping("/common/free/payCashCallBack")
+    public AjaxResult payCashCallBack(@RequestBody DistributionCashWithdrawalPayBo bo) {
+        return AjaxResult.success("成功", iDistributionCashWithdrawalService.payCashCallBack(bo) ? 1 : 0);
+    }
+
     /**
      * 获取企业ID
      */
@@ -406,6 +432,9 @@ public class CommonController
             if(Validator.isNotEmpty(bo.getHostAdmin())&&bo.getHostAdmin().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(511,"失败",null);
         }
     }

+ 41 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/CommonDistributionController.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityPosterQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityPosterService;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 商品Controller
+ *
+ * @author hjl
+ * @date 2021-10-12
+ */
+@Api(value = "游客商品管理", tags = {"游客商品管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/app/common/distribution")
+public class CommonDistributionController extends BaseController {
+
+    private final IDistributionActivityPosterService iDistributionActivityPosterService;
+
+    @ApiOperation("获取分享页面参数")
+    @PreAuthorize("@ss.hasPermi('system:poster:query')")
+    @GetMapping("/sharePoster")
+    public AjaxResult<Map<String,Object>> sharePoster(DistributionActivityPosterQueryBo bo) {
+
+        return AjaxResult.success("成功",iDistributionActivityPosterService.sharePoster(bo));
+    }
+
+}

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

@@ -0,0 +1,161 @@
+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.SecurityUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.distribution.bo.*;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityService;
+import com.zhongzheng.modules.distribution.vo.*;
+import com.zhongzheng.modules.distribution.bo.DistributionOrderQueryBo;
+import com.zhongzheng.modules.distribution.vo.DistributionOrderVo;
+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.List;
+
+/**
+ * 【请填写功能名称】Controller
+ *
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "分销活动控制器", tags = {"分销活动管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/activity")
+public class DistributionActivityController extends BaseController {
+
+    private final IDistributionActivityService iDistributionActivityService;
+
+    private final IDistributionActivityGoodsService iDistributionActivityGoodsService;
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询【请填写功能名称】列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityVo> list(DistributionActivityQueryBo bo) {
+        startPage();
+        List<DistributionActivityVo> list = iDistributionActivityService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @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("获取【请填写功能名称】详细信息")
+    @GetMapping("/{distributionId}")
+    public AjaxResult<DistributionActivityVo> getInfo(@PathVariable("distributionId" ) Long distributionId) {
+        return AjaxResult.success(iDistributionActivityService.queryById(distributionId));
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     */
+    @ApiOperation("新增【请填写功能名称】")
+    @PostMapping("/save")
+    public AjaxResult<Void> add(@RequestBody DistributionActivityAddBo bo) {
+        bo.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(iDistributionActivityService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     */
+    @ApiOperation("修改【请填写功能名称】")
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityEditBo bo) {
+        return toAjax(iDistributionActivityService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 启用/禁用分销活动
+     */
+    @ApiOperation("启用/禁用分销活动")
+    @PostMapping("/edit/status")
+    public AjaxResult<Void> editStatus(@RequestBody DistributionStatusEditBo bo) {
+        return toAjax(iDistributionActivityService.editStatus(bo) ? 1 : 0);
+    }
+
+    /**
+     * 拉取商品信息
+     */
+    @ApiOperation("拉取商品信息")
+    @GetMapping("/pull/goods/{distributionId}")
+    public AjaxResult<Void> pullGoods(@PathVariable("distributionId") Long distributionId) {
+        return toAjax(iDistributionActivityService.pullGoods(distributionId) ? 1 : 0);
+    }
+
+    /**
+     * 查询【请填写功能名称】列表
+     */
+    @ApiOperation("查询活动详情商品列表")
+    @GetMapping("/goodsList")
+    public TableDataInfo<DistributionActivityGoodsVo> getDetailGoodsList(DistributionActivityGoodsQueryBo bo) {
+        startPage();
+        List<DistributionActivityGoodsVo> list = iDistributionActivityGoodsService.getDetailGoodsList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询业务员分销排行榜
+     */
+    @ApiOperation("查询业务员分销排行榜")
+    @GetMapping("/seller/sort/notice")
+    public TableDataInfo<SellerSortNoticeVo> getSellerSortNotice(SellerSortNoticeQueryBo bo) {
+        startPage();
+        List<SellerSortNoticeVo> list = iDistributionActivityGoodsService.getSellerSortNotice(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 业务员所有分销订单
+     */
+    @ApiOperation("业务员所有分销订单")
+    @GetMapping("/seller/order")
+    public TableDataInfo<SellerOrderVo> getSellerOrder(SellerOrderQueryBo bo) {
+        startPage();
+        List<SellerOrderVo> list = iDistributionActivityService.getSellerOrder(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 佣金列表
+     */
+    @ApiOperation("佣金列表")
+    @GetMapping("/cash/list")
+    public TableDataInfo<DistributionCashVo> getCashList(DistributionCashQueryBo bo) {
+        startPage();
+        List<DistributionCashVo> list = iDistributionActivityService.getCashList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 分销订单列表
+     */
+    @ApiOperation("分销订单列表")
+    @GetMapping("/order/list")
+    public TableDataInfo<DistributionOrderVo> getOrderList(DistributionOrderQueryBo bo) {
+        startPage();
+        List<DistributionOrderVo> list = iDistributionActivityService.getOrderList(bo);
+        return getDataTable(list);
+    }
+
+
+}

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

@@ -0,0 +1,36 @@
+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 {
+
+}

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

@@ -0,0 +1,145 @@
+package com.zhongzheng.controller.distribution;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TokenService;
+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.domain.DistributionActivityImage;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityImageService;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityPosterService;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityImageVo;
+import com.zhongzheng.modules.distribution.vo.DistributionActivityPosterVo;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 【请填写功能名称】Controller
+ *
+ * @author ruoyi
+ * @date 2023-03-06
+ */
+@Api(value = "分销活动海报控制器", tags = {"分销活动海报控制器管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/poster")
+public class DistributionActivityPosterController extends BaseController {
+
+    private final IDistributionActivityPosterService iDistributionActivityPosterService;
+
+    private final IDistributionActivityImageService iDistributionImageService;
+
+    private final TokenService tokenService;
+
+    private final IDistributionSellerService iDistributionSellerService;
+    /**
+     * 查询海报列表
+     */
+    @ApiOperation("查询海报列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionActivityPosterVo> list(DistributionActivityPosterQueryBo bo) {
+        startPage();
+        List<DistributionActivityPosterVo> list = iDistributionActivityPosterService.queryList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取底图列表
+     */
+    @ApiOperation("获取海报底图列表")
+    @GetMapping("/image/list")
+    public AjaxResult<List<DistributionActivityImageVo>> list() {
+        List<DistributionActivityImage> imageList = iDistributionImageService.list(new LambdaQueryWrapper<DistributionActivityImage>().eq(DistributionActivityImage::getStatus,1));
+        List<DistributionActivityImageVo> voList = imageList.stream().map(item -> BeanUtil.toBean(item, DistributionActivityImageVo.class)).collect(Collectors.toList());
+        return AjaxResult.success(voList);
+    }
+
+    /**
+     * 导出【请填写功能名称】列表
+     */
+    @ApiOperation("导出【请填写功能名称】列表")
+    @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("获取海报详细信息")
+    @GetMapping("/{posterId}")
+    public AjaxResult<DistributionActivityPosterVo> getInfo(@PathVariable("posterId" ) Long posterId) {
+        return AjaxResult.success(iDistributionActivityPosterService.queryById(posterId));
+    }
+
+    /**
+     * 新增海报
+     */
+    @ApiOperation("新增海报")
+    @PostMapping("/save")
+    public AjaxResult<Void> add(@RequestBody DistributionActivityPosterAddBo bo) {
+        return toAjax(iDistributionActivityPosterService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改海报
+     */
+    @ApiOperation("修改海报")
+    @PostMapping("/edit")
+    public AjaxResult<Void> edit(@RequestBody DistributionActivityPosterEditBo bo) {
+        return toAjax(iDistributionActivityPosterService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 获取分销海报详细信息
+     */
+    @ApiOperation("生成业务员海报")
+    @PreAuthorize("@ss.hasPermi('system:poster:query')")
+    @GetMapping("/makePoster")
+    public AjaxResult<String> makePoster(DistributionActivityPosterQueryBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        return AjaxResult.success("成功",iDistributionActivityPosterService.makePoster(bo));
+    }
+
+    @ApiOperation("获取分享链条码")
+    @PreAuthorize("@ss.hasPermi('system:poster:query')")
+    @GetMapping("/linkCode")
+    public AjaxResult<Map<String,String>> linkCode(DistributionActivityPosterQueryBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        Map<String,String> map = new HashMap<>();
+        map.put("linkCode",iDistributionActivityPosterService.getLinkCode(bo));
+        DistributionSellerVo vo = iDistributionSellerService.queryById(loginUser.getUser().getSellerId());
+        map.put("shareCode",vo.getShareCode());
+        return AjaxResult.success("成功",map);
+    }
+
+
+    @ApiOperation("获取微信授权路径")
+    @GetMapping("/wxCodeUrl")
+    public AjaxResult<String> getWxCodeUrl() {
+        return AjaxResult.success("成功",iDistributionActivityPosterService.getWxCodeUrl());
+    }
+}

+ 76 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionAdminCashWithdrawalController.java

@@ -0,0 +1,76 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.distribution.bo.DistributionCheckHandleBo;
+import com.zhongzheng.modules.distribution.bo.DistributionCheckQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionCashWithdrawalService;
+import com.zhongzheng.modules.distribution.vo.DistributionCheckDetailVo;
+import com.zhongzheng.modules.distribution.vo.DistributionCheckVo;
+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.List;
+
+/**
+ * 分销业务员提现申请Controller
+ *
+ * @author ruoyi
+ * @date 2023-03-25
+ */
+
+@Api(value = "分销业务员提现申请控制器", tags = {"分销业务员提现申请管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/check")
+
+public class DistributionAdminCashWithdrawalController extends BaseController {
+
+    private final IDistributionCashWithdrawalService iDistributionCashWithdrawalService;
+
+    private final TokenService tokenService;
+
+    /**
+     * 审核列表
+     */
+    @ApiOperation("审核列表")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionCheckVo> list(DistributionCheckQueryBo bo) {
+        startPage();
+        List<DistributionCheckVo> list = iDistributionCashWithdrawalService.queryCheckList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 审核
+     */
+    @ApiOperation("审核")
+    @PostMapping("/handle")
+    public AjaxResult<Void> checkHandle(@RequestBody DistributionCheckHandleBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setAuditorId(loginUser.getUser().getUserId());
+        bo.setAuditor(SecurityUtils.getUsername());
+        return toAjax(iDistributionCashWithdrawalService.checkHandle(bo)? 1 : 0);
+    }
+
+    /**
+     * 审核详情
+     */
+    @ApiOperation("审核详情")
+    @GetMapping("/detail/{id}")
+    public AjaxResult<List<DistributionCheckDetailVo>> checkDetail(@PathVariable("id") Long id) {
+        List<DistributionCheckDetailVo> detailVos = iDistributionCashWithdrawalService.checkDetail(id);
+        return AjaxResult.success(detailVos);
+    }
+
+
+
+}

+ 55 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionCashLogController.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.controller.distribution;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.distribution.bo.DistributionCashLogQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionCashLogService;
+import com.zhongzheng.modules.distribution.vo.DistributionCashLogVo;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 业务员金额操作日志Controller
+ *
+ * @author ruoyi
+ * @date 2023-03-25
+ */
+@Api(value = "业务员金额操作日志控制器", tags = {"业务员金额操作日志管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/cash/log")
+public class DistributionCashLogController extends BaseController {
+
+    private final IDistributionCashLogService iDistributionCashLogService;
+
+    private final TokenService tokenService;
+
+    /**
+     * 查询业务员金额操作日志列表
+     */
+    @ApiOperation("查询业务员佣金列表")
+    @PreAuthorize("@ss.hasPermi('system:log:list')")
+    @GetMapping("/fromOrderCashList")
+    public TableDataInfo<DistributionCashLogVo> fromOrderCashList(DistributionCashLogQueryBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        startPage();
+        List<DistributionCashLogVo> list = iDistributionCashLogService.fromOrderCashList(bo);
+        return getDataTable(list);
+    }
+
+
+
+}

+ 99 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionCashWithdrawalController.java

@@ -0,0 +1,99 @@
+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.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalAddBo;
+import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalEditBo;
+import com.zhongzheng.modules.distribution.bo.DistributionCashWithdrawalQueryBo;
+import com.zhongzheng.modules.distribution.bo.DistributionCheckQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionCashWithdrawalService;
+import com.zhongzheng.modules.distribution.vo.DistributionCashWithdrawalVo;
+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.List;
+
+/**
+ * 分销业务员提现申请Controller
+ *
+ * @author ruoyi
+ * @date 2023-03-25
+ */
+
+@Api(value = "分销业务员提现申请控制器", tags = {"分销业务员提现申请管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/distribution/withdrawal")
+public class DistributionCashWithdrawalController extends BaseController {
+
+    private final IDistributionCashWithdrawalService iDistributionCashWithdrawalService;
+
+    private final TokenService tokenService;
+
+    /**
+     * 查询分销业务员提现申请列表
+     */
+    @ApiOperation("查询分销业务员提现申请列表")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionCashWithdrawalVo> list(DistributionCashWithdrawalQueryBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        startPage();
+        List<DistributionCashWithdrawalVo> list = iDistributionCashWithdrawalService.queryList(bo);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 获取分销业务员提现申请详细信息
+     */
+    @ApiOperation("获取分销业务员提现申请详细信息")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<DistributionCashWithdrawalVo> getInfo(@PathVariable("id" ) Long id) {
+        return AjaxResult.success(iDistributionCashWithdrawalService.queryById(id));
+    }
+
+    /**
+     * 新增分销业务员提现申请
+     */
+    @ApiOperation("新增分销业务员提现申请")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "分销业务员提现申请", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionCashWithdrawalAddBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        return toAjax(iDistributionCashWithdrawalService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    @ApiOperation("打款")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "打款", businessType = BusinessType.INSERT)
+    @PostMapping("/payCash")
+    public AjaxResult<Void> payCash(@RequestBody DistributionCheckQueryBo bo) {
+        return toAjax(iDistributionCashWithdrawalService.payCash(bo) ? 1 : 0);
+    }
+
+
+    @ApiOperation("取消打款申请")
+    @PreAuthorize("@ss.hasPermi('system:withdrawal:add')")
+    @Log(title = "取消打款申请", businessType = BusinessType.INSERT)
+    @PostMapping("/cancelApply")
+    public AjaxResult<Void> cancelApply(@RequestBody DistributionCashWithdrawalEditBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        return toAjax(iDistributionCashWithdrawalService.cancelApply(bo) ? 1 : 0);
+    }
+}

+ 56 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionLinkController.java

@@ -0,0 +1,56 @@
+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.domain.model.LoginUser;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.distribution.bo.DistributionLinkAddBo;
+import com.zhongzheng.modules.distribution.service.IDistributionLinkService;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 分销链路Controller
+ *
+ * @author ruoyi
+ * @date 2023-03-23
+ */
+@Api(value = "分销链路控制器", tags = {"分销链路管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/link")
+public class DistributionLinkController extends BaseController {
+
+    private final IDistributionLinkService iDistributionLinkService;
+
+    private final TokenService tokenService;
+
+    /**
+     * 新增分销链路
+     */
+    @ApiOperation("绑定分销链路")
+    @PreAuthorize("@ss.hasPermi('system:link:add')")
+    @Log(title = "分销链路", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@RequestBody DistributionLinkAddBo bo) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        return toAjax(iDistributionLinkService.bindLink(bo) ? 1 : 0);
+    }
+
+
+
+
+}

+ 172 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/DistributionSellerController.java

@@ -0,0 +1,172 @@
+package com.zhongzheng.controller.distribution;
+
+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.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.framework.web.service.WxLoginService;
+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.bo.SellerOrderQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.distribution.vo.SellerOrderVo;
+import com.zhongzheng.modules.wx.bo.WxLoginBody;
+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.List;
+
+/**
+ * 分销业务员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 TokenService tokenService;
+
+    private final WxLoginService wxLoginService;
+
+    /**
+     * 查询分销业务员列表
+     */
+    @ApiOperation("查询分销业务员列表")
+    @PreAuthorize("@ss.hasPermi('system:seller:list')")
+    @GetMapping("/list")
+    public TableDataInfo<DistributionSellerVo> list(DistributionSellerQueryBo bo) {
+        startPage();
+        List<DistributionSellerVo> list = iDistributionSellerService.findList(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) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSysUserId(loginUser.getUser().getUserId());
+        return toAjax(iDistributionSellerService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 管理员修改分销业务员
+     */
+    @ApiOperation("管理员修改分销业务员")
+    @PreAuthorize("@ss.hasPermi('system:seller:edit')")
+    @Log(title = "分销业务员", businessType = BusinessType.UPDATE)
+    @PostMapping("/sysEdit")
+    public AjaxResult<Void> sysEdit(@RequestBody DistributionSellerEditBo bo) {
+        return toAjax(iDistributionSellerService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+
+    /**
+     * 新增分销业务员
+     */
+    @ApiOperation("批量新增关联分销业务员")
+    @PreAuthorize("@ss.hasPermi('system:seller:add')")
+    @Log(title = "分销业务员", businessType = BusinessType.INSERT)
+    @PostMapping("/batchAdd")
+    public AjaxResult<Void> batchAdd(@RequestBody DistributionSellerAddBo bo) {
+        return toAjax(iDistributionSellerService.insertBatchByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @return 用户信息
+     */
+    @ApiOperation("登录业务员用户信息")
+    @GetMapping("getInfo")
+    public AjaxResult<DistributionSellerVo> getInfo()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        DistributionSellerVo vo = iDistributionSellerService.findDetail(loginUser.getUser().getSellerId());
+        if(Validator.isEmpty(vo)){
+            throw new CustomException("非法用户");
+        }
+        vo.setSelfNull();
+        return AjaxResult.success(vo);
+    }
+
+    @ApiOperation("业务员检查是否绑定公众号")
+    @GetMapping("/checkBindGzh")
+    public AjaxResult<String> checkBindGzh()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        DistributionSellerVo vo = iDistributionSellerService.queryById(loginUser.getUser().getSellerId());
+        return AjaxResult.success("成功",vo.getGzhOpenId());
+    }
+
+    @ApiOperation("提现前绑定公众号openid")
+    @PostMapping("/gzh_bind")
+    public AjaxResult gzh_bind(@RequestBody WxLoginBody loginBody)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        loginBody.setSellerId(loginUser.getUser().getSellerId());
+        wxLoginService.bindWxGzhUnionIdSeller(loginBody);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("业务员佣金")
+    @GetMapping("/cash/list")
+    public TableDataInfo<SellerOrderVo> getCashList(SellerOrderQueryBo bo) {
+        startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setSellerId(loginUser.getUser().getSellerId());
+        List<SellerOrderVo> list = iDistributionSellerService.getCashList(bo);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("业务员佣金详情")
+    @GetMapping("/cash/detail/{id}")
+    public AjaxResult<SellerOrderVo> getCashDetail(@PathVariable("id") Long id) {
+        return AjaxResult.success(iDistributionSellerService.getCashDetail(id));
+    }
+
+}

+ 71 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/distribution/SellerLoginController.java

@@ -0,0 +1,71 @@
+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.modules.distribution.bo.SellerAppAccountLoginBo;
+import com.zhongzheng.modules.distribution.bo.SellerAppRegisterBo;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+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;
+
+
+    /**
+     * 用户注册
+     */
+    @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 = iDistributionSellerService.refreshSellerToken(userAccount);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, token);
+        return AjaxResult.success(map);
+    }
+}

+ 54 - 0
zhongzheng-admin/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();
+    }
+
+
+}

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

@@ -424,4 +424,10 @@ public class ScheduleController extends BaseController {
         return AjaxResult.success();
     }
 
+    @ApiOperation("分销佣金解冻")
+    @GetMapping("/distributionRebate")
+    public AjaxResult distributionRebate(UserQueryBo bo){
+        iScheduleService.distributionRebate();
+        return AjaxResult.success();
+    }
 }

+ 7 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysLoginController.java

@@ -1,5 +1,7 @@
 package com.zhongzheng.controller.system;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
@@ -13,6 +15,7 @@ import com.zhongzheng.framework.web.service.SysPermissionService;
 import com.zhongzheng.framework.web.service.TokenService;
 import com.zhongzheng.modules.system.service.ISysMenuService;
 import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.system.vo.SysTenantVo;
 import com.zhongzheng.modules.user.bo.UserBusinessLoginBo;
 import io.swagger.annotations.Api;
@@ -52,7 +55,8 @@ public class SysLoginController
 
     @Autowired
     private ISysTenantService iSysTenantService;
-
+    @Autowired
+    private ISysUserService iSysUserService;
     /**
      * 登录方法
      *
@@ -98,7 +102,8 @@ public class SysLoginController
     public AjaxResult getInfo()
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        SysUser user = loginUser.getUser();
+        SysUser user = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getUserId, loginUser.getUser().getUserId()).last("limit 1"));
         // 角色集合
         Set<String> roles = permissionService.getRolePermission(user);
         // 权限集合

+ 53 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java

@@ -0,0 +1,53 @@
+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;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.WxLoginService;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.wx.bo.WxLoginBody;
+import com.zhongzheng.modules.wx.service.IWxPayService;
+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.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Api(tags ="微信登录用户操作管理")
+@ApiSupport(order = 2)
+@RestController
+public class WxLoginController
+{
+    @Autowired
+    private WxLoginService wxLoginService;
+
+    @Autowired
+    private IWxPayService iWxPayService;
+
+
+    @Autowired
+    private  RedisCache redisCache;
+    private static final Logger log = LoggerFactory.getLogger(WxLoginController.class);
+
+
+
+    @ApiOperation("公众号分享微信参数")
+    @GetMapping("/app/common/shareGzh")
+    public AjaxResult shareGzh(String url)
+    {
+        Map<String,String> map = iWxPayService.shareGzh(url);
+        return AjaxResult.success(map);
+    }
+
+}

+ 83 - 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: 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?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:
         # 地址
@@ -147,3 +172,7 @@ officialPush:
     periodPath: https://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
+
+
+distributionOldPay:
+    host: http://gdxypx.xy.com/System/BussinessApi/AddRedPackData

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

@@ -147,3 +147,6 @@ officialPush:
     periodPath: https://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
+
+distributionOldPay:
+    host: http://test.jqbao.net/System/BussinessApi/AddRedPackData

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

@@ -147,3 +147,6 @@ officialPush:
     periodPath: https://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: GDSXY
     token: 01b5d9833987efdff54483cdc9720da6
+
+distributionOldPay:
+    host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData

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

@@ -1,18 +1,13 @@
 package com.zhongzheng;
 
 
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
 import org.springframework.boot.SpringApplication;
-import org.springframework.boot.SpringBootVersion;
 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.core.SpringVersion;
-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)

+ 13 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/alioss/OssController.java

@@ -7,6 +7,7 @@ import com.zhongzheng.framework.web.service.WxTokenService;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.alioss.vo.ResultBean;
+import com.zhongzheng.modules.user.entity.ClientLoginSeller;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -40,6 +41,7 @@ public class OssController {
 
     private final WxTokenService wxTokenService;
 
+
     /**
      * policy获得
      */
@@ -53,6 +55,17 @@ public class OssController {
         return AjaxResult.success(result);
     }
 
+    /**
+     * policy获得
+     */
+    @ApiOperation("业务员policy获得")
+    @GetMapping("/seller_policy")
+    public AjaxResult<ResultBean> seller_policy(@Validated OssRequest ossRequest) {
+        ResultBean result = ossService.getPolicy(ossRequest);
+        log.info("服务端生成签名:{}",result);
+        return AjaxResult.success(result);
+    }
+
     /**
      * 阿里回调OSS返回参数到前端
      */

+ 44 - 1
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonController.java

@@ -1,6 +1,8 @@
 package com.zhongzheng.controller.cmmon;
 
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.page.TableDataInfo;
@@ -9,6 +11,7 @@ import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.framework.web.service.WxLoginService;
+import com.zhongzheng.modules.activity.vo.ActivityGoodsPriceVo;
 import com.zhongzheng.modules.base.bo.ConfigQueryBo;
 import com.zhongzheng.modules.course.bo.CourseQueryBo;
 import com.zhongzheng.modules.course.bo.CourseTopicGoodsQueryBo;
@@ -19,6 +22,11 @@ import com.zhongzheng.modules.course.vo.CourseTopicVo;
 import com.zhongzheng.modules.course.vo.CourseUserVo;
 import com.zhongzheng.modules.data.domain.DataWxTpClick;
 import com.zhongzheng.modules.data.service.IDataWxTpClickService;
+import com.zhongzheng.modules.distribution.bo.DistributionActivityGoodsQueryBo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityGoodsService;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.goods.bo.DistributionGoodsBo;
 import com.zhongzheng.modules.goods.service.IGoodsSpecTemplateService;
 import com.zhongzheng.modules.goods.vo.GoodsSpecTemplateVo;
 import com.zhongzheng.modules.goods.vo.GoodsUserVo;
@@ -60,7 +68,7 @@ public class CommonController extends BaseController {
 
     private final ISysConfigService configService;
 
-
+    private final IDistributionSellerService iDistributionSellerService;
 
     @Autowired
     private RedisCache redisCache;
@@ -73,6 +81,8 @@ public class CommonController extends BaseController {
 
     private final IDataWxTpClickService iDataWxTpClickService;
 
+    private final IDistributionActivityGoodsService iDistributionActivityGoodsService;
+
     /**
      * 获取微信小程序信息(网页跳转小程序)
      */
@@ -109,6 +119,15 @@ public class CommonController extends BaseController {
         return AjaxResult.success(iGoodsSpecTemplateService.queryById(specTemplateId));
     }
 
+    /**
+     * 获取商品规格模板信息
+     */
+    @ApiOperation("获取商品规格模板信息")
+    @GetMapping("/distribution/spec")
+    public AjaxResult<GoodsSpecTemplateVo> getDistributionSpec(DistributionGoodsBo bo) {
+        return AjaxResult.success(iGoodsSpecTemplateService.getDistributionSpec(bo));
+    }
+
     /**
      * 获取规格属性值对应的商品信息
      */
@@ -265,6 +284,9 @@ public class CommonController extends BaseController {
             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);
         }
     }
@@ -304,4 +326,25 @@ public class CommonController extends BaseController {
         return toAjax(iDataWxTpClickService.save(dataWxTpClick)? 1 : 0);
     }
 
+    @ApiOperation("通过分享code查询业务员用户信息")
+    @GetMapping("/distribution/getInfoByShareCode")
+    public AjaxResult<DistributionSellerVo> getInfoByShareCode(String shareCode)
+    {
+        DistributionSellerVo vo = iDistributionSellerService.queryByShareCode(shareCode);
+        vo.setNull();
+        String jsonStr = configService.selectConfigByKey("home.header");
+        JSONObject objectJson = JSON.parseObject(jsonStr);
+        vo.setTenantName(String.valueOf(objectJson.get("companyName")));
+        return AjaxResult.success(vo);
+    }
+
+
+    @ApiOperation("获取分销活动商品列表")
+    @GetMapping("/distribution/getGoodsList")
+    public TableDataInfo<ActivityGoodsPriceVo> distributionGoodsList(DistributionActivityGoodsQueryBo bo)
+    {
+        startPage();
+        List<ActivityGoodsPriceVo> list = iDistributionActivityGoodsService.getGoodsList(bo);
+        return getDataTable(list);
+    }
 }

+ 27 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/cmmon/CommonGoodsController.java

@@ -4,8 +4,10 @@ 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;
-import com.zhongzheng.modules.bank.bo.QuestionChapterExamQueryBo;
 import com.zhongzheng.modules.course.vo.CourseModuleFreeExamVo;
+import com.zhongzheng.modules.distribution.service.IDistributionActivityService;
+import com.zhongzheng.modules.distribution.vo.DistributionGoodsListVo;
+import com.zhongzheng.modules.goods.bo.DistributionGoodsBo;
 import com.zhongzheng.modules.goods.bo.GoodsAttachedQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
@@ -15,7 +17,6 @@ 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;
@@ -42,6 +43,8 @@ public class CommonGoodsController extends BaseController {
 
     private final IGoodsAttachedService iGoodsAttachedService;
 
+    private final IDistributionActivityService iDistributionActivityService;
+
     /**
      * 查询商品列表
      */
@@ -82,6 +85,15 @@ public class CommonGoodsController extends BaseController {
         return AjaxResult.success(iGoodsService.selectDetail(goodsId));
     }
 
+    /**
+     * 获取分销活动商品详细信息
+     */
+    @ApiOperation("获取分销活动商品详细信息")
+    @GetMapping("/distribution/goods")
+    public AjaxResult<GoodsVo> getDistributionGoods(DistributionGoodsBo bo) {
+        return AjaxResult.success(iGoodsService.getDistributionGoods(bo));
+    }
+
 
 
     @ApiOperation("查询商品题库目录列表")
@@ -102,4 +114,17 @@ public class CommonGoodsController extends BaseController {
         return AjaxResult.success(list);
     }
 
+    /**
+     * 获取活动商品信息
+     * @author change
+     * @date 2023/3/28 9:41
+     * @param distributionId
+     * @return null
+     */
+    @ApiOperation("获取活动商品信息")
+    @GetMapping("/goods/list/{distributionId}")
+    public AjaxResult<List<DistributionGoodsListVo>> getGoodsList(@PathVariable("distributionId") Long distributionId) {
+        return AjaxResult.success(iDistributionActivityService.getGoodsList(distributionId));
+    }
+
 }

+ 11 - 2
zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java

@@ -18,6 +18,7 @@ import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.bo.WxShareGoodsBo;
+import com.zhongzheng.modules.wx.service.IWxPayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -39,6 +40,9 @@ public class WxLoginController
     @Autowired
     private WxLoginService wxLoginService;
 
+    @Autowired
+    private IWxPayService iWxPayService;
+
     @Autowired
     private WxTokenService wxTokenService;
 
@@ -155,8 +159,6 @@ public class WxLoginController
     }
 
 
-
-
     @ApiOperation("刷新登录令牌")
     @GetMapping("/refreshToken/{userAccount}")
     public AjaxResult refreshToken(@PathVariable("userAccount") String userAccount)
@@ -167,5 +169,12 @@ public class WxLoginController
         return AjaxResult.success(map);
     }
 
+    @ApiOperation("公众号分享微信参数")
+    @GetMapping("/app/common/shareGzh")
+    public AjaxResult shareGzh(String url)
+    {
+        Map<String,String> map = iWxPayService.shareGzh(url);
+        return AjaxResult.success(map);
+    }
 
 }

+ 0 - 8
zhongzheng-api/src/main/java/com/zhongzheng/controller/wx/WxPayController.java

@@ -1,15 +1,10 @@
 package com.zhongzheng.controller.wx;
 
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
-import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.core.domain.AjaxResult;
-import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.framework.web.service.WxTokenService;
-import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserService;
-import com.zhongzheng.modules.user.vo.UserVo;
-import com.zhongzheng.modules.wx.bo.WxLoginBody;
 import com.zhongzheng.modules.wx.bo.WxPayBody;
 import com.zhongzheng.modules.wx.service.IWxPayService;
 import io.swagger.annotations.Api;
@@ -17,9 +12,6 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.Map;
-
 @Api(tags ="微信支付操作管理")
 @ApiSupport(order = 2)
 @RestController

+ 87 - 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:
         # 地址
@@ -129,7 +154,10 @@ wisdomExamRoom:
 certificate:
     host: http://192.168.1.38:8000/
 
-liveGotoURL: http://
+
+
+liveGotoURL: http://120.79.166.78:19014/
+
 
 enCodeVersion: trial
 
@@ -148,3 +176,6 @@ officialPush:
     periodPath: https://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
+
+distributionOldPay:
+    host: http://gdxypx.xy.com/System/BussinessApi/AddRedPackData

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

@@ -147,3 +147,6 @@ officialPush:
     periodPath: https://jypt-dev.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: peixunjigou
     token: 0ca175b9c0f726a831d895e26933246
+
+distributionOldPay:
+    host: http://test.jqbao.net/System/BussinessApi/AddRedPackData

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

@@ -159,3 +159,6 @@ officialPush:
     periodPath: https://jypt.gdcic.net/organjxjy/XueshiShenqing
     infoAccount: GDSXY
     token: 01b5d9833987efdff54483cdc9720da6
+
+distributionOldPay:
+    host: https://www.xyyxt.net/System/BussinessApi/AddRedPackData

+ 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>

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

@@ -64,6 +64,7 @@ public class Constants
 
     public static final String WX_LOGIN_TOKEN_KEY = "wx_login_tokens:";
 
+
     /**
      * 防重提交 redis key
      */
@@ -89,13 +90,14 @@ 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 REGISTER_SMS = "REGISTER-";
     public static final String FORGET_SMS = "FORGET-";
     public static final String LOGIN_SMS = "LOGIN-";
@@ -111,6 +113,9 @@ public class Constants
     public static final String WX_LOGIN_USER_KEY = "wx_login_user_key";
 
 
+
+
+
     /**
      * 用户ID
      */
@@ -146,6 +151,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:";
+
     /**
      * 资源映射路径 前缀
      */

+ 3 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/bo/SysUserEditBo.java

@@ -87,4 +87,7 @@ public class SysUserEditBo
     private Long[] roleIds;
     @ApiModelProperty("岗位组")
     private Long[] postIds;
+    /** 身份证号 */
+    @ApiModelProperty("身份证号")
+    private String idCard;
 }

+ 2 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysRole.java

@@ -101,6 +101,8 @@ public class SysRole implements Serializable
     @ApiModelProperty(value ="备注")
     private String remark;
 
+    private Long tenantId;
+
     /**
      * 请求参数
      */

+ 6 - 2
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java

@@ -8,6 +8,7 @@ import com.zhongzheng.common.annotation.Excel;
 import com.zhongzheng.common.annotation.Excel.ColumnType;
 import com.zhongzheng.common.annotation.Excel.Type;
 import com.zhongzheng.common.annotation.Excels;
+import com.zhongzheng.common.type.EncryptHandler;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
@@ -30,7 +31,7 @@ import java.util.Map;
 @Data
 @NoArgsConstructor
 @Accessors(chain = true)
-@TableName("sys_user")
+@TableName(value ="sys_user",autoResultMap = true)
 public class SysUser implements Serializable
 {
     private static final long serialVersionUID = 1L;
@@ -167,6 +168,9 @@ public class SysUser implements Serializable
     private Date preLoginDate;
     /** 密码最后修改时间 */
     private Long pwdTime;
+    /** 身份证号 */
+    @TableField(typeHandler = EncryptHandler.class)
+    private String idCard;
 
     public SysUser(Long userId)
     {
@@ -187,5 +191,5 @@ public class SysUser implements Serializable
     {
         return userId != null && 1L == userId;
     }*/
-
+  private Long sellerId;
 }

+ 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) ;
     }
 
 }

+ 5 - 4
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/model/LoginUser.java

@@ -12,7 +12,7 @@ import java.util.Set;
 
 /**
  * 登录用户身份权限
- * 
+ *
  * @author zhongzheng
  */
 
@@ -68,6 +68,7 @@ public class LoginUser implements UserDetails
      */
     private SysUser user;
 
+
     public LoginUser(SysUser user, Set<String> permissions)
     {
         this.user = user;
@@ -99,7 +100,7 @@ public class LoginUser implements UserDetails
 
     /**
      * 指定用户是否解锁,锁定的用户无法进行身份验证
-     * 
+     *
      * @return
      */
     @JsonIgnore
@@ -111,7 +112,7 @@ public class LoginUser implements UserDetails
 
     /**
      * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
-     * 
+     *
      * @return
      */
     @JsonIgnore
@@ -123,7 +124,7 @@ public class LoginUser implements UserDetails
 
     /**
      * 是否可用 ,禁用的用户不能身份验证
-     * 
+     *
      * @return
      */
     @JsonIgnore

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

@@ -21,7 +21,7 @@ public class EncryptHandler  implements TypeHandler<String> {
 
 
 
-    public String decrypt(String value) {
+    public static String decrypt(String value) {
         if (null == value) {
             return null;
         }

+ 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;
+    }
 }

+ 13 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/SecurityUtils.java

@@ -122,4 +122,17 @@ public class SecurityUtils
         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;
+    }
 }

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

@@ -25,7 +25,7 @@ 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()*100));
+        return tag+Integer.valueOf(time.substring(1))+""+(((int)(Math.random() * 90 + 10)));
     }
     //导入生成编号使用
     public static String getImportEncoded(String tag)

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

@@ -5,10 +5,12 @@ 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.google.zxing.common.BitMatrix;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import io.micrometer.core.lang.NonNull;
 import net.sf.jsqlparser.expression.LongValue;
 
+import java.awt.image.BufferedImage;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
@@ -348,4 +350,58 @@ public class ToolsUtils {
         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();
+    }
+
+    public static BufferedImage toBufferedImage(BitMatrix matrix) {
+        int black = 0xFF000000;
+        int white  = 0x00FFFFFF;
+        int width = matrix.getWidth();
+        int height = matrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, matrix.get(x, y) ? black : white);
+            }
+        }
+        int imgHeight = image.getHeight();//取得图片的长和宽
+        int imgWidth = image.getWidth();
+        int c = image.getRGB(3, 3);
+        int alpha = 10;
+        //防止越位
+        if (alpha < 0) {
+            alpha = 0;
+        } else if (alpha > 10) {
+            alpha = 10;
+        }
+        BufferedImage tmpImg = new BufferedImage(imgWidth, imgHeight,BufferedImage.TYPE_4BYTE_ABGR);//新建一个类型支持透明的BufferedImage
+        for(int i = 0; i < imgWidth; ++i)//把原图片的内容复制到新的图片,同时把背景设为透明
+        {
+            for(int j = 0; j < imgHeight; ++j){
+                //把背景设为透明
+                if(image.getRGB(i, j) == c){
+                    tmpImg .setRGB(i, j, c & 0x00ffffff);
+                }
+                //设置透明度
+                else{
+                    int rgb = tmpImg .getRGB(i, j);
+                    rgb = ((alpha * 255 / 10) << 24) | (rgb & 0x00ffffff);
+                    tmpImg .setRGB(i, j, rgb);
+                }
+            }
+        }
+        return tmpImg ;
+    }
+
 }

+ 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;
+//    }
 }

+ 18 - 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认证过滤器
      */
@@ -147,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);
 			}
 		}
 	}

+ 6 - 14
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java

@@ -1,27 +1,19 @@
 package com.zhongzheng.framework.mybatisplus;
 
 import cn.hutool.core.lang.Validator;
-import cn.hutool.core.util.StrUtil;
 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;
 
 /**
  * 多租户处理插件
@@ -47,10 +39,6 @@ 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");
@@ -100,6 +88,10 @@ public class CustomTenantLineHandler implements TenantLineHandler {
      */
     @Override
     public boolean ignoreTable(String tableName) {
+        if (!enabledTenant || tableName.contains("top_")){
+            //总平台忽略tenantId
+            return true;
+        }
         return IGNORE_TABLE_NAMES.contains(tableName);
     }
 

+ 3 - 6
zhongzheng-framework/src/main/java/com/zhongzheng/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -4,10 +4,8 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.http.HttpStatus;
 import com.zhongzheng.common.core.domain.AjaxResult;
 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.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;
@@ -54,7 +52,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,10 +72,10 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
                         SecurityContextHolder.getContext().setAuthentication(authenticationToken);
                     }
                 }else{
-                        //子系统
+                    //子系统
                     LoginUser loginUser = null;
 
-                       loginUser = tokenService.getLoginUser(request);
+                    loginUser = tokenService.getLoginUser(request);
 
                     if (Validator.isNotNull(loginUser) && Validator.isNull(SecurityUtils.getAuthentication()))
                     {

+ 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, "退出成功")));
+    }
+}

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

@@ -0,0 +1,494 @@
+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.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.domain.entity.SysRole;
+import com.zhongzheng.common.core.domain.entity.SysUser;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+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.IDistributionActivityService;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.distribution.vo.DistributionSellerVo;
+import com.zhongzheng.modules.distribution.vo.SellerOrderVo;
+import com.zhongzheng.modules.system.service.ISysRoleService;
+import com.zhongzheng.modules.system.service.ISysUserService;
+import com.zhongzheng.modules.top.distribution.bo.DistributionSellerQuery;
+import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 分销业务员Service业务层处理
+ *
+ * @author hjl
+ * @date 2023-03-13
+ */
+@Service
+@DS("slave")
+public class DistributionSellerServiceImpl extends ServiceImpl<DistributionSellerMapper, DistributionSeller> implements IDistributionSellerService {
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IUserService iUserService;
+
+    @Autowired
+    private ISysUserService iSysUserService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private ISysRoleService iSysRoleService;
+
+    @Autowired
+    private IDistributionActivityService iDistributionActivityService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    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("验证码错误");
+        }
+        SysUser seller = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getPhonenumber, bo.getTel()).last("limit 1"));
+        if(Validator.isNotNull(seller)){
+            throw new CustomException("该手机号已注册");
+        }
+        SysUser sellerIdCard = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getIdCard,EncryptHandler.encrypt(bo.getIdcard())).last("limit 1"));
+        if(Validator.isNotNull(sellerIdCard)){
+            if(Validator.isNotEmpty(sellerIdCard.getSellerId())){
+                throw new CustomException("该身份证已注册业务员");
+            }
+        }
+        DistributionSeller inertData = new DistributionSeller();
+        inertData.setRealname(bo.getRealname());
+        inertData.setUserAccount(ServletUtils.getEncoded("YW"));
+        inertData.setCreateTime(DateUtils.getNowTime());
+        inertData.setUpdateTime(DateUtils.getNowTime());
+        inertData.setShareCode(ToolsUtils.getRandomString(8));
+        inertData.setRegisterFrom(1);
+        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("注册失败");
+        }
+        if(Validator.isNotEmpty(sellerIdCard)){
+            sellerIdCard.setSellerId(inertData.getSellerId());
+            iSysUserService.updateById(sellerIdCard);
+        }else{
+            SysUser sysUser = new SysUser();
+            sysUser.setUserName(bo.getTel());
+            sysUser.setPhonenumber(bo.getTel());
+            sysUser.setIdCard(bo.getIdcard());
+            sysUser.setAvatar(bo.getAvatar());
+            sysUser.setPassword(SecurityUtils.encryptPassword(bo.getPwd()));
+            sysUser.setPwdTime(DateUtils.getNowTime());
+            sysUser.setSellerId(inertData.getSellerId());
+            sysUser.setCreateTime(DateUtils.getNowDate());
+            sysUser.setUpdateTime(DateUtils.getNowDate());
+            SysRole role = iSysRoleService.getOne(new LambdaQueryWrapper<SysRole>()
+                    .eq(SysRole::getRoleKey, "seller")
+                    .eq(SysRole::getStatus, 1).last("limit 1"));
+            if(Validator.isNotEmpty(role)){
+                sysUser.setRoleIds(new Long[]{role.getRoleId()});
+            }
+            iSysUserService.insertUser(sysUser);
+        }
+
+        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);
+        SysUser seller = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getPhonenumber,bo.getTel()).last("limit 1"));
+        if(Validator.isEmpty(seller)){
+            throw new CustomException("该手机号未注册");
+        }
+        if(Validator.isEmpty(seller.getSellerId())){
+            throw new CustomException("非业务员无法操作");
+        }
+        return iSysUserService.update(null,
+                new LambdaUpdateWrapper<SysUser>()
+                        .set(SysUser::getPassword,SecurityUtils.encryptPassword(bo.getPwd()))
+                        .set(SysUser::getPwdTime,DateUtils.getNowTime())
+                        .eq(SysUser::getUserId,seller.getUserId()));
+    }
+
+    /**
+     *
+     * @param seller
+     * @param user
+     * @param type 1业务员更新到用户 2用户更新到业务员
+     * @return
+     */
+    @Override
+    public Boolean syncSellerToUser(DistributionSeller seller, User user, Integer type) {
+
+        return true;
+    }
+
+    @Override
+    public Map<String, Object> accountLogin(SellerAppAccountLoginBo bo) {
+        if(Validator.isEmpty(bo.getAccount())){
+            throw new CustomException("账号不能为空");
+        }
+        LambdaQueryWrapper<SysUser> queryWrapper =new LambdaQueryWrapper<SysUser>();
+        queryWrapper.and(wq -> wq
+                .eq(SysUser::getPhonenumber,bo.getAccount())
+                .or()
+                .eq(SysUser::getIdCard,EncryptHandler.encrypt(bo.getAccount())
+                )
+                .or()
+                .eq(SysUser::getUserName,bo.getAccount()));
+        SysUser sysUser = iSysUserService.getOne(queryWrapper);
+        if(Validator.isEmpty(sysUser)){
+            throw new CustomException("登录信息错误");
+        }
+        else if (UserStatus.DISABLE.getCode().equals(sysUser.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,sysUser.getPassword()))
+        {
+            throw new BaseException("");
+        }
+        if(Validator.isEmpty(sysUser.getSellerId())){
+            throw new CustomException("非业务员无法登录");
+        }
+        DistributionSeller seller = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getSellerId, sysUser.getSellerId()));
+        LoginUser loginSeller = new LoginUser();
+        loginSeller.setUser(sysUser);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN,tokenService.createToken(loginSeller));
+        map.put("user_account",seller.getUserAccount());
+        map.put("full_info",Validator.isEmpty(sysUser.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);
+        SysUser sysUser = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getPhonenumber, bo.getTel()).last("limit 1"));
+        if (Validator.isEmpty(sysUser)) {
+            throw new CustomException("该手机号未注册");
+        }
+        if(Validator.isEmpty(sysUser.getSellerId())){
+            throw new CustomException("非业务员账号");
+        }
+        DistributionSeller seller = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getSellerId, sysUser.getSellerId()));
+        LoginUser loginSeller = new LoginUser();
+        loginSeller.setUser(sysUser);
+        Map<String, Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, tokenService.createToken(loginSeller));
+        map.put("user_account", seller.getUserAccount());
+        map.put("full_info", Validator.isEmpty(sysUser.getIdCard()) ? false : true); //是否完善身份信息
+        return map;
+    }
+
+    @Override
+    public List<DistributionSellerVo> getSellerListByTenant(DistributionSellerQuery query) {
+        return baseMapper.getSellerListByTenant(query);
+    }
+
+    @Override
+    public DistributionSellerVo queryById(Long sellerId){
+        DistributionSeller db = this.baseMapper.selectById(sellerId);
+        return BeanUtil.toBean(db, DistributionSellerVo.class);
+    }
+
+    @Override
+    public DistributionSellerVo queryByShareCode(String shareCode) {
+        DistributionSeller db = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getShareCode, shareCode));
+        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(bo.getStatus() != null, DistributionSeller::getStatus, bo.getStatus());
+        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());
+        return entity2Vo(this.list(lqw));
+    }
+
+    @Override
+    public List<DistributionSellerVo> findList(DistributionSellerQueryBo bo) {
+        return baseMapper.findList(bo);
+    }
+
+    @Override
+    public DistributionSellerVo findDetail(Long sellerId) {
+        return baseMapper.findDetail(sellerId);
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @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;
+    }
+
+    /**
+     * 后台注册
+     * @param bo 分销业务员新增业务对象
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertByAddBo(DistributionSellerAddBo bo) {
+        if(Validator.isEmpty(bo.getIdCard())){
+            throw new CustomException("没有身份证信息");
+        }
+        if(Validator.isEmpty(bo.getPhonenumber())){
+            throw new CustomException("没有手机号码");
+        }
+        if(Validator.isEmpty(bo.getRealname())){
+            throw new CustomException("没有真实姓名");
+        }
+        SysUser sellerIdCard = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getIdCard,bo.getIdCard()));
+        if(Validator.isNotNull(sellerIdCard)){
+            if(Validator.isNotEmpty(sellerIdCard.getSellerId())){
+                throw new CustomException("该身份证已注册业务员");
+            }
+        }
+        DistributionSeller add = BeanUtil.toBean(bo, DistributionSeller.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+
+        DistributionSeller inertData = new DistributionSeller();
+        inertData.setRealname(bo.getRealname());
+        inertData.setUserAccount(ServletUtils.getEncoded("YW"));
+        inertData.setCreateTime(DateUtils.getNowTime());
+        inertData.setUpdateTime(DateUtils.getNowTime());
+        inertData.setShareCode(ToolsUtils.getRandomString(8));
+        inertData.setRegisterFrom(2);
+        if(!save(inertData)){
+            throw new CustomException("注册失败");
+        }
+        if(Validator.isNotEmpty(sellerIdCard)){
+            sellerIdCard.setSellerId(inertData.getSellerId());
+            iSysUserService.updateById(sellerIdCard);
+        }else{
+            SysUser sysUser = new SysUser();
+            sysUser.setUserName(bo.getPhonenumber());
+            sysUser.setPhonenumber(bo.getPhonenumber());
+            sysUser.setIdCard(bo.getIdCard());
+            //密码身份证后六位
+            String pwd =  bo.getIdCard().substring(bo.getIdCard().length() - 6);
+            sysUser.setPassword(SecurityUtils.encryptPassword(pwd));
+            sysUser.setPwdTime(DateUtils.getNowTime());
+            sysUser.setSellerId(inertData.getSellerId());
+            sysUser.setCreateTime(DateUtils.getNowDate());
+            sysUser.setUpdateTime(DateUtils.getNowDate());
+            SysRole role = iSysRoleService.getOne(new LambdaQueryWrapper<SysRole>()
+                    .eq(SysRole::getRoleKey, "seller")
+                    .eq(SysRole::getStatus, 1).last("limit 1"));
+            if(Validator.isNotEmpty(role)){
+                sysUser.setRoleIds(new Long[]{role.getRoleId()});
+            }
+            iSysUserService.insertUser(sysUser);
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertBatchByAddBo(DistributionSellerAddBo bo) {
+        for(Long userId:bo.getSysUserIds()){
+            SysUser user = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getUserId,userId));
+            if(Validator.isEmpty(user.getIdCard())){
+                throw new CustomException(user.getUserId()+"没有身份证信息");
+            }
+            if(Validator.isEmpty(user.getPhonenumber())){
+                throw new CustomException(user.getUserId()+"没有手机号码");
+            }
+            if(Validator.isNotEmpty(user.getSellerId())){
+                throw new CustomException(user.getUserName()+"该用户已绑定分销员");
+            }
+            DistributionSeller inertData = new DistributionSeller();
+            //密码身份证后六位
+    //        String pwd =  user.getIdCard().substring(user.getIdCard().length() - 6);
+            inertData.setRealname(bo.getRealname());
+            inertData.setUserAccount(ServletUtils.getEncoded("YW"));
+            inertData.setCreateTime(DateUtils.getNowTime());
+            inertData.setUpdateTime(DateUtils.getNowTime());
+            inertData.setShareCode(ToolsUtils.getRandomString(8));
+            inertData.setRegisterFrom(3);
+            if(this.save(inertData)){
+                user.setSellerId(inertData.getSellerId());
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public Boolean updateByEditBo(DistributionSellerEditBo bo) {
+        SysUser user = new SysUser();
+        user.setAvatar(bo.getAvatar());
+        user.setUserId(bo.getSysUserId());
+        user.setUpdateTime(DateUtils.getNowDate());
+        return iSysUserService.updateById(user);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(DistributionSeller entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+    @Override
+    public String refreshSellerToken(String userAccount) {
+        DistributionSeller seller = getOne(new LambdaQueryWrapper<DistributionSeller>()
+                .eq(DistributionSeller::getUserAccount, userAccount).last("limit 1"));
+        if (seller == null) {
+            throw new CustomException("userAccount不存在");
+        }
+        SysUser sysUser = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getSellerId, seller.getSellerId()).last("limit 1"));
+        if(Validator.isEmpty(sysUser)){
+            throw new CustomException("非法账号");
+        }
+        LoginUser loginSeller = new LoginUser();
+        loginSeller.setUser(sysUser);
+        return tokenService.createToken(loginSeller);
+    }
+
+    @Override
+    public List<SellerOrderVo> getCashList(SellerOrderQueryBo bo) {
+        return iDistributionActivityService.getSellerOrder(bo);
+    }
+
+    @Override
+    public SellerOrderVo getCashDetail(Long id) {
+        return iDistributionActivityService.getCashDetail(id);
+    }
+
+}

+ 3 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java

@@ -60,6 +60,7 @@ public class SysLoginService
 
     @Autowired
     private IUserLoginErrorService iUserLoginErrorService;
+
     /**
      * 登录验证
      *
@@ -102,6 +103,8 @@ public class SysLoginService
             if(password.length()>20){
                 password = AES.decrypt(password,rsaPrivate);
             }
+            System.out.println(username);
+            System.out.println(password);
             authentication = authenticationManager
                     .authenticate(new UsernamePasswordAuthenticationToken(username, password));
         }

+ 9 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java

@@ -3,6 +3,7 @@ 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.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -28,6 +29,7 @@ import com.zhongzheng.modules.system.vo.SysTenantVo;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collection;
@@ -41,6 +43,7 @@ import java.util.stream.Collectors;
  * @date 2021-08-03
  */
 @Service
+@DS("slave") //指定数据源
 public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements ISysTenantService {
 
     @Autowired
@@ -239,4 +242,10 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
         return baseMapper.findTenantId(bo);
     }
 
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+    public List<SysTenant> getListSysTenant() {
+        return list(new LambdaQueryWrapper<SysTenant>().eq(SysTenant::getStatus, 1));
+    }
+
 }

+ 5 - 6
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TokenService.java

@@ -2,12 +2,9 @@ package com.zhongzheng.framework.web.service;
 
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.http.HttpStatus;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
-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.LoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
@@ -18,13 +15,12 @@ import com.zhongzheng.common.utils.ip.AddressUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.framework.manager.AsyncManager;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.ExpiredJwtException;
 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.access.AccessDeniedException;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -33,7 +29,6 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -164,6 +159,7 @@ public class TokenService
         return createToken(claims);
     }
 
+
     /**
      * 验证令牌有效期,相差不足20分钟,自动刷新缓存
      *
@@ -194,6 +190,7 @@ public class TokenService
         redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
     }
 
+
     /**
      * 设置用户代理信息
      *
@@ -209,6 +206,7 @@ public class TokenService
         loginUser.setOs(userAgent.getOs().getName());
     }
 
+
     /**
      * 从数据声明生成令牌
      *
@@ -251,6 +249,7 @@ public class TokenService
         return claims.getSubject();
     }
 
+
     /**
      * 获取请求token
      *

+ 19 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopSysLoginService.java

@@ -7,9 +7,11 @@ import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.user.CaptchaException;
 import com.zhongzheng.common.exception.user.CaptchaExpireException;
 import com.zhongzheng.common.exception.user.UserPasswordNotMatchException;
+import com.zhongzheng.common.utils.AES;
 import com.zhongzheng.common.utils.MessageUtils;
 import com.zhongzheng.framework.manager.AsyncManager;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
+import com.zhongzheng.modules.top.user.service.ITopSysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -18,6 +20,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.io.InputStream;
 
 /**
  * 登录校验方法
@@ -36,6 +39,9 @@ public class TopSysLoginService
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private ITopSysUserService iSysUserService;
+
     /**
      * 登录验证
      *
@@ -64,6 +70,19 @@ public class TopSysLoginService
         Authentication authentication = null;
         try
         {
+            String rsaPrivate = null;
+            try {
+                InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/pri.key");
+                rsaPrivate = AES.getStringByInputStream_1(certStream);
+                certStream.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+
+            }
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            if(password.length()>20){
+                password = AES.decrypt(password,rsaPrivate);
+            }
             // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
             authentication = authenticationManager
                     .authenticate(new UsernamePasswordAuthenticationToken(username, password));

+ 67 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopSysPermissionService.java

@@ -0,0 +1,67 @@
+package com.zhongzheng.framework.web.service;
+
+import com.zhongzheng.common.core.domain.entity.TopSysUser;
+import com.zhongzheng.modules.top.user.service.ITopSysMenuService;
+import com.zhongzheng.modules.top.user.service.ITopSysRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 用户权限处理
+ *
+ * @author zhongzheng
+ */
+@Component
+public class TopSysPermissionService
+{
+    @Autowired
+    private ITopSysRoleService topSysRoleService;
+
+    @Autowired
+    private ITopSysMenuService topSysMenuService;
+
+    /**
+     * 获取角色数据权限
+     *
+     * @param user 用户信息
+     * @return 角色权限信息
+     */
+    public Set<String> getRolePermission(TopSysUser user)
+    {
+        Set<String> roles = new HashSet<String>();
+        // 管理员拥有所有权限
+        if (user.isAdmin())
+        {
+            roles.add("admin");
+        }
+        else
+        {
+            roles.addAll(topSysRoleService.selectRolePermissionByUserId(user.getUserId()));
+        }
+        return roles;
+    }
+
+    /**
+     * 获取菜单数据权限
+     *
+     * @param user 用户信息
+     * @return 菜单权限信息
+     */
+    public Set<String> getMenuPermission(TopSysUser user)
+    {
+        Set<String> perms = new HashSet<String>();
+        // 管理员拥有所有权限
+        if (user.isAdmin())
+        {
+            perms.add("*:*:*");
+        }
+        else
+        {
+            perms.addAll(topSysMenuService.selectMenuPermsByUserId(user.getUserId()));
+        }
+        return perms;
+    }
+}

+ 9 - 12
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopUserDetailsServiceImpl.java

@@ -1,14 +1,11 @@
 package com.zhongzheng.framework.web.service;
 
 import cn.hutool.core.lang.Validator;
-import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
-import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.enums.UserStatus;
 import com.zhongzheng.common.exception.BaseException;
-import com.zhongzheng.modules.system.service.ISysUserService;
-import com.zhongzheng.modules.top.service.ITopSysUserService;
+import com.zhongzheng.modules.top.user.service.ITopSysUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,9 +14,6 @@ import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 
-import java.util.HashSet;
-import java.util.Set;
-
 /**
  * 用户验证处理
  *
@@ -34,11 +28,14 @@ public class TopUserDetailsServiceImpl implements UserDetailsService
     @Autowired
     private ITopSysUserService topUserService;
 
+    @Autowired
+    private TopSysPermissionService permissionService;
+
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
     {
         //超级管理系统用户
-        TopSysUser super_user = topUserService.selectUserByUserName(username);
+        TopSysUser super_user = topUserService.selectUserByUserNameByName(username);
         if (Validator.isNull(super_user))
         {
             log.info("登录用户:{} 不存在.", username);
@@ -59,9 +56,9 @@ public class TopUserDetailsServiceImpl implements UserDetailsService
 
     public UserDetails createTopLoginUser(TopSysUser user)
     {
-        Set<String> perms = new HashSet<String>();
-        //拥有所有权限
-        perms.add("*:*:*");
-        return new TopLoginUser(user, perms);
+//        Set<String> perms = new HashSet<String>();
+//        //拥有所有权限
+//        perms.add("*:*:*");
+        return new TopLoginUser(user, permissionService.getMenuPermission(user));
     }
 }

+ 1 - 6
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserDetailsServiceImpl.java

@@ -1,14 +1,12 @@
 package com.zhongzheng.framework.web.service;
 
 import cn.hutool.core.lang.Validator;
-import com.zhongzheng.common.core.domain.entity.TopSysUser;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
-import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.enums.UserStatus;
 import com.zhongzheng.common.exception.BaseException;
+import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.modules.system.service.ISysUserService;
-import com.zhongzheng.modules.top.service.ITopSysUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,9 +15,6 @@ import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 
-import java.util.HashSet;
-import java.util.Set;
-
 /**
  * 用户验证处理
  *

+ 37 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -24,6 +24,8 @@ import com.zhongzheng.common.utils.http.HttpUtils;
 import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.course.bo.SectionWatchPerBo;
+import com.zhongzheng.modules.distribution.domain.DistributionSeller;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
@@ -158,6 +160,9 @@ public class WxLoginService implements IWxLoginService {
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private IDistributionSellerService iDistributionSellerService;
+
     private final String KEY_PREFIX = "GOODS_SHARE";
 
     public void initData(){
@@ -1268,6 +1273,38 @@ public class WxLoginService implements IWxLoginService {
         return user;
     }
 
+    public DistributionSeller bindWxGzhUnionIdSeller(WxLoginBody loginBody) {
+        initData();
+        String param = String.format(gzh_wxAuthParam, gzh_appid, gzh_appsrcret, loginBody.getCode());
+        String resultString = HttpUtils.sendGet(gzh_wxAuthUrl, param);
+        //解析json
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
+        String access_token = String.valueOf(jsonObject.get("access_token"));
+        if(access_token.equals("null")){
+            throw new CustomException( String.valueOf(jsonObject.get("errmsg")));
+        }
+        String openId = String.valueOf(jsonObject.get("openid"));
+
+        String userInfoParam = String.format(gzh_wxUserInfoParam, access_token, openId);
+        String userInfoResultString = HttpUtils.sendGet(gzh_wxUserInfoUrl, userInfoParam);
+
+        //解析json
+        JSONObject jsonObject1 = (JSONObject) JSONObject.parse(userInfoResultString);
+        String unionId = String.valueOf(jsonObject1.get("unionid"));
+        DistributionSeller seller = iDistributionSellerService.getOne(new LambdaQueryWrapper<DistributionSeller>().eq(DistributionSeller::getSellerId,loginBody.getSellerId()));
+        if (seller == null) {
+            throw new CustomException("您尚未注册,请前往小程序注册");
+        }
+        if (Validator.isEmpty(seller.getGzhOpenId())) {
+            seller.setGzhOpenId(openId);
+            if (unionId.equals("null")) {
+                seller.setUnionId(unionId);
+            }
+            iDistributionSellerService.updateById(seller);
+        }
+        return seller;
+    }
+
     public String obtainWxPhone(String iv, String encryptedData, String session_key) {
         String userInfo = null;
         JSONObject userInfoJSON = null;

+ 4 - 1
zhongzheng-generator/src/main/java/com/zhongzheng/generator/service/GenTableServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhongzheng.common.constant.Constants;
 import com.zhongzheng.common.constant.GenConstants;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.generator.domain.GenTable;
@@ -131,6 +132,7 @@ public class GenTableServiceImpl extends ServiceImpl<GenTableMapper, GenTable> i
                                 .set(cenTableColumn.getIsEdit() == null, GenTableColumn::getIsEdit, null)
                                 .set(cenTableColumn.getIsList() == null, GenTableColumn::getIsList, null)
                                 .set(cenTableColumn.getIsQuery() == null, GenTableColumn::getIsQuery, null)
+                                .set(GenTableColumn::getUpdateTime, DateUtils.getNowDate())
                                 .eq(GenTableColumn::getColumnId,cenTableColumn.getColumnId()));
             }
         }
@@ -169,6 +171,7 @@ public class GenTableServiceImpl extends ServiceImpl<GenTableMapper, GenTable> i
                     List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
                     for (GenTableColumn column : genTableColumns) {
                         GenUtils.initColumnField(column, table);
+                        column.setCreateTime(DateUtils.getNowDate());
                         genTableColumnMapper.insert(column);
                     }
                 }
@@ -446,4 +449,4 @@ public class GenTableServiceImpl extends ServiceImpl<GenTableMapper, GenTable> i
         }
         return genPath + File.separator + VelocityUtils.getFileName(template, table);
     }
-}
+}

+ 1 - 1
zhongzheng-quartz/src/main/java/com/zhongzheng/quartz/config/ScheduleConfig.java

@@ -50,7 +50,7 @@ public class ScheduleConfig
         // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
         factory.setOverwriteExistingJobs(true);
         // 设置自动启动,默认为true
-        factory.setAutoStartup(true);
+        factory.setAutoStartup(false);
 
         return factory;
     }

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/domain/ActivityGoodsPrice.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.activity.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 【活动商品价格】对象 top_certificate
+ *
+ * @author ruoyi
+ * @date 2023-03-15
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("activity_goods_price")
+public class ActivityGoodsPrice implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 商品ID */
+    private Long goodsId;
+    /** 商品价格 */
+    private BigDecimal goodsPrice;
+    /** 活动编码 */
+    private String activityCode;
+    /** 类型 */
+    private Integer type;
+    /**  状态 1正常 0关闭 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    private Long tenantId;
+
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/mapper/ActivityGoodsPriceMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
+
+/**
+ * 商品推荐Mapper接口
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+public interface ActivityGoodsPriceMapper extends BaseMapper<ActivityGoodsPrice> {
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/IActivityGoodsPriceService.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.activity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
+
+import java.util.List;
+
+/**
+ * 商品推荐Service接口
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+public interface IActivityGoodsPriceService extends IService<ActivityGoodsPrice> {
+
+    void saveBatchEntity(List<ActivityGoodsPrice> priceList);
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/service/impl/ActivityGoodsPriceServiceImpl.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.activity.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.activity.domain.ActivityGoodsPrice;
+import com.zhongzheng.modules.activity.mapper.ActivityGoodsPriceMapper;
+import com.zhongzheng.modules.activity.service.IActivityGoodsPriceService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 商品推荐Service业务层处理
+ *
+ * @author hjl
+ * @date 2022-04-13
+ */
+@Service
+@DS("slave")
+public class ActivityGoodsPriceServiceImpl extends ServiceImpl<ActivityGoodsPriceMapper, ActivityGoodsPrice> implements IActivityGoodsPriceService {
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+    public void saveBatchEntity(List<ActivityGoodsPrice> priceList) {
+        saveBatch(priceList);
+    }
+}

+ 56 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/activity/vo/ActivityGoodsPriceVo.java

@@ -0,0 +1,56 @@
+package com.zhongzheng.modules.activity.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 活动商品价格视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-24
+ */
+@Data
+@ApiModel("活动商品价格视图对象")
+public class ActivityGoodsPriceVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 主键 */
+	@ApiModelProperty("主键")
+	private Long id;
+
+	/** 商品ID */
+	@Excel(name = "商品ID")
+	@ApiModelProperty("商品ID")
+	private Long goodsId;
+	/** 活动价格 */
+	@Excel(name = "活动价格")
+	@ApiModelProperty("活动价格")
+	private BigDecimal goodsPrice;
+	/** 活动编码 */
+	@Excel(name = "活动编码")
+	@ApiModelProperty("活动编码")
+	private String activityCode;
+	/** 活动类型 */
+	@Excel(name = "活动类型")
+	@ApiModelProperty("活动类型")
+	private Integer type;
+	/** 状态:1有效,-1无效 */
+	@Excel(name = "状态:1有效,-1无效")
+	@ApiModelProperty("状态:1有效,-1无效")
+	private Integer status;
+	/** 商品名称 */
+	@Excel(name = "商品名称")
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/** 封面地址 */
+	@Excel(name = "封面地址")
+	@ApiModelProperty("封面地址")
+	private String coverUrl;
+}

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/IAliSmsService.java

@@ -19,4 +19,11 @@ public interface IAliSmsService {
     Boolean sendPwdSms(String tel,String code);
 
     Boolean sendBindNewTelSms(String tel);
+
+
+    Boolean sendSellerRegisterSms(String tel);
+
+    Boolean sendSellerForgetSms(String tel);
+
+    Boolean sendSellerLoginSms(String tel);
 }

+ 106 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/alisms/service/impl/AliSmsServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON;
 import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
@@ -17,6 +18,9 @@ import com.zhongzheng.modules.alisms.service.IAliSmsService;
 import com.zhongzheng.modules.alisms.vo.ResultBean;
 import com.zhongzheng.modules.base.bo.SmsAddBo;
 import com.zhongzheng.modules.base.service.ISmsService;
+import com.zhongzheng.modules.distribution.domain.DistributionSeller;
+import com.zhongzheng.modules.distribution.service.IDistributionSellerService;
+import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.service.IUserService;
 import org.slf4j.Logger;
@@ -60,6 +64,11 @@ public class AliSmsServiceImpl implements IAliSmsService {
     @Autowired
     private ISmsService iSmsService;
 
+    @Autowired
+    private IDistributionSellerService iDistributionSellerService;
+
+    @Autowired
+    private ISysUserService iSysUserService;
 
     @Override
     public ResultBean sendSms(String tel, String param) {
@@ -239,4 +248,101 @@ public class AliSmsServiceImpl implements IAliSmsService {
         }
         return false;
     }
+
+    @Override
+    public Boolean sendSellerRegisterSms(String tel) {
+        if(tel==null){
+            throw new CustomException("手机号码不能为空");
+        }
+        SysUser seller = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getPhonenumber,tel).last("limit 1"));
+        if(Validator.isNotNull(seller)){
+            throw new CustomException("该手机号已注册");
+        }
+        String code = ToolsUtils.getSmsCode();
+        String key = Constants.REGISTER_SMS + tel;
+        redisCache.setCacheObject(key,code,5, TimeUnit.MINUTES);//5分钟
+        try{
+            Map<String,Object> param = new HashMap<>();
+            param.put("code",code);
+            SendSmsResponse response = SmsUtils.sendSms(tel,SIGNNAME,REGISTERTEMPLATECODE, JSON.toJSONString(param),ACCESSKEYID,ACCESSKEYSECRET);
+            System.out.println(response.getBody().getMessage());
+            if(response.getBody().getMessage().equals("OK")){
+                SmsAddBo smsAddBo = new SmsAddBo();
+                smsAddBo.setCode(code);
+                smsAddBo.setTel(tel);
+                smsAddBo.setType(6L);
+                smsAddBo.setIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                iSmsService.insertByAddBo(smsAddBo);
+                return true;
+            }
+        }catch (Exception e){
+            throw new CustomException(e.getMessage());
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean sendSellerForgetSms(String tel) {
+        if(tel==null){
+            throw new CustomException("手机号码不能为空");
+        }
+        SysUser user = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getPhonenumber,tel).last("limit 1"));
+        if(Validator.isEmpty(user)){
+            throw new CustomException("该手机号未注册");
+        }
+        String code = ToolsUtils.getSmsCode();
+        String key = Constants.FORGET_SMS + tel;
+        redisCache.setCacheObject(key,code,5, TimeUnit.MINUTES);//5分钟
+        try{
+            Map<String,Object> param = new HashMap<>();
+            param.put("code",code);
+            SendSmsResponse response = SmsUtils.sendSms(tel,SIGNNAME,FORGETTEMPLATECODE, JSON.toJSONString(param),ACCESSKEYID,ACCESSKEYSECRET);
+            if(response.getBody().getMessage().equals("OK")){
+                SmsAddBo smsAddBo = new SmsAddBo();
+                smsAddBo.setCode(code);
+                smsAddBo.setTel(tel);
+                smsAddBo.setType(7L);
+                smsAddBo.setIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                iSmsService.insertByAddBo(smsAddBo);
+                return true;
+            }
+        }catch (Exception e){
+            throw new CustomException(e.getMessage());
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean sendSellerLoginSms(String tel) {
+        if(tel==null){
+            throw new CustomException("手机号码不能为空");
+        }
+        SysUser user = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getPhonenumber,tel).last("limit 1"));
+        if(Validator.isEmpty(user)){
+            throw new CustomException("该手机号未注册");
+        }
+        String code = ToolsUtils.getSmsCode();
+        String key = Constants.LOGIN_SMS + tel;
+        redisCache.setCacheObject(key,code,5, TimeUnit.MINUTES);//5分钟
+        try{
+            Map<String,Object> param = new HashMap<>();
+            param.put("code",code);
+            SendSmsResponse response = SmsUtils.sendSms(tel,SIGNNAME,LOGINTEMPLATECODE, JSON.toJSONString(param),ACCESSKEYID,ACCESSKEYSECRET);
+            if(response.getBody().getMessage().equals("OK")){
+                SmsAddBo smsAddBo = new SmsAddBo();
+                smsAddBo.setCode(code);
+                smsAddBo.setTel(tel);
+                smsAddBo.setType(8L);
+                smsAddBo.setIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
+                iSmsService.insertByAddBo(smsAddBo);
+                return true;
+            }
+        }catch (Exception e){
+            throw new CustomException(e.getMessage());
+        }
+        return false;
+    }
 }

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionChapterExamService.java

@@ -7,6 +7,7 @@ import com.zhongzheng.modules.bank.bo.QuestionChapterExamQueryBo;
 import com.zhongzheng.modules.bank.domain.QuestionChapterExam;
 import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.bank.vo.QuestionChapterExamVo;
+import com.zhongzheng.modules.top.goods.domain.TopQuestionChapterExam;
 
 import java.util.Collection;
 import java.util.List;

+ 6 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamQuestionServiceImpl.java

@@ -1,8 +1,11 @@
 package com.zhongzheng.modules.bank.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
-import com.zhongzheng.common.utils.DateUtils;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.modules.bank.bo.ExamQuestionAddBo;
 import com.zhongzheng.modules.bank.bo.ExamQuestionEditBo;
 import com.zhongzheng.modules.bank.bo.ExamQuestionQueryBo;
@@ -12,13 +15,8 @@ import com.zhongzheng.modules.bank.service.IExamQuestionService;
 import com.zhongzheng.modules.bank.vo.ExamQuestionVo;
 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.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -29,6 +27,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-22
  */
 @Service
+@DS("slave")
 public class ExamQuestionServiceImpl extends ServiceImpl<ExamQuestionMapper, ExamQuestion> implements IExamQuestionService {
 
     @Autowired

+ 10 - 9
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/ExamServiceImpl.java

@@ -4,15 +4,23 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.bank.bo.*;
-import com.zhongzheng.modules.bank.domain.*;
+import com.zhongzheng.modules.bank.domain.Exam;
+import com.zhongzheng.modules.bank.domain.ExamQuestion;
+import com.zhongzheng.modules.bank.domain.QuestionBusiness;
+import com.zhongzheng.modules.bank.domain.QuestionChapterExam;
 import com.zhongzheng.modules.bank.mapper.ExamMapper;
 import com.zhongzheng.modules.bank.service.IExamQuestionService;
 import com.zhongzheng.modules.bank.service.IExamService;
@@ -20,10 +28,7 @@ import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionChapterExamService;
 import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.bank.vo.QuestionChapterExamVo;
-import com.zhongzheng.modules.course.bo.CourseChapterSectionListAddBo;
-import com.zhongzheng.modules.course.domain.CourseChapterSection;
 import com.zhongzheng.modules.course.domain.CourseMenuExam;
-import com.zhongzheng.modules.course.service.ICourseChapterBusinessService;
 import com.zhongzheng.modules.course.service.ICourseMenuExamService;
 import com.zhongzheng.modules.exam.bo.ExamPaperQueryBo;
 import com.zhongzheng.modules.goods.bo.GoodsAttachedQueryBo;
@@ -31,14 +36,9 @@ import com.zhongzheng.modules.goods.domain.GoodsAttached;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
 import com.zhongzheng.modules.goods.vo.GoodsAttachedVo;
 import com.zhongzheng.modules.user.bo.CheckUserExamRecordBo;
-import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.service.IUserExamRecordService;
 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 org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
@@ -51,6 +51,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-22
  */
 @Service
+@DS("slave")
 public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IExamService {
 
     @Autowired

+ 6 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionBusinessServiceImpl.java

@@ -1,8 +1,11 @@
 package com.zhongzheng.modules.bank.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
-import com.zhongzheng.common.utils.DateUtils;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.modules.bank.bo.QuestionBusinessAddBo;
 import com.zhongzheng.modules.bank.bo.QuestionBusinessEditBo;
 import com.zhongzheng.modules.bank.bo.QuestionBusinessQueryBo;
@@ -12,13 +15,8 @@ import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.vo.QuestionBusinessVo;
 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.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -29,6 +27,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-25
  */
 @Service
+@DS("slave")
 public class QuestionBusinessServiceImpl extends ServiceImpl<QuestionBusinessMapper, QuestionBusiness> implements IQuestionBusinessService {
 
     @Autowired

+ 11 - 9
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionChapterExamServiceImpl.java

@@ -1,27 +1,26 @@
 package com.zhongzheng.modules.bank.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
-import com.zhongzheng.common.utils.DateUtils;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.modules.bank.bo.QuestionChapterExamAddBo;
 import com.zhongzheng.modules.bank.bo.QuestionChapterExamEditBo;
 import com.zhongzheng.modules.bank.bo.QuestionChapterExamQueryBo;
 import com.zhongzheng.modules.bank.domain.QuestionChapterExam;
 import com.zhongzheng.modules.bank.mapper.QuestionChapterExamMapper;
-import com.zhongzheng.modules.bank.mapper.QuestionModuleChapterMapper;
 import com.zhongzheng.modules.bank.service.IQuestionChapterExamService;
 import com.zhongzheng.modules.bank.vo.ExamVo;
 import com.zhongzheng.modules.bank.vo.QuestionChapterExamVo;
+import com.zhongzheng.modules.top.goods.domain.TopQuestionChapterExam;
 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 org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -32,6 +31,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-25
  */
 @Service
+@DS("slave")
 public class QuestionChapterExamServiceImpl extends ServiceImpl<QuestionChapterExamMapper, QuestionChapterExam> implements IQuestionChapterExamService {
 
     @Autowired
@@ -118,4 +118,6 @@ public class QuestionChapterExamServiceImpl extends ServiceImpl<QuestionChapterE
     public void deleteByIdAndTenant(Long newChapterExamId, Long newTenantId) {
         baseMapper.deleteByIdAndTenant(newChapterExamId, newTenantId);
     }
+
+
 }

+ 14 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionChapterServiceImpl.java

@@ -2,33 +2,39 @@ package com.zhongzheng.modules.bank.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.bank.bo.*;
-import com.zhongzheng.modules.bank.domain.*;
+import com.zhongzheng.modules.bank.domain.QuestionBusiness;
+import com.zhongzheng.modules.bank.domain.QuestionChapter;
+import com.zhongzheng.modules.bank.domain.QuestionChapterExam;
+import com.zhongzheng.modules.bank.domain.QuestionModuleChapter;
 import com.zhongzheng.modules.bank.mapper.QuestionChapterMapper;
 import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionChapterExamService;
 import com.zhongzheng.modules.bank.service.IQuestionChapterService;
 import com.zhongzheng.modules.bank.service.IQuestionModuleChapterService;
 import com.zhongzheng.modules.bank.vo.QuestionChapterVo;
-import com.zhongzheng.modules.course.bo.CourseSectionAddBo;
 import com.zhongzheng.modules.goods.domain.GoodsAttached;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
 import com.zhongzheng.modules.user.bo.CheckUserExamRecordBo;
 import com.zhongzheng.modules.user.service.IUserExamRecordService;
 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 org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -38,6 +44,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-25
  */
 @Service
+@DS("slave")
 public class QuestionChapterServiceImpl extends ServiceImpl<QuestionChapterMapper, QuestionChapter> implements IQuestionChapterService {
 
     @Autowired

+ 6 - 8
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionModuleChapterServiceImpl.java

@@ -1,26 +1,23 @@
 package com.zhongzheng.modules.bank.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.StrUtil;
-import com.zhongzheng.common.utils.DateUtils;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.modules.bank.bo.QuestionModuleChapterAddBo;
 import com.zhongzheng.modules.bank.bo.QuestionModuleChapterEditBo;
 import com.zhongzheng.modules.bank.bo.QuestionModuleChapterQueryBo;
 import com.zhongzheng.modules.bank.domain.QuestionModuleChapter;
 import com.zhongzheng.modules.bank.mapper.QuestionModuleChapterMapper;
-import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionModuleChapterService;
 import com.zhongzheng.modules.bank.vo.QuestionChapterVo;
 import com.zhongzheng.modules.bank.vo.QuestionModuleChapterVo;
 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.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -31,6 +28,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-26
  */
 @Service
+@DS("slave")
 public class QuestionModuleChapterServiceImpl extends ServiceImpl<QuestionModuleChapterMapper, QuestionModuleChapter> implements IQuestionModuleChapterService {
 
     @Autowired

+ 6 - 6
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionModuleServiceImpl.java

@@ -2,8 +2,13 @@ package com.zhongzheng.modules.bank.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.ServletUtils;
@@ -16,21 +21,15 @@ import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionModuleChapterService;
 import com.zhongzheng.modules.bank.service.IQuestionModuleService;
 import com.zhongzheng.modules.bank.vo.QuestionModuleVo;
-import com.zhongzheng.modules.course.domain.CourseModule;
 import com.zhongzheng.modules.goods.domain.GoodsAttached;
 import com.zhongzheng.modules.goods.service.IGoodsAttachedService;
 import com.zhongzheng.modules.user.bo.CheckUserExamRecordBo;
 import com.zhongzheng.modules.user.service.IUserExamRecordService;
 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 org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -42,6 +41,7 @@ import java.util.stream.Collectors;
  * @date 2021-10-25
  */
 @Service
+@DS("slave")
 public class QuestionModuleServiceImpl extends ServiceImpl<QuestionModuleMapper, QuestionModule> implements IQuestionModuleService {
 
     @Autowired

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini