Эх сурвалжийг харах

bump: 发布1.9.0

details see: https://helio.uncarbon.cc/#/i18n/zh-CN/appendix/change-log
Uncarbon 2 жил өмнө
parent
commit
a6f736a545
45 өөрчлөгдсөн 673 нэмэгдсэн , 450 устгасан
  1. 65 1
      README.md
  2. 2 2
      pom.xml
  3. 146 84
      src/main/java/cc/uncarbon/aspect/SysLogAspect.java
  4. 6 0
      src/main/java/cc/uncarbon/config/AsyncConfiguration.java
  5. 8 3
      src/main/java/cc/uncarbon/config/CustomInterceptorConfiguration.java
  6. 14 0
      src/main/java/cc/uncarbon/module/adminapi/constant/AdminApiConstant.java
  7. 11 6
      src/main/java/cc/uncarbon/module/adminapi/web/auth/AdminAuthController.java
  8. 10 5
      src/main/java/cc/uncarbon/module/adminapi/web/oss/AdminOssFileInfoController.java
  9. 9 4
      src/main/java/cc/uncarbon/module/adminapi/web/oss/AdminOssUploadDownloadController.java
  10. 12 7
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysDataDictController.java
  11. 12 7
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysDeptController.java
  12. 9 4
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysLogController.java
  13. 14 9
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysMenuController.java
  14. 12 7
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysParamController.java
  15. 13 8
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysRoleController.java
  16. 12 7
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysTenantController.java
  17. 18 18
      src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysUserController.java
  18. 0 16
      src/main/java/cc/uncarbon/module/app/constant/AppConstant.java
  19. 14 0
      src/main/java/cc/uncarbon/module/appapi/constant/AppApiConstant.java
  20. 4 5
      src/main/java/cc/uncarbon/module/appapi/web/AppAuthController.java
  21. 2 2
      src/main/java/cc/uncarbon/module/oss/model/request/AdminInsertOrUpdateOssFileInfoDTO.java
  22. 2 0
      src/main/java/cc/uncarbon/module/sys/constant/SysConstant.java
  23. 2 2
      src/main/java/cc/uncarbon/module/sys/entity/SysDeptEntity.java
  24. 2 2
      src/main/java/cc/uncarbon/module/sys/entity/SysMenuEntity.java
  25. 2 2
      src/main/java/cc/uncarbon/module/sys/entity/SysTenantEntity.java
  26. 1 1
      src/main/java/cc/uncarbon/module/sys/entity/SysUserEntity.java
  27. 0 25
      src/main/java/cc/uncarbon/module/sys/enums/GenderEnum.java
  28. 0 62
      src/main/java/cc/uncarbon/module/sys/enums/GenericStatusEnum.java
  29. 0 1
      src/main/java/cc/uncarbon/module/sys/enums/SysUserStatusEnum.java
  30. 0 0
      src/main/java/cc/uncarbon/module/sys/mapper/xml/SysUserMapper.xml
  31. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysDeptDTO.java
  32. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysMenuDTO.java
  33. 1 1
      src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysUserDTO.java
  34. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysTenantDTO.java
  35. 2 2
      src/main/java/cc/uncarbon/module/sys/model/request/AdminUpdateSysTenantDTO.java
  36. 2 2
      src/main/java/cc/uncarbon/module/sys/model/response/SysDeptBO.java
  37. 2 2
      src/main/java/cc/uncarbon/module/sys/model/response/SysMenuBO.java
  38. 2 2
      src/main/java/cc/uncarbon/module/sys/model/response/SysTenantBO.java
  39. 1 1
      src/main/java/cc/uncarbon/module/sys/model/response/SysUserBO.java
  40. 1 1
      src/main/java/cc/uncarbon/module/sys/model/response/SysUserBaseInfoBO.java
  41. 2 7
      src/main/java/cc/uncarbon/module/sys/model/response/VbenAdminMenuMetaVO.java
  42. 4 10
      src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java
  43. 2 4
      src/main/java/cc/uncarbon/module/sys/service/SysUserService.java
  44. 244 120
      src/main/java/cc/uncarbon/module/sys/util/AdminStpUtil.java
  45. 2 2
      src/main/resources/application.yml

+ 65 - 1
README.md

@@ -5,10 +5,10 @@
 
 JDK compatibility: 1.8 - 17
 
+【[前端演示站](https://helio-demo.uncarbon.cc/)】
 【[官方文档](https://helio.uncarbon.cc/)】 
 【[主要技术栈依赖](https://helio.uncarbon.cc/#/i18n/zh-CN/helio-starters/dependencies)】
 【[快速启动步骤](https://helio.uncarbon.cc/#/i18n/zh-CN/helio-boot/quick-start)】
-【[前端演示站](https://helio-demo.uncarbon.cc/)】
 【[更新记录](https://helio.uncarbon.cc/#/i18n/zh-CN/appendix/change-log)】
 【[编码良好实践](https://helio.uncarbon.cc/#/i18n/zh-CN/experience/good-practices)】
 
@@ -26,3 +26,67 @@ JDK compatibility: 1.8 - 17
 | 项目名            | 后端                                                                    | 前端                                                                              | 需导入数据库文件                                                                     |
 |----------------|-----------------------------------------------------------------------|---------------------------------------------------------------------------------|------------------------------------------------------------------------------|
 | library 图书管理系统 | [Gitee](https://gitee.com/uncarbon97/helio-boot/tree/demo%2Flibrary/) | [Gitee](https://gitee.com/uncarbon97/helio-admin-vue-vben/tree/demo%2Flibrary/) | attachments/db/MySQL/helio_boot.sql<br>attachments/db/demo/library_MySQL.sql |
+
+## 目录结构
+```
+├─attachments   附件
+│  └─db 数据库变更脚本
+│      ├─MySQL
+│      │  └─upgrade Helio升级时数据库变更脚本
+│      └─PostgreSQL
+│          └─upgrade Helio升级时数据库变更脚本
+└─src
+    ├─main  主要代码
+    │  ├─java
+    │  │  └─cc
+    │  │      └─uncarbon
+    │  │          ├─aspect  自定义切面
+    │  │          ├─config  配置类
+    │  │          ├─helper  助手类
+    │  │          ├─interceptor Web拦截器
+    │  │          └─module  业务代码模块
+    │  │              ├─adminapi    admin-api,用于后台管理的HTTP-API
+    │  │              │  ├─constant 常量
+    │  │              │  └─web  即:Controller
+    │  │              │      ├─auth 登录登出接口
+    │  │              │      ├─oss  对象存储接口
+    │  │              │      └─sys  预置系统管理接口(如:后台用户、后台角色、后台菜单等)
+    │  │              ├─appapi  app-api,用于C端的HTTP-API【只是一个骨架,并没有业务实现】
+    │  │              │  ├─constant 常量
+    │  │              │  └─web  即:Controller
+    │  │              ├─oss 对象存储服务
+    │  │              │  ├─config   配置类
+    │  │              │  ├─constant 常量
+    │  │              │  ├─entity   实体
+    │  │              │  ├─enums    枚举
+    │  │              │  ├─facade   门面
+    │  │              │  │  └─impl  门面实现类
+    │  │              │  ├─mapper   Mybatis Mapper
+    │  │              │  ├─model    抽象模型
+    │  │              │  │  ├─request   用于请求的
+    │  │              │  │  └─response  用于响应的
+    │  │              │  └─service  服务类
+    │  │              └─sys 预置系统管理服务
+    │  │                  ├─annotation  自定义注解
+    │  │                  ├─constant    常量
+    │  │                  ├─entity  实体
+    │  │                  ├─enums   枚举
+    │  │                  ├─extension   自定义扩展
+    │  │                  │  └─impl 自定义扩展实现类
+    │  │                  ├─facade  门面
+    │  │                  │  └─impl 门面实现类
+    │  │                  ├─mapper  Mybatis Mapper
+    │  │                  │  └─xml  Mybatis Mapper XML
+    │  │                  ├─model   抽象模型
+    │  │                  │  ├─request  用于请求的
+    │  │                  │  └─response 用于响应的
+    │  │                  ├─service 服务类
+    │  │                  └─util    静态工具类
+    │  └─resources  资源,包含符合Spring Boot标准的YAML配置文件、Logback配置文件等
+    │      └─i18n 国际化文案定义
+    └─test  单元测试代码
+        └─java
+            └─cc
+                └─uncarbon
+                    └─test
+```

+ 2 - 2
pom.xml

@@ -8,12 +8,12 @@
     <parent>
         <groupId>cc.uncarbon.framework</groupId>
         <artifactId>helio-starters</artifactId>
-        <version>1.8.0</version>
+        <version>1.9.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>helio-boot</artifactId>
     <!-- 制品版本号,建议每次打包发布时都调整以作区分 -->
-    <version>1.8.0</version>
+    <version>1.9.0-SNAPSHOT</version>
 
     <properties>
         <!-- 这里写其他第三方依赖 -->

+ 146 - 84
src/main/java/cc/uncarbon/aspect/SysLogAspect.java

@@ -1,5 +1,6 @@
 package cc.uncarbon.aspect;
 
+import cc.uncarbon.framework.core.context.UserContext;
 import cc.uncarbon.framework.core.context.UserContextHolder;
 import cc.uncarbon.framework.web.util.IPUtil;
 import cc.uncarbon.module.sys.annotation.SysLog;
@@ -13,13 +14,16 @@ import cc.uncarbon.module.sys.service.SysLogService;
 import cn.dev33.satoken.spring.SpringMVCUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.text.StrPool;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ClassUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONConfig;
 import cn.hutool.json.JSONUtil;
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.JoinPoint;
@@ -32,7 +36,8 @@ import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -54,6 +59,13 @@ public class SysLogAspect {
             .setIgnoreNullValue(false)
             .setIgnoreProperties(SysConstant.SENSITIVE_FIELDS);
 
+    /**
+     * 用于数据脱敏后JSON字符串的序列化配置
+     */
+    private static final JSONConfig TO_JSON_STR_JSON_CONFIG = new JSONConfig()
+            .setNatureKeyComparator()
+            .setDateFormat(DatePattern.NORM_DATETIME_MS_PATTERN);
+
     /**
      * 最大数据文本保存长度
      */
@@ -75,13 +87,16 @@ public class SysLogAspect {
             return;
         }
 
+        HttpServletRequest request = SpringMVCUtil.getRequest();
+        AspectContext aspectContext = new AspectContext(request);
+
         if (!annotation.syncSave()) {
             // 异步保存
-            saveSysLogAsync(joinPoint, annotation, null, ret);
+            saveSysLogAsync(joinPoint, annotation, aspectContext, null, ret);
             return;
         }
 
-        saveSysLog(joinPoint, annotation, null, ret);
+        saveSysLog(joinPoint, annotation, aspectContext, null, ret);
     }
 
     /**
@@ -94,112 +109,159 @@ public class SysLogAspect {
             return;
         }
 
+        HttpServletRequest request = SpringMVCUtil.getRequest();
+        AspectContext aspectContext = new AspectContext(request);
+
         if (!annotation.syncSave()) {
             // 异步保存
-            saveSysLogAsync(joinPoint, annotation, e, null);
+            saveSysLogAsync(joinPoint, annotation, aspectContext, e, null);
             return;
         }
 
-        saveSysLog(joinPoint, annotation, e, null);
+        saveSysLog(joinPoint, annotation, aspectContext, e, null);
     }
 
     /**
      * 同步保存系统日志
+     * @param joinPoint 切点
+     * @param annotation 注解实例
+     * @param aspectContext 上下文
+     * @param e 异常实例,可以为null
+     * @param ret 返回值,可以为null
      */
-    private void saveSysLog(final JoinPoint joinPoint, SysLog annotation, final Throwable e, Object ret) {
-        // 当前线程HTTP请求
-        HttpServletRequest request = SpringMVCUtil.getRequest();
+    private void saveSysLog(final JoinPoint joinPoint, SysLog annotation, final AspectContext aspectContext, final Throwable e, Object ret) {
+        try {
+            // 指定本线程用户态
+            UserContextHolder.setUserContext(aspectContext.getUserContext());
 
-        // SysLog 切面实现类扩展
-        SysLogAspectExtension extensionInstance = DEFAULT_SYS_LOG_ASPECT_EXTENSION;
-        Class<? extends SysLogAspectExtension> extensionClazz = annotation.extension();
-        if (extensionClazz != null && extensionClazz != DefaultSysLogAspectExtension.class) {
-            // 有自定义扩展点
-            extensionInstance = ReflectUtil.newInstance(extensionClazz);
-        }
+            // SysLog 切面实现类扩展
+            SysLogAspectExtension extensionInstance = DEFAULT_SYS_LOG_ASPECT_EXTENSION;
+            Class<? extends SysLogAspectExtension> extensionClazz = annotation.extension();
+            if (extensionClazz != null && extensionClazz != DefaultSysLogAspectExtension.class) {
+                // 有自定义扩展点
+                extensionInstance = ReflectUtil.newInstance(extensionClazz);
+            }
 
-        AdminInsertSysLogDTO dto = new AdminInsertSysLogDTO()
-                // 记录操作人
-                .setUserId(UserContextHolder.getUserId())
-                .setUsername(UserContextHolder.getUserName())
-                // 记录请求方法
-                .setMethod(StrUtil.builder(
-                        joinPoint.getTarget().getClass().getName(),
-                        "#",
-                        joinPoint.getSignature().getName()
-                ).toString())
-                // 记录操作内容
-                .setOperation(annotation.value())
-                // 默认置为成功
-                .setStatus(SysLogStatusEnum.SUCCESS);
-
-        /*
-        记录请求参数
-         */
-        HashMap<Object, Object> afterMasked = new HashMap<>(16, 1);
-        String params = Arrays.stream(joinPoint.getArgs()).map(
-                item -> {
-                    if (ClassUtil.isBasicType(item.getClass())) {
-                        // 基元类型 OR 其包装类型,保存在DB时保持原样
-                        return StrUtil.toStringOrNull(item);
-                    }
+            AdminInsertSysLogDTO dto = new AdminInsertSysLogDTO()
+                    // 记录操作人
+                    .setUserId(UserContextHolder.getUserId())
+                    .setUsername(UserContextHolder.getUserName())
+                    // 记录请求方法
+                    .setMethod(StrUtil.builder(
+                            joinPoint.getTarget().getClass().getName(),
+                            "#",
+                            joinPoint.getSignature().getName()
+                    ).toString())
+                    // 记录操作内容
+                    .setOperation(annotation.value())
+                    .setIp(aspectContext.getClientIP())
+                    // 默认置为成功
+                    .setStatus(SysLogStatusEnum.SUCCESS)
+                    .setUserAgent(aspectContext.getUserAgent());
 
-                    // 先去除敏感字段后再入库
-                    afterMasked.clear();
-                    BeanUtil.copyProperties(item, afterMasked, MASKING_COPY_OPTIONS);
-                    return JSONUtil.toJsonStr(afterMasked);
-                }
-        ).collect(Collectors.joining(StrPool.LF));
-        if (StrUtil.length(params) > MAX_STRING_SAVE_LENGTH) {
-            params = StrUtil.subPre(params, MAX_STRING_SAVE_LENGTH);
-        }
-        dto.setParams(params);
+            // 记录请求参数
+            Map<Object, Object> afterMasked = new LinkedHashMap<>(32, 1);
+            String params = Arrays.stream(joinPoint.getArgs()).map(
+                    item -> {
+                        if (ClassUtil.isBasicType(item.getClass())) {
+                            // 基元类型 OR 其包装类型,保存在DB时保持原样
+                            return StrUtil.toStringOrNull(item);
+                        }
 
-        /*
-        记录IP地址
-        https://gitee.com/uncarbon97/helio-boot/issues/I5KN1X
-         */
-        String ip = UserContextHolder.getClientIP();
-        if (StrUtil.isEmpty(ip)) {
-            // 兜底处理,直接从当前线程的请求头中拿
-            ip = IPUtil.getClientIPAddress(request, 0);
-        }
-        dto.setIp(ip);
+                        // 先去除敏感字段后再入库
+                        afterMasked.clear();
+                        BeanUtil.copyProperties(item, afterMasked, MASKING_COPY_OPTIONS);
+                        return JSONUtil.toJsonStr(afterMasked, TO_JSON_STR_JSON_CONFIG);
+                    }
+            ).collect(Collectors.joining(StrPool.LF));
+            if (StrUtil.length(params) > MAX_STRING_SAVE_LENGTH) {
+                params = StrUtil.subPre(params, MAX_STRING_SAVE_LENGTH);
+            }
+            dto.setParams(params);
 
-        if (e != null) {
-            // 异常不为空,置状态为失败
-            dto.setStatus(SysLogStatusEnum.FAILED);
+            if (e != null) {
+                // 异常不为空,置状态为失败
+                dto.setStatus(SysLogStatusEnum.FAILED);
 
-            // 错误原因堆栈
-            dto.setErrorStacktrace(ExceptionUtil.stacktraceToString(e, MAX_STRING_SAVE_LENGTH));
-        }
+                // 错误原因堆栈
+                dto.setErrorStacktrace(ExceptionUtil.stacktraceToString(e, MAX_STRING_SAVE_LENGTH));
+            }
 
-        // UA;Spring框架已经做了简单的防注入过滤
-        dto.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
-
-        if (annotation.queryIPLocation()) {
-            // 查询IP属地
-            IPLocationBO ipLocation = extensionInstance.queryIPLocation(ip);
-            dto
-                    .setIpLocationRegionName(ipLocation.getRegionName())
-                    .setIpLocationProvinceName(ipLocation.getProvinceName())
-                    .setIpLocationCityName(ipLocation.getCityName())
-                    .setIpLocationDistrictName(ipLocation.getDistrictName());
-        }
+            if (annotation.queryIPLocation()) {
+                // 查询IP属地
+                IPLocationBO ipLocation = extensionInstance.queryIPLocation(aspectContext.getClientIP());
+                dto
+                        .setIpLocationRegionName(ipLocation.getRegionName())
+                        .setIpLocationProvinceName(ipLocation.getProvinceName())
+                        .setIpLocationCityName(ipLocation.getCityName())
+                        .setIpLocationDistrictName(ipLocation.getDistrictName());
+            }
 
-        // 扩展:保存到 DB 前
-        extensionInstance.beforeSaving(dto, joinPoint, annotation, e, ret);
+            // 扩展:保存到 DB 前
+            extensionInstance.beforeSaving(dto, joinPoint, annotation, e, ret);
 
-        // 保存系统日志
-        sysLogService.adminInsert(dto);
+            // 保存系统日志
+            sysLogService.adminInsert(dto);
+        } finally {
+            UserContextHolder.clear();
+        }
     }
 
+    /*
+    ----------------------------------------------------------------
+                        私有方法 private methods
+    ----------------------------------------------------------------
+     */
+
     /**
      * 异步保存系统日志
      */
-    public void saveSysLogAsync(final JoinPoint joinPoint, SysLog annotation, final Throwable e, Object ret) {
+    private void saveSysLogAsync(final JoinPoint joinPoint, SysLog annotation, final AspectContext aspectContext, final Throwable e, Object ret) {
         taskExecutor.submit(
-                () -> this.saveSysLog(joinPoint, annotation, e, ret)
+                () -> this.saveSysLog(joinPoint, annotation, aspectContext, e, ret)
         );
     }
+
+    /**
+     * 本切面上下文
+     * 内部使用
+     */
+    @Getter
+    private static final class AspectContext {
+
+        /**
+         * 包装当前用户态
+         */
+        private final UserContext userContext;
+
+        /**
+         * 客户端IP地址
+         */
+        private final String clientIP;
+
+        /**
+         * 用户UA
+         */
+        private final String userAgent;
+
+        /**
+         * 从 HTTP Request 新建
+         */
+        public AspectContext(HttpServletRequest request) {
+            this.userContext = UserContextHolder.getUserContext();
+            /*
+            记录IP地址
+            https://gitee.com/uncarbon97/helio-boot/issues/I5KN1X
+             */
+            String ip = UserContextHolder.getClientIP();
+            if (StrUtil.isEmpty(ip)) {
+                // 兜底处理,直接从request中拿
+                ip = IPUtil.getClientIPAddress(request, 0);
+            }
+            this.clientIP = ip;
+            // Spring框架已经做了简单的防注入过滤
+            this.userAgent = request.getHeader(HttpHeaders.USER_AGENT);
+        }
+    }
+
 }

+ 6 - 0
src/main/java/cc/uncarbon/config/AsyncConfiguration.java

@@ -6,6 +6,7 @@ import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
 import org.springframework.boot.autoconfigure.task.TaskExecutionProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
 import org.springframework.scheduling.annotation.AsyncConfigurer;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -26,6 +27,11 @@ public class AsyncConfiguration implements AsyncConfigurer {
     private final TaskExecutionProperties taskExecutionProperties;
 
 
+    /**
+     * 创建默认线程池
+     * 加 @Primary 注解以确保依赖注入时,获取到的是这个Bean
+     */
+    @Primary
     @Bean(name = "taskExecutor")
     public ThreadPoolTaskExecutor taskExecutor() {
         final String threadNamePrefix = "taskExecutor-";

+ 8 - 3
src/main/java/cc/uncarbon/config/CustomInterceptorConfiguration.java

@@ -3,7 +3,8 @@ package cc.uncarbon.config;
 import cc.uncarbon.framework.core.props.HelioProperties;
 import cc.uncarbon.interceptor.AdminSaTokenParseInterceptor;
 import cc.uncarbon.interceptor.DefaultSaTokenParseInterceptor;
-import cc.uncarbon.module.app.constant.AppConstant;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
+import cc.uncarbon.module.appapi.constant.AppApiConstant;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cn.dev33.satoken.interceptor.SaInterceptor;
 import cn.dev33.satoken.stp.StpUtil;
@@ -37,7 +38,11 @@ public class CustomInterceptorConfiguration implements WebMvcConfigurer {
 
         registry
                 .addInterceptor(new AdminSaTokenParseInterceptor())
-                .addPathPatterns(SysConstant.SYS_MODULE_CONTEXT_PATH + "/**");
+                .addPathPatterns(
+                        // 兼容旧的API路由前缀
+                        SysConstant.SYS_MODULE_CONTEXT_PATH + "/**",
+                        AdminApiConstant.HTTP_API_URL_PREFIX + "/**"
+                );
 
         /*
         2. 注解拦截器,启用注解功能
@@ -56,7 +61,7 @@ public class CustomInterceptorConfiguration implements WebMvcConfigurer {
                 .addInterceptor(new SaInterceptor(
                         (handler) -> StpUtil.checkLogin()
                 ))
-                .addPathPatterns(AppConstant.APP_MODULE_CONTEXT_PATH + "/**")
+                .addPathPatterns(AppApiConstant.HTTP_API_URL_PREFIX + "/**")
                 .excludePathPatterns(helioProperties.getSecurity().getExcludeRoutes());
     }
 }

+ 14 - 0
src/main/java/cc/uncarbon/module/adminapi/constant/AdminApiConstant.java

@@ -0,0 +1,14 @@
+package cc.uncarbon.module.adminapi.constant;
+
+
+/**
+ * 后台管理接口常量
+ */
+public interface AdminApiConstant {
+
+    /**
+     * HTTP-API路由前缀
+     */
+    String HTTP_API_URL_PREFIX = "/admin";
+
+}

+ 11 - 6
src/main/java/cc/uncarbon/module/sys/web/auth/AdminAuthController.java → src/main/java/cc/uncarbon/module/adminapi/web/auth/AdminAuthController.java

@@ -1,4 +1,4 @@
-package cc.uncarbon.module.sys.web.auth;
+package cc.uncarbon.module.adminapi.web.auth;
 
 
 import cc.uncarbon.aspect.extension.SysLogAspectExtensionForSysUserLogin;
@@ -10,6 +10,7 @@ import cc.uncarbon.framework.core.context.UserContextHolder;
 import cc.uncarbon.framework.web.model.response.ApiResult;
 import cc.uncarbon.helper.CaptchaHelper;
 import cc.uncarbon.helper.RolePermissionCacheHelper;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.enums.SysErrorEnum;
@@ -34,8 +35,12 @@ import java.io.IOException;
 
 @RequiredArgsConstructor
 @Slf4j
-@Api(value = "SaaS后台管理鉴权接口", tags = {"SaaS后台管理鉴权接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/auth")
+@Api(value = "后台管理-鉴权接口", tags = {"后台管理-鉴权接口"})
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminAuthController {
 
@@ -48,7 +53,7 @@ public class AdminAuthController {
 
     @SysLog(value = "登录后台用户", syncSave = true, extension = SysLogAspectExtensionForSysUserLogin.class, queryIPLocation = true)
     @ApiOperation(value = "登录")
-    @PostMapping(value = "/login")
+    @PostMapping(value = "/auth/login")
     public ApiResult<SysUserLoginVO> login(@RequestBody @Valid SysUserLoginDTO dto) {
         // RPC调用, 失败抛异常, 成功返回用户信息
         SysUserLoginBO userInfo = sysUserService.adminLogin(dto);
@@ -85,7 +90,7 @@ public class AdminAuthController {
 
     @SaCheckLogin(type = AdminStpUtil.TYPE)
     @ApiOperation(value = "登出")
-    @PostMapping(value = "/logout")
+    @PostMapping(value = "/auth/logout")
     public ApiResult<?> logout() {
         AdminStpUtil.logout();
         UserContextHolder.clear();
@@ -96,7 +101,7 @@ public class AdminAuthController {
 
     @ApiOperation(value = "验证码图片")
     @ApiImplicitParam(name = "uuid", value = "验证码图片UUID", required = true)
-    @GetMapping(value = "/captcha")
+    @GetMapping(value = "/auth/captcha")
     public void captcha(HttpServletResponse response, String uuid) throws IOException {
         /*
         由前端定义 UUID 其实并不算太好的办法,但是够简单

+ 10 - 5
src/main/java/cc/uncarbon/module/oss/web/AdminOssFileInfoController.java → src/main/java/cc/uncarbon/module/adminapi/web/oss/AdminOssFileInfoController.java

@@ -1,10 +1,11 @@
-package cc.uncarbon.module.oss.web;
+package cc.uncarbon.module.adminapi.web.oss;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.oss.model.request.AdminListOssFileInfoDTO;
 import cc.uncarbon.module.oss.model.response.OssFileInfoBO;
 import cc.uncarbon.module.oss.service.OssFileInfoService;
@@ -25,7 +26,11 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台管理-上传文件信息管理接口", tags = {"后台管理-上传文件信息管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/oss/file/infos")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminOssFileInfoController {
 
@@ -37,21 +42,21 @@ public class AdminOssFileInfoController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/oss/file/infos")
     public ApiResult<PageResult<OssFileInfoBO>> list(PageParam pageParam, AdminListOssFileInfoDTO dto) {
         return ApiResult.data(ossFileInfoService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/oss/file/infos/{id}")
     public ApiResult<OssFileInfoBO> getById(@PathVariable Long id) {
         return ApiResult.data(ossFileInfoService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/oss/file/infos")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         ossFileInfoService.adminDelete(dto.getIds());
 

+ 9 - 4
src/main/java/cc/uncarbon/module/oss/web/AdminOssUploadDownloadController.java → src/main/java/cc/uncarbon/module/adminapi/web/oss/AdminOssUploadDownloadController.java

@@ -1,7 +1,8 @@
-package cc.uncarbon.module.oss.web;
+package cc.uncarbon.module.adminapi.web.oss;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.oss.facade.OssUploadDownloadFacade;
 import cc.uncarbon.module.oss.model.request.UploadFileAttributeDTO;
 import cc.uncarbon.module.oss.model.response.OssFileDownloadReplyBO;
@@ -34,7 +35,11 @@ import java.net.URLEncoder;
 @RequiredArgsConstructor
 @Slf4j
 @Api(value = "后台管理-上传、下载文件接口", tags = {"后台管理-上传、下载文件接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/oss/files")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminOssUploadDownloadController {
 
@@ -42,7 +47,7 @@ public class AdminOssUploadDownloadController {
 
 
     @ApiOperation(value = "上传文件", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    @PostMapping
+    @PostMapping(value = "/oss/files")
     // 约束:登录后才能上传   👇 后台管理对应的鉴权工具类
     @SaCheckLogin(type = AdminStpUtil.TYPE)
     public ApiResult<OssFileUploadResultVO> upload(
@@ -72,7 +77,7 @@ public class AdminOssUploadDownloadController {
     }
 
     @ApiOperation(value = "下载文件(根据文件ID)", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/oss/files/{id}")
     // 如果需要登录后才能下载,请解禁下方注解;注意是👇 后台管理对应的鉴权工具类
     // @SaCheckLogin(type = AdminStpUtil.TYPE)
     public void download(@PathVariable Long id, HttpServletResponse response) throws IOException {

+ 12 - 7
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysDataDictController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysDataDictController.java

@@ -1,10 +1,11 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysDataDictDTO;
@@ -27,7 +28,11 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "数据字典管理接口", tags = {"数据字典管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/dataDicts")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysDataDictController {
 
@@ -38,14 +43,14 @@ public class AdminSysDataDictController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/sys/dataDicts")
     public ApiResult<PageResult<SysDataDictBO>> list(PageParam pageParam, AdminListSysDataDictDTO dto) {
         return ApiResult.data(sysDataDictService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/dataDicts/{id}")
     public ApiResult<SysDataDictBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysDataDictService.getOneById(id, true));
     }
@@ -53,7 +58,7 @@ public class AdminSysDataDictController {
     @SysLog(value = "新增数据字典")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/dataDicts")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysDataDictDTO dto) {
         sysDataDictService.adminInsert(dto);
 
@@ -63,7 +68,7 @@ public class AdminSysDataDictController {
     @SysLog(value = "编辑数据字典")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/dataDicts/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysDataDictDTO dto) {
         dto.setId(id);
         sysDataDictService.adminUpdate(dto);
@@ -74,7 +79,7 @@ public class AdminSysDataDictController {
     @SysLog(value = "删除数据字典")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/dataDicts")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysDataDictService.adminDelete(dto.getIds());
 

+ 12 - 7
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysDeptController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysDeptController.java

@@ -1,9 +1,10 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysDeptDTO;
@@ -26,7 +27,11 @@ import java.util.List;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "部门管理接口", tags = {"部门管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/depts")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysDeptController {
 
@@ -37,14 +42,14 @@ public class AdminSysDeptController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "列表")
-    @GetMapping
+    @GetMapping(value = "/sys/depts")
     public ApiResult<List<SysDeptBO>> list() {
         return ApiResult.data(sysDeptService.adminList());
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/depts/{id}")
     public ApiResult<SysDeptBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysDeptService.getOneById(id, true));
     }
@@ -52,7 +57,7 @@ public class AdminSysDeptController {
     @SysLog(value = "新增部门")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/depts")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysDeptDTO dto) {
         sysDeptService.adminInsert(dto);
 
@@ -62,7 +67,7 @@ public class AdminSysDeptController {
     @SysLog(value = "编辑部门")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/depts/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysDeptDTO dto) {
         dto.setId(id);
         sysDeptService.adminUpdate(dto);
@@ -73,7 +78,7 @@ public class AdminSysDeptController {
     @SysLog(value = "删除部门")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/depts")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysDeptService.adminDelete(dto.getIds());
 

+ 9 - 4
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysLogController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysLogController.java

@@ -1,9 +1,10 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.AdminListSysLogDTO;
 import cc.uncarbon.module.sys.model.response.SysLogBO;
@@ -25,7 +26,11 @@ import org.springframework.web.bind.annotation.RestController;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "系统日志管理接口", tags = {"系统日志管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/logs")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysLogController {
 
@@ -36,14 +41,14 @@ public class AdminSysLogController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/sys/logs")
     public ApiResult<PageResult<SysLogBO>> list(PageParam pageParam, AdminListSysLogDTO dto) {
         return ApiResult.data(sysLogService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/logs/{id}")
     public ApiResult<SysLogBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysLogService.getOneById(id, true));
     }

+ 14 - 9
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysMenuController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysMenuController.java

@@ -1,8 +1,9 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysMenuDTO;
@@ -25,7 +26,11 @@ import java.util.List;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台菜单管理接口", tags = {"后台菜单管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/menus")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysMenuController {
 
@@ -36,14 +41,14 @@ public class AdminSysMenuController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "列表")
-    @GetMapping
+    @GetMapping(value = "/sys/menus")
     public ApiResult<List<SysMenuBO>> list() {
         return ApiResult.data(sysMenuService.adminList());
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/menus/{id}")
     public ApiResult<SysMenuBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysMenuService.getOneById(id, true));
     }
@@ -51,7 +56,7 @@ public class AdminSysMenuController {
     @SysLog(value = "新增后台菜单")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/menus")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysMenuDTO dto) {
         sysMenuService.adminInsert(dto);
 
@@ -61,7 +66,7 @@ public class AdminSysMenuController {
     @SysLog(value = "编辑后台菜单")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/menus/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysMenuDTO dto) {
         dto.setId(id);
         sysMenuService.adminUpdate(dto);
@@ -72,7 +77,7 @@ public class AdminSysMenuController {
     @SysLog(value = "删除后台菜单")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/menus")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysMenuService.adminDelete(dto.getIds());
 
@@ -80,13 +85,13 @@ public class AdminSysMenuController {
     }
 
     @ApiOperation(value = "取侧边菜单")
-    @GetMapping("/side")
+    @GetMapping("/sys/menus/side")
     public ApiResult<List<SysMenuBO>> adminListSideMenu() {
         return ApiResult.data(sysMenuService.adminListSideMenu());
     }
 
     @ApiOperation(value = "取所有可见菜单")
-    @GetMapping("/all")
+    @GetMapping("/sys/menus/all")
     public ApiResult<List<SysMenuBO>> adminListVisibleMenu() {
         return ApiResult.data(sysMenuService.adminListVisibleMenu());
     }

+ 12 - 7
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysParamController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysParamController.java

@@ -1,10 +1,11 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.AdminInsertOrUpdateSysParamDTO;
@@ -27,7 +28,11 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "系统参数管理接口", tags = {"系统参数管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/params")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysParamController {
 
@@ -38,14 +43,14 @@ public class AdminSysParamController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/sys/params")
     public ApiResult<PageResult<SysParamBO>> list(PageParam pageParam, AdminListSysParamDTO dto) {
         return ApiResult.data(sysParamService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/params/{id}")
     public ApiResult<SysParamBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysParamService.getOneById(id, true));
     }
@@ -53,7 +58,7 @@ public class AdminSysParamController {
     @SysLog(value = "新增系统参数")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/params")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysParamDTO dto) {
         sysParamService.adminInsert(dto);
 
@@ -63,7 +68,7 @@ public class AdminSysParamController {
     @SysLog(value = "编辑系统参数")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/params/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysParamDTO dto) {
         dto.setId(id);
         sysParamService.adminUpdate(dto);
@@ -74,7 +79,7 @@ public class AdminSysParamController {
     @SysLog(value = "删除系统参数")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/params")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysParamService.adminDelete(dto.getIds());
 

+ 13 - 8
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysRoleController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysRoleController.java

@@ -1,4 +1,4 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.page.PageParam;
@@ -6,6 +6,7 @@ import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
 import cc.uncarbon.helper.RolePermissionCacheHelper;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.AdminBindRoleMenuRelationDTO;
@@ -30,7 +31,11 @@ import java.util.Set;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台角色管理接口", tags = {"后台角色管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/roles")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysRoleController {
 
@@ -43,14 +48,14 @@ public class AdminSysRoleController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/sys/roles")
     public ApiResult<PageResult<SysRoleBO>> list(PageParam pageParam, AdminListSysRoleDTO dto) {
         return ApiResult.data(sysRoleService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/roles/{id}")
     public ApiResult<SysRoleBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysRoleService.getOneById(id, true));
     }
@@ -58,7 +63,7 @@ public class AdminSysRoleController {
     @SysLog(value = "新增后台角色")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/roles")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysRoleDTO dto) {
         sysRoleService.adminInsert(dto);
 
@@ -68,7 +73,7 @@ public class AdminSysRoleController {
     @SysLog(value = "编辑后台角色")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/roles/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysRoleDTO dto) {
         dto.setId(id);
         sysRoleService.adminUpdate(dto);
@@ -79,7 +84,7 @@ public class AdminSysRoleController {
     @SysLog(value = "删除后台角色")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/roles")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysRoleService.adminDelete(dto.getIds());
 
@@ -92,7 +97,7 @@ public class AdminSysRoleController {
     @SysLog(value = "绑定角色与菜单关联关系")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "bindMenus")
     @ApiOperation(value = "绑定角色与菜单关联关系")
-    @PutMapping(value = "/{id}/menus")
+    @PutMapping(value = "/sys/roles/{id}/menus")
     public ApiResult<?> bindMenus(@PathVariable Long id, @RequestBody @Valid AdminBindRoleMenuRelationDTO dto) {
         dto.setRoleId(id);
         Set<String> newPermissions = sysRoleService.adminBindMenus(dto);

+ 12 - 7
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysTenantController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysTenantController.java

@@ -1,10 +1,11 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.facade.SysTenantFacade;
@@ -29,7 +30,11 @@ import javax.validation.Valid;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "系统租户管理接口", tags = {"系统租户管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/tenants")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysTenantController {
 
@@ -42,14 +47,14 @@ public class AdminSysTenantController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/sys/tenants")
     public ApiResult<PageResult<SysTenantBO>> list(PageParam pageParam, AdminListSysTenantDTO dto) {
         return ApiResult.data(sysTenantService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/tenants/{id}")
     public ApiResult<SysTenantBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysTenantService.getOneById(id, true));
     }
@@ -57,7 +62,7 @@ public class AdminSysTenantController {
     @SysLog(value = "新增系统租户")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/tenants")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertSysTenantDTO dto) {
         sysTenantFacade.adminInsert(dto);
 
@@ -67,7 +72,7 @@ public class AdminSysTenantController {
     @SysLog(value = "编辑系统租户")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/tenants/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminUpdateSysTenantDTO dto) {
         dto.setId(id);
         sysTenantService.adminUpdate(dto);
@@ -78,7 +83,7 @@ public class AdminSysTenantController {
     @SysLog(value = "删除系统租户")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/tenants")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysTenantService.adminDelete(dto.getIds());
 

+ 18 - 18
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysUserController.java → src/main/java/cc/uncarbon/module/adminapi/web/sys/AdminSysUserController.java

@@ -1,4 +1,4 @@
-package cc.uncarbon.module.sys.web.sys;
+package cc.uncarbon.module.adminapi.web.sys;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.exception.BusinessException;
@@ -6,6 +6,7 @@ import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.web.model.request.IdsDTO;
 import cc.uncarbon.framework.web.model.response.ApiResult;
+import cc.uncarbon.module.adminapi.constant.AdminApiConstant;
 import cc.uncarbon.module.sys.annotation.SysLog;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.model.request.*;
@@ -15,7 +16,6 @@ import cc.uncarbon.module.sys.service.SysUserService;
 import cc.uncarbon.module.sys.util.AdminStpUtil;
 import cn.dev33.satoken.annotation.SaCheckLogin;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.util.StrUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -30,7 +30,11 @@ import java.util.Set;
 @SaCheckLogin(type = AdminStpUtil.TYPE)
 @Slf4j
 @Api(value = "后台用户管理接口", tags = {"后台用户管理接口"})
-@RequestMapping(SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/sys/users")
+@RequestMapping(value = {
+        // 兼容旧的API路由前缀
+        SysConstant.SYS_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1,
+        AdminApiConstant.HTTP_API_URL_PREFIX + "/api/v1"
+})
 @RestController
 public class AdminSysUserController {
 
@@ -41,14 +45,14 @@ public class AdminSysUserController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "分页列表")
-    @GetMapping
+    @GetMapping(value = "/sys/users")
     public ApiResult<PageResult<SysUserBO>> list(PageParam pageParam, AdminListSysUserDTO dto) {
         return ApiResult.data(sysUserService.adminList(pageParam, dto));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "详情")
-    @GetMapping(value = "/{id}")
+    @GetMapping(value = "/sys/users/{id}")
     public ApiResult<SysUserBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysUserService.getOneById(id, true));
     }
@@ -56,7 +60,7 @@ public class AdminSysUserController {
     @SysLog(value = "新增后台用户")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
     @ApiOperation(value = "新增")
-    @PostMapping
+    @PostMapping(value = "/sys/users")
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysUserDTO dto) {
         sysUserService.adminInsert(dto);
 
@@ -66,7 +70,7 @@ public class AdminSysUserController {
     @SysLog(value = "编辑后台用户")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
     @ApiOperation(value = "编辑")
-    @PutMapping(value = "/{id}")
+    @PutMapping(value = "/sys/users/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysUserDTO dto) {
         dto.setId(id);
         sysUserService.adminUpdate(dto);
@@ -77,7 +81,7 @@ public class AdminSysUserController {
     @SysLog(value = "删除后台用户")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
     @ApiOperation(value = "删除")
-    @DeleteMapping
+    @DeleteMapping(value = "/sys/users")
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysUserService.adminDelete(dto.getIds());
 
@@ -85,7 +89,7 @@ public class AdminSysUserController {
     }
 
     @ApiOperation(value = "取当前用户信息")
-    @GetMapping(value = "/info")
+    @GetMapping(value = "/sys/users/info")
     public ApiResult<VbenAdminUserInfoVO> getCurrentUserInfo() {
         return ApiResult.data(sysUserService.adminGetCurrentUserInfo());
     }
@@ -93,7 +97,7 @@ public class AdminSysUserController {
     @SysLog(value = "重置某用户密码")
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "resetPassword")
     @ApiOperation(value = "重置某用户密码")
-    @PutMapping(value = "/{userId}/password")
+    @PutMapping(value = "/sys/users/{userId}/password")
     public ApiResult<?> resetPassword(@PathVariable Long userId, @RequestBody @Valid AdminResetSysUserPasswordDTO dto) {
         dto.setUserId(userId);
         sysUserService.adminResetUserPassword(dto);
@@ -106,12 +110,8 @@ public class AdminSysUserController {
 
     @SysLog(value = "修改当前用户密码")
     @ApiOperation(value = "修改当前用户密码")
-    @PostMapping(value = "/updatePassword")
+    @PostMapping(value = "/sys/users/updatePassword")
     public ApiResult<?> updatePassword(@RequestBody @Valid AdminUpdateCurrentSysUserPasswordDTO dto) {
-        if (StrUtil.isBlank(dto.getNewPassword()) || StrUtil.isBlank(dto.getConfirmNewPassword())) {
-            throw new BusinessException(400, "密码或确认密码不能为空");
-        }
-
         if (!dto.getConfirmNewPassword().equals(dto.getNewPassword())) {
             throw new BusinessException(400, "密码与确认密码不同,请检查");
         }
@@ -125,7 +125,7 @@ public class AdminSysUserController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "bindRoles")
     @ApiOperation(value = "绑定用户与角色关联关系")
-    @PutMapping(value = "/{userId}/roles")
+    @PutMapping(value = "/sys/users/{userId}/roles")
     public ApiResult<?> bindRoles(@PathVariable Long userId, @RequestBody AdminBindUserRoleRelationDTO dto) {
         dto.setUserId(userId);
         sysUserService.adminBindRoles(dto);
@@ -138,7 +138,7 @@ public class AdminSysUserController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "kickOut")
     @ApiOperation(value = "踢某用户下线")
-    @PostMapping(value = "/{userId}/kickOut")
+    @PostMapping(value = "/sys/users/{userId}/kickOut")
     public ApiResult<?> kickOut(@PathVariable Long userId) {
         AdminStpUtil.kickout(userId);
 
@@ -147,7 +147,7 @@ public class AdminSysUserController {
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
     @ApiOperation(value = "取指定用户关联角色ID")
-    @GetMapping(value = "/{userId}/relatedRoleIds")
+    @GetMapping(value = "/sys/users/{userId}/relatedRoleIds")
     public ApiResult<Set<Long>> listRelatedRoleIds(@PathVariable Long userId) {
         return ApiResult.data(sysUserService.listRelatedRoleIds(userId));
     }

+ 0 - 16
src/main/java/cc/uncarbon/module/app/constant/AppConstant.java

@@ -1,16 +0,0 @@
-package cc.uncarbon.module.app.constant;
-
-
-/**
- * C端接口常量
- *
- * @author Uncarbon
- */
-public interface AppConstant {
-
-    /**
-     * C端接口路由前缀
-     */
-    String APP_MODULE_CONTEXT_PATH = "/app";
-
-}

+ 14 - 0
src/main/java/cc/uncarbon/module/appapi/constant/AppApiConstant.java

@@ -0,0 +1,14 @@
+package cc.uncarbon.module.appapi.constant;
+
+
+/**
+ * C端接口常量
+ */
+public interface AppApiConstant {
+
+    /**
+     * HTTP-API路由前缀
+     */
+    String HTTP_API_URL_PREFIX = "/app";
+
+}

+ 4 - 5
src/main/java/cc/uncarbon/module/app/web/AppAuthController.java → src/main/java/cc/uncarbon/module/appapi/web/AppAuthController.java

@@ -1,9 +1,8 @@
-package cc.uncarbon.module.app.web;
+package cc.uncarbon.module.appapi.web;
 
 
-import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.web.model.response.ApiResult;
-import cc.uncarbon.module.app.constant.AppConstant;
+import cc.uncarbon.module.appapi.constant.AppApiConstant;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -16,7 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 @RequiredArgsConstructor
 @Slf4j
 @Api(value = "APP鉴权接口", tags = {"APP鉴权接口"})
-@RequestMapping(AppConstant.APP_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/auth")
+@RequestMapping(AppApiConstant.HTTP_API_URL_PREFIX + "/api/v1")
 @RestController
 public class AppAuthController {
 
@@ -26,7 +25,7 @@ public class AppAuthController {
      */
 
     @ApiOperation(value = "登录")
-    @PostMapping("/login")
+    @PostMapping("/auth/login")
     public ApiResult<?> login() {
         /*
         编码时请参考AdminAuthController#login

+ 2 - 2
src/main/java/cc/uncarbon/module/oss/model/request/AdminInsertOrUpdateOssFileInfoDTO.java

@@ -1,6 +1,6 @@
 package cc.uncarbon.module.oss.model.request;
 
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -52,7 +52,7 @@ public class AdminInsertOrUpdateOssFileInfoDTO implements Serializable {
 
     @ApiModelProperty(value = "状态", required = true)
     @NotNull(message = "状态不能为空")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
     @ApiModelProperty(value = "类别编号")
     private Integer classified;

+ 2 - 0
src/main/java/cc/uncarbon/module/sys/constant/SysConstant.java

@@ -10,7 +10,9 @@ public interface SysConstant {
 
     /**
      * 后台管理接口路由前缀
+     * @deprecated since 1.9.0, because its meaning is no longer so fitting; replaced by AdminApiConstant#API_URL_PREFIX
      */
+    @Deprecated
     String SYS_MODULE_CONTEXT_PATH = "/sys";
 
     /**

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/entity/SysDeptEntity.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.entity;
 
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
@@ -48,6 +48,6 @@ public class SysDeptEntity extends HelioBaseEntity<Long> {
 
 	@ApiModelProperty(value = "状态")
 	@TableField(value = "status")
-	private GenericStatusEnum status;
+	private EnabledStatusEnum status;
 
 }

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/entity/SysMenuEntity.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.entity;
 
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
 import cc.uncarbon.module.sys.enums.SysMenuTypeEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -53,7 +53,7 @@ public class SysMenuEntity extends HelioBaseEntity<Long> {
 
 	@ApiModelProperty(value = "状态")
 	@TableField(value = "status")
-	private GenericStatusEnum status;
+	private EnabledStatusEnum status;
 
 	@ApiModelProperty(value = "组件(Vue项目中`/@/views/`后的路径部分; 填`LAYOUT`为空页面)")
 	@TableField(value = "component")

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/entity/SysTenantEntity.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.entity;
 
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
@@ -32,7 +32,7 @@ public class SysTenantEntity extends HelioBaseEntity<Long> {
 
     @ApiModelProperty(value = "状态")
     @TableField(value = "status")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
     @ApiModelProperty(value = "租户管理员用户ID")
     @TableField(value = "tenant_admin_user_id")

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/entity/SysUserEntity.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.entity;
 
+import cc.uncarbon.framework.core.enums.GenderEnum;
 import cc.uncarbon.framework.crud.entity.HelioBaseEntity;
-import cc.uncarbon.module.sys.enums.GenderEnum;
 import cc.uncarbon.module.sys.enums.SysUserStatusEnum;
 import cn.hutool.core.annotation.Alias;
 import com.baomidou.mybatisplus.annotation.TableField;

+ 0 - 25
src/main/java/cc/uncarbon/module/sys/enums/GenderEnum.java

@@ -1,25 +0,0 @@
-package cc.uncarbon.module.sys.enums;
-
-import cc.uncarbon.framework.core.enums.HelioBaseEnum;
-import com.baomidou.mybatisplus.annotation.EnumValue;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-
-/**
- * 生理性别枚举类
- */
-@AllArgsConstructor
-@Getter
-public enum GenderEnum implements HelioBaseEnum<Integer> {
-
-    UNKNOWN(0, "未知"),
-    MALE(1, "男"),
-    FEMALE(2, "女"),
-
-    ;
-    @EnumValue
-    private final Integer value;
-    private final String label;
-
-}

+ 0 - 62
src/main/java/cc/uncarbon/module/sys/enums/GenericStatusEnum.java

@@ -1,62 +0,0 @@
-package cc.uncarbon.module.sys.enums;
-
-import cc.uncarbon.framework.core.enums.HelioBaseEnum;
-import com.baomidou.mybatisplus.annotation.EnumValue;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-
-/**
- * 通用状态枚举类
- */
-@AllArgsConstructor
-@Getter
-public enum GenericStatusEnum implements HelioBaseEnum<Integer> {
-
-    DISABLED(0, "禁用"),
-    ENABLED(1, "启用"),
-
-    ;
-    @EnumValue
-    private final Integer value;
-    private final String label;
-
-    /**
-     * 根据值得到枚举类对象
-     * @param value 外部值
-     * @return null or 枚举类对象
-     */
-    public static GenericStatusEnum of(Integer value) {
-        if (value == null) {
-            return null;
-        }
-        // 区分度小,直接用if判断了
-        if (DISABLED.value.equals(value)) {
-            return DISABLED;
-        }
-        if (ENABLED.value.equals(value)) {
-            return ENABLED;
-        }
-        return null;
-    }
-
-    /**
-     * 取反值
-     * @param old 原值
-     * @return 新值
-     */
-    public static GenericStatusEnum reverse(GenericStatusEnum old) {
-        if (old == null) {
-            return null;
-        }
-
-        switch (old) {
-            case DISABLED:
-                return GenericStatusEnum.ENABLED;
-            case ENABLED:
-                return GenericStatusEnum.DISABLED;
-        }
-
-        throw new IllegalArgumentException();
-    }
-}

+ 0 - 1
src/main/java/cc/uncarbon/module/sys/enums/SysUserStatusEnum.java

@@ -14,7 +14,6 @@ import lombok.Getter;
 public enum SysUserStatusEnum implements HelioBaseEnum<Integer> {
 
     BANNED(0, "封禁"),
-
     ENABLED(1, "正常"),
 
     ;

+ 0 - 0
src/main/resources/mapper/SysUserMapper.xml → src/main/java/cc/uncarbon/module/sys/mapper/xml/SysUserMapper.xml


+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysDeptDTO.java

@@ -1,6 +1,6 @@
 package cc.uncarbon.module.sys.model.request;
 
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -40,6 +40,6 @@ public class AdminInsertOrUpdateSysDeptDTO implements Serializable {
     private Integer sort;
 
     @ApiModelProperty(value = "状态")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
 }

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysMenuDTO.java

@@ -1,6 +1,6 @@
 package cc.uncarbon.module.sys.model.request;
 
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.module.sys.enums.SysMenuTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -55,7 +55,7 @@ public class AdminInsertOrUpdateSysMenuDTO implements Serializable {
     private Integer sort;
 
     @ApiModelProperty(value = "状态")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
     @ApiModelProperty(value = "外链地址")
     private String externalLink;

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/model/request/AdminInsertOrUpdateSysUserDTO.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.model.request;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.module.sys.enums.GenderEnum;
+import cc.uncarbon.framework.core.enums.GenderEnum;
 import cc.uncarbon.module.sys.enums.SysUserStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminListSysTenantDTO.java

@@ -1,6 +1,6 @@
 package cc.uncarbon.module.sys.model.request;
 
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -29,6 +29,6 @@ public class AdminListSysTenantDTO implements Serializable {
     private Long tenantId;
 
     @ApiModelProperty(value = "状态")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
 }

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/request/AdminUpdateSysTenantDTO.java

@@ -1,6 +1,6 @@
 package cc.uncarbon.module.sys.model.request;
 
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -37,7 +37,7 @@ public class AdminUpdateSysTenantDTO implements Serializable {
 
     @ApiModelProperty(value = "状态", required = true)
     @NotNull(message = "状态不能为空")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
     @ApiModelProperty(value = "备注")
     private String remark;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/response/SysDeptBO.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -49,6 +49,6 @@ public class SysDeptBO implements Serializable {
     private Integer sort;
 
     @ApiModelProperty(value = "状态")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
 }

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/response/SysMenuBO.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.module.sys.enums.SysMenuTypeEnum;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -59,7 +59,7 @@ public class SysMenuBO implements Serializable {
     private Integer sort;
 
     @ApiModelProperty(value = "状态")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
     @ApiModelProperty(value = "组件")
     private String component;

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/model/response/SysTenantBO.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -49,7 +49,7 @@ public class SysTenantBO implements Serializable {
     private Long tenantId;
 
     @ApiModelProperty(value = "状态")
-    private GenericStatusEnum status;
+    private EnabledStatusEnum status;
 
     @ApiModelProperty(value = "租户管理员用户基本信息")
     private SysUserBaseInfoBO tenantAdminUser;

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/model/response/SysUserBO.java

@@ -1,7 +1,7 @@
 package cc.uncarbon.module.sys.model.response;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
-import cc.uncarbon.module.sys.enums.GenderEnum;
+import cc.uncarbon.framework.core.enums.GenderEnum;
 import cc.uncarbon.module.sys.enums.SysUserStatusEnum;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
src/main/java/cc/uncarbon/module/sys/model/response/SysUserBaseInfoBO.java

@@ -1,6 +1,6 @@
 package cc.uncarbon.module.sys.model.response;
 
-import cc.uncarbon.module.sys.enums.GenderEnum;
+import cc.uncarbon.framework.core.enums.GenderEnum;
 import cc.uncarbon.module.sys.enums.SysUserStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;

+ 2 - 7
src/main/java/cc/uncarbon/module/sys/model/response/VbenAdminMenuMetaVO.java

@@ -2,10 +2,8 @@ package cc.uncarbon.module.sys.model.response;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
+import lombok.Getter;
 
 import java.io.Serializable;
 
@@ -14,10 +12,7 @@ import java.io.Serializable;
  * 后台菜单子项详情 for VbenAdmin
  * @author Uncarbon
  */
-@Accessors(chain = true)
-@Builder
 @AllArgsConstructor
-@NoArgsConstructor
 @Data
 public class VbenAdminMenuMetaVO implements Serializable {
 
@@ -25,7 +20,7 @@ public class VbenAdminMenuMetaVO implements Serializable {
     private String title;
 
     @ApiModelProperty(value = "是否不可关闭")
-    private Boolean affix = false;
+    private Boolean affix;
 
     @ApiModelProperty(value = "图标")
     private String icon;

+ 4 - 10
src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java

@@ -2,12 +2,12 @@ package cc.uncarbon.module.sys.service;
 
 import cc.uncarbon.framework.core.constant.HelioConstant;
 import cc.uncarbon.framework.core.context.UserContextHolder;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.core.exception.BusinessException;
 import cc.uncarbon.framework.core.function.StreamFunction;
 import cc.uncarbon.framework.crud.service.impl.HelioBaseServiceImpl;
 import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.entity.SysMenuEntity;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
 import cc.uncarbon.module.sys.enums.SysErrorEnum;
 import cc.uncarbon.module.sys.enums.SysMenuTypeEnum;
 import cc.uncarbon.module.sys.mapper.SysMenuMapper;
@@ -189,7 +189,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
                                                     .lambda()
                                                     .select(SysMenuEntity::getPermission)
                                                     .in(SysMenuEntity::getId, menuIds)
-                                                    .eq(SysMenuEntity::getStatus, GenericStatusEnum.ENABLED)
+                                                    .eq(SysMenuEntity::getStatus, EnabledStatusEnum.ENABLED)
                                     )
                                     .stream()
                                     .map(SysMenuEntity::getPermission)
@@ -250,13 +250,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
         String snowflakeIdStr = SNOWFLAKE.nextIdStr();
         bo
                 .setName(snowflakeIdStr)
-                .setMeta(
-                        VbenAdminMenuMetaVO.builder()
-                                .title(bo.getTitle())
-                                .affix(false)
-                                .icon(bo.getIcon())
-                                .build()
-                );
+                .setMeta(new VbenAdminMenuMetaVO(bo.getTitle(), false, bo.getIcon()));
 
         // 这里是兼容 JDK8 的写法,使用较高 JDK 版本可使用语法糖
         switch (bo.getType()) {
@@ -317,7 +311,7 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
                 new QueryWrapper<SysMenuEntity>()
                         .lambda()
                         .select(SysMenuEntity::getId, SysMenuEntity::getParentId)
-                        .eq(SysMenuEntity::getStatus, GenericStatusEnum.ENABLED)
+                        .eq(SysMenuEntity::getStatus, EnabledStatusEnum.ENABLED)
         ).stream().collect(Collectors.toMap(SysMenuEntity::getId, SysMenuEntity::getParentId, StreamFunction.ignoredThrowingMerger()));
 
         // 3. 超级管理员直接返回所有菜单

+ 2 - 4
src/main/java/cc/uncarbon/module/sys/service/SysUserService.java

@@ -3,16 +3,14 @@ package cc.uncarbon.module.sys.service;
 import cc.uncarbon.framework.core.context.TenantContext;
 import cc.uncarbon.framework.core.context.TenantContextHolder;
 import cc.uncarbon.framework.core.context.UserContextHolder;
+import cc.uncarbon.framework.core.enums.EnabledStatusEnum;
 import cc.uncarbon.framework.core.exception.BusinessException;
 import cc.uncarbon.framework.core.page.PageParam;
 import cc.uncarbon.framework.core.page.PageResult;
 import cc.uncarbon.framework.core.props.HelioProperties;
 import cc.uncarbon.framework.crud.service.impl.HelioBaseServiceImpl;
-import cc.uncarbon.module.sys.annotation.SysLog;
-import cc.uncarbon.module.sys.constant.SysConstant;
 import cc.uncarbon.module.sys.entity.SysTenantEntity;
 import cc.uncarbon.module.sys.entity.SysUserEntity;
-import cc.uncarbon.module.sys.enums.GenericStatusEnum;
 import cc.uncarbon.module.sys.enums.SysErrorEnum;
 import cc.uncarbon.module.sys.enums.SysUserStatusEnum;
 import cc.uncarbon.module.sys.mapper.SysUserMapper;
@@ -401,7 +399,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
             throw new BusinessException(SysErrorEnum.INVALID_TENANT);
         }
 
-        if (GenericStatusEnum.DISABLED == tenantEntity.getStatus()) {
+        if (EnabledStatusEnum.DISABLED == tenantEntity.getStatus()) {
             throw new BusinessException(SysErrorEnum.DISABLED_TENANT);
         }
 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 244 - 120
src/main/java/cc/uncarbon/module/sys/util/AdminStpUtil.java


+ 2 - 2
src/main/resources/application.yml

@@ -105,5 +105,5 @@ sa-token:
   # 有效期解释:https://sa-token.cc/doc.html#/fun/token-timeout
   # token 有效期,单位=秒;默认30天,-1代表永不过期
   timeout: 2592000
-  # token 临时有效期 (指定时间内无操作就视为token过期),单位=秒
-  activity-timeout: -1
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно