Commit 823c26a567ca0fd916adc0d680c0176c812bffe2

Authored by YunaiV
1 parent 1345c663

批量提交一次迁移的代码

完成 get-info 接口,完成和前端 vue 的对接
ruoyi-admin/src/main/resources/application.yml
... ... @@ -12,8 +12,6 @@ ruoyi:
12 12 profile: D:/ruoyi/uploadPath
13 13 # 获取ip地址开关
14 14 addressEnabled: false
15   - # 验证码类型 math 数组计算 char 字符验证
16   - captchaType: math
17 15  
18 16 # 开发环境配置
19 17 server:
... ... @@ -42,7 +40,7 @@ spring:
42 40 messages:
43 41 # 国际化资源文件路径
44 42 basename: i18n/messages
45   - profiles:
  43 + profiles:
46 44 active: druid
47 45 # 文件上传
48 46 servlet:
... ... @@ -59,13 +57,13 @@ spring:
59 57 # redis 配置
60 58 redis:
61 59 # 地址
62   - host: localhost
  60 + host: 127.0.0.1
63 61 # 端口,默认为6379
64 62 port: 6379
65 63 # 数据库索引
66 64 database: 0
67 65 # 密码
68   - password:
  66 + password:
69 67 # 连接超时时间
70 68 timeout: 10s
71 69 lettuce:
... ... @@ -79,15 +77,6 @@ spring:
79 77 # #连接池最大阻塞等待时间(使用负值表示没有限制)
80 78 max-wait: -1ms
81 79  
82   -# token配置
83   -token:
84   - # 令牌自定义标识
85   - header: Authorization
86   - # 令牌密钥
87   - secret: abcdefghijklmnopqrstuvwxyz
88   - # 令牌有效期(默认30分钟)
89   - expireTime: 30
90   -
91 80 # MyBatis配置
92 81 mybatis:
93 82 # 搜索指定包别名
... ... @@ -98,11 +87,11 @@ mybatis:
98 87 configLocation: classpath:mybatis/mybatis-config.xml
99 88  
100 89 # PageHelper分页插件
101   -pagehelper:
  90 +pagehelper:
102 91 helperDialect: mysql
103 92 reasonable: true
104 93 supportMethodsArguments: true
105   - params: count=countSql
  94 + params: count=countSql
106 95  
107 96 # Swagger配置
108 97 swagger:
... ... @@ -112,7 +101,7 @@ swagger:
112 101 pathMapping: /dev-api
113 102  
114 103 # 防止XSS攻击
115   -xss:
  104 +xss:
116 105 # 过滤开关
117 106 enabled: true
118 107 # 排除链接(多个用逗号分隔)
... ...
ruoyi-ui/src/store/modules/user.js
... ... @@ -51,7 +51,7 @@ const user = {
51 51 return new Promise((resolve, reject) => {
52 52 getInfo(state.token).then(res => {
53 53 const user = res.user
54   - const avatar = user.avatar == "" ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar;
  54 + const avatar = user.avatar === "" ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar;
55 55 if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
56 56 commit('SET_ROLES', res.roles)
57 57 commit('SET_PERMISSIONS', res.permissions)
... ... @@ -66,7 +66,7 @@ const user = {
66 66 })
67 67 })
68 68 },
69   -
  69 +
70 70 // 退出系统
71 71 LogOut({ commit, state }) {
72 72 return new Promise((resolve, reject) => {
... ...
src/main/java/cn/iocoder/dashboard/common/core/IntArrayValuable.java 0 → 100644
  1 +package cn.iocoder.dashboard.common.core;
  2 +
  3 +/**
  4 + * 可生成 Int 数组的接口
  5 + *
  6 + * @author 芋道源码
  7 + */
  8 +public interface IntArrayValuable {
  9 +
  10 + /**
  11 + * @return int 数组
  12 + */
  13 + int[] array();
  14 +
  15 +}
... ...
src/main/java/cn/iocoder/dashboard/common/enums/CommonStatusEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.common.enums;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 通用状态枚举
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum CommonStatusEnum {
  14 +
  15 + ENABLE("0", "开启"),
  16 + DISABLE("1", "关闭");
  17 +
  18 + /**
  19 + * 状态值
  20 + */
  21 + private final String status;
  22 + /**
  23 + * 状态名
  24 + */
  25 + private final String name;
  26 +
  27 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/datasource/DataSourceConfiguration.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.datasource;
  2 +
  3 +import org.springframework.context.annotation.Configuration;
  4 +import org.springframework.transaction.annotation.EnableTransactionManagement;
  5 +
  6 +/**
  7 + * 数据库匹配类
  8 + */
  9 +@Configuration
  10 +@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理
  11 +public class DataSourceConfiguration {
  12 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/mybatis/config/MybatisConfiguration.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.mybatis.config;
  2 +
  3 +import org.apache.ibatis.annotations.Mapper;
  4 +import org.mybatis.spring.annotation.MapperScan;
  5 +import org.springframework.context.annotation.Configuration;
  6 +
  7 +/**
  8 + * MyBaits 配置类
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Configuration
  13 +@MapperScan(value = "cn.iocoder.dashboard", annotationClass = Mapper.class)
  14 +public class MybatisConfiguration {
  15 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthGetInfoRespVO.java
... ... @@ -2,18 +2,42 @@ package cn.iocoder.dashboard.modules.system.controller.auth.vo;
2 2  
3 3 import io.swagger.annotations.ApiModel;
4 4 import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Builder;
5 7 import lombok.Data;
  8 +import lombok.NoArgsConstructor;
6 9  
7 10 import java.util.Set;
8 11  
9 12 @ApiModel("获得用户信息 Resp VO")
10 13 @Data
  14 +@NoArgsConstructor
  15 +@AllArgsConstructor
  16 +@Builder
11 17 public class SysAuthGetInfoRespVO {
12 18  
  19 + @ApiModelProperty(value = "用户信息", required = true)
  20 + private UserVO user;
  21 +
13 22 @ApiModelProperty(value = "角色权限数组", required = true)
14 23 private Set<String> roles;
15 24  
16 25 @ApiModelProperty(value = "菜单权限数组", required = true)
17 26 private Set<String> permissions;
18 27  
  28 + @ApiModel("用户信息 VO")
  29 + @Data
  30 + @NoArgsConstructor
  31 + @AllArgsConstructor
  32 + @Builder
  33 + public static class UserVO {
  34 +
  35 + @ApiModelProperty(value = "用户昵称", required = true, example = "芋道源码")
  36 + private String nickname;
  37 +
  38 + @ApiModelProperty(value = "用户头像", required = true, example = "http://www.iocoder.cn/xx.jpg")
  39 + private String avatar;
  40 +
  41 + }
  42 +
19 43 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java
... ... @@ -22,10 +22,11 @@ public interface SysAuthConvert {
22 22 LoginUser convert(SysUserDO bean);
23 23  
24 24 default SysAuthGetInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
25   - SysAuthGetInfoRespVO respVO = new SysAuthGetInfoRespVO();
26   - respVO.setRoles(CollectionUtils.convertSet(roleList, SysRoleDO::getRoleKey));
27   - respVO.setPermissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPerms));
28   - return respVO;
  25 + return SysAuthGetInfoRespVO.builder()
  26 + .user(SysAuthGetInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build())
  27 + .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getRoleKey))
  28 + .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPerms))
  29 + .build();
29 30 }
30 31  
31 32 SysAuthGetRouterRespVO convertTreeNode(SysMenuDO menu);
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/permission/MenuTypeEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.enums.permission;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 菜单类型枚举类
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum MenuTypeEnum {
  14 +
  15 + DIR("M"), // 目录
  16 + MENU("C"), // 菜单
  17 + BUTTON("F") // 按钮
  18 + ;
  19 +
  20 + /**
  21 + * 类型
  22 + */
  23 + private final String type;
  24 +
  25 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.modules.system.service.auth.impl;
2 2  
3 3 import cn.hutool.core.util.IdUtil;
4 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 6 import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
6 7 import cn.iocoder.dashboard.framework.security.core.LoginUser;
7 8 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
... ... @@ -12,6 +13,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRo
12 13 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
13 14 import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO;
14 15 import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum;
  16 +import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
15 17 import cn.iocoder.dashboard.modules.system.enums.user.UserStatus;
16 18 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
17 19 import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService;
... ... @@ -19,6 +21,7 @@ import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionServi
19 21 import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
20 22 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
21 23 import cn.iocoder.dashboard.util.collection.CollectionUtils;
  24 +import cn.iocoder.dashboard.util.collection.SetUtils;
22 25 import cn.iocoder.dashboard.util.date.DateUtils;
23 26 import io.jsonwebtoken.Claims;
24 27 import io.jsonwebtoken.JwtException;
... ... @@ -231,22 +234,24 @@ public class SysAuthServiceImpl implements SysAuthService {
231 234 // 获得角色列表
232 235 List<SysRoleDO> roleList = roleService.listRolesFromCache(roleIds);
233 236 // 获得菜单列表
234   - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds);
  237 + List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds,
  238 + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()),
  239 + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
235 240 // 拼接结果返回
236 241 return SysAuthConvert.INSTANCE.convert(user, roleList, menuList);
237 242 }
238 243  
239 244 @Override
240 245 public List<SysAuthGetRouterRespVO> getRouters(Long userId, Set<Long> roleIds) {
241   - // TODO 芋艿:去除 F 的类型,去除 禁用 的
242   - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds);
  246 + List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds,
  247 + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()),
  248 + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
243 249 // 转换成 Tree 结构返回
244 250 return buildRouterTree(menuList);
245 251 }
246 252  
247 253 private static List<SysAuthGetRouterRespVO> buildRouterTree(List<SysMenuDO> menuList) {
248 254 // 排序,保证菜单的有序性
249   - menuList = new ArrayList<>(menuList); // 使用 ArrayList 套一下,因为 menuList 是不可修改的 List
250 255 menuList.sort(Comparator.comparing(SysMenuDO::getOrderNum));
251 256 // 构建菜单树
252 257 // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java
... ... @@ -18,16 +18,25 @@ public interface SysMenuService {
18 18 /**
19 19 * 获得所有菜单,从缓存中
20 20 *
  21 + * 任一参数为空时,则返回为空
  22 + *
  23 + * @param menuTypes 菜单类型数组
  24 + * @param menusStatuses 菜单状态数组
21 25 * @return 菜单列表
22 26 */
23   - List<SysMenuDO> listMenusFromCache();
  27 + List<SysMenuDO> listMenusFromCache(Collection<String> menuTypes, Collection<String> menusStatuses);
24 28  
25 29 /**
26 30 * 获得指定编号的菜单数组,从缓存中
27 31 *
  32 + * 任一参数为空时,则返回为空
  33 + *
28 34 * @param menuIds 菜单编号数组
  35 + * @param menuTypes 菜单类型数组
  36 + * @param menusStatuses 菜单状态数组
29 37 * @return 菜单数组
30 38 */
31   - List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds);
  39 + List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds, Collection<String> menuTypes,
  40 + Collection<String> menusStatuses);
32 41  
33 42 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java
... ... @@ -22,10 +22,15 @@ public interface SysPermissionService {
22 22 /**
23 23 * 获得角色们拥有的菜单列表,从缓存中获取
24 24 *
25   - * @param roleIds 角色编号素组
  25 + * 任一参数为空时,则返回为空
  26 + *
  27 + * @param roleIds 角色编号数组
  28 + * @param menuTypes 菜单类型数组
  29 + * @param menusStatuses 菜单状态数组
26 30 * @return 菜单列表
27 31 */
28   - List<SysMenuDO> listRoleMenusFromCache(Collection<Long> roleIds);
  32 + List<SysMenuDO> listRoleMenusFromCache(Collection<Long> roleIds, Collection<String> menuTypes,
  33 + Collection<String> menusStatuses);
29 34  
30 35 /**
31 36 * 获得用户拥有的角色编号数组
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
1 1 package cn.iocoder.dashboard.modules.system.service.permission.impl;
2 2  
3   -import cn.hutool.core.collection.CollectionUtil;
4 3 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysMenuMapper;
5 4 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
6 5 import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
7   -import com.google.common.collect.ImmutableList;
  6 +import cn.iocoder.dashboard.util.collection.CollectionUtils;
8 7 import com.google.common.collect.ImmutableMap;
9 8 import com.google.common.collect.ImmutableMultimap;
10 9 import com.google.common.collect.Multimap;
... ... @@ -13,10 +12,7 @@ import org.springframework.stereotype.Service;
13 12  
14 13 import javax.annotation.PostConstruct;
15 14 import javax.annotation.Resource;
16   -import java.util.Collection;
17   -import java.util.Collections;
18   -import java.util.List;
19   -import java.util.Map;
  15 +import java.util.*;
20 16 import java.util.stream.Collectors;
21 17  
22 18 /**
... ... @@ -64,18 +60,27 @@ public class SysMenuServiceImpl implements SysMenuService {
64 60 }
65 61  
66 62 @Override
67   - public List<SysMenuDO> listMenusFromCache() {
68   - // Guava ImmutableMap 对应的 value 类型为 ImmutableCollection
69   - // 而 ImmutableList 在 copyof 时,如果入参类型为 ImmutableCollection 时,会进行包装,而不会进行复制。
70   - return ImmutableList.copyOf(menuCache.values());
  63 + public List<SysMenuDO> listMenusFromCache(Collection<String> menuTypes, Collection<String> menusStatuses) {
  64 + // 任一一个参数为空,则返回空
  65 + if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) {
  66 + return Collections.emptyList();
  67 + }
  68 + // 创建新数组,避免缓存被修改
  69 + return menuCache.values().stream().filter(menu -> menuTypes.contains(menu.getMenuType())
  70 + && menusStatuses.contains(menu.getStatus()))
  71 + .collect(Collectors.toList());
71 72 }
72 73  
73 74 @Override
74   - public List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds) {
75   - if (CollectionUtil.isEmpty(menuIds)) {
  75 + public List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds, Collection<String> menuTypes,
  76 + Collection<String> menusStatuses) {
  77 + // 任一一个参数为空,则返回空
  78 + if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) {
76 79 return Collections.emptyList();
77 80 }
78   - return menuCache.values().stream().filter(menuDO -> menuIds.contains(menuDO.getMenuId()))
  81 + return menuCache.values().stream().filter(menu -> menuIds.contains(menu.getMenuId())
  82 + && menuTypes.contains(menu.getMenuType())
  83 + && menusStatuses.contains(menu.getStatus()))
79 84 .collect(Collectors.toList());
80 85 }
81 86 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java
... ... @@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
17 17 import javax.annotation.PostConstruct;
18 18 import javax.annotation.Resource;
19 19 import java.util.Collection;
  20 +import java.util.Collections;
20 21 import java.util.List;
21 22  
22 23 /**
... ... @@ -77,16 +78,21 @@ public class SysPermissionServiceImpl implements SysPermissionService {
77 78 }
78 79  
79 80 @Override
80   - public List<SysMenuDO> listRoleMenusFromCache(Collection<Long> roleIds) {
  81 + public List<SysMenuDO> listRoleMenusFromCache(Collection<Long> roleIds, Collection<String> menuTypes,
  82 + Collection<String> menusStatuses) {
  83 + // 任一一个参数为空时,不返回任何菜单
  84 + if (CollectionUtils.isAnyEmpty(roleIds, menusStatuses, menusStatuses)) {
  85 + return Collections.emptyList();
  86 + }
81 87 // 判断角色是否包含管理员
82 88 List<SysRoleDO> roleList = roleService.listRolesFromCache(roleIds);
83 89 boolean hasAdmin = roleService.hasAnyAdmin(roleList);
84 90 // 获得角色拥有的菜单关联
85 91 if (hasAdmin) { // 管理员,获取到全部
86   - return menuService.listMenusFromCache();
  92 + return menuService.listMenusFromCache(menuTypes, menusStatuses);
87 93 }
88 94 List<Long> menuIds = MapUtils.getList(roleMenuCache, roleIds);
89   - return menuService.listMenusFromCache(menuIds);
  95 + return menuService.listMenusFromCache(menuIds, menuTypes, menusStatuses);
90 96 }
91 97  
92 98 @Override
... ...
src/main/java/cn/iocoder/dashboard/util/collection/CollectionUtils.java
... ... @@ -14,8 +14,8 @@ import java.util.stream.Collectors;
14 14 */
15 15 public class CollectionUtils {
16 16  
17   - public static <T> Set<T> asSet(T... objs) {
18   - return new HashSet<>(Arrays.asList(objs));
  17 + public static boolean isAnyEmpty(Collection<?>... collections) {
  18 + return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty);
19 19 }
20 20  
21 21 public static <T> List<T> filterList(Collection<T> from, Predicate<T> predicate) {
... ...
src/main/java/cn/iocoder/dashboard/util/collection/SetUtils.java 0 → 100644
  1 +package cn.iocoder.dashboard.util.collection;
  2 +
  3 +import java.util.Arrays;
  4 +import java.util.HashSet;
  5 +import java.util.Set;
  6 +
  7 +/**
  8 + * Set 工具类
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +public class SetUtils {
  13 +
  14 + public static <T> Set<T> asSet(T... objs) {
  15 + return new HashSet<>(Arrays.asList(objs));
  16 + }
  17 +
  18 +}
... ...