Uncarbon 3 роки тому
батько
коміт
6be2fb859a
30 змінених файлів з 219 додано та 188 видалено
  1. 7 0
      README.md
  2. 16 2
      pom.xml
  3. 14 14
      src/main/java/cc/uncarbon/config/CustomInterceptorConfiguration.java
  4. 3 2
      src/main/java/cc/uncarbon/module/app/web/AppAuthController.java
  5. 3 2
      src/main/java/cc/uncarbon/module/oss/enums/OssErrorEnum.java
  6. 0 32
      src/main/java/cc/uncarbon/module/oss/util/URLUtil.java
  7. 3 4
      src/main/java/cc/uncarbon/module/oss/web/AdminOssFileInfoController.java
  8. 1 13
      src/main/java/cc/uncarbon/module/sys/enums/GenderEnum.java
  9. 20 10
      src/main/java/cc/uncarbon/module/sys/enums/GenericStatusEnum.java
  10. 1 3
      src/main/java/cc/uncarbon/module/sys/enums/SysErrorEnum.java
  11. 2 12
      src/main/java/cc/uncarbon/module/sys/enums/SysLogStatusEnum.java
  12. 26 3
      src/main/java/cc/uncarbon/module/sys/enums/SysMenuTypeEnum.java
  13. 2 9
      src/main/java/cc/uncarbon/module/sys/enums/SysUserStatusEnum.java
  14. 0 3
      src/main/java/cc/uncarbon/module/sys/model/response/SysMenuBO.java
  15. 9 20
      src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java
  16. 2 3
      src/main/java/cc/uncarbon/module/sys/service/SysRoleMenuRelationService.java
  17. 2 0
      src/main/java/cc/uncarbon/module/sys/service/SysRoleService.java
  18. 2 3
      src/main/java/cc/uncarbon/module/sys/service/SysUserService.java
  19. 2 3
      src/main/java/cc/uncarbon/module/sys/web/auth/AdminAuthController.java
  20. 5 5
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysDataDictController.java
  21. 5 5
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysDeptController.java
  22. 2 2
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysLogController.java
  23. 7 7
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysMenuController.java
  24. 5 5
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysParamController.java
  25. 6 6
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysRoleController.java
  26. 6 7
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysTenantController.java
  27. 11 11
      src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysUserController.java
  28. 23 0
      src/main/resources/application-prod.yml
  29. 23 0
      src/main/resources/application-test.yml
  30. 11 2
      src/main/resources/application.yml

+ 7 - 0
README.md

@@ -9,6 +9,8 @@ JDK compatibility: 1.8 - 17
 【[主要技术栈依赖](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)】
 
 需要先安装 `MySQL`、`Redis` 等必需中间件
 
@@ -19,3 +21,8 @@ JDK compatibility: 1.8 - 17
 |----------------------|-----------------------------------------------------------------------------|------------------------------------------------------------|--------------------------------------------------------------|
 | helio-generator      | 可一键生成单体or微服务版的前、后端代码,减少无谓的重复劳动                                              | [Gitee](https://gitee.com/uncarbon97/helio-generator)      | [GitHub](https://github.com/uncarbon97/helio-generator)      |
 | helio-admin-vue-vben | 基于[Vue vben admin](https://github.com/anncwb/vue-vben-admin) 改造适配的前端框架,开箱即用 | [Gitee](https://gitee.com/uncarbon97/helio-admin-vue-vben) | [GitHub](https://github.com/uncarbon97/helio-admin-vue-vben) |
+
+## 演示项目
+| 项目名            | 后端                                                                    | 前端                                                                              | 需导入数据库文件                                                                     |
+|----------------|-----------------------------------------------------------------------|---------------------------------------------------------------------------------|------------------------------------------------------------------------------|
+| 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 |

+ 16 - 2
pom.xml

@@ -3,16 +3,17 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+    <packaging>jar</packaging>
 
     <parent>
         <groupId>cc.uncarbon.framework</groupId>
         <artifactId>helio-starters</artifactId>
-        <version>1.7.2</version>
+        <version>1.7.3</version>
     </parent>
 
     <artifactId>helio-boot</artifactId>
     <!-- 程序版本号,建议每次打包发布时都调整以作区分 -->
-    <version>1.7.2</version>
+    <version>1.7.3</version>
 
     <properties>
         <!-- 这里写其他第三方依赖 -->
@@ -95,6 +96,19 @@
     </dependencies>
 
     <build>
+        <!-- 支持 mybatis XML 放置在 java 包下 -->
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+
         <plugins>
             <!-- Spring Boot 打包插件 -->
             <plugin>

+ 14 - 14
src/main/java/cc/uncarbon/config/CustomInterceptorConfiguration.java

@@ -5,8 +5,7 @@ import cc.uncarbon.framework.satoken.interceptor.DefaultSaTokenParseInterceptor;
 import cc.uncarbon.interceptor.AdminSaTokenParseInterceptor;
 import cc.uncarbon.module.app.constant.AppConstant;
 import cc.uncarbon.module.sys.constant.SysConstant;
-import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
-import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+import cn.dev33.satoken.interceptor.SaInterceptor;
 import cn.dev33.satoken.stp.StpUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Configuration;
@@ -29,34 +28,35 @@ public class CustomInterceptorConfiguration implements WebMvcConfigurer {
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         /*
-        1. 请求头解析, 设定用户上下文
+        1. 通用请求头解析,设定用户、租户上下文
          */
         registry
                 .addInterceptor(new DefaultSaTokenParseInterceptor())
-                .addPathPatterns(AppConstant.APP_MODULE_CONTEXT_PATH + "/**");
+                // @since 1.7.3 fix: 访问除 /app/** 以外的路由时,不会清除复用线程中残留的用户态
+                .addPathPatterns("/**");
 
         registry
                 .addInterceptor(new AdminSaTokenParseInterceptor())
                 .addPathPatterns(SysConstant.SYS_MODULE_CONTEXT_PATH + "/**");
 
         /*
-        2. App-路由拦截器, 使几乎所有接口都需要登录
+        2. 注解拦截器,启用注解功能
+         */
+        registry
+                .addInterceptor(new SaInterceptor())
+                .addPathPatterns("/**");
+
+        /*
+        3. /app/** 路由拦截器, 使几乎所有接口都需要登录
         放行接口请在配置文件的 helio.security.exclude-routes 中设置
 
         @see http://sa-token.dev33.cn/doc/index.html#/use/route-check
          */
         registry
-                .addInterceptor(new SaRouteInterceptor(
-                        (req, res, handler) -> StpUtil.checkLogin()
+                .addInterceptor(new SaInterceptor(
+                        (handler) -> StpUtil.checkLogin()
                 ))
                 .addPathPatterns(AppConstant.APP_MODULE_CONTEXT_PATH + "/**")
                 .excludePathPatterns(helioProperties.getSecurity().getExcludeRoutes());
-
-        /*
-        3. 注解拦截器, 启用注解功能
-         */
-        registry
-                .addInterceptor(new SaAnnotationInterceptor())
-                .addPathPatterns("/**");
     }
 }

+ 3 - 2
src/main/java/cc/uncarbon/module/app/web/AppAuthController.java

@@ -6,8 +6,8 @@ import cc.uncarbon.framework.web.model.response.ApiResult;
 import cc.uncarbon.module.app.constant.AppConstant;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 /**
  * @author Uncarbon
  */
+@RequiredArgsConstructor
 @Slf4j
 @Api(value = "APP鉴权接口", tags = {"APP鉴权接口"})
 @RequestMapping(AppConstant.APP_MODULE_CONTEXT_PATH + HelioConstant.Version.HTTP_API_VERSION_V1 + "/auth")
@@ -27,7 +28,7 @@ public class AppAuthController {
     相关拦截器代码请见 CustomInterceptorConfiguration.java
      */
 
-    @ApiOperation(value = "登录", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "登录")
     @PostMapping("/login")
     public ApiResult<?> login() {
         /*

+ 3 - 2
src/main/java/cc/uncarbon/module/oss/enums/OssErrorEnum.java

@@ -8,17 +8,18 @@ import lombok.Getter;
 
 /**
  * OSS异常枚举类
- * @author Uncarbon
  */
 @AllArgsConstructor
 @Getter
 public enum OssErrorEnum implements HelioBaseEnum<Integer> {
 
     INVALID_ID(400, "无效ID"),
+
     FILE_UPLOAD_FAILED(500, "文件上传失败,请联系管理员"),
+
     FILE_DOWNLOAD_FAILED(500, "文件下载失败,请联系管理员"),
-    ;
 
+    ;
     @EnumValue
     private final Integer value;
     private final String label;

+ 0 - 32
src/main/java/cc/uncarbon/module/oss/util/URLUtil.java

@@ -1,32 +0,0 @@
-package cc.uncarbon.module.oss.util;
-
-import cn.hutool.core.util.StrUtil;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * 定制 URLUtil
- * 继承自 cn.hutool.core.util.URLUtil
- *
- * @author Uncarbon
- */
-public class URLUtil extends cn.hutool.core.util.URLUtil {
-
-    /**
-     * 取完整域名(protocol + domain + port),最后不带"/"
-     * @param urlStr URL文本
-     */
-    public static String getFullDomain(String urlStr) {
-        try {
-            URL url = new URL(urlStr);
-            return String.format("%s://%s:%s", url.getProtocol(), url.getHost(), url.getPort());
-        } catch (MalformedURLException e) {
-            // 走兜底方案
-        }
-
-        // 兜底方案,直接替换掉 path 部分
-        return StrUtil.replace(urlStr, getPath(urlStr), StrUtil.EMPTY);
-    }
-
-}

+ 3 - 4
src/main/java/cc/uncarbon/module/oss/web/AdminOssFileInfoController.java

@@ -16,7 +16,6 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -42,21 +41,21 @@ public class AdminOssFileInfoController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{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 = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         ossFileInfoService.adminDelete(dto.getIds());

+ 1 - 13
src/main/java/cc/uncarbon/module/sys/enums/GenderEnum.java

@@ -8,28 +8,16 @@ import lombok.Getter;
 
 /**
  * 生理性别枚举类
- * @author Uncarbon
  */
 @AllArgsConstructor
 @Getter
 public enum GenderEnum implements HelioBaseEnum<Integer> {
 
-    /**
-     * 未知
-     */
     UNKNOWN(0, "未知"),
-
-    /**
-     * 男
-     */
     MALE(1, "男"),
-
-    /**
-     * 女
-     */
     FEMALE(2, "女"),
-    ;
 
+    ;
     @EnumValue
     private final Integer value;
     private final String label;

+ 20 - 10
src/main/java/cc/uncarbon/module/sys/enums/GenericStatusEnum.java

@@ -8,28 +8,38 @@ import lombok.Getter;
 
 /**
  * 通用状态枚举类
- *
- * @author Uncarbon
  */
 @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 原值

+ 1 - 3
src/main/java/cc/uncarbon/module/sys/enums/SysErrorEnum.java

@@ -6,8 +6,7 @@ import lombok.Getter;
 
 
 /**
- * 后台管理异常枚举类
- * @author Uncarbon
+ * SYS异常枚举类
  */
 @AllArgsConstructor
 @Getter
@@ -32,7 +31,6 @@ public enum SysErrorEnum implements HelioBaseEnum<Integer> {
     UUID_CANNOT_BE_BLANK(400, "UUID不能为空"),
 
     ;
-
     private final Integer value;
     private final String label;
 

+ 2 - 12
src/main/java/cc/uncarbon/module/sys/enums/SysLogStatusEnum.java

@@ -7,29 +7,19 @@ import lombok.Getter;
 
 
 /**
- * 系统日志状态枚举类
- * @author Uncarbon
+ * 预置系统日志状态枚举类
  */
 @AllArgsConstructor
 @Getter
 public enum SysLogStatusEnum implements HelioBaseEnum<Integer> {
 
-    /**
-     * 未执行
-     */
     NON_EXECUTION(0, "未执行"),
 
-    /**
-     * 成功
-     */
     SUCCESS(1, "成功"),
 
-    /**
-     * 失败
-     */
     FAILED(2, "失败"),
-    ;
 
+    ;
     @EnumValue
     private final Integer value;
     private final String label;

+ 26 - 3
src/main/java/cc/uncarbon/module/sys/enums/SysMenuTypeEnum.java

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.annotation.EnumValue;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.Arrays;
+import java.util.List;
+
 
 /**
- * 菜单类型枚举类
- * @author Uncarbon
+ * 预置系统菜单类型枚举类
  */
 @AllArgsConstructor
 @Getter
@@ -33,10 +35,31 @@ public enum SysMenuTypeEnum implements HelioBaseEnum<Integer> {
      * 外链
      */
     EXTERNAL_LINK(3, "外链"),
-    ;
 
+    ;
     @EnumValue
     private final Integer value;
     private final String label;
 
+    /**
+     * 所有菜单类型
+     */
+    public static List<SysMenuTypeEnum> all() {
+        return Arrays.asList(DIR, MENU, BUTTON, EXTERNAL_LINK);
+    }
+
+    /**
+     * 用于后台管理-侧边菜单的几种菜单类型
+     */
+    public static List<SysMenuTypeEnum> forAdminSide() {
+        return Arrays.asList(DIR, MENU, EXTERNAL_LINK);
+    }
+
+    /**
+     * 用于后台管理-绑定角色与菜单关联关系
+     */
+    public static List<SysMenuTypeEnum> forAdminBindMenus() {
+        return Arrays.asList(DIR, MENU, BUTTON, EXTERNAL_LINK);
+    }
+
 }

+ 2 - 9
src/main/java/cc/uncarbon/module/sys/enums/SysUserStatusEnum.java

@@ -7,24 +7,17 @@ import lombok.Getter;
 
 
 /**
- * 后台用户状态枚举类
- * @author Uncarbon
+ * 预置系统后台用户状态枚举类
  */
 @AllArgsConstructor
 @Getter
 public enum SysUserStatusEnum implements HelioBaseEnum<Integer> {
 
-    /**
-     * 封禁
-     */
     BANNED(0, "封禁"),
 
-    /**
-     * 正常
-     */
     ENABLED(1, "正常"),
-    ;
 
+    ;
     @EnumValue
     private final Integer value;
     private final String label;

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

@@ -76,7 +76,4 @@ public class SysMenuBO implements Serializable {
     @ApiModelProperty(value = "【用于Vben Admin】菜单详情", hidden = true)
     private VbenAdminMenuMetaVO meta;
 
-    @ApiModelProperty(value = "【用于Vben Admin树状菜单】菜单主键ID字符串", hidden = true)
-    private String idStr;
-
 }

+ 9 - 20
src/main/java/cc/uncarbon/module/sys/service/SysMenuService.java

@@ -17,6 +17,7 @@ import cc.uncarbon.module.sys.model.response.SysMenuBO;
 import cc.uncarbon.module.sys.model.response.VbenAdminMenuMetaVO;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.text.StrPool;
 import cn.hutool.core.util.IdUtil;
@@ -146,21 +147,15 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
      */
     public List<SysMenuBO> adminListSideMenu() {
         Set<Long> visibleMenuIds = this.listCurrentUserVisibleMenuIds();
-
-        List<SysMenuTypeEnum> requiredMenuTypes = Arrays.asList(SysMenuTypeEnum.DIR, SysMenuTypeEnum.MENU,
-                SysMenuTypeEnum.EXTERNAL_LINK);
-        return this.listByIds(visibleMenuIds, requiredMenuTypes);
+        return this.listByIds(visibleMenuIds, SysMenuTypeEnum.forAdminSide());
     }
 
     /**
-     * 后台管理-取所有可见菜单 包括按钮类型
+     * 后台管理-取所有可见菜单
      */
     public List<SysMenuBO> adminListVisibleMenu() {
         Set<Long> visibleMenuIds = this.listCurrentUserVisibleMenuIds();
-
-        List<SysMenuTypeEnum> requiredMenuTypes = Arrays.asList(SysMenuTypeEnum.DIR, SysMenuTypeEnum.MENU,
-                SysMenuTypeEnum.EXTERNAL_LINK, SysMenuTypeEnum.BUTTON);
-        return this.listByIds(visibleMenuIds, requiredMenuTypes);
+        return this.listByIds(visibleMenuIds, SysMenuTypeEnum.all());
     }
 
     /**
@@ -258,7 +253,6 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
 
         String snowflakeIdStr = SNOWFLAKE.nextIdStr();
         bo
-                .setIdStr(StrUtil.toString(bo.getId()))
                 .setName(snowflakeIdStr)
                 .setMeta(
                         VbenAdminMenuMetaVO.builder()
@@ -343,21 +337,16 @@ public class SysMenuService extends HelioBaseServiceImpl<SysMenuMapper, SysMenuE
         return this.traceParentMenuIds(allMenuMap, directlyRelatedMenuIds);
     }
 
-    private List<SysMenuBO> listByIds(Collection<Long> visibleMenuIds, List<SysMenuTypeEnum> requiredMenuTypes)
+    private List<SysMenuBO> listByIds(Collection<Long> ids, List<SysMenuTypeEnum> types)
             throws IllegalArgumentException {
-        if (CollUtil.isEmpty(visibleMenuIds)) {
-            throw new IllegalArgumentException("visibleMenuIds不能为空");
-        }
-
-        if (CollUtil.isEmpty(requiredMenuTypes)) {
-            throw new IllegalArgumentException("requiredMenuTypes不能为空");
-        }
+        Assert.notEmpty(ids);
+        Assert.notEmpty(types);
 
         List<SysMenuEntity> entityList = this.list(
                 new QueryWrapper<SysMenuEntity>()
                         .lambda()
-                        .in(SysMenuEntity::getId, visibleMenuIds)
-                        .in(SysMenuEntity::getType, requiredMenuTypes)
+                        .in(SysMenuEntity::getId, ids)
+                        .in(SysMenuEntity::getType, types)
                         .orderByAsc(SysMenuEntity::getSort)
         );
 

+ 2 - 3
src/main/java/cc/uncarbon/module/sys/service/SysRoleMenuRelationService.java

@@ -4,6 +4,7 @@ import cc.uncarbon.framework.crud.service.impl.HelioBaseServiceImpl;
 import cc.uncarbon.module.sys.entity.SysRoleMenuRelationEntity;
 import cc.uncarbon.module.sys.mapper.SysRoleMenuRelationMapper;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.RequiredArgsConstructor;
@@ -33,9 +34,7 @@ public class SysRoleMenuRelationService extends HelioBaseServiceImpl<SysRoleMenu
      * @return 菜单Ids
      */
     public Set<Long> listMenuIdsByRoleIds(Collection<Long> roleIds) throws IllegalArgumentException {
-        if (CollUtil.isEmpty(roleIds)) {
-            throw new IllegalArgumentException("roleIds不能为空");
-        }
+        Assert.notEmpty(roleIds);
 
         // aka * 16
         Set<Long> ret = new HashSet<>(roleIds.size() << 4);

+ 2 - 0
src/main/java/cc/uncarbon/module/sys/service/SysRoleService.java

@@ -140,6 +140,8 @@ public class SysRoleService extends HelioBaseServiceImpl<SysRoleMapper, SysRoleE
      *
      * @return 新菜单ID集合对应的权限名
      */
+    @SysLog(value = "绑定角色与菜单关联关系")
+    @Transactional(rollbackFor = Exception.class)
     public Set<String> adminBindMenus(AdminBindRoleMenuRelationDTO dto) {
         Set<String> newPermissions = sysMenuService.listPermissionsByMenuIds(dto.getMenuIds());
         sysRoleMenuRelationService.cleanAndBind(dto.getRoleId(), dto.getMenuIds());

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

@@ -38,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.PostConstruct;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -227,9 +228,7 @@ public class SysUserService extends HelioBaseServiceImpl<SysUserMapper, SysUserE
         SysUserLoginBO ret = new SysUserLoginBO();
         BeanUtil.copyProperties(sysUserBO, ret);
 
-        // aka * 64
-        HashSet<String> permissions = new HashSet<>(roleIdPermissionMap.size() << 6);
-        roleIdPermissionMap.values().forEach(permissions::addAll);
+        Set<String> permissions = roleIdPermissionMap.values().stream().flatMap(Collection::stream).collect(Collectors.toSet());
 
         ret
                 .setRoleIds(new HashSet<>(roleMap.keySet()))

+ 2 - 3
src/main/java/cc/uncarbon/module/sys/web/auth/AdminAuthController.java

@@ -24,7 +24,6 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -50,7 +49,7 @@ public class AdminAuthController {
     private final CaptchaHelper captchaHelper;
 
 
-    @ApiOperation(value = "登录", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "登录")
     @PostMapping(value = "/login")
     public ApiResult<SysUserLoginVO> login(HttpServletRequest request, @RequestBody @Valid SysUserLoginDTO dto) {
         // 从请求中得到客户端IP地址
@@ -90,7 +89,7 @@ public class AdminAuthController {
     }
 
     @SaCheckLogin(type = AdminStpUtil.TYPE)
-    @ApiOperation(value = "登出", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "登出")
     @PostMapping(value = "/logout")
     public ApiResult<?> logout() {
         AdminStpUtil.logout();

+ 5 - 5
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysDataDictController.java

@@ -40,21 +40,21 @@ public class AdminSysDataDictController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysDataDictBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysDataDictService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysDataDictDTO dto) {
         sysDataDictService.adminInsert(dto);
@@ -63,7 +63,7 @@ public class AdminSysDataDictController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysDataDictDTO dto) {
         dto.setId(id);
@@ -73,7 +73,7 @@ public class AdminSysDataDictController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysDataDictService.adminDelete(dto.getIds());

+ 5 - 5
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysDeptController.java

@@ -38,21 +38,21 @@ public class AdminSysDeptController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "列表")
     @GetMapping
     public ApiResult<List<SysDeptBO>> list() {
         return ApiResult.data(sysDeptService.adminList());
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysDeptBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysDeptService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysDeptDTO dto) {
         sysDeptService.adminInsert(dto);
@@ -61,7 +61,7 @@ public class AdminSysDeptController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysDeptDTO dto) {
         dto.setId(id);
@@ -71,7 +71,7 @@ public class AdminSysDeptController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysDeptService.adminDelete(dto.getIds());

+ 2 - 2
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysLogController.java

@@ -39,14 +39,14 @@ public class AdminSysLogController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysLogBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysLogService.getOneById(id, true));

+ 7 - 7
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysMenuController.java

@@ -38,21 +38,21 @@ public class AdminSysMenuController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "列表")
     @GetMapping
     public ApiResult<List<SysMenuBO>> list() {
         return ApiResult.data(sysMenuService.adminList());
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysMenuBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysMenuService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysMenuDTO dto) {
         sysMenuService.adminInsert(dto);
@@ -61,7 +61,7 @@ public class AdminSysMenuController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysMenuDTO dto) {
         dto.setId(id);
@@ -71,7 +71,7 @@ public class AdminSysMenuController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysMenuService.adminDelete(dto.getIds());
@@ -79,13 +79,13 @@ public class AdminSysMenuController {
         return ApiResult.success();
     }
 
-    @ApiOperation(value = "取侧边菜单", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "取侧边菜单")
     @GetMapping("/side")
     public ApiResult<List<SysMenuBO>> adminListSideMenu() {
         return ApiResult.data(sysMenuService.adminListSideMenu());
     }
 
-    @ApiOperation(value = "取所有可见菜单", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "取所有可见菜单")
     @GetMapping("/all")
     public ApiResult<List<SysMenuBO>> adminListVisibleMenu() {
         return ApiResult.data(sysMenuService.adminListVisibleMenu());

+ 5 - 5
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysParamController.java

@@ -39,21 +39,21 @@ public class AdminSysParamController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysParamBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysParamService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysParamDTO dto) {
         sysParamService.adminInsert(dto);
@@ -62,7 +62,7 @@ public class AdminSysParamController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysParamDTO dto) {
         dto.setId(id);
@@ -72,7 +72,7 @@ public class AdminSysParamController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysParamService.adminDelete(dto.getIds());

+ 6 - 6
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysRoleController.java

@@ -45,21 +45,21 @@ public class AdminSysRoleController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysRoleBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysRoleService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysRoleDTO dto) {
         sysRoleService.adminInsert(dto);
@@ -68,7 +68,7 @@ public class AdminSysRoleController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysRoleDTO dto) {
         dto.setId(id);
@@ -78,7 +78,7 @@ public class AdminSysRoleController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysRoleService.adminDelete(dto.getIds());
@@ -90,7 +90,7 @@ public class AdminSysRoleController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "bindMenus")
-    @ApiOperation(value = "绑定角色与菜单关联关系", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "绑定角色与菜单关联关系")
     @PutMapping(value = "/{id}/menus")
     public ApiResult<?> bindMenus(@PathVariable Long id, @RequestBody @Valid AdminBindRoleMenuRelationDTO dto) {
         dto.setRoleId(id);

+ 6 - 7
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysTenantController.java

@@ -5,8 +5,8 @@ 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.sys.facade.SysTenantFacade;
 import cc.uncarbon.module.sys.constant.SysConstant;
+import cc.uncarbon.module.sys.facade.SysTenantFacade;
 import cc.uncarbon.module.sys.model.request.AdminInsertSysTenantDTO;
 import cc.uncarbon.module.sys.model.request.AdminListSysTenantDTO;
 import cc.uncarbon.module.sys.model.request.AdminUpdateSysTenantDTO;
@@ -19,7 +19,6 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -44,21 +43,21 @@ public class AdminSysTenantController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysTenantBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysTenantService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertSysTenantDTO dto) {
         sysTenantFacade.adminInsert(dto);
@@ -67,7 +66,7 @@ public class AdminSysTenantController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminUpdateSysTenantDTO dto) {
         dto.setId(id);
@@ -77,7 +76,7 @@ public class AdminSysTenantController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysTenantService.adminDelete(dto.getIds());

+ 11 - 11
src/main/java/cc/uncarbon/module/sys/web/sys/AdminSysUserController.java

@@ -43,21 +43,21 @@ public class AdminSysUserController {
 
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "分页列表", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "分页列表")
     @GetMapping
     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 = "详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "详情")
     @GetMapping(value = "/{id}")
     public ApiResult<SysUserBO> getById(@PathVariable Long id) {
         return ApiResult.data(sysUserService.getOneById(id, true));
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.CREATE)
-    @ApiOperation(value = "新增", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "新增")
     @PostMapping
     public ApiResult<?> insert(@RequestBody @Valid AdminInsertOrUpdateSysUserDTO dto) {
         sysUserService.adminInsert(dto);
@@ -66,7 +66,7 @@ public class AdminSysUserController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.UPDATE)
-    @ApiOperation(value = "编辑", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "编辑")
     @PutMapping(value = "/{id}")
     public ApiResult<?> update(@PathVariable Long id, @RequestBody @Valid AdminInsertOrUpdateSysUserDTO dto) {
         dto.setId(id);
@@ -76,7 +76,7 @@ public class AdminSysUserController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.DELETE)
-    @ApiOperation(value = "删除", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "删除")
     @DeleteMapping
     public ApiResult<?> delete(@RequestBody @Valid IdsDTO<Long> dto) {
         sysUserService.adminDelete(dto.getIds());
@@ -84,14 +84,14 @@ public class AdminSysUserController {
         return ApiResult.success();
     }
 
-    @ApiOperation(value = "取当前用户信息", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "取当前用户信息")
     @GetMapping(value = "/info")
     public ApiResult<VbenAdminUserInfoVO> getCurrentUserInfo() {
         return ApiResult.data(sysUserService.adminGetCurrentUserInfo());
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "resetPassword")
-    @ApiOperation(value = "重置某用户密码", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "重置某用户密码")
     @PutMapping(value = "/{userId}/password")
     public ApiResult<?> resetPassword(@PathVariable Long userId, @RequestBody @Valid AdminResetSysUserPasswordDTO dto) {
         dto.setUserId(userId);
@@ -103,7 +103,7 @@ public class AdminSysUserController {
         return ApiResult.success();
     }
 
-    @ApiOperation(value = "修改当前用户密码", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "修改当前用户密码")
     @PostMapping(value = "/updatePassword")
     public ApiResult<?> updatePassword(@RequestBody @Valid AdminUpdateCurrentSysUserPasswordDTO dto) {
         if (StrUtil.isBlank(dto.getNewPassword()) || StrUtil.isBlank(dto.getConfirmNewPassword())) {
@@ -122,7 +122,7 @@ public class AdminSysUserController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "bindRoles")
-    @ApiOperation(value = "绑定用户与角色关联关系", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "绑定用户与角色关联关系")
     @PutMapping(value = "/{userId}/roles")
     public ApiResult<?> bindRoles(@PathVariable Long userId, @RequestBody AdminBindUserRoleRelationDTO dto) {
         dto.setUserId(userId);
@@ -135,7 +135,7 @@ public class AdminSysUserController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + "kickOut")
-    @ApiOperation(value = "踢某用户下线", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "踢某用户下线")
     @PostMapping(value = "/{userId}/kickOut")
     public ApiResult<?> kickOut(@PathVariable Long userId) {
         AdminStpUtil.kickout(userId);
@@ -144,7 +144,7 @@ public class AdminSysUserController {
     }
 
     @SaCheckPermission(type = AdminStpUtil.TYPE, value = PERMISSION_PREFIX + HelioConstant.Permission.RETRIEVE)
-    @ApiOperation(value = "取指定用户关联角色ID", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "取指定用户关联角色ID")
     @GetMapping(value = "/{userId}/relatedRoleIds")
     public ApiResult<Set<Long>> listRelatedRoleIds(@PathVariable Long userId) {
         return ApiResult.data(sysUserService.listRelatedRoleIds(userId));

+ 23 - 0
src/main/resources/application-prod.yml

@@ -29,6 +29,29 @@ spring:
     password:
     # Redis数据库序号
     database: 1
+  file-storage:
+    # 文档链接: https://spring-file-storage.xuyanwu.cn/#/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8?id=%e9%85%8d%e7%bd%ae
+    # 默认使用 minio-1 存储平台
+    default-platform: minio-1
+    # 缩略图后缀
+    thumbnail-suffix: ".min.jpg"
+    local-plus: # 本地存储升级版,不使用的情况下可以不写
+      - platform: local-plus-1 # 存储平台标识
+        enable-storage: true  #启用存储
+        enable-access: false #启用访问(线上请使用 Nginx 配置,效率更高)
+        domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+        base-path: / # 基础路径
+        path-patterns: /** # 访问路径
+        storage-path: (实际本地存储路径,如 D:/local-plus-1) # 实际本地存储路径
+    minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+      - platform: minio-1 # 存储平台标识
+        enable-storage: true  # 启用存储
+        access-key: (MinIO AK)
+        secret-key: (MinIO SK)
+        end-point: http://127.0.0.1:9000
+        bucket-name: helio
+        domain: http://127.0.0.1:9000/helio/ # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+        base-path: / # 基础路径
 
 knife4j:
   # 生产环境务必设为true

+ 23 - 0
src/main/resources/application-test.yml

@@ -29,6 +29,29 @@ spring:
     password:
     # Redis数据库序号
     database: 1
+  file-storage:
+    # 文档链接: https://spring-file-storage.xuyanwu.cn/#/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8?id=%e9%85%8d%e7%bd%ae
+    # 默认使用 minio-1 存储平台
+    default-platform: minio-1
+    # 缩略图后缀
+    thumbnail-suffix: ".min.jpg"
+    local-plus: # 本地存储升级版,不使用的情况下可以不写
+      - platform: local-plus-1 # 存储平台标识
+        enable-storage: true  #启用存储
+        enable-access: false #启用访问(线上请使用 Nginx 配置,效率更高)
+        domain: "" # 访问域名,例如:“http://127.0.0.1:8030/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
+        base-path: / # 基础路径
+        path-patterns: /** # 访问路径
+        storage-path: (实际本地存储路径,如 D:/local-plus-1) # 实际本地存储路径
+    minio: # MinIO,由于 MinIO SDK 支持 AWS S3,其它兼容 AWS S3 协议的存储平台也都可配置在这里
+      - platform: minio-1 # 存储平台标识
+        enable-storage: true  # 启用存储
+        access-key: (MinIO AK)
+        secret-key: (MinIO SK)
+        end-point: http://127.0.0.1:9000
+        bucket-name: helio
+        domain: http://127.0.0.1:9000/helio/ # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
+        base-path: / # 基础路径
 
 knife4j:
   # 生产环境务必设为true

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

@@ -20,6 +20,15 @@ spring:
   messages:
     # 国际化资源目录,一般不做修改
     basename: i18n/messages
+  task:
+    # spring-schedule 线程池容量
+    scheduling:
+      pool:
+        size: 8
+    # spring-async 线程池容量
+    execution:
+      pool:
+        core-size: 8
 
 helio:
   crud:
@@ -71,8 +80,8 @@ server:
   port: 7003
 
 mybatis-plus:
-  # XML扫描,支持统配符 * 或者 ; 分割
-  mapper-locations: classpath*:/mapper/**/*.xml
+  # XML扫描,支持统配符 * 或者 , 分割
+  mapper-locations: classpath*:/mapper/**/*.xml, classpath*:/**/mapper/xml/*.xml
 
 logging:
   level: