Commit 3e5bd019626f9fca82ff97b75b729f02fc548ed3
1 parent
ea4c9e49
1. 完成 menu 模块的迁移
2. 增加 mybatis plus 的 QueryWrapperX 封装,方便拼接 SQL
Showing
25 changed files
with
209 additions
and
269 deletions
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
| @@ -59,59 +59,11 @@ public interface SysMenuMapper | @@ -59,59 +59,11 @@ public interface SysMenuMapper | ||
| 59 | 59 | ||
| 60 | /** | 60 | /** |
| 61 | * 根据角色ID查询菜单树信息 | 61 | * 根据角色ID查询菜单树信息 |
| 62 | - * | 62 | + * |
| 63 | * @param roleId 角色ID | 63 | * @param roleId 角色ID |
| 64 | * @param menuCheckStrictly 菜单树选择项是否关联显示 | 64 | * @param menuCheckStrictly 菜单树选择项是否关联显示 |
| 65 | * @return 选中菜单列表 | 65 | * @return 选中菜单列表 |
| 66 | */ | 66 | */ |
| 67 | public List<Integer> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); | 67 | public List<Integer> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); |
| 68 | 68 | ||
| 69 | - /** | ||
| 70 | - * 根据菜单ID查询信息 | ||
| 71 | - * | ||
| 72 | - * @param menuId 菜单ID | ||
| 73 | - * @return 菜单信息 | ||
| 74 | - */ | ||
| 75 | - public SysMenu selectMenuById(Long menuId); | ||
| 76 | - | ||
| 77 | - /** | ||
| 78 | - * 是否存在菜单子节点 | ||
| 79 | - * | ||
| 80 | - * @param menuId 菜单ID | ||
| 81 | - * @return 结果 | ||
| 82 | - */ | ||
| 83 | - public int hasChildByMenuId(Long menuId); | ||
| 84 | - | ||
| 85 | - /** | ||
| 86 | - * 新增菜单信息 | ||
| 87 | - * | ||
| 88 | - * @param menu 菜单信息 | ||
| 89 | - * @return 结果 | ||
| 90 | - */ | ||
| 91 | - public int insertMenu(SysMenu menu); | ||
| 92 | - | ||
| 93 | - /** | ||
| 94 | - * 修改菜单信息 | ||
| 95 | - * | ||
| 96 | - * @param menu 菜单信息 | ||
| 97 | - * @return 结果 | ||
| 98 | - */ | ||
| 99 | - public int updateMenu(SysMenu menu); | ||
| 100 | - | ||
| 101 | - /** | ||
| 102 | - * 删除菜单管理信息 | ||
| 103 | - * | ||
| 104 | - * @param menuId 菜单ID | ||
| 105 | - * @return 结果 | ||
| 106 | - */ | ||
| 107 | - public int deleteMenuById(Long menuId); | ||
| 108 | - | ||
| 109 | - /** | ||
| 110 | - * 校验菜单名称是否唯一 | ||
| 111 | - * | ||
| 112 | - * @param menuName 菜单名称 | ||
| 113 | - * @param parentId 父菜单ID | ||
| 114 | - * @return 结果 | ||
| 115 | - */ | ||
| 116 | - public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); | ||
| 117 | } | 69 | } |
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
| @@ -8,6 +8,7 @@ import java.util.LinkedList; | @@ -8,6 +8,7 @@ import java.util.LinkedList; | ||
| 8 | import java.util.List; | 8 | import java.util.List; |
| 9 | import java.util.Set; | 9 | import java.util.Set; |
| 10 | import java.util.stream.Collectors; | 10 | import java.util.stream.Collectors; |
| 11 | + | ||
| 11 | import org.springframework.beans.factory.annotation.Autowired; | 12 | import org.springframework.beans.factory.annotation.Autowired; |
| 12 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 13 | import com.ruoyi.common.constant.UserConstants; | 14 | import com.ruoyi.common.constant.UserConstants; |
| @@ -30,19 +31,9 @@ import com.ruoyi.system.service.ISysMenuService; | @@ -30,19 +31,9 @@ import com.ruoyi.system.service.ISysMenuService; | ||
| 30 | * @author ruoyi | 31 | * @author ruoyi |
| 31 | */ | 32 | */ |
| 32 | @Service | 33 | @Service |
| 33 | -public class SysMenuServiceImpl implements ISysMenuService | ||
| 34 | -{ | 34 | +public class SysMenuServiceImpl implements ISysMenuService { |
| 35 | public static final String PREMISSION_STRING = "perms[\"{0}\"]"; | 35 | public static final String PREMISSION_STRING = "perms[\"{0}\"]"; |
| 36 | 36 | ||
| 37 | - @Autowired | ||
| 38 | - private SysMenuMapper menuMapper; | ||
| 39 | - | ||
| 40 | - @Autowired | ||
| 41 | - private SysRoleMapper roleMapper; | ||
| 42 | - | ||
| 43 | - @Autowired | ||
| 44 | - private SysRoleMenuMapper roleMenuMapper; | ||
| 45 | - | ||
| 46 | /** | 37 | /** |
| 47 | * 根据用户查询系统菜单列表 | 38 | * 根据用户查询系统菜单列表 |
| 48 | * | 39 | * |
| @@ -50,8 +41,7 @@ public class SysMenuServiceImpl implements ISysMenuService | @@ -50,8 +41,7 @@ public class SysMenuServiceImpl implements ISysMenuService | ||
| 50 | * @return 菜单列表 | 41 | * @return 菜单列表 |
| 51 | */ | 42 | */ |
| 52 | @Override | 43 | @Override |
| 53 | - public List<SysMenu> selectMenuList(Long userId) | ||
| 54 | - { | 44 | + public List<SysMenu> selectMenuList(Long userId) { |
| 55 | return selectMenuList(new SysMenu(), userId); | 45 | return selectMenuList(new SysMenu(), userId); |
| 56 | } | 46 | } |
| 57 | 47 | ||
| @@ -62,16 +52,12 @@ public class SysMenuServiceImpl implements ISysMenuService | @@ -62,16 +52,12 @@ public class SysMenuServiceImpl implements ISysMenuService | ||
| 62 | * @return 菜单列表 | 52 | * @return 菜单列表 |
| 63 | */ | 53 | */ |
| 64 | @Override | 54 | @Override |
| 65 | - public List<SysMenu> selectMenuList(SysMenu menu, Long userId) | ||
| 66 | - { | 55 | + public List<SysMenu> selectMenuList(SysMenu menu, Long userId) { |
| 67 | List<SysMenu> menuList = null; | 56 | List<SysMenu> menuList = null; |
| 68 | // 管理员显示所有菜单信息 | 57 | // 管理员显示所有菜单信息 |
| 69 | - if (SysUser.isAdmin(userId)) | ||
| 70 | - { | 58 | + if (SysUser.isAdmin(userId)) { |
| 71 | menuList = menuMapper.selectMenuList(menu); | 59 | menuList = menuMapper.selectMenuList(menu); |
| 72 | - } | ||
| 73 | - else | ||
| 74 | - { | 60 | + } else { |
| 75 | menu.getParams().put("userId", userId); | 61 | menu.getParams().put("userId", userId); |
| 76 | menuList = menuMapper.selectMenuListByUserId(menu); | 62 | menuList = menuMapper.selectMenuListByUserId(menu); |
| 77 | } | 63 | } |
| @@ -85,14 +71,11 @@ public class SysMenuServiceImpl implements ISysMenuService | @@ -85,14 +71,11 @@ public class SysMenuServiceImpl implements ISysMenuService | ||
| 85 | * @return 权限列表 | 71 | * @return 权限列表 |
| 86 | */ | 72 | */ |
| 87 | @Override | 73 | @Override |
| 88 | - public Set<String> selectMenuPermsByUserId(Long userId) | ||
| 89 | - { | 74 | + public Set<String> selectMenuPermsByUserId(Long userId) { |
| 90 | List<String> perms = menuMapper.selectMenuPermsByUserId(userId); | 75 | List<String> perms = menuMapper.selectMenuPermsByUserId(userId); |
| 91 | Set<String> permsSet = new HashSet<>(); | 76 | Set<String> permsSet = new HashSet<>(); |
| 92 | - for (String perm : perms) | ||
| 93 | - { | ||
| 94 | - if (StringUtils.isNotEmpty(perm)) | ||
| 95 | - { | 77 | + for (String perm : perms) { |
| 78 | + if (StringUtils.isNotEmpty(perm)) { | ||
| 96 | permsSet.addAll(Arrays.asList(perm.trim().split(","))); | 79 | permsSet.addAll(Arrays.asList(perm.trim().split(","))); |
| 97 | } | 80 | } |
| 98 | } | 81 | } |
| @@ -106,15 +89,11 @@ public class SysMenuServiceImpl implements ISysMenuService | @@ -106,15 +89,11 @@ public class SysMenuServiceImpl implements ISysMenuService | ||
| 106 | * @return 菜单列表 | 89 | * @return 菜单列表 |
| 107 | */ | 90 | */ |
| 108 | @Override | 91 | @Override |
| 109 | - public List<SysMenu> selectMenuTreeByUserId(Long userId) | ||
| 110 | - { | 92 | + public List<SysMenu> selectMenuTreeByUserId(Long userId) { |
| 111 | List<SysMenu> menus = null; | 93 | List<SysMenu> menus = null; |
| 112 | - if (SecurityUtils.isAdmin(userId)) | ||
| 113 | - { | 94 | + if (SecurityUtils.isAdmin(userId)) { |
| 114 | menus = menuMapper.selectMenuTreeAll(); | 95 | menus = menuMapper.selectMenuTreeAll(); |
| 115 | - } | ||
| 116 | - else | ||
| 117 | - { | 96 | + } else { |
| 118 | menus = menuMapper.selectMenuTreeByUserId(userId); | 97 | menus = menuMapper.selectMenuTreeByUserId(userId); |
| 119 | } | 98 | } |
| 120 | return getChildPerms(menus, 0); | 99 | return getChildPerms(menus, 0); |
| @@ -127,8 +106,7 @@ public class SysMenuServiceImpl implements ISysMenuService | @@ -127,8 +106,7 @@ public class SysMenuServiceImpl implements ISysMenuService | ||
| 127 | * @return 选中菜单列表 | 106 | * @return 选中菜单列表 |
| 128 | */ | 107 | */ |
| 129 | @Override | 108 | @Override |
| 130 | - public List<Integer> selectMenuListByRoleId(Long roleId) | ||
| 131 | - { | 109 | + public List<Integer> selectMenuListByRoleId(Long roleId) { |
| 132 | SysRole role = roleMapper.selectRoleById(roleId); | 110 | SysRole role = roleMapper.selectRoleById(roleId); |
| 133 | return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); | 111 | return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); |
| 134 | } | 112 | } |
| @@ -140,102 +118,22 @@ public class SysMenuServiceImpl implements ISysMenuService | @@ -140,102 +118,22 @@ public class SysMenuServiceImpl implements ISysMenuService | ||
| 140 | * @return 下拉树结构列表 | 118 | * @return 下拉树结构列表 |
| 141 | */ | 119 | */ |
| 142 | @Override | 120 | @Override |
| 143 | - public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) | ||
| 144 | - { | 121 | + public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) { |
| 145 | List<SysMenu> menuTrees = buildMenuTree(menus); | 122 | List<SysMenu> menuTrees = buildMenuTree(menus); |
| 146 | return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); | 123 | return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); |
| 147 | } | 124 | } |
| 148 | 125 | ||
| 149 | /** | 126 | /** |
| 150 | - * 根据菜单ID查询信息 | ||
| 151 | - * | ||
| 152 | - * @param menuId 菜单ID | ||
| 153 | - * @return 菜单信息 | ||
| 154 | - */ | ||
| 155 | - @Override | ||
| 156 | - public SysMenu selectMenuById(Long menuId) | ||
| 157 | - { | ||
| 158 | - return menuMapper.selectMenuById(menuId); | ||
| 159 | - } | ||
| 160 | - | ||
| 161 | - /** | ||
| 162 | - * 是否存在菜单子节点 | ||
| 163 | - * | ||
| 164 | - * @param menuId 菜单ID | ||
| 165 | - * @return 结果 | ||
| 166 | - */ | ||
| 167 | - @Override | ||
| 168 | - public boolean hasChildByMenuId(Long menuId) | ||
| 169 | - { | ||
| 170 | - int result = menuMapper.hasChildByMenuId(menuId); | ||
| 171 | - return result > 0 ? true : false; | ||
| 172 | - } | ||
| 173 | - | ||
| 174 | - /** | ||
| 175 | * 查询菜单使用数量 | 127 | * 查询菜单使用数量 |
| 176 | * | 128 | * |
| 177 | * @param menuId 菜单ID | 129 | * @param menuId 菜单ID |
| 178 | * @return 结果 | 130 | * @return 结果 |
| 179 | */ | 131 | */ |
| 180 | @Override | 132 | @Override |
| 181 | - public boolean checkMenuExistRole(Long menuId) | ||
| 182 | - { | 133 | + public boolean checkMenuExistRole(Long menuId) { |
| 183 | int result = roleMenuMapper.checkMenuExistRole(menuId); | 134 | int result = roleMenuMapper.checkMenuExistRole(menuId); |
| 184 | return result > 0 ? true : false; | 135 | return result > 0 ? true : false; |
| 185 | } | 136 | } |
| 186 | 137 | ||
| 187 | - /** | ||
| 188 | - * 新增保存菜单信息 | ||
| 189 | - * | ||
| 190 | - * @param menu 菜单信息 | ||
| 191 | - * @return 结果 | ||
| 192 | - */ | ||
| 193 | - @Override | ||
| 194 | - public int insertMenu(SysMenu menu) | ||
| 195 | - { | ||
| 196 | - return menuMapper.insertMenu(menu); | ||
| 197 | - } | ||
| 198 | - | ||
| 199 | - /** | ||
| 200 | - * 修改保存菜单信息 | ||
| 201 | - * | ||
| 202 | - * @param menu 菜单信息 | ||
| 203 | - * @return 结果 | ||
| 204 | - */ | ||
| 205 | - @Override | ||
| 206 | - public int updateMenu(SysMenu menu) | ||
| 207 | - { | ||
| 208 | - return menuMapper.updateMenu(menu); | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - /** | ||
| 212 | - * 删除菜单管理信息 | ||
| 213 | - * | ||
| 214 | - * @param menuId 菜单ID | ||
| 215 | - * @return 结果 | ||
| 216 | - */ | ||
| 217 | - @Override | ||
| 218 | - public int deleteMenuById(Long menuId) | ||
| 219 | - { | ||
| 220 | - return menuMapper.deleteMenuById(menuId); | ||
| 221 | - } | ||
| 222 | - | ||
| 223 | - /** | ||
| 224 | - * 校验菜单名称是否唯一 | ||
| 225 | - * | ||
| 226 | - * @param menu 菜单信息 | ||
| 227 | - * @return 结果 | ||
| 228 | - */ | ||
| 229 | - @Override | ||
| 230 | - public String checkMenuNameUnique(SysMenu menu) | ||
| 231 | - { | ||
| 232 | - Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); | ||
| 233 | - SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); | ||
| 234 | - if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) | ||
| 235 | - { | ||
| 236 | - return UserConstants.NOT_UNIQUE; | ||
| 237 | - } | ||
| 238 | - return UserConstants.UNIQUE; | ||
| 239 | - } | ||
| 240 | 138 | ||
| 241 | } | 139 | } |
ruoyi-ui/src/utils/dict.js
| @@ -7,7 +7,7 @@ import store from '@/store' | @@ -7,7 +7,7 @@ import store from '@/store' | ||
| 7 | 7 | ||
| 8 | export const DICT_TYPE = { | 8 | export const DICT_TYPE = { |
| 9 | SYS_COMMON_STATUS: 'sys_common_status', | 9 | SYS_COMMON_STATUS: 'sys_common_status', |
| 10 | - SYS_MENU_TYPE: 'menu_type' | 10 | + SYS_MENU_TYPE: 'sys_menu_type' |
| 11 | } | 11 | } |
| 12 | 12 | ||
| 13 | /** | 13 | /** |
ruoyi-ui/src/views/system/menu/index.vue
| @@ -13,10 +13,10 @@ | @@ -13,10 +13,10 @@ | ||
| 13 | <el-form-item label="状态" prop="status"> | 13 | <el-form-item label="状态" prop="status"> |
| 14 | <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small"> | 14 | <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small"> |
| 15 | <el-option | 15 | <el-option |
| 16 | - v-for="dict in statusOptions" | ||
| 17 | - :key="dict.dictValue" | ||
| 18 | - :label="dict.dictLabel" | ||
| 19 | - :value="dict.dictValue" | 16 | + v-for="dict in statusDictDatas" |
| 17 | + :key="dict.value" | ||
| 18 | + :label="dict.label" | ||
| 19 | + :value="dict.value" | ||
| 20 | /> | 20 | /> |
| 21 | </el-select> | 21 | </el-select> |
| 22 | </el-form-item> | 22 | </el-form-item> |
| @@ -106,8 +106,8 @@ | @@ -106,8 +106,8 @@ | ||
| 106 | <el-radio-group v-model="form.type"> | 106 | <el-radio-group v-model="form.type"> |
| 107 | <el-radio | 107 | <el-radio |
| 108 | v-for="dict in menuTypeDictDatas" | 108 | v-for="dict in menuTypeDictDatas" |
| 109 | - :key="dict.value" | ||
| 110 | - :label="dict.value" | 109 | + :key="parseInt(dict.value)" |
| 110 | + :label="parseInt(dict.value)" | ||
| 111 | >{{dict.label}}</el-radio> | 111 | >{{dict.label}}</el-radio> |
| 112 | </el-radio-group> | 112 | </el-radio-group> |
| 113 | </el-form-item> | 113 | </el-form-item> |
| @@ -165,7 +165,7 @@ | @@ -165,7 +165,7 @@ | ||
| 165 | <el-radio | 165 | <el-radio |
| 166 | v-for="dict in statusDictDatas" | 166 | v-for="dict in statusDictDatas" |
| 167 | :key="dict.value" | 167 | :key="dict.value" |
| 168 | - :label="dict.value" | 168 | + :label="parseInt(dict.value)" |
| 169 | >{{dict.label}}</el-radio> | 169 | >{{dict.label}}</el-radio> |
| 170 | </el-radio-group> | 170 | </el-radio-group> |
| 171 | </el-form-item> | 171 | </el-form-item> |
| @@ -206,8 +206,6 @@ export default { | @@ -206,8 +206,6 @@ export default { | ||
| 206 | title: "", | 206 | title: "", |
| 207 | // 是否显示弹出层 | 207 | // 是否显示弹出层 |
| 208 | open: false, | 208 | open: false, |
| 209 | - // 菜单状态数据字典 | ||
| 210 | - statusOptions: [], | ||
| 211 | // 查询参数 | 209 | // 查询参数 |
| 212 | queryParams: { | 210 | queryParams: { |
| 213 | name: undefined, | 211 | name: undefined, |
| @@ -288,9 +286,9 @@ export default { | @@ -288,9 +286,9 @@ export default { | ||
| 288 | parentId: 0, | 286 | parentId: 0, |
| 289 | name: undefined, | 287 | name: undefined, |
| 290 | icon: undefined, | 288 | icon: undefined, |
| 291 | - type: "1", | 289 | + type: SysMenuTypeEnum.DIR, |
| 292 | sort: undefined, | 290 | sort: undefined, |
| 293 | - status: "0" | 291 | + status: SysCommonStatusEnum.ENABLE |
| 294 | }; | 292 | }; |
| 295 | this.resetForm("form"); | 293 | this.resetForm("form"); |
| 296 | }, | 294 | }, |
| @@ -329,17 +327,18 @@ export default { | @@ -329,17 +327,18 @@ export default { | ||
| 329 | submitForm: function() { | 327 | submitForm: function() { |
| 330 | this.$refs["form"].validate(valid => { | 328 | this.$refs["form"].validate(valid => { |
| 331 | if (valid) { | 329 | if (valid) { |
| 332 | - // 若权限类型为菜单时,进行 route 的校验,避免后续拼接出来的路由无法跳转 | ||
| 333 | - if (this.form.type === ResourceTypeEnum.MENU) { | 330 | + // 若权限类型为目录或者菜单时,进行 path 的校验,避免后续拼接出来的路由无法跳转 |
| 331 | + if (this.form.type === SysMenuTypeEnum.DIR | ||
| 332 | + || this.form.type === SysMenuTypeEnum.MENU) { | ||
| 334 | // 如果是外链,则不进行校验 | 333 | // 如果是外链,则不进行校验 |
| 335 | - const route = this.resourceForm.route | ||
| 336 | - if (route.indexOf('http://') === -1 || route.indexOf('https://') === -1) { | ||
| 337 | - // 父权限为根节点,route 必须以 / 开头 | ||
| 338 | - if (this.resourceForm.pid === 0 && route.charAt(0) !== '/') { | ||
| 339 | - this.messageSuccess('前端必须以 / 开头') | 334 | + const path = this.form.path |
| 335 | + if (path.indexOf('http://') === -1 || path.indexOf('https://') === -1) { | ||
| 336 | + // 父权限为根节点,path 必须以 / 开头 | ||
| 337 | + if (this.form.parentId === 0 && path.charAt(0) !== '/') { | ||
| 338 | + this.msgSuccess('前端必须以 / 开头') | ||
| 340 | return | 339 | return |
| 341 | - } else if (this.resourceForm.pid !== 0 && route.charAt(0) === '/') { | ||
| 342 | - this.messageSuccess('前端不能以 / 开头') | 340 | + } else if (this.form.parentId !== 0 && path.charAt(0) === '/') { |
| 341 | + this.msgSuccess('前端不能以 / 开头') | ||
| 343 | return | 342 | return |
| 344 | } | 343 | } |
| 345 | } | 344 | } |
src/main/java/cn/iocoder/dashboard/framework/mybatis/core/BaseDO.java renamed to src/main/java/cn/iocoder/dashboard/framework/mybatis/core/dataobject/BaseDO.java
src/main/java/cn/iocoder/dashboard/framework/mybatis/core/query/QueryWrapperX.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.framework.mybatis.core.query; | ||
| 2 | + | ||
| 3 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 4 | +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; | ||
| 5 | +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | ||
| 6 | +import org.springframework.util.StringUtils; | ||
| 7 | + | ||
| 8 | +import java.util.Collection; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: | ||
| 12 | + * | ||
| 13 | + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 | ||
| 14 | + * | ||
| 15 | + * @param <T> 数据类型 | ||
| 16 | + */ | ||
| 17 | +public class QueryWrapperX<T> extends QueryWrapper<T> { | ||
| 18 | + | ||
| 19 | + public QueryWrapperX<T> likeIfPresent(String column, String val) { | ||
| 20 | + if (StringUtils.hasText(val)) { | ||
| 21 | + return (QueryWrapperX<T>) super.like(column, val); | ||
| 22 | + } | ||
| 23 | + return this; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public QueryWrapperX<T> inIfPresent(String column, Collection<?> values) { | ||
| 27 | + if (!CollectionUtils.isEmpty(values)) { | ||
| 28 | + return (QueryWrapperX<T>) super.in(column, values); | ||
| 29 | + } | ||
| 30 | + return this; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + public QueryWrapperX<T> inIfPresent(String column, Object... values) { | ||
| 34 | + if (!ArrayUtils.isEmpty(values)) { | ||
| 35 | + return (QueryWrapperX<T>) super.in(column, values); | ||
| 36 | + } | ||
| 37 | + return this; | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + public QueryWrapperX<T> eqIfPresent(String column, Object val) { | ||
| 41 | + if (val != null) { | ||
| 42 | + return (QueryWrapperX<T>) super.eq(column, val); | ||
| 43 | + } | ||
| 44 | + return this; | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + public QueryWrapperX<T> gtIfPresent(String column, Object val) { | ||
| 48 | + if (val != null) { | ||
| 49 | + return (QueryWrapperX<T>) super.gt(column, val); | ||
| 50 | + } | ||
| 51 | + return this; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + public QueryWrapperX<T> betweenIfPresent(String column, Object val1, Object val2) { | ||
| 55 | + if (val1 != null && val2 != null) { | ||
| 56 | + return (QueryWrapperX<T>) super.between(column, val1, val2); | ||
| 57 | + } | ||
| 58 | + if (val1 != null) { | ||
| 59 | + return (QueryWrapperX<T>) ge(column, val1); | ||
| 60 | + } | ||
| 61 | + if (val2 != null) { | ||
| 62 | + return (QueryWrapperX<T>) le(column, val2); | ||
| 63 | + } | ||
| 64 | + return this; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + // ========== 重写父类方法,方便链式调用 ========== | ||
| 68 | + | ||
| 69 | + @Override | ||
| 70 | + public QueryWrapperX<T> eq(boolean condition, String column, Object val) { | ||
| 71 | + super.eq(condition, column, val); | ||
| 72 | + return this; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + @Override | ||
| 76 | + public QueryWrapperX<T> eq(String column, Object val) { | ||
| 77 | + super.eq(column, val); | ||
| 78 | + return this; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + @Override | ||
| 82 | + public QueryWrapperX<T> orderByDesc(String column) { | ||
| 83 | + super.orderByDesc(true, column); | ||
| 84 | + return this; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + @Override | ||
| 88 | + public QueryWrapperX<T> last(String lastSql) { | ||
| 89 | + super.last(lastSql); | ||
| 90 | + return this; | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | +} |
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java
| 1 | package cn.iocoder.dashboard.modules.system.controller.auth; | 1 | package cn.iocoder.dashboard.modules.system.controller.auth; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | ||
| 3 | import cn.iocoder.dashboard.common.pojo.CommonResult; | 4 | import cn.iocoder.dashboard.common.pojo.CommonResult; |
| 4 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; | 5 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; |
| 5 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO; | 6 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO; |
| 6 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO; | 7 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO; |
| 7 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO; | 8 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO; |
| 9 | +import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; | ||
| 10 | +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; | ||
| 11 | +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; | ||
| 12 | +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | ||
| 13 | +import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; | ||
| 8 | import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; | 14 | import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; |
| 15 | +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; | ||
| 16 | +import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; | ||
| 17 | +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; | ||
| 18 | +import cn.iocoder.dashboard.util.collection.SetUtils; | ||
| 9 | import io.swagger.annotations.Api; | 19 | import io.swagger.annotations.Api; |
| 10 | import io.swagger.annotations.ApiOperation; | 20 | import io.swagger.annotations.ApiOperation; |
| 11 | import org.springframework.web.bind.annotation.*; | 21 | import org.springframework.web.bind.annotation.*; |
| @@ -26,6 +36,12 @@ public class SysAuthController { | @@ -26,6 +36,12 @@ public class SysAuthController { | ||
| 26 | 36 | ||
| 27 | @Resource | 37 | @Resource |
| 28 | private SysAuthService authService; | 38 | private SysAuthService authService; |
| 39 | + @Resource | ||
| 40 | + private SysUserService userService; | ||
| 41 | + @Resource | ||
| 42 | + private SysRoleService roleService; | ||
| 43 | + @Resource | ||
| 44 | + private SysPermissionService permissionService; | ||
| 29 | 45 | ||
| 30 | @ApiOperation("使用账号密码登录") | 46 | @ApiOperation("使用账号密码登录") |
| 31 | @PostMapping("/login") | 47 | @PostMapping("/login") |
| @@ -38,15 +54,30 @@ public class SysAuthController { | @@ -38,15 +54,30 @@ public class SysAuthController { | ||
| 38 | @ApiOperation("获取登陆用户的权限信息") | 54 | @ApiOperation("获取登陆用户的权限信息") |
| 39 | @GetMapping("/get-permission-info") | 55 | @GetMapping("/get-permission-info") |
| 40 | public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() { | 56 | public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() { |
| 41 | - SysAuthPermissionInfoRespVO respVO = authService.getPermissionInfo(getLoginUserId(), getLoginUserRoleIds()); | ||
| 42 | - return success(respVO); | 57 | + // 获得用户信息 |
| 58 | + SysUserDO user = userService.getUser(getLoginUserId()); | ||
| 59 | + if (user == null) { | ||
| 60 | + return null; | ||
| 61 | + } | ||
| 62 | + // 获得角色列表 | ||
| 63 | + List<SysRoleDO> roleList = roleService.listRolesFromCache(getLoginUserRoleIds()); | ||
| 64 | + // 获得菜单列表 | ||
| 65 | + List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(), | ||
| 66 | + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), | ||
| 67 | + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); | ||
| 68 | + // 拼接结果返回 | ||
| 69 | + return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList)); | ||
| 43 | } | 70 | } |
| 44 | 71 | ||
| 45 | @ApiOperation("获得登陆用户的菜单列表") | 72 | @ApiOperation("获得登陆用户的菜单列表") |
| 46 | @GetMapping("list-menus") | 73 | @GetMapping("list-menus") |
| 47 | public CommonResult<List<SysAuthMenuRespVO>> listMenus() { | 74 | public CommonResult<List<SysAuthMenuRespVO>> listMenus() { |
| 48 | - List<SysAuthMenuRespVO> respVOList = authService.listMenus(getLoginUserId(), getLoginUserRoleIds()); | ||
| 49 | - return success(respVOList); | 75 | + // 获得用户拥有的菜单列表 |
| 76 | + List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(), | ||
| 77 | + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 | ||
| 78 | + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 | ||
| 79 | + // 转换成 Tree 结构返回 | ||
| 80 | + return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList)); | ||
| 50 | } | 81 | } |
| 51 | 82 | ||
| 52 | } | 83 | } |
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java
| @@ -84,8 +84,8 @@ public class SysMenuController { | @@ -84,8 +84,8 @@ public class SysMenuController { | ||
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | @ApiOperation("删除菜单") | 86 | @ApiOperation("删除菜单") |
| 87 | + @PostMapping("/delete") | ||
| 87 | // @Log(title = "菜单管理", businessType = BusinessType.DELETE) | 88 | // @Log(title = "菜单管理", businessType = BusinessType.DELETE) |
| 88 | -// @DeleteMapping("/{menuId}") | ||
| 89 | public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) { | 89 | public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) { |
| 90 | menuService.deleteMenu(id); | 90 | menuService.deleteMenu(id); |
| 91 | return success(true); | 91 | return success(true); |
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/SysMenuBaseVO.java
| @@ -24,7 +24,7 @@ public class SysMenuBaseVO { | @@ -24,7 +24,7 @@ public class SysMenuBaseVO { | ||
| 24 | private String permission; | 24 | private String permission; |
| 25 | 25 | ||
| 26 | @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类") | 26 | @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类") |
| 27 | - @NotBlank(message = "菜单类型不能为空") | 27 | + @NotNull(message = "菜单类型不能为空") |
| 28 | private Integer type; | 28 | private Integer type; |
| 29 | 29 | ||
| 30 | @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") | 30 | @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") |
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/SysMenuListReqVO.java
| @@ -2,17 +2,14 @@ package cn.iocoder.dashboard.modules.system.controller.permission.vo; | @@ -2,17 +2,14 @@ package cn.iocoder.dashboard.modules.system.controller.permission.vo; | ||
| 2 | 2 | ||
| 3 | import io.swagger.annotations.ApiModel; | 3 | import io.swagger.annotations.ApiModel; |
| 4 | import io.swagger.annotations.ApiModelProperty; | 4 | import io.swagger.annotations.ApiModelProperty; |
| 5 | -import lombok.AllArgsConstructor; | ||
| 6 | -import lombok.Builder; | ||
| 7 | import lombok.Data; | 5 | import lombok.Data; |
| 8 | -import lombok.NoArgsConstructor; | ||
| 9 | 6 | ||
| 10 | @ApiModel("菜单列表 Request VO") | 7 | @ApiModel("菜单列表 Request VO") |
| 11 | @Data | 8 | @Data |
| 12 | public class SysMenuListReqVO { | 9 | public class SysMenuListReqVO { |
| 13 | 10 | ||
| 14 | @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") | 11 | @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") |
| 15 | - private String menuName; | 12 | + private String name; |
| 16 | 13 | ||
| 17 | @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") | 14 | @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") |
| 18 | private Integer status; | 15 | private Integer status; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysMenuMapper.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; | ||
| 4 | +import cn.iocoder.dashboard.modules.system.controller.permission.vo.SysMenuListReqVO; | ||
| 3 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; | 5 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; |
| 4 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 6 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 7 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| 6 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 9 | ||
| 10 | +import java.util.List; | ||
| 11 | + | ||
| 8 | @Mapper | 12 | @Mapper |
| 9 | public interface SysMenuMapper extends BaseMapper<SysMenuDO> { | 13 | public interface SysMenuMapper extends BaseMapper<SysMenuDO> { |
| 10 | 14 | ||
| @@ -17,4 +21,13 @@ public interface SysMenuMapper extends BaseMapper<SysMenuDO> { | @@ -17,4 +21,13 @@ public interface SysMenuMapper extends BaseMapper<SysMenuDO> { | ||
| 17 | return selectCount(new QueryWrapper<SysMenuDO>().eq("parent_id", parentId)); | 21 | return selectCount(new QueryWrapper<SysMenuDO>().eq("parent_id", parentId)); |
| 18 | } | 22 | } |
| 19 | 23 | ||
| 24 | + default List<SysMenuDO> selectList(SysMenuListReqVO reqVO) { | ||
| 25 | + return selectList(new QueryWrapperX<SysMenuDO>().likeIfPresent("name", reqVO.getName()) | ||
| 26 | + .eqIfPresent("status", reqVO.getStatus())); | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + default List<SysMenuDO> selectList() { | ||
| 30 | + return selectList(new QueryWrapper<>()); | ||
| 31 | + } | ||
| 32 | + | ||
| 20 | } | 33 | } |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dept/SysDept.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 3 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 4 | 4 | ||
| 5 | import javax.validation.constraints.Email; | 5 | import javax.validation.constraints.Email; |
| 6 | import javax.validation.constraints.NotBlank; | 6 | import javax.validation.constraints.NotBlank; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictDataDO.java
| @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict; | @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; |
| 4 | import cn.iocoder.dashboard.framework.excel.Excel; | 4 | import cn.iocoder.dashboard.framework.excel.Excel; |
| 5 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 5 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| 7 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| 8 | import lombok.Data; | 8 | import lombok.Data; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictTypeDO.java
| @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict; | @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; |
| 4 | import cn.iocoder.dashboard.framework.excel.Excel; | 4 | import cn.iocoder.dashboard.framework.excel.Excel; |
| 5 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 5 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 6 | import com.baomidou.mybatisplus.annotation.TableField; | 6 | import com.baomidou.mybatisplus.annotation.TableField; |
| 7 | import com.baomidou.mybatisplus.annotation.TableId; | 7 | import com.baomidou.mybatisplus.annotation.TableId; |
| 8 | import com.baomidou.mybatisplus.annotation.TableName; | 8 | import com.baomidou.mybatisplus.annotation.TableName; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysMenuDO.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; |
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; |
| 4 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 4 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 5 | import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; | 5 | import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; |
| 6 | import com.baomidou.mybatisplus.annotation.TableField; | 6 | import com.baomidou.mybatisplus.annotation.TableField; |
| 7 | import com.baomidou.mybatisplus.annotation.TableId; | 7 | import com.baomidou.mybatisplus.annotation.TableId; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; |
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.framework.excel.Excel; | 3 | import cn.iocoder.dashboard.framework.excel.Excel; |
| 4 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 4 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 5 | import com.baomidou.mybatisplus.annotation.TableField; | 5 | import com.baomidou.mybatisplus.annotation.TableField; |
| 6 | import com.baomidou.mybatisplus.annotation.TableId; | 6 | import com.baomidou.mybatisplus.annotation.TableId; |
| 7 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDeptDO.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 3 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 4 | import com.baomidou.mybatisplus.annotation.TableId; | 4 | import com.baomidou.mybatisplus.annotation.TableId; |
| 5 | import com.baomidou.mybatisplus.annotation.TableName; | 5 | import com.baomidou.mybatisplus.annotation.TableName; |
| 6 | import lombok.Data; | 6 | import lombok.Data; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleMenuDO.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 3 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 4 | import com.baomidou.mybatisplus.annotation.TableId; | 4 | import com.baomidou.mybatisplus.annotation.TableId; |
| 5 | import com.baomidou.mybatisplus.annotation.TableName; | 5 | import com.baomidou.mybatisplus.annotation.TableName; |
| 6 | import lombok.Data; | 6 | import lombok.Data; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysUserRoleDO.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 3 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 4 | import com.baomidou.mybatisplus.annotation.TableId; | 4 | import com.baomidou.mybatisplus.annotation.TableId; |
| 5 | import com.baomidou.mybatisplus.annotation.TableName; | 5 | import com.baomidou.mybatisplus.annotation.TableName; |
| 6 | import lombok.Data; | 6 | import lombok.Data; |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java
| @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user; | @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.framework.excel.Excel; | 3 | import cn.iocoder.dashboard.framework.excel.Excel; |
| 4 | import cn.iocoder.dashboard.framework.excel.Excels; | 4 | import cn.iocoder.dashboard.framework.excel.Excels; |
| 5 | -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO; | 5 | +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 6 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDept; | 6 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDept; |
| 7 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; | 7 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; |
| 8 | import com.baomidou.mybatisplus.annotation.TableField; | 8 | import com.baomidou.mybatisplus.annotation.TableField; |
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
| @@ -24,6 +24,6 @@ public interface SysErrorCodeConstants { | @@ -24,6 +24,6 @@ public interface SysErrorCodeConstants { | ||
| 24 | ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单"); | 24 | ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单"); |
| 25 | ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在"); | 25 | ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在"); |
| 26 | ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除"); | 26 | ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除"); |
| 27 | - ErrorCode MENU_PARENT_NOT_MENU = new ErrorCode(1002002005, "父菜单的类型必须是菜单"); | 27 | + ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单"); |
| 28 | 28 | ||
| 29 | } | 29 | } |
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java
| 1 | package cn.iocoder.dashboard.modules.system.service.auth; | 1 | package cn.iocoder.dashboard.modules.system.service.auth; |
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.framework.security.core.service.SecurityFrameworkService; | 3 | import cn.iocoder.dashboard.framework.security.core.service.SecurityFrameworkService; |
| 4 | -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO; | ||
| 5 | -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; | ||
| 6 | - | ||
| 7 | -import java.util.List; | ||
| 8 | -import java.util.Set; | ||
| 9 | 4 | ||
| 10 | /** | 5 | /** |
| 11 | * 认证 Service 接口 | 6 | * 认证 Service 接口 |
| @@ -18,28 +13,4 @@ public interface SysAuthService extends SecurityFrameworkService { | @@ -18,28 +13,4 @@ public interface SysAuthService extends SecurityFrameworkService { | ||
| 18 | 13 | ||
| 19 | String login(String username, String password, String captchaUUID, String captchaCode); | 14 | String login(String username, String password, String captchaUUID, String captchaCode); |
| 20 | 15 | ||
| 21 | - /** | ||
| 22 | - * 获得用户的基本信息 | ||
| 23 | - * | ||
| 24 | - * 这里传输 roleIds 参数的原因,是该参数是从 LoginUser 缓存中获取到的,而我们校验权限时也是从 LoginUser 缓存中获取 roleIds | ||
| 25 | - * 通过这样的方式,保持一致 | ||
| 26 | - * | ||
| 27 | - * @param userId 用户编号 | ||
| 28 | - * @param roleIds 用户拥有的角色编号数组 | ||
| 29 | - * @return 用户的信息,包括角色权限和菜单权限 | ||
| 30 | - */ | ||
| 31 | - SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds); | ||
| 32 | - | ||
| 33 | - /** | ||
| 34 | - * 获得用户的菜单 Vue 路由 | ||
| 35 | - * | ||
| 36 | - * 这里传输 roleIds 参数的原因,是该参数是从 LoginUser 缓存中获取到的,而我们校验权限时也是从 LoginUser 缓存中获取 roleIds | ||
| 37 | - * 通过这样的方式,保持一致 | ||
| 38 | - * | ||
| 39 | - * @param userId 用户编号 | ||
| 40 | - * @param roleIds 用户拥有的角色编号数组 | ||
| 41 | - * @return 菜单 Vue 路由 | ||
| 42 | - */ | ||
| 43 | - List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds); | ||
| 44 | - | ||
| 45 | } | 16 | } |
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
| @@ -226,31 +226,4 @@ public class SysAuthServiceImpl implements SysAuthService { | @@ -226,31 +226,4 @@ public class SysAuthServiceImpl implements SysAuthService { | ||
| 226 | loginUserRedisDAO.set(sessionId, loginUser); | 226 | loginUserRedisDAO.set(sessionId, loginUser); |
| 227 | } | 227 | } |
| 228 | 228 | ||
| 229 | - @Override | ||
| 230 | - public SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds) { | ||
| 231 | - // 获得用户信息 | ||
| 232 | - SysUserDO user = userService.getUser(userId); | ||
| 233 | - if (user == null) { | ||
| 234 | - return null; | ||
| 235 | - } | ||
| 236 | - // 获得角色列表 | ||
| 237 | - List<SysRoleDO> roleList = roleService.listRolesFromCache(roleIds); | ||
| 238 | - // 获得菜单列表 | ||
| 239 | - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds, | ||
| 240 | - SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), | ||
| 241 | - SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); | ||
| 242 | - // 拼接结果返回 | ||
| 243 | - return SysAuthConvert.INSTANCE.convert(user, roleList, menuList); | ||
| 244 | - } | ||
| 245 | - | ||
| 246 | - @Override | ||
| 247 | - public List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds) { | ||
| 248 | - // 获得用户拥有的菜单列表 | ||
| 249 | - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds, | ||
| 250 | - SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 | ||
| 251 | - SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 | ||
| 252 | - // 转换成 Tree 结构返回 | ||
| 253 | - return SysAuthConvert.INSTANCE.buildMenuTree(menuList); | ||
| 254 | - } | ||
| 255 | - | ||
| 256 | } | 229 | } |
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
| @@ -65,7 +65,7 @@ public class SysMenuServiceImpl implements SysMenuService { | @@ -65,7 +65,7 @@ public class SysMenuServiceImpl implements SysMenuService { | ||
| 65 | @Override | 65 | @Override |
| 66 | @PostConstruct | 66 | @PostConstruct |
| 67 | public void init() { | 67 | public void init() { |
| 68 | - List<SysMenuDO> menuList = menuMapper.selectList(null); | 68 | + List<SysMenuDO> menuList = menuMapper.selectList(); |
| 69 | ImmutableMap.Builder<Long, SysMenuDO> menuCacheBuilder = ImmutableMap.builder(); | 69 | ImmutableMap.Builder<Long, SysMenuDO> menuCacheBuilder = ImmutableMap.builder(); |
| 70 | ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder(); | 70 | ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder(); |
| 71 | menuList.forEach(menuDO -> { | 71 | menuList.forEach(menuDO -> { |
| @@ -79,7 +79,7 @@ public class SysMenuServiceImpl implements SysMenuService { | @@ -79,7 +79,7 @@ public class SysMenuServiceImpl implements SysMenuService { | ||
| 79 | 79 | ||
| 80 | @Override | 80 | @Override |
| 81 | public List<SysMenuRespVO> listMenus(SysMenuListReqVO reqVO) { | 81 | public List<SysMenuRespVO> listMenus(SysMenuListReqVO reqVO) { |
| 82 | - List<SysMenuDO> list = menuMapper.selectList(null); | 82 | + List<SysMenuDO> list = menuMapper.selectList(reqVO); |
| 83 | // TODO 排序 | 83 | // TODO 排序 |
| 84 | return SysMenuConvert.INSTANCE.convertList(list); | 84 | return SysMenuConvert.INSTANCE.convertList(list); |
| 85 | } | 85 | } |
| @@ -240,9 +240,10 @@ public class SysMenuServiceImpl implements SysMenuService { | @@ -240,9 +240,10 @@ public class SysMenuServiceImpl implements SysMenuService { | ||
| 240 | if (menu == null) { | 240 | if (menu == null) { |
| 241 | throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); | 241 | throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); |
| 242 | } | 242 | } |
| 243 | - // 父菜单必须是目录类型 | ||
| 244 | - if (!MenuTypeEnum.DIR.getType().equals(menu.getType())) { | ||
| 245 | - throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_MENU); | 243 | + // 父菜单必须是目录或者菜单类型 |
| 244 | + if (!MenuTypeEnum.DIR.getType().equals(menu.getType()) | ||
| 245 | + && !MenuTypeEnum.MENU.getType().equals(menu.getType())) { | ||
| 246 | + throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_DIR_OR_MENU); | ||
| 246 | } | 247 | } |
| 247 | } | 248 | } |
| 248 | 249 |
src/main/resources/application.yaml
| @@ -38,3 +38,15 @@ yudao: | @@ -38,3 +38,15 @@ yudao: | ||
| 38 | timeout: 5m | 38 | timeout: 5m |
| 39 | width: 160 | 39 | width: 160 |
| 40 | height: 60 | 40 | height: 60 |
| 41 | + | ||
| 42 | +# MyBatis Plus 的配置项 | ||
| 43 | +mybatis-plus: | ||
| 44 | + configuration: | ||
| 45 | + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 | ||
| 46 | + global-config: | ||
| 47 | + db-config: | ||
| 48 | + id-type: auto # 自增 ID | ||
| 49 | + logic-delete-value: 1 # 逻辑已删除值(默认为 1) | ||
| 50 | + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) | ||
| 51 | + mapper-locations: classpath*:mapper/*.xml | ||
| 52 | + type-aliases-package: cn.iocoder.dashboard.modules.*.dal.mysql.dataobject |