Преглед изворни кода

安全问题:操作日志

chengxiaowen пре 2 недеља
родитељ
комит
5c74fa5543

+ 14 - 1
sso-module-system/sso-module-system-api/src/main/java/com/poteviohealth/cgp/sso/module/system/enums/LogRecordConstants.java

@@ -19,6 +19,8 @@ public interface LogRecordConstants {
     String SYSTEM_USER_DELETE_SUCCESS = "删除了用户【{{#user.nickname}}】";
     String SYSTEM_USER_DELETE_SUCCESS = "删除了用户【{{#user.nickname}}】";
     String SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE = "重置用户密码";
     String SYSTEM_USER_UPDATE_PASSWORD_SUB_TYPE = "重置用户密码";
     String SYSTEM_USER_UPDATE_PASSWORD_SUCCESS = "将用户【{{#user.nickname}}】的密码重置";
     String SYSTEM_USER_UPDATE_PASSWORD_SUCCESS = "将用户【{{#user.nickname}}】的密码重置";
+    String SYSTEM_USER_IMPORT_SUCCESS = "导入了用户";
+    String SYSTEM_USER_STATUS_SUCCESS = "更新了用户【{{#user.nickname}}】状态";
 
 
     // ======================= SYSTEM_ROLE 角色 =======================
     // ======================= SYSTEM_ROLE 角色 =======================
 
 
@@ -32,12 +34,23 @@ public interface LogRecordConstants {
 
 
     // ======================= SYSTEM_DEPT 机构 =======================
     // ======================= SYSTEM_DEPT 机构 =======================
 
 
-    String SYSTEM_DEPT_TYPE = "SYSTEM 角色";
+    String SYSTEM_DEPT_TYPE = "SYSTEM 机构";
     String SYSTEM_DEPT_CREATE_SUB_TYPE = "创建部门";
     String SYSTEM_DEPT_CREATE_SUB_TYPE = "创建部门";
     String SYSTEM_DEPT_CREATE_SUCCESS = "创建了部门【{{#dept.name}}】";
     String SYSTEM_DEPT_CREATE_SUCCESS = "创建了部门【{{#dept.name}}】";
     String SYSTEM_DEPT_UPDATE_SUB_TYPE = "更新部门";
     String SYSTEM_DEPT_UPDATE_SUB_TYPE = "更新部门";
     String SYSTEM_DEPT_UPDATE_SUCCESS = "更新了部门【{{#dept.name}}】: {_DIFF{#updateReqVO}}";
     String SYSTEM_DEPT_UPDATE_SUCCESS = "更新了部门【{{#dept.name}}】: {_DIFF{#updateReqVO}}";
     String SYSTEM_DEPT_DELETE_SUB_TYPE = "删除部门";
     String SYSTEM_DEPT_DELETE_SUB_TYPE = "删除部门";
     String SYSTEM_DEPT_DELETE_SUCCESS = "删除了部门【{{#dept.name}}】";
     String SYSTEM_DEPT_DELETE_SUCCESS = "删除了部门【{{#dept.name}}】";
+    String SYSTEM_DEPT_STATUS_SUCCESS = "更新了部门【{{#dept.name}}】状态";
+
+    // ======================= system_oauth2_client 应用 =======================
+
+    String SYSTEM_CLIENT_TYPE = "SYSTEM 应用";
+    String SYSTEM_CLIENT_CREATE_SUB_TYPE = "创建应用";
+    String SYSTEM_CLIENT_CREATE_SUCCESS = "创建了应用【{{#client.name}}】";
+    String SYSTEM_CLIENT_UPDATE_SUB_TYPE = "更新应用";
+    String SYSTEM_CLIENT_UPDATE_SUCCESS = "更新了应用【{{#client.name}}】: {_DIFF{#updateReqVO}}";
+    String SYSTEM_CLIENT_DELETE_SUB_TYPE = "删除应用";
+    String SYSTEM_CLIENT_DELETE_SUCCESS = "删除了应用【{{#client.name}}】";
 
 
 }
 }

+ 5 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/dept/DeptServiceImpl.java

@@ -347,6 +347,8 @@ public class DeptServiceImpl implements DeptService {
     }
     }
 
 
     @Override
     @Override
+    @LogRecord(type = SYSTEM_DEPT_TYPE, subType = SYSTEM_DEPT_UPDATE_SUB_TYPE, bizNo = "{{#id}}",
+            success = SYSTEM_DEPT_STATUS_SUCCESS)
     public void updateUserStatus(Long id, Integer status) {
     public void updateUserStatus(Long id, Integer status) {
         // 校验用户存在
         // 校验用户存在
         DeptDO deptDO = validateDeptExists(id);
         DeptDO deptDO = validateDeptExists(id);
@@ -355,6 +357,9 @@ public class DeptServiceImpl implements DeptService {
         updateObj.setId(id);
         updateObj.setId(id);
         updateObj.setStatus(status);
         updateObj.setStatus(status);
         deptMapper.updateById(updateObj);
         deptMapper.updateById(updateObj);
+
+        // 3. 记录操作日志上下文
+        LogRecordContext.putVariable("dept", deptDO);
     }
     }
 
 
     @Override
     @Override

+ 26 - 4
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/oauth2/OAuth2ClientServiceImpl.java

@@ -4,6 +4,9 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.mzt.logapi.context.LogRecordContext;
+import com.mzt.logapi.service.impl.DiffParseFunction;
+import com.mzt.logapi.starter.annotation.LogRecord;
 import com.poteviohealth.cgp.sso.framework.common.enums.CommonStatusEnum;
 import com.poteviohealth.cgp.sso.framework.common.enums.CommonStatusEnum;
 import com.poteviohealth.cgp.sso.framework.common.pojo.PageResult;
 import com.poteviohealth.cgp.sso.framework.common.pojo.PageResult;
 import com.poteviohealth.cgp.sso.framework.common.util.object.BeanUtils;
 import com.poteviohealth.cgp.sso.framework.common.util.object.BeanUtils;
@@ -11,6 +14,7 @@ import com.poteviohealth.cgp.sso.framework.common.util.string.StrUtils;
 import com.poteviohealth.cgp.sso.framework.web.core.util.WebFrameworkUtils;
 import com.poteviohealth.cgp.sso.framework.web.core.util.WebFrameworkUtils;
 import com.poteviohealth.cgp.sso.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO;
 import com.poteviohealth.cgp.sso.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO;
 import com.poteviohealth.cgp.sso.module.system.controller.admin.oauth2.vo.client.OAuth2ClientSaveReqVO;
 import com.poteviohealth.cgp.sso.module.system.controller.admin.oauth2.vo.client.OAuth2ClientSaveReqVO;
+import com.poteviohealth.cgp.sso.module.system.controller.admin.user.vo.user.UserSaveReqVO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.user.AdminUserDO;
 import com.poteviohealth.cgp.sso.module.system.dal.dataobject.user.AdminUserDO;
 import com.poteviohealth.cgp.sso.module.system.dal.mysql.oauth2.OAuth2ClientMapper;
 import com.poteviohealth.cgp.sso.module.system.dal.mysql.oauth2.OAuth2ClientMapper;
@@ -31,6 +35,7 @@ import java.util.List;
 
 
 import static com.poteviohealth.cgp.sso.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.poteviohealth.cgp.sso.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.poteviohealth.cgp.sso.module.system.enums.ErrorCodeConstants.*;
 import static com.poteviohealth.cgp.sso.module.system.enums.ErrorCodeConstants.*;
+import static com.poteviohealth.cgp.sso.module.system.enums.LogRecordConstants.*;
 
 
 /**
 /**
  * OAuth2.0 Client Service 实现类
  * OAuth2.0 Client Service 实现类
@@ -48,42 +53,59 @@ public class OAuth2ClientServiceImpl implements OAuth2ClientService {
     private AdminUserService userService;
     private AdminUserService userService;
 
 
     @Override
     @Override
+    @LogRecord(type = SYSTEM_CLIENT_TYPE, subType = SYSTEM_CLIENT_CREATE_SUB_TYPE, bizNo = "{{#client.id}}",
+            success = SYSTEM_CLIENT_CREATE_SUCCESS)
     public Long createOAuth2Client(OAuth2ClientSaveReqVO createReqVO) {
     public Long createOAuth2Client(OAuth2ClientSaveReqVO createReqVO) {
         validateClientIdExists(null, createReqVO.getClientId());
         validateClientIdExists(null, createReqVO.getClientId());
         // 插入
         // 插入
         OAuth2ClientDO client = BeanUtils.toBean(createReqVO, OAuth2ClientDO.class);
         OAuth2ClientDO client = BeanUtils.toBean(createReqVO, OAuth2ClientDO.class);
         oauth2ClientMapper.insert(client);
         oauth2ClientMapper.insert(client);
+
+        // 3. 记录操作日志上下文
+        LogRecordContext.putVariable("client", client);
         return client.getId();
         return client.getId();
     }
     }
 
 
     @Override
     @Override
     @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT,
     @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT,
             allEntries = true) // allEntries 清空所有缓存,因为可能修改到 clientId 字段,不好清理
             allEntries = true) // allEntries 清空所有缓存,因为可能修改到 clientId 字段,不好清理
+    @LogRecord(type = SYSTEM_CLIENT_TYPE, subType = SYSTEM_CLIENT_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
+            success = SYSTEM_CLIENT_UPDATE_SUCCESS)
     public void updateOAuth2Client(OAuth2ClientSaveReqVO updateReqVO) {
     public void updateOAuth2Client(OAuth2ClientSaveReqVO updateReqVO) {
         // 校验存在
         // 校验存在
-        validateOAuth2ClientExists(updateReqVO.getId());
+        OAuth2ClientDO old = validateOAuth2ClientExists(updateReqVO.getId());
         // 校验 Client 未被占用
         // 校验 Client 未被占用
         validateClientIdExists(updateReqVO.getId(), updateReqVO.getClientId());
         validateClientIdExists(updateReqVO.getId(), updateReqVO.getClientId());
 
 
         // 更新
         // 更新
         OAuth2ClientDO updateObj = BeanUtils.toBean(updateReqVO, OAuth2ClientDO.class);
         OAuth2ClientDO updateObj = BeanUtils.toBean(updateReqVO, OAuth2ClientDO.class);
         oauth2ClientMapper.updateById(updateObj);
         oauth2ClientMapper.updateById(updateObj);
+
+        // 3. 记录操作日志上下文
+        LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(old, OAuth2ClientSaveReqVO.class));
+        LogRecordContext.putVariable("client", updateObj);
     }
     }
 
 
     @Override
     @Override
     @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT,
     @CacheEvict(cacheNames = RedisKeyConstants.OAUTH_CLIENT,
             allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 key,不好清理
             allEntries = true) // allEntries 清空所有缓存,因为 id 不是直接的缓存 key,不好清理
+    @LogRecord(type = SYSTEM_CLIENT_TYPE, subType = SYSTEM_CLIENT_DELETE_SUB_TYPE, bizNo = "{{#id}}",
+            success = SYSTEM_CLIENT_DELETE_SUCCESS)
     public void deleteOAuth2Client(Long id) {
     public void deleteOAuth2Client(Long id) {
         // 校验存在
         // 校验存在
-        validateOAuth2ClientExists(id);
+        OAuth2ClientDO old = validateOAuth2ClientExists(id);
         // 删除
         // 删除
         oauth2ClientMapper.deleteById(id);
         oauth2ClientMapper.deleteById(id);
+        // 3. 记录操作日志上下文
+        LogRecordContext.putVariable("client", old);
     }
     }
 
 
-    private void validateOAuth2ClientExists(Long id) {
-        if (oauth2ClientMapper.selectById(id) == null) {
+    private OAuth2ClientDO validateOAuth2ClientExists(Long id) {
+        OAuth2ClientDO old = oauth2ClientMapper.selectById(id);
+        if (old == null) {
             throw exception(OAUTH2_CLIENT_NOT_EXISTS);
             throw exception(OAUTH2_CLIENT_NOT_EXISTS);
         }
         }
+        return old;
     }
     }
 
 
     @VisibleForTesting
     @VisibleForTesting

+ 7 - 0
sso-module-system/sso-module-system-biz/src/main/java/com/poteviohealth/cgp/sso/module/system/service/user/AdminUserServiceImpl.java

@@ -241,6 +241,8 @@ public class AdminUserServiceImpl implements AdminUserService {
     }
     }
 
 
     @Override
     @Override
+    @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_UPDATE_SUB_TYPE, bizNo = "{{#id}}",
+            success = SYSTEM_USER_STATUS_SUCCESS)
     public void updateUserStatus(Long id, Integer status) {
     public void updateUserStatus(Long id, Integer status) {
         // 校验用户存在
         // 校验用户存在
         AdminUserDO user = validateUserExists(id);
         AdminUserDO user = validateUserExists(id);
@@ -252,6 +254,9 @@ public class AdminUserServiceImpl implements AdminUserService {
         updateObj.setId(id);
         updateObj.setId(id);
         updateObj.setStatus(status);
         updateObj.setStatus(status);
         userMapper.updateById(updateObj);
         userMapper.updateById(updateObj);
+
+        // 3. 记录操作日志上下文
+        LogRecordContext.putVariable("user", user);
     }
     }
 
 
     @Override
     @Override
@@ -473,6 +478,8 @@ public class AdminUserServiceImpl implements AdminUserService {
 
 
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
     @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
+    @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_CREATE_SUB_TYPE, bizNo = "",
+            success = SYSTEM_USER_IMPORT_SUCCESS)
     public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
     public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
         if (CollUtil.isEmpty(importUsers)) {
         if (CollUtil.isEmpty(importUsers)) {
             throw exception(USER_IMPORT_LIST_IS_EMPTY);
             throw exception(USER_IMPORT_LIST_IS_EMPTY);

+ 1 - 0
sso-server/src/main/java/com/poteviohealth/cgp/sso/server/SsoServerApplication.java

@@ -1,5 +1,6 @@
 package com.poteviohealth.cgp.sso.server;
 package com.poteviohealth.cgp.sso.server;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressWarnings;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 

+ 81 - 22
sso-server/src/main/resources/application-dev.yaml

@@ -33,14 +33,14 @@ spring:
             multi-statement-allow: true
             multi-statement-allow: true
     dynamic: # 多数据源配置
     dynamic: # 多数据源配置
       druid: # Druid 【连接池】相关的全局配置
       druid: # Druid 【连接池】相关的全局配置
-        initial-size: 5 # 初始连接数
-        min-idle: 10 # 最小连接池数量
+        initial-size: 1 # 初始连接数
+        min-idle: 1 # 最小连接池数量
         max-active: 20 # 最大连接池数量
         max-active: 20 # 最大连接池数量
         max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
         max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
         time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
         time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
         min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
         min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
         max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
         max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
-        validation-query: SELECT 1 # 配置检测连接是否有效
+        validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
         test-while-idle: true
         test-while-idle: true
         test-on-borrow: false
         test-on-borrow: false
         test-on-return: false
         test-on-return: false
@@ -48,27 +48,52 @@ spring:
       datasource:
       datasource:
         master:
         master:
           url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
           url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          #          url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
+          #          url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+          #          url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+          #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 连接的示例
+          #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
           username: ssovue
           username: ssovue
           password: Om$MfIj1
           password: Om$MfIj1
-        slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
+        #          url: jdbc:mysql://192.168.8.191:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+        #          username: root
+        #          password: mogu2018
+        #          url: jdbc:mysql://10.108.200.80:5857/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+        #          username: ssovue
+        #          password: Om$MfIj1
+        #          username: sa # SQL Server 连接的示例
+        #          password: Yudao@2024 # SQL Server 连接的示例
+        #          username: SYSDBA # DM 连接的示例
+        #          password: SYSDBA001 # DM 连接的示例
+        slave: # 模拟从库,可根据自己需要修改
           lazy: true # 开启懒加载,保证启动速度
           lazy: true # 开启懒加载,保证启动速度
-          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          #          url: jdbc:mysql://10.108.200.80:5857/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          #          username: ssovue
+          #          password: Om$MfIj1
+          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: ssovue
           username: ssovue
           password: Om$MfIj1
           password: Om$MfIj1
+  #          url: jdbc:mysql://192.168.8.191:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+  #          username: root
+  #          password: mogu2018
 
 
-  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优R
   redis:
   redis:
-    host: 8.131.243.90 # 地址
-    port: 6379 # 端口
+    host: 47.94.156.179 # 地址
+    port: 16379 # 端口
     database: 11 # 数据库索引
     database: 11 # 数据库索引
-    password: lzTest2022 # 密码,建议生产环境开启
+    password: trJQ#4gN # 密码,建议生产环境开启
+#    host: 10.108.200.80 # 地址
+#    port: 16379 # 端口
+#    database: 10 # 数据库索引
+#    password: trJQ#4gN # 密码,建议生产环境开启
 
 
 --- #################### 定时任务相关配置 ####################
 --- #################### 定时任务相关配置 ####################
 
 
 # Quartz 配置项,对应 QuartzProperties 配置类
 # Quartz 配置项,对应 QuartzProperties 配置类
 spring:
 spring:
   quartz:
   quartz:
-    auto-startup: true # 测试环境,需要开启 Job
+    auto-startup: true # 本地开发环境,尽量不要开启 Job
     scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
     scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
     job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
     job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
     wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
     wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
@@ -105,8 +130,8 @@ spring:
   rabbitmq:
   rabbitmq:
     host: 127.0.0.1 # RabbitMQ 服务的地址
     host: 127.0.0.1 # RabbitMQ 服务的地址
     port: 5672 # RabbitMQ 服务的端口
     port: 5672 # RabbitMQ 服务的端口
-    username: guest # RabbitMQ 服务的账号
-    password: guest # RabbitMQ 服务的密码
+    username: rabbit # RabbitMQ 服务的账号
+    password: rabbit # RabbitMQ 服务的密码
   # Kafka 配置项,对应 KafkaProperties 配置类
   # Kafka 配置项,对应 KafkaProperties 配置类
   kafka:
   kafka:
     bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
     bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
@@ -144,21 +169,49 @@ spring:
 logging:
 logging:
   file:
   file:
     name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
     name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+  level:
+    # 配置自己写的 MyBatis Mapper 打印日志
+    com.poteviohealth.cgp.sso.module.bpm.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.infra.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # 配置 ApiErrorLogMapper 的日志级别为 info,避免和 GlobalExceptionHandler 重复打印
+    com.poteviohealth.cgp.sso.module.infra.dal.mysql.job.JobLogMapper: INFO # 配置 JobLogMapper 的日志级别为 info
+    com.poteviohealth.cgp.sso.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
+    com.poteviohealth.cgp.sso.module.pay.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # 配置 PayNotifyTaskMapper 的日志级别为 info
+    com.poteviohealth.cgp.sso.module.system.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info
+    com.poteviohealth.cgp.sso.module.tool.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.member.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.trade.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.promotion.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.statistics.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.crm.dal.mysql: debug
+    com.poteviohealth.cgp.sso.module.erp.dal.mysql: debug
+    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+debug: false
 
 
---- #################### 微信公众号相关配置 ####################
-wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
-  mp:
-    # 公众号配置(必填)
-    app-id: wx041349c6f39b268b
-    secret: 5abee519483bc9f8cb37ce280e814bd0
+--- #################### 微信公众号、小程序相关配置 ####################
+wx:
+  mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
+    #    app-id: wx041349c6f39b268b # 测试号(牛希尧提供的)
+    #    secret: 5abee519483bc9f8cb37ce280e814bd0
+    app-id: wx5b23ba7a5589ecbb # 测试号(自己的)
+    secret: 2a7b3b20c537e52e74afd395eb85f61f
+    #    app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的)
+    #    secret: bd4f9fab889591b62aeac0d7b8d8b4a0
     # 存储配置,解决 AccessToken 的跨节点的共享
     # 存储配置,解决 AccessToken 的跨节点的共享
     config-storage:
     config-storage:
       type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
       type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
       key-prefix: wx # Redis Key 的前缀
       key-prefix: wx # Redis Key 的前缀
       http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
       http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
   miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
   miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
-    appid: wx63c280fe3248a3e7
+    #    appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
+    #    secret: 333ae72f41552af1e998fe1f54e1584a
+    appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
     secret: 6f270509224a7ae1296bbf1c8cb97aed
     secret: 6f270509224a7ae1296bbf1c8cb97aed
+    #    appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的)
+    #    secret: 4a1a04e07f6a4a0751b39c3064a92c8b
     config-storage:
     config-storage:
       type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
       type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
       key-prefix: wa # Redis Key 的前缀
       key-prefix: wa # Redis Key 的前缀
@@ -167,7 +220,11 @@ wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-sta
 --- #################### 中康科相关配置 ####################
 --- #################### 中康科相关配置 ####################
 
 
 # 中康科配置项,设置当前项目所有自定义的配置
 # 中康科配置项,设置当前项目所有自定义的配置
-sso:
+yudao:
+  captcha:
+    enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
+  security:
+    mock-enable: true
   xss:
   xss:
     enable: false
     enable: false
     exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
     exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
@@ -176,7 +233,9 @@ sso:
   pay:
   pay:
     order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
     order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
     refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
     refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
-  demo: true # 开启演示模式
+  access-log: # 访问日志的配置项
+    enable: false
+  demo: false # 关闭演示模式
   tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
   tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
 
 
 justauth:
 justauth:
@@ -204,4 +263,4 @@ justauth:
   cache:
   cache:
     type: REDIS
     type: REDIS
     prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
     prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
-    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
+    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟

+ 21 - 5
sso-server/src/main/resources/application-local.yaml

@@ -47,12 +47,18 @@ spring:
       primary: master
       primary: master
       datasource:
       datasource:
         master:
         master:
-          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          #          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
           #          url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
           #          url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
           #          url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
           #          url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
           #          url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
           #          url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
           #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 连接的示例
           #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 连接的示例
           #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
           #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+          #          username: ssovue
+          #          password: Om$MfIj1
+          #          url: jdbc:mysql://192.168.8.191:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          #          username: root
+          #          password: mogu2018
+          url: jdbc:mysql://10.108.200.84:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: ssovue
           username: ssovue
           password: Om$MfIj1
           password: Om$MfIj1
         #          username: sa # SQL Server 连接的示例
         #          username: sa # SQL Server 连接的示例
@@ -61,15 +67,25 @@ spring:
         #          password: SYSDBA001 # DM 连接的示例
         #          password: SYSDBA001 # DM 连接的示例
         slave: # 模拟从库,可根据自己需要修改
         slave: # 模拟从库,可根据自己需要修改
           lazy: true # 开启懒加载,保证启动速度
           lazy: true # 开启懒加载,保证启动速度
-          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://10.108.200.84:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: ssovue
           username: ssovue
           password: Om$MfIj1
           password: Om$MfIj1
+  #          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+  #          username: ssovue
+  #          password: Om$MfIj1
+  #          url: jdbc:mysql://192.168.8.191:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+  #          username: root
+  #          password: mogu2018
 
 
   # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优R
   # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优R
   redis:
   redis:
-    host: 47.94.156.179 # 地址
+    #    host: 47.94.156.179 # 地址
+    #    port: 16379 # 端口
+    #    database: 10 # 数据库索引
+    #    password: trJQ#4gN # 密码,建议生产环境开启
+    host: 10.108.200.80 # 地址
     port: 16379 # 端口
     port: 16379 # 端口
-    database: 11 # 数据库索引
+    database: 10 # 数据库索引
     password: trJQ#4gN # 密码,建议生产环境开启
     password: trJQ#4gN # 密码,建议生产环境开启
 
 
 --- #################### 定时任务相关配置 ####################
 --- #################### 定时任务相关配置 ####################
@@ -208,7 +224,7 @@ yudao:
   captcha:
   captcha:
     enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
     enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
   security:
   security:
-    mock-enable: true
+    mock-enable: false
   xss:
   xss:
     enable: false
     enable: false
     exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
     exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系

+ 266 - 0
sso-server/src/main/resources/application-prod.yaml

@@ -0,0 +1,266 @@
+server:
+  port: 48080
+
+--- #################### 数据库相关配置 ####################
+
+spring:
+  # 数据源配置项
+  autoconfigure:
+    exclude:
+      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
+      - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+      - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
+      - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+  datasource:
+    druid: # Druid 【监控】相关的全局配置
+      web-stat-filter:
+        enabled: true
+      stat-view-servlet:
+        enabled: true
+        allow: # 设置白名单,不填则允许所有访问
+        url-pattern: /druid/*
+        login-username: # 控制台管理用户名和密码
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          log-slow-sql: true # 慢 SQL 记录
+          slow-sql-millis: 100
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+    dynamic: # 多数据源配置
+      druid: # Druid 【连接池】相关的全局配置
+        initial-size: 1 # 初始连接数
+        min-idle: 1 # 最小连接池数量
+        max-active: 20 # 最大连接池数量
+        max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+        time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+        min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+        max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+        validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+        test-while-idle: true
+        test-on-borrow: false
+        test-on-return: false
+      primary: master
+      datasource:
+        master:
+          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          #          url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
+          #          url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+          #          url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+          #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 连接的示例
+          #          url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+          username: ssovue
+          password: Om$MfIj1
+#          url: jdbc:mysql://192.168.8.191:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          username: root
+#          password: mogu2018
+#          url: jdbc:mysql://10.108.200.80:5857/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          username: ssovue
+#          password: Om$MfIj1
+        #          username: sa # SQL Server 连接的示例
+        #          password: Yudao@2024 # SQL Server 连接的示例
+        #          username: SYSDBA # DM 连接的示例
+        #          password: SYSDBA001 # DM 连接的示例
+        slave: # 模拟从库,可根据自己需要修改
+          lazy: true # 开启懒加载,保证启动速度
+#          url: jdbc:mysql://10.108.200.80:5857/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          username: ssovue
+#          password: Om$MfIj1
+          url: jdbc:mysql://8.140.107.248:13306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          username: ssovue
+          password: Om$MfIj1
+#          url: jdbc:mysql://192.168.8.191:3306/vue_pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          username: root
+#          password: mogu2018
+
+  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优R
+  redis:
+    host: 47.94.156.179 # 地址
+    port: 16379 # 端口
+    database: 11 # 数据库索引
+    password: trJQ#4gN # 密码,建议生产环境开启
+#    host: 10.108.200.80 # 地址
+#    port: 16379 # 端口
+#    database: 10 # 数据库索引
+#    password: trJQ#4gN # 密码,建议生产环境开启
+
+--- #################### 定时任务相关配置 ####################
+
+# Quartz 配置项,对应 QuartzProperties 配置类
+spring:
+  quartz:
+    auto-startup: true # 本地开发环境,尽量不要开启 Job
+    scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
+    job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
+    wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
+    properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
+      org:
+        quartz:
+          # Scheduler 相关配置
+          scheduler:
+            instanceName: schedulerName
+            instanceId: AUTO # 自动生成 instance ID
+          # JobStore 相关配置
+          jobStore:
+            # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
+            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
+            isClustered: true # 是集群模式
+            clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
+            misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
+          # 线程池相关配置
+          threadPool:
+            threadCount: 25 # 线程池大小。默认为 10 。
+            threadPriority: 5 # 线程优先级
+            class: org.quartz.simpl.SimpleThreadPool # 线程池类型
+    jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
+      initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
+
+--- #################### 消息队列相关 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+  name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+
+spring:
+  # RabbitMQ 配置项,对应 RabbitProperties 配置类
+  rabbitmq:
+    host: 127.0.0.1 # RabbitMQ 服务的地址
+    port: 5672 # RabbitMQ 服务的端口
+    username: rabbit # RabbitMQ 服务的账号
+    password: rabbit # RabbitMQ 服务的密码
+  # Kafka 配置项,对应 KafkaProperties 配置类
+  kafka:
+    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+  acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+  expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+  endpoints:
+    web:
+      base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+      exposure:
+        include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+  boot:
+    admin:
+      # Spring Boot Admin Client 客户端的相关配置
+      client:
+        url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
+        instance:
+          service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+      # Spring Boot Admin Server 服务端的相关配置
+      context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+  file:
+    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+  level:
+    # 配置自己写的 MyBatis Mapper 打印日志
+    cn.iocoder.yudao.module.bpm.dal.mysql: debug
+    cn.iocoder.yudao.module.infra.dal.mysql: debug
+    cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # 配置 ApiErrorLogMapper 的日志级别为 info,避免和 GlobalExceptionHandler 重复打印
+    cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper: INFO # 配置 JobLogMapper 的日志级别为 info
+    cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
+    cn.iocoder.yudao.module.pay.dal.mysql: debug
+    cn.iocoder.yudao.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # 配置 PayNotifyTaskMapper 的日志级别为 info
+    cn.iocoder.yudao.module.system.dal.mysql: debug
+    cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info
+    cn.iocoder.yudao.module.tool.dal.mysql: debug
+    cn.iocoder.yudao.module.member.dal.mysql: debug
+    cn.iocoder.yudao.module.trade.dal.mysql: debug
+    cn.iocoder.yudao.module.promotion.dal.mysql: debug
+    cn.iocoder.yudao.module.statistics.dal.mysql: debug
+    cn.iocoder.yudao.module.crm.dal.mysql: debug
+    cn.iocoder.yudao.module.erp.dal.mysql: debug
+    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+debug: false
+
+--- #################### 微信公众号、小程序相关配置 ####################
+wx:
+  mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
+    #    app-id: wx041349c6f39b268b # 测试号(牛希尧提供的)
+    #    secret: 5abee519483bc9f8cb37ce280e814bd0
+    app-id: wx5b23ba7a5589ecbb # 测试号(自己的)
+    secret: 2a7b3b20c537e52e74afd395eb85f61f
+    #    app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的)
+    #    secret: bd4f9fab889591b62aeac0d7b8d8b4a0
+    # 存储配置,解决 AccessToken 的跨节点的共享
+    config-storage:
+      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
+      key-prefix: wx # Redis Key 的前缀
+      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
+  miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
+    #    appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
+    #    secret: 333ae72f41552af1e998fe1f54e1584a
+    appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
+    secret: 6f270509224a7ae1296bbf1c8cb97aed
+    #    appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的)
+    #    secret: 4a1a04e07f6a4a0751b39c3064a92c8b
+    config-storage:
+      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
+      key-prefix: wa # Redis Key 的前缀
+      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
+
+--- #################### 中康科相关配置 ####################
+
+# 中康科配置项,设置当前项目所有自定义的配置
+yudao:
+  captcha:
+    enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
+  security:
+    mock-enable: true
+  xss:
+    enable: false
+    exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
+      - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
+      - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
+  pay:
+    order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
+    refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
+  access-log: # 访问日志的配置项
+    enable: false
+  demo: false # 关闭演示模式
+  tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
+
+justauth:
+  enabled: true
+  type:
+    DINGTALK: # 钉钉
+      client-id: dingvrnreaje3yqvzhxg
+      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
+      ignore-check-redirect-uri: true
+    WECHAT_ENTERPRISE: # 企业微信
+      client-id: wwd411c69a39ad2e54
+      client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
+      agent-id: 1000004
+      ignore-check-redirect-uri: true
+    # noinspection SpringBootApplicationYaml
+    WECHAT_MINI_APP: # 微信小程序
+      client-id: ${wx.miniapp.appid}
+      client-secret: ${wx.miniapp.secret}
+      ignore-check-redirect-uri: true
+      ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验
+    WECHAT_MP: # 微信公众号
+      client-id: ${wx.mp.app-id}
+      client-secret: ${wx.mp.secret}
+      ignore-check-redirect-uri: true
+  cache:
+    type: REDIS
+    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟

+ 9 - 4
sso-server/src/main/resources/application.yaml

@@ -3,7 +3,7 @@ spring:
     name: sso-server
     name: sso-server
 
 
   profiles:
   profiles:
-    active: local
+    active: dev
 
 
   main:
   main:
     allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
     allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
@@ -26,8 +26,12 @@ spring:
       write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
       write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
       write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
       write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
       write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
       write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
-      fail-on-empty-beans: false # 允许序列化无属性的 Bean
-
+      #fail-on-empty-beans: false # 允许序列化无属性的 Bean
+      # 某些类对象无法序列化的时候,是否报错
+      fail_on_empty_beans: true
+    deserialization:
+      # json对象中有不存在的属性时候,是否报错
+      fail_on_unknown_properties: true
   # Cache 配置项
   # Cache 配置项
   cache:
   cache:
     type: REDIS
     type: REDIS
@@ -107,7 +111,7 @@ aj:
     cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
     cache-number: 1000 # local 缓存的阈值,达到这个值,清除缓存
     timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
     timing-clear: 180 # local定时清除过期缓存(单位秒),设置为0代表不执行
     type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选
     type: blockPuzzle # 验证码类型 default两种都实例化。 blockPuzzle 滑块拼图 clickWord 文字点选
-    water-mark: 中康科 # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode
+    water-mark:  # 右下角水印文字(我的水印),可使用 https://tool.chinaz.com/tools/unicode.aspx 中文转 Unicode,Linux 可能需要转 unicode
     interference-options: 0 # 滑动干扰项(0/1/2)
     interference-options: 0 # 滑动干扰项(0/1/2)
     req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
     req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false
     req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定
     req-get-lock-limit: 5 # 验证失败 5 次,get接口锁定
@@ -193,6 +197,7 @@ sso:
       - /admin-api/pay/notify/** # 支付回调通知,不携带租户编号
       - /admin-api/pay/notify/** # 支付回调通知,不携带租户编号
       - /jmreport/* # 积木报表,无法携带租户编号
       - /jmreport/* # 积木报表,无法携带租户编号
       - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号
       - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号
+      - /admin-api/system/auth/guanyuanLogin
     ignore-tables:
     ignore-tables:
       - system_tenant
       - system_tenant
       - system_tenant_package
       - system_tenant_package

+ 3 - 3
sso-ui/sso-ui-admin-vue3/.env.dev

@@ -4,12 +4,12 @@ NODE_ENV=production
 VITE_DEV=true
 VITE_DEV=true
 
 
 # 请求路径
 # 请求路径
-VITE_BASE_URL='http://123.56.196.46:48080'
+VITE_BASE_URL='http://localhost:48080'
 
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 VITE_UPLOAD_TYPE=server
 # 上传路径
 # 上传路径
-VITE_UPLOAD_URL='http://123.56.196.46:48080/admin-api/infra/file/upload'
+VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
 
 
 # 接口地址
 # 接口地址
 VITE_API_URL=/admin-api
 VITE_API_URL=/admin-api
@@ -30,7 +30,7 @@ VITE_BASE_PATH=/
 VITE_OUT_DIR=dist
 VITE_OUT_DIR=dist
 
 
 # 商城H5会员端域名
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN='http://123.56.196.46:48080'
+VITE_MALL_H5_DOMAIN='http://localhost:48080'
 
 
 # 验证码的开关
 # 验证码的开关
 VITE_APP_CAPTCHA_ENABLE=true
 VITE_APP_CAPTCHA_ENABLE=true

+ 3 - 3
sso-ui/sso-ui-admin-vue3/.env.prod

@@ -4,12 +4,12 @@ NODE_ENV=production
 VITE_DEV=false
 VITE_DEV=false
 
 
 # 请求路径
 # 请求路径
-VITE_BASE_URL='http://123.56.196.46:48080'
+VITE_BASE_URL='https://kycloud.checg.cn'
 
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 VITE_UPLOAD_TYPE=server
 # 上传路径
 # 上传路径
-VITE_UPLOAD_URL='http://123.56.196.46:48080/admin-api/infra/file/upload'
+VITE_UPLOAD_URL='https://kycloud.checg.cn/admin-api/infra/file/upload'
 
 
 # 接口地址
 # 接口地址
 VITE_API_URL=/admin-api
 VITE_API_URL=/admin-api
@@ -30,7 +30,7 @@ VITE_BASE_PATH=/
 VITE_OUT_DIR=dist-prod
 VITE_OUT_DIR=dist-prod
 
 
 # 商城H5会员端域名
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN='http://123.56.196.46:48080'
+VITE_MALL_H5_DOMAIN='https://kycloud.checg.cn'
 
 
 # 验证码的开关
 # 验证码的开关
 VITE_APP_CAPTCHA_ENABLE=true
 VITE_APP_CAPTCHA_ENABLE=true

+ 3 - 3
sso-ui/sso-ui-admin-vue3/.env.test

@@ -4,12 +4,12 @@ NODE_ENV=production
 VITE_DEV=false
 VITE_DEV=false
 
 
 # 请求路径
 # 请求路径
-VITE_BASE_URL='http://localhost:48080'
+VITE_BASE_URL='http://123.56.196.46:11016'
 
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
 VITE_UPLOAD_TYPE=server
 VITE_UPLOAD_TYPE=server
 # 上传路径
 # 上传路径
-VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
+VITE_UPLOAD_URL='http://123.56.196.46:11016/admin-api/infra/file/upload'
 
 
 # 接口地址
 # 接口地址
 VITE_API_URL=/admin-api
 VITE_API_URL=/admin-api
@@ -30,4 +30,4 @@ VITE_BASE_PATH=/admin-ui-vue3/
 VITE_OUT_DIR=dist-test
 VITE_OUT_DIR=dist-test
 
 
 # 商城H5会员端域名
 # 商城H5会员端域名
-VITE_MALL_H5_DOMAIN='https://dev.poteviohealth.com/home'
+VITE_MALL_H5_DOMAIN='http://123.56.196.46:11016'

+ 2 - 0
sso-ui/sso-ui-admin-vue3/package.json

@@ -8,12 +8,14 @@
     "i": "pnpm install",
     "i": "pnpm install",
     "dev": "vite",
     "dev": "vite",
     "dev-server": "vite --mode dev",
     "dev-server": "vite --mode dev",
+    "test": "vite --mode test",
     "ts:check": "vue-tsc --noEmit",
     "ts:check": "vue-tsc --noEmit",
     "build:local": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev --base=/sso/",
     "build:local": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev --base=/sso/",
     "build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev --base=/sso/",
     "build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev --base=/sso/",
     "build:test": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode test --base=/sso/",
     "build:test": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode test --base=/sso/",
     "build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage",
     "build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage",
     "build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod --base=/sso/",
     "build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod --base=/sso/",
+    "build:prodroot": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod",
     "serve:dev": "vite preview --mode dev",
     "serve:dev": "vite preview --mode dev",
     "serve:prod": "vite preview --mode prod",
     "serve:prod": "vite preview --mode prod",
     "preview": "pnpm build:local && vite preview",
     "preview": "pnpm build:local && vite preview",