Procházet zdrojové kódy

改造公共模块,和系统模块

1811872455@163.com před 3 týdny
rodič
revize
7c35e732f4
100 změnil soubory, kde provedl 1116 přidání a 1486 odebrání
  1. 0 21
      java/storlead-account/pom.xml
  2. 0 53
      java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/platform/admin/controller/PlatformTenantEnterpriseEntityController.java
  3. 0 53
      java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/platform/admin/controller/PlatformTenantEnterpriseUserRelEntityController.java
  4. 0 52
      java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/system/controller/AuthController.java
  5. 0 97
      java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/system/controller/SystemUserEntityController.java
  6. 0 53
      java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/tenant/controller/TenantEnterpriseEntityController.java
  7. 0 53
      java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/tenant/controller/TenantEnterpriseUserRelEntityController.java
  8. 0 5
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/platform/admin/package-info.java
  9. 0 16
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/SystemLoginDTO.java
  10. 0 14
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/SystemUserQueryDTO.java
  11. 0 37
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/SystemUserSaveDTO.java
  12. 0 19
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/TenantLoginDTO.java
  13. 0 47
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/entity/SystemUserEntity.java
  14. 0 9
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/mapper/SystemUserEntityMapper.java
  15. 0 14
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/AuthLoginService.java
  16. 0 7
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/SystemUserEntityService.java
  17. 0 140
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/impl/AuthLoginServiceImpl.java
  18. 0 13
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/impl/SystemUserEntityServiceImpl.java
  19. 0 19
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseQueryDTO.java
  20. 0 37
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseSaveDTO.java
  21. 0 20
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseUserRelQueryDTO.java
  22. 0 28
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseUserRelSaveDTO.java
  23. 0 49
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/entity/TenantEnterpriseEntity.java
  24. 0 37
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/entity/TenantEnterpriseUserRelEntity.java
  25. 0 9
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/mapper/TenantEnterpriseEntityMapper.java
  26. 0 9
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/mapper/TenantEnterpriseUserRelEntityMapper.java
  27. 0 4
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/package-info.java
  28. 0 7
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/TenantEnterpriseEntityService.java
  29. 0 7
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/TenantEnterpriseUserRelEntityService.java
  30. 0 13
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/impl/TenantEnterpriseEntityServiceImpl.java
  31. 0 13
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/impl/TenantEnterpriseUserRelEntityServiceImpl.java
  32. 0 133
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/web/TenantEnterpriseEntityWebDelegate.java
  33. 0 134
      java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/web/TenantEnterpriseUserRelEntityWebDelegate.java
  34. 0 5
      java/storlead-account/storlead-account-biz/src/main/resources/mapper/SystemUserEntityMapper.xml
  35. 0 5
      java/storlead-account/storlead-account-biz/src/main/resources/mapper/TenantEnterpriseEntityMapper.xml
  36. 0 5
      java/storlead-account/storlead-account-biz/src/main/resources/mapper/TenantEnterpriseUserRelEntityMapper.xml
  37. 21 1
      java/storlead-api/pom.xml
  38. 4 1
      java/storlead-api/src/main/java/com/storlead/api/StorleadTradeApplication.java
  39. 71 0
      java/storlead-api/src/main/java/com/storlead/login/AuthCaptchaApiController.java
  40. 189 0
      java/storlead-api/src/main/java/com/storlead/login/LoginApiController.java
  41. 21 1
      java/storlead-api/src/main/resources/application-dev.yml
  42. 7 0
      java/storlead-dependencies/pom.xml
  43. 6 0
      java/storlead-framework/storlead-common/pom.xml
  44. 0 66
      java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/result/BizResult.java
  45. 1 11
      java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/result/Result.java
  46. 23 0
      java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/util/ConvertUtils.java
  47. 227 0
      java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/util/OssBootUtil.java
  48. 26 0
      java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/AnnBase.java
  49. 22 0
      java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/AnnotateEnumType.java
  50. 11 0
      java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/Dept.java
  51. 32 0
      java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/Dict.java
  52. 26 0
      java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/OrgAutoMateAnnotate.java
  53. 0 4
      java/storlead-framework/storlead-mybatis/src/main/java/com/storlead/framework/mybatis/service/MyBaseService.java
  54. 1 1
      java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/filter/AuthRequestFilter.java
  55. 1 1
      java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/filter/RoutingRequestFilter.java
  56. 1 1
      java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/handler/ExceptionHandler.java
  57. 1 2
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/service/InsideMessageRecordService.java
  58. 1 3
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/service/WechatMessageService.java
  59. 1 2
      java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/service/impl/WechatMessageServiceImpl.java
  60. 2 2
      java/storlead-message/storlead-message-core/src/main/resources/mapper/MessageTemplateEventDetailMapper.xml
  61. 2 2
      java/storlead-message/storlead-message-core/src/main/resources/mapper/MessageTemplateEventGroupMapper.xml
  62. 1 1
      java/storlead-sasa/storlead-trade/storlead-customer/src/main/java/com/storlead/crm/customer/controller/CustomerAiAnalysisController.java
  63. 1 0
      java/storlead-sms/pom.xml
  64. 7 3
      java/storlead-sms/storlead-sms-api/pom.xml
  65. 70 0
      java/storlead-sms/storlead-sms-api/src/main/java/com/storlead/sms/api/SmsCaptchaApiController.java
  66. 34 0
      java/storlead-sms/storlead-sms-api/src/main/java/com/storlead/sms/api/SmsLogApiController.java
  67. 0 14
      java/storlead-sms/storlead-sms-api/src/main/java/com/storlead/sms/server/SmsLogService.java
  68. 1 1
      java/storlead-sms/storlead-sms-biz/pom.xml
  69. 0 47
      java/storlead-sms/storlead-sms-biz/src/main/java/com/storlead/sms/controller/SmsLogApiController.java
  70. 77 30
      java/storlead-sms/storlead-sms-biz/src/main/java/com/storlead/sms/service/impl/SmsLogServiceImpl.java
  71. 2 2
      java/storlead-sms/storlead-sms-biz/src/main/resources/mapper/SmsLogMapper.xml
  72. 25 0
      java/storlead-sms/storlead-sms-spi/pom.xml
  73. 22 0
      java/storlead-sms/storlead-sms-spi/src/main/java/com/storlead/sms/spi/SmsCaptchaScene.java
  74. 27 0
      java/storlead-sms/storlead-sms-spi/src/main/java/com/storlead/sms/spi/SmsCaptchaService.java
  75. 17 0
      java/storlead-sms/storlead-sms-spi/src/main/java/com/storlead/sms/spi/SmsLogService.java
  76. 9 35
      java/storlead-system/pom.xml
  77. 33 0
      java/storlead-system/storlead-system-api/pom.xml
  78. 4 0
      java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/api/package-info.java
  79. 74 0
      java/storlead-system/storlead-system-biz/pom.xml
  80. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/aspect/DictAspect.java
  81. 2 3
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/aspect/LogAspect.java
  82. 9 12
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/assemble/DataScope.java
  83. 1 1
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/assemble/LambdaUtils.java
  84. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/config/FastClientImporter.java
  85. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/config/JacksonConfig.java
  86. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/holder/RequestHolder.java
  87. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/CompanyCustomSettingsMapper.java
  88. 2 1
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/DeptRoleMapper.java
  89. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelExportColumnRuleMapper.java
  90. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelExportTemplateMapper.java
  91. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelImportColumnRuleMapper.java
  92. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelImportTemplateMapper.java
  93. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/FileResourceMapper.java
  94. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/MenuMapper.java
  95. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/QuickMenuMapper.java
  96. 1 1
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/RoleMapper.java
  97. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/RoleMenuMapper.java
  98. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/SysDictDetailMapper.java
  99. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/SysDictMapper.java
  100. 0 0
      java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/SysOperationLogMapper.java

+ 0 - 21
java/storlead-account/pom.xml

@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.storlead.boot</groupId>
-        <artifactId>storlead-saas-platform</artifactId>
-        <version>1.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>storlead-account</artifactId>
-    <packaging>pom</packaging>
-    <name>storlead-account</name>
-
-    <modules>
-        <module>storlead-account-biz</module>
-        <module>storlead-account-api</module>
-    </modules>
-</project>

+ 0 - 53
java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/platform/admin/controller/PlatformTenantEnterpriseEntityController.java

@@ -1,53 +0,0 @@
-package com.storlead.account.platform.admin.controller;
-
-import com.storlead.account.tenant.dto.TenantEnterpriseQueryDTO;
-import com.storlead.account.tenant.dto.TenantEnterpriseSaveDTO;
-import com.storlead.account.tenant.web.TenantEnterpriseEntityWebDelegate;
-import com.storlead.framework.web.assemble.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-
-/**
- * 平台系统管理员侧:跨租户维护企业(后续应加独立鉴权,如仅平台运营账号可访问)。
- */
-@RestController
-@RequestMapping("/platform/admin/tenant/enterprise")
-@Api(tags = "平台侧-租户企业管理")
-public class PlatformTenantEnterpriseEntityController {
-
-    @Resource
-    private TenantEnterpriseEntityWebDelegate enterpriseWebDelegate;
-
-    @PostMapping("/page")
-    @ApiOperation("平台侧企业分页")
-    public Result<Object> page(@RequestBody TenantEnterpriseQueryDTO query) {
-        return enterpriseWebDelegate.page(query);
-    }
-
-    @GetMapping("/detail")
-    @ApiOperation("平台侧企业详情")
-    public Result<Object> detail(@RequestParam("id") Long id) {
-        return enterpriseWebDelegate.detail(id);
-    }
-
-    @PostMapping("/save")
-    @ApiOperation("平台侧新增企业")
-    public Result<Object> save(@RequestBody TenantEnterpriseSaveDTO dto) {
-        return enterpriseWebDelegate.save(dto);
-    }
-
-    @PostMapping("/update")
-    @ApiOperation("平台侧修改企业")
-    public Result<Object> update(@RequestBody TenantEnterpriseSaveDTO dto) {
-        return enterpriseWebDelegate.update(dto);
-    }
-
-    @PostMapping("/delete")
-    @ApiOperation("平台侧删除企业")
-    public Result<Object> delete(@RequestParam("id") Long id) {
-        return enterpriseWebDelegate.delete(id);
-    }
-}

+ 0 - 53
java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/platform/admin/controller/PlatformTenantEnterpriseUserRelEntityController.java

@@ -1,53 +0,0 @@
-package com.storlead.account.platform.admin.controller;
-
-import com.storlead.account.tenant.dto.TenantEnterpriseUserRelQueryDTO;
-import com.storlead.account.tenant.dto.TenantEnterpriseUserRelSaveDTO;
-import com.storlead.account.tenant.web.TenantEnterpriseUserRelEntityWebDelegate;
-import com.storlead.framework.web.assemble.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-
-/**
- * 平台系统管理员侧:跨租户维护企业-用户关系。
- */
-@RestController
-@RequestMapping("/platform/admin/tenant/enterprise-user-rel")
-@Api(tags = "平台侧-租户企业用户关系管理")
-public class PlatformTenantEnterpriseUserRelEntityController {
-
-    @Resource
-    private TenantEnterpriseUserRelEntityWebDelegate userRelWebDelegate;
-
-    @PostMapping("/page")
-    @ApiOperation("平台侧企业用户关系分页")
-    public Result<Object> page(@RequestBody TenantEnterpriseUserRelQueryDTO query) {
-        return userRelWebDelegate.page(query);
-    }
-
-    @GetMapping("/detail")
-    @ApiOperation("平台侧企业用户关系详情")
-    public Result<Object> detail(@RequestParam("id") Long id) {
-        return userRelWebDelegate.detail(id);
-    }
-
-    @PostMapping("/save")
-    @ApiOperation("平台侧新增企业用户关系")
-    public Result<Object> save(@RequestBody TenantEnterpriseUserRelSaveDTO dto) {
-        return userRelWebDelegate.save(dto);
-    }
-
-    @PostMapping("/update")
-    @ApiOperation("平台侧修改企业用户关系")
-    public Result<Object> update(@RequestBody TenantEnterpriseUserRelSaveDTO dto) {
-        return userRelWebDelegate.update(dto);
-    }
-
-    @PostMapping("/delete")
-    @ApiOperation("平台侧删除企业用户关系")
-    public Result<Object> delete(@RequestParam("id") Long id) {
-        return userRelWebDelegate.delete(id);
-    }
-}

+ 0 - 52
java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/system/controller/AuthController.java

@@ -1,52 +0,0 @@
-package com.storlead.account.system.controller;
-
-import com.storlead.account.system.dto.SystemLoginDTO;
-import com.storlead.account.system.dto.TenantLoginDTO;
-import com.storlead.account.system.service.AuthLoginService;
-import com.storlead.framework.common.constant.DefContants;
-import com.storlead.framework.util.LoginUserUtil;
-import com.storlead.framework.web.assemble.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-
-@RestController
-@RequestMapping("/account/auth")
-@Api(tags = "账户认证")
-public class AuthController {
-
-    @Resource
-    private AuthLoginService authLoginService;
-
-    @PostMapping("/system/login")
-    @ApiOperation("系统用户登录")
-    public Result<Object> systemLogin(@RequestBody SystemLoginDTO dto, HttpServletRequest request) {
-        return authLoginService.systemLogin(dto, request.getRemoteAddr());
-    }
-
-    @PostMapping("/tenant/login")
-    @ApiOperation("租户用户登录")
-    public Result<Object> tenantLogin(@RequestBody TenantLoginDTO dto, HttpServletRequest request) {
-        return authLoginService.tenantLogin(dto, request.getRemoteAddr());
-    }
-
-    @PostMapping("/logout")
-    @ApiOperation("退出登录")
-    public Result<Object> logout(HttpServletRequest request) {
-        String token = request.getHeader(DefContants.ACCESS_TOKEN);
-        if (StringUtils.isBlank(token)) {
-            token = request.getParameter(DefContants.ACCESS_TOKEN);
-        }
-        return authLoginService.logout(token);
-    }
-
-    @GetMapping("/me")
-    @ApiOperation("获取当前登录用户")
-    public Result<Object> me() {
-        return Result.ok(LoginUserUtil.getLoginUser());
-    }
-}

+ 0 - 97
java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/system/controller/SystemUserEntityController.java

@@ -1,97 +0,0 @@
-package com.storlead.account.system.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.account.system.dto.SystemUserQueryDTO;
-import com.storlead.account.system.dto.SystemUserSaveDTO;
-import com.storlead.account.system.entity.SystemUserEntity;
-import com.storlead.account.system.service.SystemUserEntityService;
-import com.storlead.framework.common.ecode.BCryptPasswordEncoder;
-import com.storlead.framework.web.assemble.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.util.Objects;
-
-@RestController
-@RequestMapping("/platform/admin/system-user")
-@Api(tags = "平台系统用户管理")
-public class SystemUserEntityController {
-
-    @Resource
-    private SystemUserEntityService systemUserService;
-    @Resource
-    private BCryptPasswordEncoder passwordEncoder;
-
-    @PostMapping("/page")
-    @ApiOperation("系统用户分页查询")
-    public Result<Object> page(@RequestBody SystemUserQueryDTO query) {
-        Page<SystemUserEntity> page = new Page<>(query.getPageIndex(), query.getPageSize());
-        LambdaQueryWrapper<SystemUserEntity> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(SystemUserEntity::getIsDelete, 0);
-        if (StringUtils.isNotBlank(query.getBlurry())) {
-            wrapper.and(w -> w.like(SystemUserEntity::getUsername, query.getBlurry())
-                    .or().like(SystemUserEntity::getMobile, query.getBlurry())
-                    .or().like(SystemUserEntity::getEmail, query.getBlurry())
-                    .or().like(SystemUserEntity::getNickName, query.getBlurry()));
-        }
-        wrapper.orderByAsc(SystemUserEntity::getSort).orderByDesc(SystemUserEntity::getCreateTime);
-        return Result.ok(systemUserService.page(page, wrapper));
-    }
-
-    @GetMapping("/detail")
-    @ApiOperation("系统用户详情")
-    public Result<Object> detail(@RequestParam("id") Long id) {
-        return Result.ok(systemUserService.getById(id));
-    }
-
-    @PostMapping("/save")
-    @ApiOperation("新增系统用户")
-    public Result<Object> save(@RequestBody SystemUserSaveDTO dto) {
-        if (StringUtils.isBlank(dto.getUsername()) || StringUtils.isBlank(dto.getPassword())) {
-            return Result.error("username和password不能为空");
-        }
-        SystemUserEntity entity = new SystemUserEntity();
-        BeanUtils.copyProperties(dto, entity);
-        entity.setId(null);
-        entity.setPasswordHash(passwordEncoder.encode(dto.getPassword()));
-        entity.setIsDelete(0);
-        if (entity.getEnabled() == null) {
-            entity.setEnabled(true);
-        }
-        if (entity.getSort() == null) {
-            entity.setSort(0);
-        }
-        return Result.ok(systemUserService.save(entity));
-    }
-
-    @PostMapping("/update")
-    @ApiOperation("修改系统用户")
-    public Result<Object> update(@RequestBody SystemUserSaveDTO dto) {
-        if (Objects.isNull(dto.getId())) {
-            return Result.error("id不能为空");
-        }
-        SystemUserEntity entity = systemUserService.getById(dto.getId());
-        if (entity == null) {
-            return Result.error("记录不存在");
-        }
-        BeanUtils.copyProperties(dto, entity, "passwordHash", "createTime", "createBy", "ownerBy");
-        if (StringUtils.isNotBlank(dto.getPassword())) {
-            entity.setPasswordHash(passwordEncoder.encode(dto.getPassword()));
-        }
-        if (dto.getEnabled() != null) {
-            entity.setEnabled(dto.getEnabled() == 1);
-        }
-        return Result.ok(systemUserService.updateById(entity));
-    }
-
-    @PostMapping("/delete")
-    @ApiOperation("删除系统用户")
-    public Result<Object> delete(@RequestParam("id") Long id) {
-        return Result.ok(systemUserService.lgDelete(id));
-    }
-}

+ 0 - 53
java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/tenant/controller/TenantEnterpriseEntityController.java

@@ -1,53 +0,0 @@
-package com.storlead.account.tenant.controller;
-
-import com.storlead.account.tenant.dto.TenantEnterpriseQueryDTO;
-import com.storlead.account.tenant.dto.TenantEnterpriseSaveDTO;
-import com.storlead.account.tenant.web.TenantEnterpriseEntityWebDelegate;
-import com.storlead.framework.web.assemble.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-
-/**
- * 企业租户侧:企业信息维护(后续应强制使用登录上下文中的 tenant_id,禁止越权查询其它租户)。
- */
-@RestController
-@RequestMapping("/account/tenant/enterprise")
-@Api(tags = "租户侧-企业管理")
-public class TenantEnterpriseEntityController {
-
-    @Resource
-    private TenantEnterpriseEntityWebDelegate enterpriseWebDelegate;
-
-    @PostMapping("/page")
-    @ApiOperation("租户侧企业分页")
-    public Result<Object> page(@RequestBody TenantEnterpriseQueryDTO query) {
-        return enterpriseWebDelegate.tenantPage(query);
-    }
-
-    @GetMapping("/detail")
-    @ApiOperation("租户侧企业详情")
-    public Result<Object> detail(@RequestParam("id") Long id) {
-        return enterpriseWebDelegate.tenantDetail(id);
-    }
-
-    @PostMapping("/save")
-    @ApiOperation("租户侧新增企业")
-    public Result<Object> save(@RequestBody TenantEnterpriseSaveDTO dto) {
-        return enterpriseWebDelegate.tenantSave(dto);
-    }
-
-    @PostMapping("/update")
-    @ApiOperation("租户侧修改企业")
-    public Result<Object> update(@RequestBody TenantEnterpriseSaveDTO dto) {
-        return enterpriseWebDelegate.tenantUpdate(dto);
-    }
-
-    @PostMapping("/delete")
-    @ApiOperation("租户侧删除企业")
-    public Result<Object> delete(@RequestParam("id") Long id) {
-        return enterpriseWebDelegate.tenantDelete(id);
-    }
-}

+ 0 - 53
java/storlead-account/storlead-account-api/src/main/java/com/storlead/account/tenant/controller/TenantEnterpriseUserRelEntityController.java

@@ -1,53 +0,0 @@
-package com.storlead.account.tenant.controller;
-
-import com.storlead.account.tenant.dto.TenantEnterpriseUserRelQueryDTO;
-import com.storlead.account.tenant.dto.TenantEnterpriseUserRelSaveDTO;
-import com.storlead.account.tenant.web.TenantEnterpriseUserRelEntityWebDelegate;
-import com.storlead.framework.web.assemble.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-
-/**
- * 企业租户侧:本企业成员关系维护。
- */
-@RestController
-@RequestMapping("/account/tenant/enterprise-user-rel")
-@Api(tags = "租户侧-企业用户关系管理")
-public class TenantEnterpriseUserRelEntityController {
-
-    @Resource
-    private TenantEnterpriseUserRelEntityWebDelegate userRelWebDelegate;
-
-    @PostMapping("/page")
-    @ApiOperation("租户侧企业用户关系分页")
-    public Result<Object> page(@RequestBody TenantEnterpriseUserRelQueryDTO query) {
-        return userRelWebDelegate.tenantPage(query);
-    }
-
-    @GetMapping("/detail")
-    @ApiOperation("租户侧企业用户关系详情")
-    public Result<Object> detail(@RequestParam("id") Long id) {
-        return userRelWebDelegate.tenantDetail(id);
-    }
-
-    @PostMapping("/save")
-    @ApiOperation("租户侧新增企业用户关系")
-    public Result<Object> save(@RequestBody TenantEnterpriseUserRelSaveDTO dto) {
-        return userRelWebDelegate.tenantSave(dto);
-    }
-
-    @PostMapping("/update")
-    @ApiOperation("租户侧修改企业用户关系")
-    public Result<Object> update(@RequestBody TenantEnterpriseUserRelSaveDTO dto) {
-        return userRelWebDelegate.tenantUpdate(dto);
-    }
-
-    @PostMapping("/delete")
-    @ApiOperation("租户侧删除企业用户关系")
-    public Result<Object> delete(@RequestParam("id") Long id) {
-        return userRelWebDelegate.tenantDelete(id);
-    }
-}

+ 0 - 5
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/platform/admin/package-info.java

@@ -1,5 +0,0 @@
-/**
- * 平台系统管理员侧:可跨租户维护企业与成员关系(后续应单独鉴权,如仅 {@code isAdmin} 或独立角色体系),
- * 与 {@link com.storlead.account.tenant} 入口分离,避免与企业用户混用同一套 URL。
- */
-package com.storlead.account.platform.admin;

+ 0 - 16
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/SystemLoginDTO.java

@@ -1,16 +0,0 @@
-package com.storlead.account.system.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "SystemLoginDTO", description = "系统用户登录入参")
-public class SystemLoginDTO {
-
-    @ApiModelProperty(value = "登录账号", required = true)
-    private String username;
-
-    @ApiModelProperty(value = "密码", required = true)
-    private String password;
-}

+ 0 - 14
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/SystemUserQueryDTO.java

@@ -1,14 +0,0 @@
-package com.storlead.account.system.dto;
-
-import com.storlead.framework.mybatis.page.Page;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "SystemUserQueryDTO", description = "系统用户分页查询条件")
-public class SystemUserQueryDTO extends Page {
-
-    @ApiModelProperty(value = "模糊关键字(账号/手机号/邮箱/昵称)")
-    private String blurry;
-}

+ 0 - 37
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/SystemUserSaveDTO.java

@@ -1,37 +0,0 @@
-package com.storlead.account.system.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "SystemUserSaveDTO", description = "系统用户新增/修改入参")
-public class SystemUserSaveDTO {
-
-    @ApiModelProperty(value = "主键ID,新增不传,修改必传")
-    private Long id;
-
-    @ApiModelProperty(value = "登录账号")
-    private String username;
-
-    @ApiModelProperty(value = "手机号")
-    private String mobile;
-
-    @ApiModelProperty(value = "邮箱")
-    private String email;
-
-    @ApiModelProperty(value = "密码(新增必传,修改可选)")
-    private String password;
-
-    @ApiModelProperty(value = "昵称")
-    private String nickName;
-
-    @ApiModelProperty(value = "头像")
-    private String avatar;
-
-    @ApiModelProperty(value = "是否启用:1启用 0禁用")
-    private Integer enabled;
-
-    @ApiModelProperty(value = "显示排序")
-    private Integer sort;
-}

+ 0 - 19
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/dto/TenantLoginDTO.java

@@ -1,19 +0,0 @@
-package com.storlead.account.system.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "TenantLoginDTO", description = "租户用户登录入参")
-public class TenantLoginDTO {
-
-    @ApiModelProperty(value = "登录账号", required = true)
-    private String username;
-
-    @ApiModelProperty(value = "密码", required = true)
-    private String password;
-
-    @ApiModelProperty(value = "租户ID(绑定多个租户时建议传)")
-    private Long tenantId;
-}

+ 0 - 47
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/entity/SystemUserEntity.java

@@ -1,47 +0,0 @@
-package com.storlead.account.system.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.storlead.framework.mybatis.entity.SysBaseField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.util.Date;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sp_system_user")
-@ApiModel(value = "SystemUserEntity", description = "系统用户(全局账号)")
-public class SystemUserEntity extends SysBaseField {
-
-    @TableId(type = IdType.AUTO)
-    @ApiModelProperty(value = "主键ID")
-    private Long id;
-
-    @ApiModelProperty(value = "登录账号")
-    private String username;
-
-    @ApiModelProperty(value = "手机号")
-    private String mobile;
-
-    @ApiModelProperty(value = "邮箱")
-    private String email;
-
-    @ApiModelProperty(value = "密码哈希")
-    private String passwordHash;
-
-    @ApiModelProperty(value = "昵称")
-    private String nickName;
-
-    @ApiModelProperty(value = "头像")
-    private String avatar;
-
-    @ApiModelProperty(value = "最近登录时间")
-    private Date lastLoginAt;
-
-    @ApiModelProperty(value = "最近登录IP")
-    private String lastLoginIp;
-}

+ 0 - 9
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/mapper/SystemUserEntityMapper.java

@@ -1,9 +0,0 @@
-package com.storlead.account.system.mapper;
-
-import com.storlead.account.system.entity.SystemUserEntity;
-import com.storlead.framework.mybatis.mapper.MyBaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface SystemUserEntityMapper extends MyBaseMapper<SystemUserEntity> {
-}

+ 0 - 14
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/AuthLoginService.java

@@ -1,14 +0,0 @@
-package com.storlead.account.system.service;
-
-import com.storlead.account.system.dto.SystemLoginDTO;
-import com.storlead.account.system.dto.TenantLoginDTO;
-import com.storlead.framework.web.assemble.Result;
-
-public interface AuthLoginService {
-
-    Result<Object> systemLogin(SystemLoginDTO dto, String ip);
-
-    Result<Object> tenantLogin(TenantLoginDTO dto, String ip);
-
-    Result<Object> logout(String token);
-}

+ 0 - 7
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/SystemUserEntityService.java

@@ -1,7 +0,0 @@
-package com.storlead.account.system.service;
-
-import com.storlead.account.system.entity.SystemUserEntity;
-import com.storlead.framework.mybatis.service.MyBaseService;
-
-public interface SystemUserEntityService extends MyBaseService<SystemUserEntity> {
-}

+ 0 - 140
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/impl/AuthLoginServiceImpl.java

@@ -1,140 +0,0 @@
-package com.storlead.account.system.service.impl;
-
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.storlead.account.system.dto.SystemLoginDTO;
-import com.storlead.account.system.dto.TenantLoginDTO;
-import com.storlead.account.system.entity.SystemUserEntity;
-import com.storlead.account.system.service.AuthLoginService;
-import com.storlead.account.system.service.SystemUserEntityService;
-import com.storlead.account.tenant.entity.TenantEnterpriseUserRelEntity;
-import com.storlead.account.tenant.service.TenantEnterpriseUserRelEntityService;
-import com.storlead.framework.auth.vo.LoginUser;
-import com.storlead.framework.common.ecode.BCryptPasswordEncoder;
-import com.storlead.framework.redis.RedisService;
-import com.storlead.framework.web.assemble.Result;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-@Service
-public class AuthLoginServiceImpl implements AuthLoginService {
-
-    private static final long TOKEN_EXPIRE_SECONDS = 7L * 24L * 60L * 60L;
-
-    @Resource
-    private SystemUserEntityService systemUserService;
-    @Resource
-    private TenantEnterpriseUserRelEntityService tenantUserRelService;
-    @Resource
-    private BCryptPasswordEncoder passwordEncoder;
-    @Resource
-    private RedisService redisService;
-
-    @Override
-    public Result<Object> systemLogin(SystemLoginDTO dto, String ip) {
-        if (StringUtils.isBlank(dto.getUsername()) || StringUtils.isBlank(dto.getPassword())) {
-            return Result.error("用户名或密码不能为空");
-        }
-        SystemUserEntity user = getEnabledSystemUser(dto.getUsername());
-        if (user == null || !passwordEncoder.matches(dto.getPassword(), user.getPasswordHash())) {
-            return Result.error("用户名或密码错误");
-        }
-        LoginUser loginUser = toLoginUser(user, true, null);
-        String token = issueToken(loginUser);
-        updateLastLogin(user, ip);
-        return loginResult(token, loginUser);
-    }
-
-    @Override
-    public Result<Object> tenantLogin(TenantLoginDTO dto, String ip) {
-        if (StringUtils.isBlank(dto.getUsername()) || StringUtils.isBlank(dto.getPassword())) {
-            return Result.error("用户名或密码不能为空");
-        }
-        SystemUserEntity user = getEnabledSystemUser(dto.getUsername());
-        if (user == null || !passwordEncoder.matches(dto.getPassword(), user.getPasswordHash())) {
-            return Result.error("用户名或密码错误");
-        }
-
-        LambdaQueryWrapper<TenantEnterpriseUserRelEntity> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(TenantEnterpriseUserRelEntity::getUserId, user.getId())
-                .eq(TenantEnterpriseUserRelEntity::getIsDelete, 0)
-                .eq(TenantEnterpriseUserRelEntity::getEnabled, true);
-        if (dto.getTenantId() != null) {
-            wrapper.eq(TenantEnterpriseUserRelEntity::getTenantId, dto.getTenantId());
-        }
-        List<TenantEnterpriseUserRelEntity> relList = tenantUserRelService.list(wrapper);
-        if (relList == null || relList.isEmpty()) {
-            return Result.error("当前账号未绑定可登录租户");
-        }
-        if (dto.getTenantId() == null && relList.size() > 1) {
-            return Result.error("账号绑定多个租户,请传tenantId");
-        }
-
-        TenantEnterpriseUserRelEntity rel = relList.get(0);
-        LoginUser loginUser = toLoginUser(user, false, rel.getTenantId());
-        String token = issueToken(loginUser);
-        updateLastLogin(user, ip);
-        return loginResult(token, loginUser);
-    }
-
-    @Override
-    public Result<Object> logout(String token) {
-        if (StringUtils.isBlank(token)) {
-            return Result.error("token不能为空");
-        }
-        redisService.deleteObject(token);
-        return Result.ok(true);
-    }
-
-    private SystemUserEntity getEnabledSystemUser(String username) {
-        return systemUserService.getOne(new LambdaQueryWrapper<SystemUserEntity>()
-                .eq(SystemUserEntity::getUsername, username)
-                .eq(SystemUserEntity::getIsDelete, 0)
-                .eq(SystemUserEntity::getEnabled, true)
-                .last("limit 1"));
-    }
-
-    private LoginUser toLoginUser(SystemUserEntity user, boolean isAdmin, Long tenantId) {
-        LoginUser loginUser = new LoginUser();
-        loginUser.setId(user.getId());
-        loginUser.setUserName(user.getUsername());
-        loginUser.setNickName(user.getNickName());
-        loginUser.setAvatar(user.getAvatar());
-        loginUser.setEmail(user.getEmail());
-        loginUser.setMobile(user.getMobile());
-        loginUser.setEnabled(Boolean.TRUE.equals(user.getEnabled()) ? 1 : 0);
-        loginUser.setIsAdmin(isAdmin);
-        loginUser.setTenantId(tenantId);
-        loginUser.setCompanyId(tenantId);
-        return loginUser;
-    }
-
-    private String issueToken(LoginUser loginUser) {
-        String token = UUID.randomUUID().toString().replace("-", "");
-        redisService.setCacheObject(token, JSONUtil.toJsonStr(loginUser), TOKEN_EXPIRE_SECONDS, TimeUnit.SECONDS);
-        return token;
-    }
-
-    private Result<Object> loginResult(String token, LoginUser loginUser) {
-        Map<String, Object> data = new HashMap<>();
-        data.put("token", token);
-        data.put("user", loginUser);
-        return Result.ok(data);
-    }
-
-    private void updateLastLogin(SystemUserEntity user, String ip) {
-        SystemUserEntity update = new SystemUserEntity();
-        update.setId(user.getId());
-        update.setLastLoginAt(new Date());
-        update.setLastLoginIp(ip);
-        systemUserService.updateById(update);
-    }
-}

+ 0 - 13
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/system/service/impl/SystemUserEntityServiceImpl.java

@@ -1,13 +0,0 @@
-package com.storlead.account.system.service.impl;
-
-import com.storlead.account.system.entity.SystemUserEntity;
-import com.storlead.account.system.mapper.SystemUserEntityMapper;
-import com.storlead.account.system.service.SystemUserEntityService;
-import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
-import org.springframework.stereotype.Service;
-
-@Service
-public class SystemUserEntityServiceImpl
-        extends MyBaseServiceImpl<SystemUserEntityMapper, SystemUserEntity>
-        implements SystemUserEntityService {
-}

+ 0 - 19
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseQueryDTO.java

@@ -1,19 +0,0 @@
-package com.storlead.account.tenant.dto;
-
-import com.storlead.framework.mybatis.page.Page;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "TenantEnterpriseQueryDTO", description = "企业分页查询条件")
-public class TenantEnterpriseQueryDTO extends Page {
-
-    /** 模糊匹配:企业名称、编码、信用代码 */
-    @ApiModelProperty(value = "模糊关键字(企业名称/编码/信用代码)")
-    private String blurry;
-
-    /** 按租户过滤;企业租户端建议由服务端强制覆盖为当前登录租户 */
-    @ApiModelProperty(value = "租户ID(企业维度 tenant_id)")
-    private Long tenantId;
-}

+ 0 - 37
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseSaveDTO.java

@@ -1,37 +0,0 @@
-package com.storlead.account.tenant.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "TenantEnterpriseSaveDTO", description = "企业新增/修改入参")
-public class TenantEnterpriseSaveDTO {
-
-    @ApiModelProperty(value = "主键ID,新增不传,修改必传")
-    private Long id;
-
-    @ApiModelProperty(value = "租户ID(企业维度 tenant_id)")
-    private Long tenantId;
-
-    @ApiModelProperty(value = "企业编码")
-    private String enterpriseCode;
-
-    @ApiModelProperty(value = "企业名称")
-    private String enterpriseName;
-
-    @ApiModelProperty(value = "统一社会信用代码")
-    private String licenseNo;
-
-    @ApiModelProperty(value = "联系人姓名")
-    private String contactName;
-
-    @ApiModelProperty(value = "联系人手机")
-    private String contactPhone;
-
-    @ApiModelProperty(value = "联系人邮箱")
-    private String contactEmail;
-
-    @ApiModelProperty(value = "显示排序,数值越小越靠前")
-    private Integer sort;
-}

+ 0 - 20
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseUserRelQueryDTO.java

@@ -1,20 +0,0 @@
-package com.storlead.account.tenant.dto;
-
-import com.storlead.framework.mybatis.page.Page;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "TenantEnterpriseUserRelQueryDTO", description = "企业-用户关系分页查询条件")
-public class TenantEnterpriseUserRelQueryDTO extends Page {
-
-    @ApiModelProperty(value = "租户ID(企业维度 tenant_id)")
-    private Long tenantId;
-
-    @ApiModelProperty(value = "企业主表ID(sp_tenant_enterprise.id)")
-    private Long enterpriseId;
-
-    @ApiModelProperty(value = "平台用户ID")
-    private Long userId;
-}

+ 0 - 28
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/dto/TenantEnterpriseUserRelSaveDTO.java

@@ -1,28 +0,0 @@
-package com.storlead.account.tenant.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-@Data
-@ApiModel(value = "TenantEnterpriseUserRelSaveDTO", description = "企业-用户关系新增/修改入参")
-public class TenantEnterpriseUserRelSaveDTO {
-
-    @ApiModelProperty(value = "主键ID,新增不传,修改必传")
-    private Long id;
-
-    @ApiModelProperty(value = "租户ID(企业维度 tenant_id)")
-    private Long tenantId;
-
-    @ApiModelProperty(value = "企业主表ID(sp_tenant_enterprise.id)")
-    private Long enterpriseId;
-
-    @ApiModelProperty(value = "平台用户ID")
-    private Long userId;
-
-    @ApiModelProperty(value = "是否企业管理员:0否 1是")
-    private Integer isAdmin;
-
-    @ApiModelProperty(value = "显示排序")
-    private Integer sort;
-}

+ 0 - 49
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/entity/TenantEnterpriseEntity.java

@@ -1,49 +0,0 @@
-package com.storlead.account.tenant.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.storlead.framework.mybatis.entity.SysBaseField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 企业主体(账户体系-企业维度),映射表 sp_tenant_enterprise。
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sp_tenant_enterprise")
-@ApiModel(value = "TenantEnterpriseEntity", description = "企业主体,对应表 sp_tenant_enterprise")
-public class TenantEnterpriseEntity extends SysBaseField {
-
-    /** 主键 */
-    @TableId(type = IdType.AUTO)
-    @ApiModelProperty(value = "主键ID")
-    private Long id;
-
-    /** 企业编码,业务侧唯一标识(与库表 enterprise_code 一致) */
-    @ApiModelProperty(value = "企业编码")
-    private String enterpriseCode;
-
-    /** 企业名称 */
-    @ApiModelProperty(value = "企业名称")
-    private String enterpriseName;
-
-    /** 统一社会信用代码,可空 */
-    @ApiModelProperty(value = "统一社会信用代码")
-    private String licenseNo;
-
-    /** 联系人姓名 */
-    @ApiModelProperty(value = "联系人姓名")
-    private String contactName;
-
-    /** 联系人手机 */
-    @ApiModelProperty(value = "联系人手机")
-    private String contactPhone;
-
-    /** 联系人邮箱 */
-    @ApiModelProperty(value = "联系人邮箱")
-    private String contactEmail;
-}

+ 0 - 37
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/entity/TenantEnterpriseUserRelEntity.java

@@ -1,37 +0,0 @@
-package com.storlead.account.tenant.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.storlead.framework.mybatis.entity.SysBaseField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 企业下用户绑定关系,映射表 sp_tenant_user_rel。
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("sp_tenant_user_rel")
-@ApiModel(value = "TenantEnterpriseUserRelEntity", description = "企业-用户绑定关系,对应表 sp_tenant_user_rel")
-public class TenantEnterpriseUserRelEntity extends SysBaseField {
-
-    /** 主键 */
-    @TableId(type = IdType.AUTO)
-    @ApiModelProperty(value = "主键ID")
-    private Long id;
-
-    /** 关联企业主表主键 sp_tenant_enterprise.id */
-    @ApiModelProperty(value = "企业主表ID(sp_tenant_enterprise.id)")
-    private Long enterpriseId;
-
-    /** 平台用户主键 */
-    @ApiModelProperty(value = "平台用户ID")
-    private Long userId;
-
-    /** 是否该企业管理员:0 否,1 是 */
-    @ApiModelProperty(value = "是否企业管理员:0否 1是")
-    private Integer isAdmin;
-}

+ 0 - 9
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/mapper/TenantEnterpriseEntityMapper.java

@@ -1,9 +0,0 @@
-package com.storlead.account.tenant.mapper;
-
-import com.storlead.account.tenant.entity.TenantEnterpriseEntity;
-import com.storlead.framework.mybatis.mapper.MyBaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface TenantEnterpriseEntityMapper extends MyBaseMapper<TenantEnterpriseEntity> {
-}

+ 0 - 9
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/mapper/TenantEnterpriseUserRelEntityMapper.java

@@ -1,9 +0,0 @@
-package com.storlead.account.tenant.mapper;
-
-import com.storlead.account.tenant.entity.TenantEnterpriseUserRelEntity;
-import com.storlead.framework.mybatis.mapper.MyBaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface TenantEnterpriseUserRelEntityMapper extends MyBaseMapper<TenantEnterpriseUserRelEntity> {
-}

+ 0 - 4
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/package-info.java

@@ -1,4 +0,0 @@
-/**
- * 企业租户侧账户能力:操作范围应限定在当前登录用户所属 {@code tenant_id}(后续可接数据权限/网关校验)。
- */
-package com.storlead.account.tenant;

+ 0 - 7
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/TenantEnterpriseEntityService.java

@@ -1,7 +0,0 @@
-package com.storlead.account.tenant.service;
-
-import com.storlead.account.tenant.entity.TenantEnterpriseEntity;
-import com.storlead.framework.mybatis.service.MyBaseService;
-
-public interface TenantEnterpriseEntityService extends MyBaseService<TenantEnterpriseEntity> {
-}

+ 0 - 7
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/TenantEnterpriseUserRelEntityService.java

@@ -1,7 +0,0 @@
-package com.storlead.account.tenant.service;
-
-import com.storlead.account.tenant.entity.TenantEnterpriseUserRelEntity;
-import com.storlead.framework.mybatis.service.MyBaseService;
-
-public interface TenantEnterpriseUserRelEntityService extends MyBaseService<TenantEnterpriseUserRelEntity> {
-}

+ 0 - 13
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/impl/TenantEnterpriseEntityServiceImpl.java

@@ -1,13 +0,0 @@
-package com.storlead.account.tenant.service.impl;
-
-import com.storlead.account.tenant.entity.TenantEnterpriseEntity;
-import com.storlead.account.tenant.mapper.TenantEnterpriseEntityMapper;
-import com.storlead.account.tenant.service.TenantEnterpriseEntityService;
-import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
-import org.springframework.stereotype.Service;
-
-@Service
-public class TenantEnterpriseEntityServiceImpl
-        extends MyBaseServiceImpl<TenantEnterpriseEntityMapper, TenantEnterpriseEntity>
-        implements TenantEnterpriseEntityService {
-}

+ 0 - 13
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/service/impl/TenantEnterpriseUserRelEntityServiceImpl.java

@@ -1,13 +0,0 @@
-package com.storlead.account.tenant.service.impl;
-
-import com.storlead.account.tenant.entity.TenantEnterpriseUserRelEntity;
-import com.storlead.account.tenant.mapper.TenantEnterpriseUserRelEntityMapper;
-import com.storlead.account.tenant.service.TenantEnterpriseUserRelEntityService;
-import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
-import org.springframework.stereotype.Service;
-
-@Service
-public class TenantEnterpriseUserRelEntityServiceImpl
-        extends MyBaseServiceImpl<TenantEnterpriseUserRelEntityMapper, TenantEnterpriseUserRelEntity>
-        implements TenantEnterpriseUserRelEntityService {
-}

+ 0 - 133
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/web/TenantEnterpriseEntityWebDelegate.java

@@ -1,133 +0,0 @@
-package com.storlead.account.tenant.web;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.account.tenant.dto.TenantEnterpriseQueryDTO;
-import com.storlead.account.tenant.dto.TenantEnterpriseSaveDTO;
-import com.storlead.account.tenant.entity.TenantEnterpriseEntity;
-import com.storlead.account.tenant.service.TenantEnterpriseEntityService;
-import com.storlead.framework.util.LoginUserUtil;
-import com.storlead.framework.web.assemble.Result;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.util.Objects;
-
-@Component
-public class TenantEnterpriseEntityWebDelegate {
-
-    @Resource
-    private TenantEnterpriseEntityService enterpriseService;
-
-    public Result<Object> tenantPage(TenantEnterpriseQueryDTO query) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        query.setTenantId(currentTenantId);
-        return page(query);
-    }
-
-    public Result<Object> page(TenantEnterpriseQueryDTO query) {
-        Page<TenantEnterpriseEntity> page = new Page<>(query.getPageIndex(), query.getPageSize());
-        LambdaQueryWrapper<TenantEnterpriseEntity> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(TenantEnterpriseEntity::getIsDelete, 0);
-        if (query.getTenantId() != null) {
-            wrapper.eq(TenantEnterpriseEntity::getTenantId, query.getTenantId());
-        }
-        if (StringUtils.isNotBlank(query.getBlurry())) {
-            wrapper.and(w -> w.like(TenantEnterpriseEntity::getEnterpriseName, query.getBlurry())
-                    .or()
-                    .like(TenantEnterpriseEntity::getEnterpriseCode, query.getBlurry())
-                    .or()
-                    .like(TenantEnterpriseEntity::getLicenseNo, query.getBlurry()));
-        }
-        wrapper.orderByAsc(TenantEnterpriseEntity::getSort).orderByDesc(TenantEnterpriseEntity::getCreateTime);
-        return Result.ok(enterpriseService.page(page, wrapper));
-    }
-
-    public Result<Object> detail(Long id) {
-        return Result.ok(enterpriseService.getById(id));
-    }
-
-    public Result<Object> tenantDetail(Long id) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        TenantEnterpriseEntity entity = enterpriseService.getById(id);
-        if (entity == null || !currentTenantId.equals(entity.getTenantId())) {
-            return Result.error("无权查看该数据");
-        }
-        return Result.ok(entity);
-    }
-
-    public Result<Object> save(TenantEnterpriseSaveDTO dto) {
-        TenantEnterpriseEntity entity = new TenantEnterpriseEntity();
-        BeanUtils.copyProperties(dto, entity);
-        entity.setId(null);
-        entity.setIsDelete(0);
-        if (entity.getEnabled() == null) {
-            entity.setEnabled(true);
-        }
-        if (entity.getSort() == null) {
-            entity.setSort(0);
-        }
-        return Result.ok(enterpriseService.save(entity));
-    }
-
-    public Result<Object> tenantSave(TenantEnterpriseSaveDTO dto) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        dto.setTenantId(currentTenantId);
-        return save(dto);
-    }
-
-    public Result<Object> update(TenantEnterpriseSaveDTO dto) {
-        if (Objects.isNull(dto.getId())) {
-            return Result.error("id不能为空");
-        }
-        TenantEnterpriseEntity entity = enterpriseService.getById(dto.getId());
-        if (entity == null) {
-            return Result.error("记录不存在");
-        }
-        BeanUtils.copyProperties(dto, entity);
-        return Result.ok(enterpriseService.updateById(entity));
-    }
-
-    public Result<Object> tenantUpdate(TenantEnterpriseSaveDTO dto) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        if (Objects.isNull(dto.getId())) {
-            return Result.error("id不能为空");
-        }
-        TenantEnterpriseEntity entity = enterpriseService.getById(dto.getId());
-        if (entity == null || !currentTenantId.equals(entity.getTenantId())) {
-            return Result.error("无权修改该数据");
-        }
-        dto.setTenantId(currentTenantId);
-        return update(dto);
-    }
-
-    public Result<Object> delete(Long id) {
-        return Result.ok(enterpriseService.lgDelete(id));
-    }
-
-    public Result<Object> tenantDelete(Long id) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        TenantEnterpriseEntity entity = enterpriseService.getById(id);
-        if (entity == null || !currentTenantId.equals(entity.getTenantId())) {
-            return Result.error("无权删除该数据");
-        }
-        return delete(id);
-    }
-}

+ 0 - 134
java/storlead-account/storlead-account-biz/src/main/java/com/storlead/account/tenant/web/TenantEnterpriseUserRelEntityWebDelegate.java

@@ -1,134 +0,0 @@
-package com.storlead.account.tenant.web;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.storlead.account.tenant.dto.TenantEnterpriseUserRelQueryDTO;
-import com.storlead.account.tenant.dto.TenantEnterpriseUserRelSaveDTO;
-import com.storlead.account.tenant.entity.TenantEnterpriseUserRelEntity;
-import com.storlead.account.tenant.service.TenantEnterpriseUserRelEntityService;
-import com.storlead.framework.util.LoginUserUtil;
-import com.storlead.framework.web.assemble.Result;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.util.Objects;
-
-@Component
-public class TenantEnterpriseUserRelEntityWebDelegate {
-
-    @Resource
-    private TenantEnterpriseUserRelEntityService userRelService;
-
-    public Result<Object> tenantPage(TenantEnterpriseUserRelQueryDTO query) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        query.setTenantId(currentTenantId);
-        return page(query);
-    }
-
-    public Result<Object> page(TenantEnterpriseUserRelQueryDTO query) {
-        Page<TenantEnterpriseUserRelEntity> page = new Page<>(query.getPageIndex(), query.getPageSize());
-        LambdaQueryWrapper<TenantEnterpriseUserRelEntity> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(TenantEnterpriseUserRelEntity::getIsDelete, 0);
-        if (query.getTenantId() != null) {
-            wrapper.eq(TenantEnterpriseUserRelEntity::getTenantId, query.getTenantId());
-        }
-        if (query.getEnterpriseId() != null) {
-            wrapper.eq(TenantEnterpriseUserRelEntity::getEnterpriseId, query.getEnterpriseId());
-        }
-        if (query.getUserId() != null) {
-            wrapper.eq(TenantEnterpriseUserRelEntity::getUserId, query.getUserId());
-        }
-        wrapper.orderByAsc(TenantEnterpriseUserRelEntity::getSort).orderByDesc(TenantEnterpriseUserRelEntity::getCreateTime);
-        return Result.ok(userRelService.page(page, wrapper));
-    }
-
-    public Result<Object> detail(Long id) {
-        return Result.ok(userRelService.getById(id));
-    }
-
-    public Result<Object> tenantDetail(Long id) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        TenantEnterpriseUserRelEntity entity = userRelService.getById(id);
-        if (entity == null || !currentTenantId.equals(entity.getTenantId())) {
-            return Result.error("无权查看该数据");
-        }
-        return Result.ok(entity);
-    }
-
-    public Result<Object> save(TenantEnterpriseUserRelSaveDTO dto) {
-        TenantEnterpriseUserRelEntity entity = new TenantEnterpriseUserRelEntity();
-        BeanUtils.copyProperties(dto, entity);
-        entity.setId(null);
-        entity.setIsDelete(0);
-        if (entity.getEnabled() == null) {
-            entity.setEnabled(true);
-        }
-        if (entity.getSort() == null) {
-            entity.setSort(0);
-        }
-        if (entity.getIsAdmin() == null) {
-            entity.setIsAdmin(0);
-        }
-        return Result.ok(userRelService.save(entity));
-    }
-
-    public Result<Object> tenantSave(TenantEnterpriseUserRelSaveDTO dto) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        dto.setTenantId(currentTenantId);
-        return save(dto);
-    }
-
-    public Result<Object> update(TenantEnterpriseUserRelSaveDTO dto) {
-        if (Objects.isNull(dto.getId())) {
-            return Result.error("id不能为空");
-        }
-        TenantEnterpriseUserRelEntity entity = userRelService.getById(dto.getId());
-        if (entity == null) {
-            return Result.error("记录不存在");
-        }
-        BeanUtils.copyProperties(dto, entity);
-        return Result.ok(userRelService.updateById(entity));
-    }
-
-    public Result<Object> tenantUpdate(TenantEnterpriseUserRelSaveDTO dto) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        if (Objects.isNull(dto.getId())) {
-            return Result.error("id不能为空");
-        }
-        TenantEnterpriseUserRelEntity entity = userRelService.getById(dto.getId());
-        if (entity == null || !currentTenantId.equals(entity.getTenantId())) {
-            return Result.error("无权修改该数据");
-        }
-        dto.setTenantId(currentTenantId);
-        return update(dto);
-    }
-
-    public Result<Object> delete(Long id) {
-        return Result.ok(userRelService.lgDelete(id));
-    }
-
-    public Result<Object> tenantDelete(Long id) {
-        Long currentTenantId = LoginUserUtil.getCurrentTenantId();
-        if (currentTenantId == null) {
-            return Result.error("当前登录上下文未绑定租户");
-        }
-        TenantEnterpriseUserRelEntity entity = userRelService.getById(id);
-        if (entity == null || !currentTenantId.equals(entity.getTenantId())) {
-            return Result.error("无权删除该数据");
-        }
-        return delete(id);
-    }
-}

+ 0 - 5
java/storlead-account/storlead-account-biz/src/main/resources/mapper/SystemUserEntityMapper.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.storlead.account.system.mapper.SystemUserEntityMapper">
-    <!-- 默认 CRUD 由 MyBatis-Plus BaseMapper 提供 -->
-</mapper>

+ 0 - 5
java/storlead-account/storlead-account-biz/src/main/resources/mapper/TenantEnterpriseEntityMapper.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.storlead.account.tenant.mapper.TenantEnterpriseEntityMapper">
-    <!-- 自定义 SQL 在此扩展;默认 CRUD 由 MyBatis-Plus BaseMapper 提供 -->
-</mapper>

+ 0 - 5
java/storlead-account/storlead-account-biz/src/main/resources/mapper/TenantEnterpriseUserRelEntityMapper.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.storlead.account.tenant.mapper.TenantEnterpriseUserRelEntityMapper">
-    <!-- 自定义 SQL 在此扩展;默认 CRUD 由 MyBatis-Plus BaseMapper 提供 -->
-</mapper>

+ 21 - 1
java/storlead-api/pom.xml

@@ -26,7 +26,11 @@
         </dependency>
         <dependency>
             <groupId>com.storlead.boot</groupId>
-            <artifactId>storlead-account-api</artifactId>
+            <artifactId>storlead-user-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-sms-api</artifactId>
         </dependency>
         <dependency>
             <groupId>com.storlead.boot</groupId>
@@ -36,6 +40,22 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+
+        <!--        业务模块     -->
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-user-spi</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-sms-spi</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-system-biz</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 4 - 1
java/storlead-api/src/main/java/com/storlead/api/StorleadTradeApplication.java

@@ -15,7 +15,10 @@ import java.net.InetAddress;
 @MapperScan({
         "com.storlead.account.tenant.mapper",
         "com.storlead.account.system.mapper",
-        "com.storlead.crm.customer.mapper"
+        "com.storlead.crm.customer.mapper",
+        "com.storlead.user.mapper",
+        "com.storlead.sms.mapper",
+        "com.storlead.system.mapper"
 })
 @Slf4j
 public class StorleadTradeApplication {

+ 71 - 0
java/storlead-api/src/main/java/com/storlead/login/AuthCaptchaApiController.java

@@ -0,0 +1,71 @@
+package com.storlead.login;
+
+import cn.hutool.core.util.StrUtil;
+import com.storlead.framework.common.result.Result;
+import com.storlead.sms.spi.SmsCaptchaScene;
+import com.storlead.sms.spi.SmsCaptchaService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 登录域验证码入口:仅依赖 {@link SmsCaptchaService}(SPI),与短信实现解耦。
+ */
+@RestController
+@RequestMapping("/sys/auth/captcha")
+@Api(tags = "System -> 验证码(解耦)")
+public class AuthCaptchaApiController {
+
+    @Resource
+    private SmsCaptchaService smsCaptchaService;
+
+    @ApiOperation("发送验证码")
+    @PostMapping("/send")
+    public Result<?> send(
+            @ApiParam(value = "手机号", required = true) @RequestParam String mobile,
+            @ApiParam(value = "场景,默认 LOGIN") @RequestParam(defaultValue = "LOGIN") String scene) {
+        if (StrUtil.isBlank(mobile)) {
+            return Result.error("参数错误");
+        }
+        SmsCaptchaScene s = parseScene(scene);
+        if (s == null) {
+            return Result.error("不支持的场景: " + scene);
+        }
+        smsCaptchaService.sendCaptcha(mobile, s);
+        return Result.ok(smsCaptchaService.sendCaptcha(mobile, s));
+    }
+
+    @ApiOperation("校验验证码")
+    @PostMapping("/verify")
+    public Result<?> verify(
+            @ApiParam(value = "手机号", required = true) @RequestParam String mobile,
+            @ApiParam(value = "验证码", required = true) @RequestParam String code,
+            @ApiParam(value = "场景,默认 LOGIN") @RequestParam(defaultValue = "LOGIN") String scene,
+            @ApiParam(value = "校验成功后是否删除缓存", defaultValue = "true") @RequestParam(defaultValue = "true") boolean consume) {
+        if (StrUtil.isBlank(mobile) || StrUtil.isBlank(code)) {
+            return Result.error("参数错误");
+        }
+        SmsCaptchaScene s = parseScene(scene);
+        if (s == null) {
+            return Result.error("不支持的场景: " + scene);
+        }
+        return Result.ok(smsCaptchaService.verifyCaptcha(mobile, code, s, consume));
+    }
+
+    private static SmsCaptchaScene parseScene(String scene) {
+        if (StrUtil.isBlank(scene)) {
+            return SmsCaptchaScene.LOGIN;
+        }
+        try {
+            return SmsCaptchaScene.valueOf(scene.trim().toUpperCase());
+        } catch (IllegalArgumentException e) {
+            return null;
+        }
+    }
+}

+ 189 - 0
java/storlead-api/src/main/java/com/storlead/login/LoginApiController.java

@@ -0,0 +1,189 @@
+package com.storlead.login;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.storlead.framework.auth.jwt.JwtUtil;
+import com.storlead.framework.auth.vo.LoginUser;
+import com.storlead.framework.common.constant.CommonConstant;
+import com.storlead.framework.common.constant.RedisKeySaltConstant;
+import com.storlead.framework.common.ecode.BCryptPasswordEncoder;
+import com.storlead.framework.common.util.RsaUtils;
+import com.storlead.framework.redis.RedisService;
+import com.storlead.framework.common.result.Result;
+import com.storlead.user.pojo.dto.UserLoginDTO;
+import com.storlead.user.pojo.entity.DeptEntity;
+import com.storlead.user.pojo.entity.JobEntity;
+import com.storlead.user.pojo.entity.UserEntity;
+import com.storlead.user.service.IDepartService;
+import com.storlead.user.service.IJobService;
+import com.storlead.user.service.IUserService;
+import com.storlead.system.service.IMenuService;
+import com.storlead.system.service.IUserRoleService;
+import com.storlead.system.util.SystemConfigItemCacheUtil;
+import com.storlead.sms.spi.SmsCaptchaScene;
+import com.storlead.sms.spi.SmsCaptchaService;
+import com.storlead.wecom.service.CorpWeChatService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+
+@RestController
+@RequestMapping("/sys/auth")
+@Api(tags="System -> 登录模块")
+@Slf4j
+public class LoginApiController {
+
+    @Resource
+    private RedisService redisService;
+
+    @Resource
+    private IUserService userService;
+
+    @Resource
+    private IMenuService menuService;
+
+    @Resource
+    private IDepartService departService;
+
+    @Resource
+    private CorpWeChatService corpWeChatService;
+
+    @Resource
+    private SmsCaptchaService smsCaptchaService;
+
+    @Value("${environment}")
+    private  String environment;
+
+    @Resource
+    private IUserRoleService userRoleService;
+
+    @Resource
+    private IJobService jobService;
+
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    @ApiOperation(value = "用户登录接口", notes = "用户登录接口")
+    public Result login(@RequestBody UserLoginDTO loginDTO) {
+
+        if (Objects.isNull(loginDTO)) {
+            return Result.error("参数错误");
+        }
+        UserEntity userInfo;
+        JSONObject obj = new JSONObject();
+        if (StrUtil.isNotBlank(loginDTO.getWxCode())) {
+            String code = corpWeChatService.login(loginDTO.getWxCode());
+            userInfo = userService.getOne(new LambdaQueryWrapper<UserEntity>().eq(UserEntity::getXworkUserId,code));
+        } else if (StrUtil.isNotBlank(loginDTO.getSmsCode())) {
+            // 验证码登录:仅在 /login 内完成验证码校验(consume=true 防止重复使用),再查用户
+            String mobile = StrUtil.trimToEmpty(loginDTO.getAccount());
+            String smsCode = StrUtil.trimToEmpty(loginDTO.getSmsCode());
+            if (StrUtil.isBlank(mobile)) {
+                return Result.error("请输入手机号");
+            }
+            if (StrUtil.isBlank(smsCode)) {
+                return Result.error("请输入验证码");
+            }
+            Result<?> vr = smsCaptchaService.verifyCaptcha(mobile, smsCode, SmsCaptchaScene.LOGIN, true);
+            if (!vr.isSuccess()) {
+                return Result.error(vr.getCode(), vr.getMessage());
+            }
+            userInfo = userService.getOne(new LambdaQueryWrapper<UserEntity>()
+                    .eq(UserEntity::getMobile, mobile)
+                    .eq(UserEntity::getIsDelete, CommonConstant.DEL_FLAG_0));
+            if (userInfo == null) {
+                return Result.error("该手机号未绑定用户或账号已删除");
+            }
+        } else {
+            if (StrUtil.isBlank(loginDTO.getAccount()) || StrUtil.isBlank(loginDTO.getPassword())) {
+                return Result.error("用户名或密码为空");
+            }
+            userInfo = userService.getOne(new LambdaQueryWrapper<UserEntity>().eq(UserEntity::getMobile,loginDTO.getAccount()).eq(UserEntity::getIsDelete, CommonConstant.DEL_FLAG_0));
+            if (Objects.isNull(userInfo)) {
+                return Result.error("账号不存在");
+            }
+
+            BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
+            String password = "";
+            if((!environment.equals("prod") && !loginDTO.getPassword().equals("qq123456")) || environment.equals("prod")){
+                try {
+                    password = RsaUtils.decryptByPrivateKey(RsaUtils.PRIVATE_KEY, loginDTO.getPassword());
+                }catch (Exception e) {
+                    return Result.error("用户名或密码错误");
+                }
+            }
+            if(environment.equals("prod") || (environment.equals("test")
+                    && !loginDTO.getPassword().equals("qq123456") &&
+                    !password.equals("qq123456"))) {
+                if (!bCryptPasswordEncoder.matches(password, userInfo.getPassword())) {
+                    return Result.error("用户名或密码错误");
+                }
+            }
+            String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\W]{8,}$";
+            String defaultPassWord = SystemConfigItemCacheUtil.getDefaultPassWord();
+
+            if(password !=null && (!password.matches(regex) || password.equals(defaultPassWord))){
+                obj.put("status",1);
+            }else {
+                obj.put("status",2);
+            }
+
+        }
+        if (Objects.isNull(userInfo)) {
+            return Result.error("登录失败,未获取到用户信息");
+        }
+        if (!userInfo.getEnabled()) {
+            return Result.error("该账号用户暂无登录权限");
+        }
+
+        Integer possessMenuCount = menuService.checkUserMenuAccess(userInfo.getId());
+        if (possessMenuCount == 0) {
+            return Result.error("暂未获取到菜单权限,请联系管理员分配权限!");
+        }
+
+        LoginUser loginUser = new LoginUser();
+        BeanUtils.copyProperties(userInfo,loginUser);
+
+        if (Objects.nonNull(userInfo.getJobId())) {
+            JobEntity job = jobService.getById(userInfo.getJobId());
+            if (Objects.nonNull(job)) {
+                loginUser.setJobName(job.getName());
+            }
+        }
+
+        loginUser.setRoleIds(userRoleService.selectUserRoleByUserId(userInfo.getId()));
+        if (Objects.nonNull(userInfo.getDeptId())) {
+            DeptEntity dept = departService.getById(userInfo.getDeptId());
+            if (Objects.nonNull(dept)) {
+                loginUser.setDeptName(dept.getName());
+                loginUser.setDeptJobDes(dept.getDeptJobDes());
+            }
+        }
+
+        //用户登录信息
+        String jwtToken = JwtUtil.createJWT(JSONObject.toJSONString(loginUser),loginUser.getMobile());
+        String token = SecureUtil.md5(jwtToken);
+
+        String json = JSONObject.toJSONString(loginUser);
+        redisService.setCacheObject(token, json, 60 * 60 * 24L * 7, TimeUnit.SECONDS);
+
+        Map<String, String> apiMap = new HashMap();
+        redisService.setCacheObject(RedisKeySaltConstant.API_CODE_REDIS + loginUser.getMobile(), apiMap);
+
+        obj.put("token", token);
+        return Result.ok(obj);
+    }
+}

+ 21 - 1
java/storlead-api/src/main/resources/application-dev.yml

@@ -90,10 +90,30 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://mysql.test.storlead.com:39091/sp_smart_trade_test?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
+          url: jdbc:mysql://mysql.test.storlead.com:39091/sp_saas_platform_test?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
           username: root
           password: rCgRgLjH99Xvg5BN
           driver-class-name: com.mysql.jdbc.Driver
+        sales:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://mysql.test.storlead.com:39091/sp_sales_test?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
+          username: root
+          password: rCgRgLjH99Xvg5BN
+        management:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://mysql.test.storlead.com:39091/storlead_test?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&noDatetimeStringSync=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: rCgRgLjH99Xvg5BN
+        otr:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://mysql.test.storlead.com:39091/storlead_test?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&noDatetimeStringSync=true&serverTimezone=Asia/Shanghai
+          username: root
+          password: rCgRgLjH99Xvg5BN
+        oa:
+          driver-class-name: com.mysql.jdbc.Driver
+          url: jdbc:mysql://139.159.206.64:65369/storlead_ecology_prod?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
+          username: storlead_ecology
+          password: 3raNoDvbo7jqbwtedQGQ
 #          url: jdbc:mysql://mysql.test.storlead.com:39091/sp_tems_test?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
 #          username: root
 #          password: rCgRgLjH99Xvg5BN

+ 7 - 0
java/storlead-dependencies/pom.xml

@@ -102,6 +102,13 @@
                 <version>${fastjson.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>4.5.3</version>
+            </dependency>
+
+
 
             <dependency>
                 <groupId>org.apache.httpcomponents.client5</groupId>

+ 6 - 0
java/storlead-framework/storlead-common/pom.xml

@@ -60,6 +60,12 @@
             <version>${commons.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.17.4</version>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>

+ 0 - 66
java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/result/BizResult.java

@@ -1,66 +0,0 @@
-package com.storlead.framework.common.result;
-
-import com.storlead.framework.common.enums.ErrorMsgCode;
-import com.storlead.framework.common.enums.ResultCode;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class BizResult<T> implements Serializable {
-    private static final long serialVersionUID = -3285741963633941427L;
-
-    private boolean success = true;
-    private String message = "操作成功!";
-    private Integer code = ResultCode.SUCCESS.getCode();
-    private T result;
-    private long timestamp = System.currentTimeMillis();
-
-    public static <T> BizResult<T> ok() {
-        BizResult<T> r = new BizResult<>();
-        r.setSuccess(true);
-        r.setCode(ResultCode.SUCCESS.getCode());
-        r.setMessage(ResultCode.SUCCESS.getMsg());
-        r.setTimestamp(System.currentTimeMillis());
-        return r;
-    }
-
-    public static <T> BizResult<T> ok(T result) {
-        BizResult<T> r = ok();
-        r.setResult(result);
-        return r;
-    }
-
-    public static <T> BizResult<T> ok(String msg) {
-        BizResult<T> r = ok();
-        r.setMessage(msg);
-        return r;
-    }
-
-    public static <T> BizResult<T> error(String msg) {
-        BizResult<T> r = new BizResult<>();
-        r.setSuccess(false);
-        r.setCode(ResultCode.ERROR.getCode());
-        r.setMessage(msg);
-        r.setTimestamp(System.currentTimeMillis());
-        return r;
-    }
-
-    public static <T> BizResult<T> error(ErrorMsgCode code) {
-        BizResult<T> r = new BizResult<>();
-        r.setSuccess(false);
-        r.setCode(code.getCode());
-        r.setMessage(code.getMsg());
-        r.setTimestamp(System.currentTimeMillis());
-        return r;
-    }
-
-    public static <T> BizResult<T> error(int code, String msg) {
-        BizResult<T> r = new BizResult<>();
-        r.setSuccess(false);
-        r.setCode(code);
-        r.setMessage(msg);
-        r.setTimestamp(System.currentTimeMillis());
-        return r;
-    }
-}

+ 1 - 11
java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/assemble/Result.java → java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/result/Result.java

@@ -1,6 +1,5 @@
-package com.storlead.framework.web.assemble;
+package com.storlead.framework.common.result;
 
-import com.storlead.framework.common.result.BizResult;
 import com.storlead.framework.common.enums.ErrorMsgCode;
 import com.storlead.framework.common.enums.ResultCode;
 import io.swagger.annotations.ApiModel;
@@ -181,13 +180,4 @@ public class Result<T> implements Serializable {
 		return error(ResultCode.FORBIDDEN.getCode(), msg);
 	}
 
-	public static <T> Result<T> fromBiz(BizResult<T> bizResult) {
-		Result<T> r = new Result<>();
-		r.setSuccess(bizResult.isSuccess());
-		r.setCode(bizResult.getCode());
-		r.setMessage(bizResult.getMessage());
-		r.setResult(bizResult.getResult());
-		r.setTimestamp(bizResult.getTimestamp());
-		return r;
-	}
 }

+ 23 - 0
java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/util/ConvertUtils.java

@@ -1,7 +1,9 @@
 package com.storlead.framework.common.util;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
 
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Field;
@@ -616,4 +618,25 @@ public class ConvertUtils {
 		return (T)model;
 	}
 
+	public static String camelToUnderscore(String camelCase) {
+		return StringUtils.join(
+				StringUtils.splitByCharacterTypeCamelCase(camelCase), "_"
+		).toLowerCase();
+	}
+
+	public static List<Long> retainByIds(List<Long> ownerByIds, Set dataScope) {
+		if (CollectionUtils.isEmpty(ownerByIds)) {
+			return List.copyOf(dataScope);
+		}
+		if (CollectionUtils.isEmpty(dataScope)) {
+			return Arrays.asList(0L);
+		}
+		ownerByIds.retainAll(dataScope);
+		if (CollectionUtils.isEmpty(ownerByIds)) {
+			return Arrays.asList(0L);
+		}
+		return ownerByIds;
+	}
+
+
 }

+ 227 - 0
java/storlead-framework/storlead-common/src/main/java/com/storlead/framework/common/util/OssBootUtil.java

@@ -0,0 +1,227 @@
+package com.storlead.framework.common.util;
+
+import com.aliyun.oss.ClientConfiguration;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.common.auth.DefaultCredentialProvider;
+import com.aliyun.oss.model.CannedAccessControlList;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.PutObjectResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.http.fileupload.FileItemStream;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+/**
+ * @Description: 阿里云 oss 上传工具类(高依赖版)
+ * @Date: 2019/5/10
+ */
+@Slf4j
+public class OssBootUtil {
+
+    private static Boolean loading;
+    private static String endPoint;
+    private static String accessKeyId;
+    private static String accessKeySecret;
+    private static String bucketName;
+
+    public static void setLoading(Boolean loading) {
+        OssBootUtil.loading = loading;
+    }
+
+    public static void setEndPoint(String endPoint) {
+        OssBootUtil.endPoint = endPoint;
+    }
+
+    public static void setAccessKeyId(String accessKeyId) {
+        OssBootUtil.accessKeyId = accessKeyId;
+    }
+
+    public static void setAccessKeySecret(String accessKeySecret) {
+        OssBootUtil.accessKeySecret = accessKeySecret;
+    }
+
+    public static void setBucketName(String bucketName) {
+        OssBootUtil.bucketName = bucketName;
+    }
+
+    /**
+     * oss 工具客户端
+     */
+    private static OSSClient ossClient = null;
+    private static String FILE_URL;
+
+    /**
+     * 上传文件至阿里云 OSS
+     * 文件上传成功,返回文件完整访问路径
+     * 文件上传失败,返回 null
+     *
+     * @param file    待上传文件
+     * @param fileDir 文件保存目录
+     * @return oss 中的相对文件路径
+     */
+    public static String upload(MultipartFile file, String fileDir) {
+        initOSS(endPoint, accessKeyId, accessKeySecret);
+        StringBuilder fileUrl = new StringBuilder();
+        try {
+            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
+            String preffix = file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf('.'));
+            String fileName = preffix+DateUtils.getUploadFileName() + suffix;
+            if (!fileDir.endsWith("/")) {
+                fileDir = fileDir.concat("/");
+            }
+            fileUrl = fileUrl.append(fileDir + fileName);
+
+            String fileUrl1 = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
+            //FILE_URL = staticDomain + "/" + fileUrl;
+            PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.getInputStream());
+            // 设置权限(公开读)
+            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
+            if (result != null) {
+                log.info("------OSS文件上传成功------" + fileUrl);
+            }
+            return fileUrl1;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    public static String upload(MultipartFile file, String fileDir,String newBucketName,String newEndPoint) {
+
+        initOSS(endPoint, accessKeyId, accessKeySecret);
+        StringBuilder fileUrl = new StringBuilder();
+        try {
+            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
+            String preffix = file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf('.'));
+            String fileName = preffix+DateUtils.getUploadFileName() + suffix;
+            if (!fileDir.endsWith("/")) {
+                fileDir = fileDir.concat("/");
+            }
+            fileUrl = fileUrl.append(fileDir + fileName);
+            String fileUrl1  = "https://" + newBucketName + "." + newEndPoint + "/" + fileUrl;
+            //FILE_URL = staticDomain + "/" + fileUrl;
+            PutObjectResult result = ossClient.putObject(newBucketName, fileUrl.toString(), file.getInputStream());
+            // 设置权限(公开读)
+            ossClient.setBucketAcl(newBucketName, CannedAccessControlList.PublicRead);
+            if (result != null) {
+                log.info("------OSS文件上传成功------" + fileUrl);
+            }
+            return fileUrl1;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 上传文件至阿里云 OSS
+     * 文件上传成功,返回文件完整访问路径
+     * 文件上传失败,返回 null
+     *
+     * @param file    待上传文件
+     * @param fileDir 文件保存目录
+     * @return oss 中的相对文件路径
+     */
+    public static String upload(FileItemStream file, String fileDir) {
+        initOSS(endPoint, accessKeyId, accessKeySecret);
+        StringBuilder fileUrl = new StringBuilder();
+        try {
+            String suffix = file.getName().substring(file.getName().lastIndexOf('.'));
+            String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
+            if (!fileDir.endsWith("/")) {
+                fileDir = fileDir.concat("/");
+            }
+            fileUrl = fileUrl.append(fileDir + fileName);
+
+            String fileUrl1  = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
+            //FILE_URL = staticDomain + "/" + fileUrl;
+            PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());
+            // 设置权限(公开读)
+            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
+            if (result != null) {
+                System.out.println("------OSS文件上传成功------" + fileUrl);
+            }
+            return fileUrl1;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据文件名下载文件 获取文件的流
+     * 这里需要注意的就是 这里查找的oss文件目录是共有的目录 如果需要查找别的文件目录得话请勿使用该方法
+     *
+     * @param fileName 文件的名称 这里需要注意了这里的文件名是上传oss时候的文件名
+     * @return null 表示文件不存在
+     * @author timo
+     * @date 2019/1/10 21:46
+     */
+    public static InputStream downloadObjFileToInputStream(String fileName) {
+        return downloadObjFileToInputStream(bucketName, fileName);
+    }
+
+    /**
+     * 根据文件名下载文件
+     * 获取文件的流
+     *
+     * @param fileName   文件的名称 这里需要注意了这里的文件名是上传oss时候的文件名
+     * @param bucketName oss文件所在的目录
+     * @return null 表示文件不存在
+     * @author timo
+     * @date 2019/1/10 21:46
+     */
+    public static InputStream downloadObjFileToInputStream(String bucketName, String fileName) {
+        try {
+            OSSObject ossObject = new OSSClient(endPoint, accessKeyId, accessKeySecret).getObject(bucketName, fileName);
+            if (ossObject == null) {
+                throw new FileNotFoundException(fileName + " not in " + bucketName);
+            }
+            return ossObject.getObjectContent();
+        } catch (Exception e) {
+            e.getStackTrace();
+            log.info("获取文件失败:" + e.toString() + e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 删除文件
+     * @param url
+     */
+    public static void deleteUrl(String url) {
+        String bucketUrl = "https://" + bucketName + "." + endPoint + "/";
+        //String bucketUrl = staticDomain + "/";
+        url = url.replace(bucketUrl,"");
+        ossClient.deleteObject(bucketName, url);
+    }
+
+    /**
+     * 删除文件
+     * @param fileName
+     */
+    public static void delete(String fileName) {
+        ossClient.deleteObject(bucketName, fileName);
+    }
+
+    /**
+     * 初始化 oss 客户端
+     *
+     * @return
+     */
+    private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
+        if (ossClient == null) {
+            ossClient = new OSSClient(endpoint,
+                    new DefaultCredentialProvider(accessKeyId, accessKeySecret),
+                    new ClientConfiguration());
+        }
+        return ossClient;
+    }
+
+}

+ 26 - 0
java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/AnnBase.java

@@ -0,0 +1,26 @@
+package com.storlead.framework.annotate;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface AnnBase {
+    /**
+     * KEY字段
+     * @return
+     */
+    String keyField() default "";
+    /**
+     * 赋值字段
+     * @return
+     */
+    String valueField() default "";
+    /**
+     * 是否多字典
+     * @return
+     */
+    boolean multiple() default false;
+
+}
+

+ 22 - 0
java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/AnnotateEnumType.java

@@ -0,0 +1,22 @@
+package com.storlead.framework.annotate;
+
+public enum AnnotateEnumType {
+    //SubCompany
+    //Dept
+    //User
+    DICT("Dict"),
+    SUB_COMPANY("SubCompany"),
+    COMPANY("Company"),
+    DEPT("Dept"),
+    USER("User");
+
+    private String type;
+
+    AnnotateEnumType(String type) {
+        this.type = type;
+    }
+
+    public String getType() {
+        return type;
+    }
+}

+ 11 - 0
java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/Dept.java

@@ -0,0 +1,11 @@
+package com.storlead.framework.annotate;
+
+/**
+ * @program: sp-sales-platform
+ * @description:
+ * @author: chenkq
+ * @create: 2024-05-21 16:38
+ */
+//public @interface @Dept extends AnnBase {
+//
+//}

+ 32 - 0
java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/Dict.java

@@ -0,0 +1,32 @@
+package com.storlead.framework.annotate;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Dict {
+    /**
+     * 字典编码
+     */
+    String dictCode();
+    /**
+     * KEY字段
+     * @return
+     */
+    String keyField() default "";
+    /**
+     * 赋值字段
+     * @return
+     */
+    String valueField() default "";
+    /**
+     * 是否多字典
+     * @return
+     */
+    boolean multiple() default false;
+
+    String des() default "";
+}

+ 26 - 0
java/storlead-framework/storlead-core/src/main/java/com/storlead/framework/annotate/OrgAutoMateAnnotate.java

@@ -0,0 +1,26 @@
+package com.storlead.framework.annotate;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OrgAutoMateAnnotate {
+
+    String keyField() default "";
+    /**
+     * 赋值字段
+     * @return
+     */
+    String valueField() default "";
+    /**
+     * 是否多字典
+     * @return
+     */
+    boolean multiple() default false;
+
+    AnnotateEnumType annotateType() default AnnotateEnumType.DICT;
+}
+

+ 0 - 4
java/storlead-framework/storlead-mybatis/src/main/java/com/storlead/framework/mybatis/service/MyBaseService.java

@@ -1,12 +1,8 @@
 package com.storlead.framework.mybatis.service;
 
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.storlead.framework.common.constant.CommonConstant;
-import org.springframework.util.CollectionUtils;
 
 import java.util.List;
-import java.util.Objects;
 
 public interface MyBaseService <T> extends IService<T> {
 

+ 1 - 1
java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/filter/AuthRequestFilter.java

@@ -19,7 +19,7 @@ import com.storlead.framework.core.context.IContext;
 import com.storlead.framework.core.tenant.TenantConstants;
 import com.storlead.framework.core.tenant.TenantContext;
 import com.storlead.framework.redis.RedisService;
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import com.storlead.framework.common.enums.ResultCode;
 import com.storlead.framework.web.wrapper.JsonRequestWrapper;
 import lombok.extern.log4j.Log4j2;

+ 1 - 1
java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/filter/RoutingRequestFilter.java

@@ -3,7 +3,7 @@ package com.storlead.framework.web.filter;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.storlead.framework.common.util.SystemUtils;
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.core.Ordered;
 import org.springframework.http.HttpStatus;

+ 1 - 1
java/storlead-framework/storlead-web/src/main/java/com/storlead/framework/web/handler/ExceptionHandler.java

@@ -1,6 +1,6 @@
 package com.storlead.framework.web.handler;
 
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import com.storlead.framework.web.exception.DaoException;
 import com.storlead.framework.web.exception.TopException;
 import com.storlead.framework.web.message.MsgCode;

+ 1 - 2
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/service/InsideMessageRecordService.java

@@ -1,13 +1,12 @@
 package com.storlead.message.service;
 
 import com.storlead.framework.mybatis.service.MyBaseService;
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import com.storlead.message.pojo.entity.InsideMessageRecordEntity;
 import com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity;
 import com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
 
 /**

+ 1 - 3
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/service/WechatMessageService.java

@@ -1,11 +1,9 @@
 package com.storlead.message.service;
 
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity;
-import org.springframework.stereotype.Component;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
 
 public interface WechatMessageService {

+ 1 - 2
java/storlead-message/storlead-message-core/src/main/java/com/storlead/message/service/impl/WechatMessageServiceImpl.java

@@ -1,11 +1,10 @@
 package com.storlead.message.service.impl;
 
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.storlead.common.util.HtmlUtils;
 import com.storlead.frame.core.assemble.Result;
 import com.storlead.frame.enums.ErrorMsgCode;
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import com.storlead.framework.web.enums.ErrorMsgCode;
 import com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity;
 import com.storlead.message.service.WechatMessageService;

+ 2 - 2
java/storlead-message/storlead-message-core/src/main/resources/mapper/MessageTemplateEventDetailMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.storlead.message.mapper.MessageTemplateEventDetailMapper">
 
         <!-- 通用查询映射结果 -->
-        <resultMap id="BaseResultMap" extends="com.storlead.frame.mapper.SysBaseFieldMapper.BaseResultMap" type="com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity">
+        <resultMap id="BaseResultMap" extends="com.storlead.framework.mybatis.mapper.SysBaseFieldMapper.BaseResultMap" type="com.storlead.message.pojo.entity.MessageTemplateEventDetailEntity">
             <id column="id" property="id" />
             <result column="template_event_id" property="templateEventId" />
             <result column="template_event_name" property="templateEventName" />
@@ -17,7 +17,7 @@
 
         <!-- 通用查询结果列 -->
         <sql id="Base_Column_List">
-            id, template_event_id, template_event_name, template_icon,template_tag,template_detail_type, message_title, message_centent, callback_url, remark,<include refid="com.storlead.frame.mapper.SysBaseFieldMapper.Base_Column_List"></include>
+            id, template_event_id, template_event_name, template_icon,template_tag,template_detail_type, message_title, message_centent, callback_url, remark,<include refid="com.storlead.framework.mybatis.mapper.SysBaseFieldMapper.Base_Column_List"></include>
         </sql>
 
 </mapper>

+ 2 - 2
java/storlead-message/storlead-message-core/src/main/resources/mapper/MessageTemplateEventGroupMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.storlead.message.mapper.MessageTemplateEventGroupMapper">
 
         <!-- 通用查询映射结果 -->
-        <resultMap id="BaseResultMap" extends="com.storlead.frame.mapper.SysBaseFieldMapper.BaseResultMap" type="com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity">
+        <resultMap id="BaseResultMap" extends="com.storlead.framework.mybatis.mapper.SysBaseFieldMapper.BaseResultMap" type="com.storlead.message.pojo.entity.MessageTemplateEventGroupEntity">
              <id column="id" property="id" />
              <result column="template_service_name" property="templateServiceName" />
             <result column="template_service_type" property="templateServiceType" />
@@ -17,7 +17,7 @@
         <!-- 通用查询结果列 -->
         <sql id="Base_Column_List">
             id, template_service_name, template_service_code, event_name, event_code, event_rule_script,receiver_key,
-            <include refid="com.storlead.frame.mapper.SysBaseFieldMapper.Base_Column_List"></include>
+            <include refid="com.storlead.framework.mybatis.mapper.SysBaseFieldMapper.Base_Column_List"></include>
         </sql>
 
         <select id="selectMessageTemplateList" resultType="com.storlead.message.pojo.vo.MessageTemplateVO">

+ 1 - 1
java/storlead-sasa/storlead-trade/storlead-customer/src/main/java/com/storlead/crm/customer/controller/CustomerAiAnalysisController.java

@@ -3,7 +3,7 @@ package com.storlead.crm.customer.controller;
 import com.storlead.crm.customer.dto.CustomerSingleAnalysisRequestDTO;
 import com.storlead.crm.customer.entity.CustomerAnalysisResultEntity;
 import com.storlead.crm.customer.service.CustomerAiAnalysisService;
-import com.storlead.framework.web.assemble.Result;
+import com.storlead.framework.common.result.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;

+ 1 - 0
java/storlead-sms/pom.xml

@@ -18,6 +18,7 @@
 
     <modules>
         <module>storlead-sms-core</module>
+        <module>storlead-sms-spi</module>
         <module>storlead-sms-biz</module>
         <module>storlead-sms-api</module>
     </modules>

+ 7 - 3
java/storlead-sms/storlead-sms-api/pom.xml

@@ -14,16 +14,20 @@
     <artifactId>storlead-sms-api</artifactId>
     <packaging>jar</packaging>
     <name>storlead-sms-api</name>
+    <description>短信域 HTTP 接入层(Controller),依赖 spi 与 biz。</description>
 
     <dependencies>
         <dependency>
             <groupId>com.storlead.boot</groupId>
-            <artifactId>storlead-sms-core</artifactId>
+            <artifactId>storlead-sms-spi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-sms-biz</artifactId>
         </dependency>
-
         <dependency>
             <groupId>com.storlead.boot</groupId>
-            <artifactId>storlead-common</artifactId>
+            <artifactId>storlead-web</artifactId>
         </dependency>
     </dependencies>
 </project>

+ 70 - 0
java/storlead-sms/storlead-sms-api/src/main/java/com/storlead/sms/api/SmsCaptchaApiController.java

@@ -0,0 +1,70 @@
+package com.storlead.sms.api;
+
+import cn.hutool.core.util.StrUtil;
+import com.storlead.framework.common.result.Result;
+import com.storlead.sms.spi.SmsCaptchaScene;
+import com.storlead.sms.spi.SmsCaptchaService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 短信验证码 HTTP(依赖 {@link SmsCaptchaService} 契约,与实现解耦)
+ */
+@Api(tags = "System-SMS -> 验证码")
+@RestController
+@RequestMapping("/sys/sms/captcha")
+public class SmsCaptchaApiController {
+
+    @Resource
+    private SmsCaptchaService smsCaptchaService;
+
+    @ApiOperation("发送验证码")
+    @PostMapping("/send")
+    public Result<?> send(
+            @ApiParam(value = "手机号", required = true) @RequestParam String mobile,
+            @ApiParam(value = "场景,默认 LOGIN", allowableValues = "LOGIN") @RequestParam(defaultValue = "LOGIN") String scene) {
+        if (StrUtil.isBlank(mobile)) {
+            return Result.error("参数错误");
+        }
+        SmsCaptchaScene s = parseScene(scene);
+        if (s == null) {
+            return Result.error("不支持的场景: " + scene);
+        }
+        return Result.ok(smsCaptchaService.sendCaptcha(mobile, s));
+    }
+
+    @ApiOperation("校验验证码")
+    @PostMapping("/verify")
+    public Result<?> verify(
+            @ApiParam(value = "手机号", required = true) @RequestParam String mobile,
+            @ApiParam(value = "验证码", required = true) @RequestParam String code,
+            @ApiParam(value = "场景,默认 LOGIN", allowableValues = "LOGIN") @RequestParam(defaultValue = "LOGIN") String scene,
+            @ApiParam(value = "校验成功后是否删除缓存(一次性)", defaultValue = "true") @RequestParam(defaultValue = "true") boolean consume) {
+        if (StrUtil.isBlank(mobile) || StrUtil.isBlank(code)) {
+            return Result.error("参数错误");
+        }
+        SmsCaptchaScene s = parseScene(scene);
+        if (s == null) {
+            return Result.error("不支持的场景: " + scene);
+        }
+        return Result.ok(smsCaptchaService.verifyCaptcha(mobile, code, s, consume));
+    }
+
+    private static SmsCaptchaScene parseScene(String scene) {
+        if (StrUtil.isBlank(scene)) {
+            return SmsCaptchaScene.LOGIN;
+        }
+        try {
+            return SmsCaptchaScene.valueOf(scene.trim().toUpperCase());
+        } catch (IllegalArgumentException e) {
+            return null;
+        }
+    }
+}

+ 34 - 0
java/storlead-sms/storlead-sms-api/src/main/java/com/storlead/sms/api/SmsLogApiController.java

@@ -0,0 +1,34 @@
+package com.storlead.sms.api;
+
+import cn.hutool.core.util.StrUtil;
+import com.storlead.framework.common.result.Result;
+import com.storlead.sms.spi.SmsCaptchaScene;
+import com.storlead.sms.spi.SmsCaptchaService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 短信发送 HTTP 接口
+ */
+@Api(tags = "System-SMS -> 短信")
+@RestController
+@RequestMapping("/sys/sms")
+public class SmsLogApiController {
+
+    @Resource
+    private SmsCaptchaService smsCaptchaService;
+
+    @ApiOperation("发送登录验证码")
+    @PostMapping("/sendLoginVerifyCode")
+    public Result<?> sendLoginVerifyCode(String mobile) {
+        if (StrUtil.isBlank(mobile)) {
+            return Result.error("参数错误");
+        }
+        return Result.result(smsCaptchaService.sendCaptcha(mobile, SmsCaptchaScene.LOGIN));
+    }
+}

+ 0 - 14
java/storlead-sms/storlead-sms-api/src/main/java/com/storlead/sms/server/SmsLogService.java

@@ -1,14 +0,0 @@
-package com.storlead.sms.server;
-
-import com.storlead.framework.common.result.BizResult;
-
-/**
- * SMS external service interface.
- */
-public interface SmsLogService {
-
-    /**
-     * Send login verification SMS code.
-     */
-    BizResult sendLoginSmsCode(String mobile);
-}

+ 1 - 1
java/storlead-sms/storlead-sms-biz/pom.xml

@@ -18,7 +18,7 @@
     <dependencies>
         <dependency>
             <groupId>com.storlead.boot</groupId>
-            <artifactId>storlead-sms-api</artifactId>
+            <artifactId>storlead-sms-spi</artifactId>
         </dependency>
 
         <dependency>

+ 0 - 47
java/storlead-sms/storlead-sms-biz/src/main/java/com/storlead/sms/controller/SmsLogApiController.java

@@ -1,47 +0,0 @@
-package com.storlead.sms.controller;//package com.storlead.sms.controller;
-//
-//import cn.hutool.core.util.StrUtil;
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.storlead.frame.core.assemble.Result;
-//import com.storlead.sms.service.SmsLogService;
-//import io.swagger.annotations.Api;
-//import io.swagger.annotations.ApiOperation;
-//import org.springframework.web.bind.annotation.PostMapping;
-//import org.springframework.web.bind.annotation.RequestMapping;
-//import org.springframework.web.bind.annotation.RestController;
-//
-//import javax.annotation.Resource;
-//
-///**
-// * @program: sp-cloud
-// * @description: 短信发送
-// * @author: chenkq
-// * @create: 2022-05-27 10:08
-// */
-//
-//
-//@Api(tags = "系统: 企业微信管理")
-//@RestController
-//@RequestMapping("/sys/sms")
-//public class SmsLogApiController {
-//
-//    @Resource
-//    private SmsLogService smsLogService;
-//
-//    @ApiOperation("获取AccessToken")
-//    @PostMapping("/sendLoginVerifyCode")
-//    public Result sendLoginVerifyCode(String mobile) {
-//        if (StrUtil.isBlank(mobile)) {
-//            return Result.error("参数错误");
-//        }
-//        //UserEn userAccount = userAccountService.getOne(new LambdaQueryWrapper<UserAccount>().eq(UserAccount::getAccount,mobile));
-////      if (userAccount == null) {
-////          return Result.error("手机号错误,该手机号用户不存在");
-////      }
-//        try {
-//            return  smsLogService.sendLoginSmsCode(mobile);
-//        }catch (Exception e) {
-//            return  Result.error(e.getMessage());
-//        }
-//    }
-//}

+ 77 - 30
java/storlead-sms/storlead-sms-biz/src/main/java/com/storlead/sms/service/impl/SmsLogServiceImpl.java

@@ -5,14 +5,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.storlead.framework.common.constant.RedisKeySaltConstant;
 import com.storlead.framework.common.enums.ErrorMsgCode;
-import com.storlead.framework.common.result.BizResult;
+import com.storlead.framework.common.result.Result;
 import com.storlead.framework.common.util.RandomCodeUtil;
 import com.storlead.framework.redis.RedisService;
 import com.storlead.sms.constants.SmsTemplateConstants;
 import com.storlead.sms.mapper.SmsLogMapper;
 import com.storlead.sms.pojo.entity.SmsLogEntity;
-import com.storlead.sms.server.SmsLogService;
+import com.storlead.sms.spi.SmsCaptchaScene;
+import com.storlead.sms.spi.SmsCaptchaService;
+import com.storlead.sms.spi.SmsLogService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -20,69 +24,112 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
- * <p>
- * 短信日志 服务实现类
- * </p>
- *
- * @author chenkq
- * @since 2022-05-27
+ * 短信日志与验证码(发送/校验)
  */
+@Slf4j
 @Service
-public class SmsLogServiceImpl extends ServiceImpl<SmsLogMapper, SmsLogEntity> implements SmsLogService {
+public class SmsLogServiceImpl extends ServiceImpl<SmsLogMapper, SmsLogEntity>
+        implements SmsLogService, SmsCaptchaService {
 
     @Resource
     private RedisService redisService;
 
     @Override
-    public BizResult sendLoginSmsCode(String mobile) {
-        //
-        int count = this.count(new LambdaQueryWrapper<SmsLogEntity>().eq(SmsLogEntity::getMobile,mobile).eq(SmsLogEntity::getType,Integer.valueOf(10)).apply(" TO_DAYS(send_time) = TO_DAYS(NOW()) "));
+    public Result<?> sendCaptcha(String mobile, SmsCaptchaScene scene) {
+        if (!StringUtils.hasText(mobile)) {
+            return Result.error(ErrorMsgCode.D_400009);
+        }
+        if (scene == null) {
+            return Result.error(ErrorMsgCode.PARAMETER_FAIL);
+        }
+        int type = scene.getSmsLogType();
+        int count = this.count(new LambdaQueryWrapper<SmsLogEntity>()
+                .eq(SmsLogEntity::getMobile, mobile)
+                .eq(SmsLogEntity::getType, type)
+                .apply(" TO_DAYS(send_time) = TO_DAYS(NOW()) "));
         if (count >= SmsTemplateConstants.SEND_MAXIMIZE) {
-            return BizResult.error(ErrorMsgCode.D_400001);
+            return Result.error(ErrorMsgCode.D_400001);
         }
-        Object var1 = redisService.getCacheObject(RedisKeySaltConstant.REDIS_LOGIN_VALID_CODE_KEY+mobile);
-        if (Objects.nonNull(var1)) {
-            SmsLogEntity smsLog = (SmsLogEntity) var1;
+        String cacheKey = captchaRedisKey(scene, mobile);
+        Object cached = redisService.getCacheObject(cacheKey);
+        if (Objects.nonNull(cached)) {
+            SmsLogEntity smsLog = (SmsLogEntity) cached;
             Long currentTime = System.currentTimeMillis();
             Long sendTime = smsLog.getSendTime().getTime();
             if ((currentTime - sendTime) / 1000 < smsLog.getValidTime()) {
-                return BizResult.error(ErrorMsgCode.D_400002);
+                return Result.error(ErrorMsgCode.D_400002);
             }
         }
         int checkCode = RandomCodeUtil.RandomCheckCode();
-
         try {
             boolean res = sendMobileVerifyCode(mobile, checkCode);
             if (!res) {
-                return BizResult.error(ErrorMsgCode.D_400003);
+                return Result.error(ErrorMsgCode.D_400003);
             }
-            log.error("SmsLog ---- = "+checkCode);
+            log.error("SmsLog ---- = " + checkCode);
             SmsLogEntity smsLog = new SmsLogEntity();
             smsLog.setVerifyCode(String.valueOf(checkCode));
             smsLog.setMobile(mobile);
-            smsLog.setType(Integer.valueOf(10));
-            //无需关注id  验证的是手机号码
+            smsLog.setType(type);
             smsLog.setUserId(null);
             smsLog.setValidTime(60);
             smsLog.setSendTime(new Date());
             smsLog.setStatus(1);
             this.baseMapper.insert(smsLog);
-            redisService.setCacheObject(RedisKeySaltConstant.REDIS_LOGIN_VALID_CODE_KEY+mobile,smsLog,120L, TimeUnit.MINUTES);
+            redisService.setCacheObject(cacheKey, smsLog, 120L, TimeUnit.MINUTES);
         } catch (Exception e) {
-            return BizResult.error(e.getMessage());
+            return Result.error(e.getMessage());
+        }
+        return Result.ok();
+    }
+
+    @Override
+    public Result<?> verifyCaptcha(String mobile, String code, SmsCaptchaScene scene, boolean consumeAfterSuccess) {
+        if (!StringUtils.hasText(mobile) || !StringUtils.hasText(code)) {
+            return Result.error(ErrorMsgCode.PARAMETER_FAIL);
+        }
+        if (scene == null) {
+            return Result.error(ErrorMsgCode.PARAMETER_FAIL);
+        }
+        String cacheKey = captchaRedisKey(scene, mobile);
+        Object cached = redisService.getCacheObject(cacheKey);
+        if (cached == null) {
+            return Result.error(ErrorMsgCode.D_400004);
         }
-        return BizResult.ok();
+        SmsLogEntity smsLog = (SmsLogEntity) cached;
+        if (smsLog.getSendTime() != null && smsLog.getValidTime() != null) {
+            long elapsedSec = (System.currentTimeMillis() - smsLog.getSendTime().getTime()) / 1000;
+            if (elapsedSec > smsLog.getValidTime()) {
+                return Result.error(ErrorMsgCode.D_400006);
+            }
+        }
+        String expect = smsLog.getVerifyCode() == null ? "" : smsLog.getVerifyCode().trim();
+        String actual = code.trim();
+        if (!actual.equals(expect)) {
+            return Result.error(ErrorMsgCode.D_400008);
+        }
+        if (consumeAfterSuccess) {
+            redisService.deleteObject(cacheKey);
+        }
+        return Result.ok();
     }
 
+    @Override
+    public Result<?> sendLoginSmsCode(String mobile) {
+        return sendCaptcha(mobile, SmsCaptchaScene.LOGIN);
+    }
 
     /**
-     * 发送手机验证码短信
-     *
-     * @param mobile    手机
-     * @param checkCode 验证码
+     * 与历史 Redis 键兼容:LOGIN 场景沿用 {@link RedisKeySaltConstant#REDIS_LOGIN_VALID_CODE_KEY}。
      */
+    private String captchaRedisKey(SmsCaptchaScene scene, String mobile) {
+        if (scene == SmsCaptchaScene.LOGIN) {
+            return RedisKeySaltConstant.REDIS_LOGIN_VALID_CODE_KEY + mobile;
+        }
+        return "sms_captcha_" + scene.name() + "_" + mobile;
+    }
+
     public boolean sendMobileVerifyCode(String mobile, Integer checkCode) throws ClientException {
         return true;
-        // return SmsUtil.sendSms(smsProperties.getSmsCheckCodeTemplate(), JSON.toJSONString(ImmutableMap.of("number", checkCode)), mobile,smsProperties.getSmsAccessKeyId(),smsProperties.getSmsAccessKeyIdSecret());
     }
 }

+ 2 - 2
java/storlead-sms/storlead-sms-biz/src/main/resources/mapper/SmsLogMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.storlead.user.sms.mapper.SmsLogMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" extends="com.storlead.frame.mapper.SysBaseFieldMapper.BaseResultMap" type="com.storlead.sms.pojo.entity.SmsLogEntity">
+    <resultMap id="BaseResultMap" extends="com.storlead.framework.mybatis.mapper.SysBaseFieldMapper.BaseResultMap" type="com.storlead.sms.pojo.entity.SmsLogEntity">
         <id column="sms_log_id" property="smsLogId" />
         <result column="user_id" property="userId" />
         <result column="mobile" property="mobile" />
@@ -17,7 +17,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, user_id, mobile, verify_code, message, `type` ,status, send_time, valid_time, <include refid="com.storlead.frame.mapper.SysBaseFieldMapper.Base_Column_List"></include>
+        id, user_id, mobile, verify_code, message, `type` ,status, send_time, valid_time, <include refid="com.storlead.framework.mybatis.mapper.SysBaseFieldMapper.Base_Column_List"></include>
     </sql>
 
 </mapper>

+ 25 - 0
java/storlead-sms/storlead-sms-spi/pom.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.storlead.boot</groupId>
+        <artifactId>storlead-sms</artifactId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>storlead-sms-spi</artifactId>
+    <packaging>jar</packaging>
+    <name>storlead-sms-spi</name>
+    <description>短信域对外业务契约(SPI),供其它模块仅依赖接口与返回类型。</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-common</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 22 - 0
java/storlead-sms/storlead-sms-spi/src/main/java/com/storlead/sms/spi/SmsCaptchaScene.java

@@ -0,0 +1,22 @@
+package com.storlead.sms.spi;
+
+/**
+ * 短信验证码业务场景(与短信日志 type、Redis 键策略等在 biz 侧映射)。
+ */
+public enum SmsCaptchaScene {
+
+    /**
+     * 登录验证码(历史 type=10)
+     */
+    LOGIN(10);
+
+    private final int smsLogType;
+
+    SmsCaptchaScene(int smsLogType) {
+        this.smsLogType = smsLogType;
+    }
+
+    public int getSmsLogType() {
+        return smsLogType;
+    }
+}

+ 27 - 0
java/storlead-sms/storlead-sms-spi/src/main/java/com/storlead/sms/spi/SmsCaptchaService.java

@@ -0,0 +1,27 @@
+package com.storlead.sms.spi;
+
+import com.storlead.framework.common.result.Result;
+
+/**
+ * 短信验证码对外契约:发送与校验。实现位于 storlead-sms-biz,调用方仅依赖本接口即可解耦。
+ */
+public interface SmsCaptchaService {
+
+    /**
+     * 发送验证码
+     *
+     * @param mobile 手机号
+     * @param scene  业务场景
+     */
+    Result<?> sendCaptcha(String mobile, SmsCaptchaScene scene);
+
+    /**
+     * 校验验证码
+     *
+     * @param mobile              手机号
+     * @param code                用户输入的验证码
+     * @param scene               须与发送时一致
+     * @param consumeAfterSuccess 校验通过后是否删除缓存(一次性验证码建议 true)
+     */
+    Result<?> verifyCaptcha(String mobile, String code, SmsCaptchaScene scene, boolean consumeAfterSuccess);
+}

+ 17 - 0
java/storlead-sms/storlead-sms-spi/src/main/java/com/storlead/sms/spi/SmsLogService.java

@@ -0,0 +1,17 @@
+package com.storlead.sms.spi;
+
+import com.storlead.framework.common.result.Result;
+
+/**
+ * 短信能力对外契约(实现位于 storlead-sms-biz)。
+ *
+ * @deprecated 请使用 {@link SmsCaptchaService},便于扩展场景与统一校验。
+ */
+@Deprecated
+public interface SmsLogService {
+
+    /**
+     * 发送登录验证码短信
+     */
+    Result<?> sendLoginSmsCode(String mobile);
+}

+ 9 - 35
java/storlead-system/pom.xml

@@ -3,9 +3,10 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
-        <artifactId>storlead-saas-platform</artifactId>
         <groupId>com.storlead.boot</groupId>
+        <artifactId>storlead-saas-platform</artifactId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
@@ -13,40 +14,13 @@
     <artifactId>storlead-system</artifactId>
     <packaging>pom</packaging>
     <name>storlead-system</name>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.0</version>
-                <configuration>
-                    <source>11</source>
-                    <target>11</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
     <version>1.0</version>
-    <description>common project for Spring Boot</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.storlead.boot</groupId>
-            <artifactId>storlead-common</artifactId>
-        </dependency>
-
-        <!--  jwt 需要,移除会报错  -->
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt</artifactId>
-            <version>${io.jsonwebtoken.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-        </dependency>
-    </dependencies>
+    <description>系统域聚合模块:core(模型)、spi(业务契约)、api(HTTP/Controller)、biz(Mapper 与实现)。</description>
 
+    <modules>
+        <module>storlead-system-core</module>
+        <module>storlead-system-spi</module>
+        <module>storlead-system-biz</module>
+        <module>storlead-system-api</module>
+    </modules>
 </project>

+ 33 - 0
java/storlead-system/storlead-system-api/pom.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.storlead.boot</groupId>
+        <artifactId>storlead-system</artifactId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>storlead-system-api</artifactId>
+    <packaging>jar</packaging>
+    <name>storlead-system-api</name>
+    <description>系统域 HTTP 接入层:Controller(按需放置)。</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-system-spi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-system-biz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-web</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 4 - 0
java/storlead-system/storlead-system-api/src/main/java/com/storlead/system/api/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * 系统域 HTTP 接口:{@code RestController} 等放置于此包。
+ */
+package com.storlead.system.api;

+ 74 - 0
java/storlead-system/storlead-system-biz/pom.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.storlead.boot</groupId>
+        <artifactId>storlead-system</artifactId>
+        <version>1.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>storlead-system-biz</artifactId>
+    <packaging>jar</packaging>
+    <name>storlead-system-biz</name>
+    <description>系统域实现:Mapper、Service 实现、AOP、配置与工具。</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-system-spi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-user-spi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-mybatis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-auth</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.storlead.boot</groupId>
+            <artifactId>storlead-web</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>storlead-system-biz</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.0</version>
+                <configuration>
+                    <source>11</source>
+                    <target>11</target>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+</project>

+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/aspect/DictAspect.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/aspect/DictAspect.java


+ 2 - 3
java/storlead-system/src/main/java/com/storlead/system/aspect/LogAspect.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/aspect/LogAspect.java

@@ -1,9 +1,8 @@
 package com.storlead.system.aspect;
 
 import cn.hutool.json.JSONUtil;
-import com.github.blankhang.util.IpUtil;
-import com.storlead.frame.auth.util.LoginUserUtil;
-import com.storlead.frame.auth.vo.LoginUser;
+import com.storlead.framework.auth.vo.LoginUser;
+import com.storlead.framework.util.LoginUserUtil;
 import com.storlead.system.enums.OperationLogTypeEnum;
 import com.storlead.system.holder.RequestHolder;
 import com.storlead.system.pojo.entity.SysOperationLogEntity;

+ 9 - 12
java/storlead-system/src/main/java/com/storlead/system/assemble/DataScope.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/assemble/DataScope.java

@@ -2,14 +2,12 @@ package com.storlead.system.assemble;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import com.storlead.common.object.QueryBaseEntity;
-import com.storlead.common.util.ConvertUtils;
-import com.storlead.frame.auth.util.LoginUserUtil;
-import com.storlead.frame.auth.vo.LoginUser;
-import com.storlead.frame.mybatis.entity.SysBaseField;
+import com.storlead.framework.auth.vo.LoginUser;
+import com.storlead.framework.common.util.ConvertUtils;
+import com.storlead.framework.mybatis.entity.SysBaseField;
+import com.storlead.framework.util.LoginUserUtil;
+import com.storlead.framework.web.assemble.QueryBaseEntity;
 import com.storlead.system.pojo.entity.*;
 import com.storlead.system.service.*;
 import com.storlead.user.pojo.entity.DeptEntity;
@@ -89,7 +87,6 @@ public class DataScope {
                 return new HashSet<>();
             }
 
-
             // 存储自定义的数据权限
             if (scopeType[2].equals(role.getDataScope())) {
                 Set<DeptEntity> depts = deptService.findByRoleId(role.getId());
@@ -225,7 +222,7 @@ public class DataScope {
 //        return isSelfOnly;
 //    }
 
-    public <W extends SysBaseField,E extends QueryBaseEntity> void assemblyDataWrapperPurview(LambdaQueryWrapper<W> wrapper,E e,String mergeSql) {
+    public <W extends SysBaseField,E extends QueryBaseEntity> void assemblyDataWrapperPurview(LambdaQueryWrapper<W> wrapper, E e, String mergeSql) {
 
         StringBuilder whereCondition = new StringBuilder();
         LoginUser currentUser = LoginUserUtil.getLoginUser();
@@ -303,9 +300,9 @@ public class DataScope {
     public <W extends SysBaseField,E extends QueryBaseEntity> void assemblyDataOnlyWrapper(LambdaQueryWrapper<W> wrapper,String mergeSql) {
 
         StringBuilder whereCondition = new StringBuilder();
-        if(Integer.valueOf(1).equals(LoginUserUtil.getReviewTag())) {
-            return;
-        }
+//        if(Integer.valueOf(1).equals(LoginUserUtil.getReviewTag())) {
+//            return;
+//        }
         LoginUser currentUser = LoginUserUtil.getLoginUser();
         UserEntity user = userService.getById(currentUser.getId());
         Set<Long> roleIds = new HashSet<>();

+ 1 - 1
java/storlead-system/src/main/java/com/storlead/system/assemble/LambdaUtils.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/assemble/LambdaUtils.java

@@ -2,7 +2,7 @@ package com.storlead.system.assemble;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import com.storlead.frame.mybatis.entity.SysBaseField;
+import com.storlead.framework.mybatis.entity.SysBaseField;
 import org.apache.poi.ss.formula.functions.T;
 
 import java.lang.invoke.SerializedLambda;

+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/config/FastClientImporter.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/config/FastClientImporter.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/config/JacksonConfig.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/config/JacksonConfig.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/holder/RequestHolder.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/holder/RequestHolder.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/CompanyCustomSettingsMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/CompanyCustomSettingsMapper.java


+ 2 - 1
java/storlead-system/src/main/java/com/storlead/system/mapper/DeptRoleMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/DeptRoleMapper.java

@@ -1,6 +1,7 @@
 package com.storlead.system.mapper;
 
-import com.storlead.frame.mybatis.mapper.MyBaseMapper;
+import com.storlead.framework.mybatis.mapper.MyBaseMapper;
+import com.storlead.framework.mybatis.mapper.MyBaseMapper;
 import com.storlead.system.pojo.entity.DeptRoleEntity;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 

+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/ExcelExportColumnRuleMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelExportColumnRuleMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/ExcelExportTemplateMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelExportTemplateMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/ExcelImportColumnRuleMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelImportColumnRuleMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/ExcelImportTemplateMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/ExcelImportTemplateMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/FileResourceMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/FileResourceMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/MenuMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/MenuMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/QuickMenuMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/QuickMenuMapper.java


+ 1 - 1
java/storlead-system/src/main/java/com/storlead/system/mapper/RoleMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/RoleMapper.java

@@ -1,7 +1,7 @@
 package com.storlead.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.storlead.frame.mybatis.mapper.MyBaseMapper;
+import com.storlead.framework.mybatis.mapper.MyBaseMapper;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import com.storlead.system.pojo.entity.RoleEntity;

+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/RoleMenuMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/RoleMenuMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/SysDictDetailMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/SysDictDetailMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/SysDictMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/SysDictMapper.java


+ 0 - 0
java/storlead-system/src/main/java/com/storlead/system/mapper/SysOperationLogMapper.java → java/storlead-system/storlead-system-biz/src/main/java/com/storlead/system/mapper/SysOperationLogMapper.java


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů