Commit c9372b0a5c30bf300fe5d0f48d9ba241179498b4
1 parent
823c26a5
修改 get-routers 接口的相关方法,简单完成
Showing
10 changed files
with
310 additions
and
427 deletions
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
| ... | ... | @@ -26,7 +26,7 @@ import com.ruoyi.system.service.ISysMenuService; |
| 26 | 26 | |
| 27 | 27 | /** |
| 28 | 28 | * 菜单 业务层处理 |
| 29 | - * | |
| 29 | + * | |
| 30 | 30 | * @author ruoyi |
| 31 | 31 | */ |
| 32 | 32 | @Service |
| ... | ... | @@ -45,7 +45,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 45 | 45 | |
| 46 | 46 | /** |
| 47 | 47 | * 根据用户查询系统菜单列表 |
| 48 | - * | |
| 48 | + * | |
| 49 | 49 | * @param userId 用户ID |
| 50 | 50 | * @return 菜单列表 |
| 51 | 51 | */ |
| ... | ... | @@ -57,7 +57,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 57 | 57 | |
| 58 | 58 | /** |
| 59 | 59 | * 查询系统菜单列表 |
| 60 | - * | |
| 60 | + * | |
| 61 | 61 | * @param menu 菜单信息 |
| 62 | 62 | * @return 菜单列表 |
| 63 | 63 | */ |
| ... | ... | @@ -80,7 +80,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 80 | 80 | |
| 81 | 81 | /** |
| 82 | 82 | * 根据用户ID查询权限 |
| 83 | - * | |
| 83 | + * | |
| 84 | 84 | * @param userId 用户ID |
| 85 | 85 | * @return 权限列表 |
| 86 | 86 | */ |
| ... | ... | @@ -101,7 +101,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 101 | 101 | |
| 102 | 102 | /** |
| 103 | 103 | * 根据用户ID查询菜单 |
| 104 | - * | |
| 104 | + * | |
| 105 | 105 | * @param userId 用户名称 |
| 106 | 106 | * @return 菜单列表 |
| 107 | 107 | */ |
| ... | ... | @@ -122,7 +122,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 122 | 122 | |
| 123 | 123 | /** |
| 124 | 124 | * 根据角色ID查询菜单树信息 |
| 125 | - * | |
| 125 | + * | |
| 126 | 126 | * @param roleId 角色ID |
| 127 | 127 | * @return 选中菜单列表 |
| 128 | 128 | */ |
| ... | ... | @@ -134,81 +134,8 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 134 | 134 | } |
| 135 | 135 | |
| 136 | 136 | /** |
| 137 | - * 构建前端路由所需要的菜单 | |
| 138 | - * | |
| 139 | - * @param menus 菜单列表 | |
| 140 | - * @return 路由列表 | |
| 141 | - */ | |
| 142 | - @Override | |
| 143 | - public List<RouterVo> buildMenus(List<SysMenu> menus) | |
| 144 | - { | |
| 145 | - List<RouterVo> routers = new LinkedList<RouterVo>(); | |
| 146 | - for (SysMenu menu : menus) | |
| 147 | - { | |
| 148 | - RouterVo router = new RouterVo(); | |
| 149 | - router.setHidden("1".equals(menu.getVisible())); | |
| 150 | - router.setName(getRouteName(menu)); | |
| 151 | - router.setPath(getRouterPath(menu)); | |
| 152 | - router.setComponent(getComponent(menu)); | |
| 153 | - router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()))); | |
| 154 | - List<SysMenu> cMenus = menu.getChildren(); | |
| 155 | - if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) | |
| 156 | - { | |
| 157 | - router.setAlwaysShow(true); | |
| 158 | - router.setRedirect("noRedirect"); | |
| 159 | - router.setChildren(buildMenus(cMenus)); | |
| 160 | - } | |
| 161 | - else if (isMeunFrame(menu)) | |
| 162 | - { | |
| 163 | - List<RouterVo> childrenList = new ArrayList<RouterVo>(); | |
| 164 | - RouterVo children = new RouterVo(); | |
| 165 | - children.setPath(menu.getPath()); | |
| 166 | - children.setComponent(menu.getComponent()); | |
| 167 | - children.setName(StringUtils.capitalize(menu.getPath())); | |
| 168 | - children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()))); | |
| 169 | - childrenList.add(children); | |
| 170 | - router.setChildren(childrenList); | |
| 171 | - } | |
| 172 | - routers.add(router); | |
| 173 | - } | |
| 174 | - return routers; | |
| 175 | - } | |
| 176 | - | |
| 177 | - /** | |
| 178 | - * 构建前端所需要树结构 | |
| 179 | - * | |
| 180 | - * @param menus 菜单列表 | |
| 181 | - * @return 树结构列表 | |
| 182 | - */ | |
| 183 | - @Override | |
| 184 | - public List<SysMenu> buildMenuTree(List<SysMenu> menus) | |
| 185 | - { | |
| 186 | - List<SysMenu> returnList = new ArrayList<SysMenu>(); | |
| 187 | - List<Long> tempList = new ArrayList<Long>(); | |
| 188 | - for (SysMenu dept : menus) | |
| 189 | - { | |
| 190 | - tempList.add(dept.getMenuId()); | |
| 191 | - } | |
| 192 | - for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();) | |
| 193 | - { | |
| 194 | - SysMenu menu = (SysMenu) iterator.next(); | |
| 195 | - // 如果是顶级节点, 遍历该父节点的所有子节点 | |
| 196 | - if (!tempList.contains(menu.getParentId())) | |
| 197 | - { | |
| 198 | - recursionFn(menus, menu); | |
| 199 | - returnList.add(menu); | |
| 200 | - } | |
| 201 | - } | |
| 202 | - if (returnList.isEmpty()) | |
| 203 | - { | |
| 204 | - returnList = menus; | |
| 205 | - } | |
| 206 | - return returnList; | |
| 207 | - } | |
| 208 | - | |
| 209 | - /** | |
| 210 | 137 | * 构建前端所需要下拉树结构 |
| 211 | - * | |
| 138 | + * | |
| 212 | 139 | * @param menus 菜单列表 |
| 213 | 140 | * @return 下拉树结构列表 |
| 214 | 141 | */ |
| ... | ... | @@ -221,7 +148,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 221 | 148 | |
| 222 | 149 | /** |
| 223 | 150 | * 根据菜单ID查询信息 |
| 224 | - * | |
| 151 | + * | |
| 225 | 152 | * @param menuId 菜单ID |
| 226 | 153 | * @return 菜单信息 |
| 227 | 154 | */ |
| ... | ... | @@ -233,7 +160,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 233 | 160 | |
| 234 | 161 | /** |
| 235 | 162 | * 是否存在菜单子节点 |
| 236 | - * | |
| 163 | + * | |
| 237 | 164 | * @param menuId 菜单ID |
| 238 | 165 | * @return 结果 |
| 239 | 166 | */ |
| ... | ... | @@ -246,7 +173,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 246 | 173 | |
| 247 | 174 | /** |
| 248 | 175 | * 查询菜单使用数量 |
| 249 | - * | |
| 176 | + * | |
| 250 | 177 | * @param menuId 菜单ID |
| 251 | 178 | * @return 结果 |
| 252 | 179 | */ |
| ... | ... | @@ -259,7 +186,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 259 | 186 | |
| 260 | 187 | /** |
| 261 | 188 | * 新增保存菜单信息 |
| 262 | - * | |
| 189 | + * | |
| 263 | 190 | * @param menu 菜单信息 |
| 264 | 191 | * @return 结果 |
| 265 | 192 | */ |
| ... | ... | @@ -271,7 +198,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 271 | 198 | |
| 272 | 199 | /** |
| 273 | 200 | * 修改保存菜单信息 |
| 274 | - * | |
| 201 | + * | |
| 275 | 202 | * @param menu 菜单信息 |
| 276 | 203 | * @return 结果 |
| 277 | 204 | */ |
| ... | ... | @@ -283,7 +210,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 283 | 210 | |
| 284 | 211 | /** |
| 285 | 212 | * 删除菜单管理信息 |
| 286 | - * | |
| 213 | + * | |
| 287 | 214 | * @param menuId 菜单ID |
| 288 | 215 | * @return 结果 |
| 289 | 216 | */ |
| ... | ... | @@ -295,7 +222,7 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 295 | 222 | |
| 296 | 223 | /** |
| 297 | 224 | * 校验菜单名称是否唯一 |
| 298 | - * | |
| 225 | + * | |
| 299 | 226 | * @param menu 菜单信息 |
| 300 | 227 | * @return 结果 |
| 301 | 228 | */ |
| ... | ... | @@ -311,155 +238,4 @@ public class SysMenuServiceImpl implements ISysMenuService |
| 311 | 238 | return UserConstants.UNIQUE; |
| 312 | 239 | } |
| 313 | 240 | |
| 314 | - /** | |
| 315 | - * 获取路由名称 | |
| 316 | - * | |
| 317 | - * @param menu 菜单信息 | |
| 318 | - * @return 路由名称 | |
| 319 | - */ | |
| 320 | - public String getRouteName(SysMenu menu) | |
| 321 | - { | |
| 322 | - String routerName = StringUtils.capitalize(menu.getPath()); | |
| 323 | - // 非外链并且是一级目录(类型为目录) | |
| 324 | - if (isMeunFrame(menu)) | |
| 325 | - { | |
| 326 | - routerName = StringUtils.EMPTY; | |
| 327 | - } | |
| 328 | - return routerName; | |
| 329 | - } | |
| 330 | - | |
| 331 | - /** | |
| 332 | - * 获取路由地址 | |
| 333 | - * | |
| 334 | - * @param menu 菜单信息 | |
| 335 | - * @return 路由地址 | |
| 336 | - */ | |
| 337 | - public String getRouterPath(SysMenu menu) | |
| 338 | - { | |
| 339 | - String routerPath = menu.getPath(); | |
| 340 | - // 非外链并且是一级目录(类型为目录) | |
| 341 | - if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) | |
| 342 | - && UserConstants.NO_FRAME.equals(menu.getIsFrame())) | |
| 343 | - { | |
| 344 | - routerPath = "/" + menu.getPath(); | |
| 345 | - } | |
| 346 | - // 非外链并且是一级目录(类型为菜单) | |
| 347 | - else if (isMeunFrame(menu)) | |
| 348 | - { | |
| 349 | - routerPath = "/"; | |
| 350 | - } | |
| 351 | - return routerPath; | |
| 352 | - } | |
| 353 | - | |
| 354 | - /** | |
| 355 | - * 获取组件信息 | |
| 356 | - * | |
| 357 | - * @param menu 菜单信息 | |
| 358 | - * @return 组件信息 | |
| 359 | - */ | |
| 360 | - public String getComponent(SysMenu menu) | |
| 361 | - { | |
| 362 | - String component = UserConstants.LAYOUT; | |
| 363 | - if (StringUtils.isNotEmpty(menu.getComponent()) && !isMeunFrame(menu)) | |
| 364 | - { | |
| 365 | - component = menu.getComponent(); | |
| 366 | - } | |
| 367 | - else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) | |
| 368 | - { | |
| 369 | - component = UserConstants.PARENT_VIEW; | |
| 370 | - } | |
| 371 | - return component; | |
| 372 | - } | |
| 373 | - | |
| 374 | - /** | |
| 375 | - * 是否为菜单内部跳转 | |
| 376 | - * | |
| 377 | - * @param menu 菜单信息 | |
| 378 | - * @return 结果 | |
| 379 | - */ | |
| 380 | - public boolean isMeunFrame(SysMenu menu) | |
| 381 | - { | |
| 382 | - return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) | |
| 383 | - && menu.getIsFrame().equals(UserConstants.NO_FRAME); | |
| 384 | - } | |
| 385 | - | |
| 386 | - /** | |
| 387 | - * 是否为parent_view组件 | |
| 388 | - * | |
| 389 | - * @param menu 菜单信息 | |
| 390 | - * @return 结果 | |
| 391 | - */ | |
| 392 | - public boolean isParentView(SysMenu menu) | |
| 393 | - { | |
| 394 | - return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); | |
| 395 | - } | |
| 396 | - | |
| 397 | - /** | |
| 398 | - * 根据父节点的ID获取所有子节点 | |
| 399 | - * | |
| 400 | - * @param list 分类表 | |
| 401 | - * @param parentId 传入的父节点ID | |
| 402 | - * @return String | |
| 403 | - */ | |
| 404 | - public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) | |
| 405 | - { | |
| 406 | - List<SysMenu> returnList = new ArrayList<SysMenu>(); | |
| 407 | - for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();) | |
| 408 | - { | |
| 409 | - SysMenu t = (SysMenu) iterator.next(); | |
| 410 | - // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 | |
| 411 | - if (t.getParentId() == parentId) | |
| 412 | - { | |
| 413 | - recursionFn(list, t); | |
| 414 | - returnList.add(t); | |
| 415 | - } | |
| 416 | - } | |
| 417 | - return returnList; | |
| 418 | - } | |
| 419 | - | |
| 420 | - /** | |
| 421 | - * 递归列表 | |
| 422 | - * | |
| 423 | - * @param list | |
| 424 | - * @param t | |
| 425 | - */ | |
| 426 | - private void recursionFn(List<SysMenu> list, SysMenu t) | |
| 427 | - { | |
| 428 | - // 得到子节点列表 | |
| 429 | - List<SysMenu> childList = getChildList(list, t); | |
| 430 | - t.setChildren(childList); | |
| 431 | - for (SysMenu tChild : childList) | |
| 432 | - { | |
| 433 | - if (hasChild(list, tChild)) | |
| 434 | - { | |
| 435 | - recursionFn(list, tChild); | |
| 436 | - } | |
| 437 | - } | |
| 438 | - } | |
| 439 | - | |
| 440 | - /** | |
| 441 | - * 得到子节点列表 | |
| 442 | - */ | |
| 443 | - private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) | |
| 444 | - { | |
| 445 | - List<SysMenu> tlist = new ArrayList<SysMenu>(); | |
| 446 | - Iterator<SysMenu> it = list.iterator(); | |
| 447 | - while (it.hasNext()) | |
| 448 | - { | |
| 449 | - SysMenu n = (SysMenu) it.next(); | |
| 450 | - if (n.getParentId().longValue() == t.getMenuId().longValue()) | |
| 451 | - { | |
| 452 | - tlist.add(n); | |
| 453 | - } | |
| 454 | - } | |
| 455 | - return tlist; | |
| 456 | - } | |
| 457 | - | |
| 458 | - /** | |
| 459 | - * 判断是否有子节点 | |
| 460 | - */ | |
| 461 | - private boolean hasChild(List<SysMenu> list, SysMenu t) | |
| 462 | - { | |
| 463 | - return getChildList(list, t).size() > 0 ? true : false; | |
| 464 | - } | |
| 465 | 241 | } | ... | ... |
ruoyi-ui/src/store/modules/permission.js
| ... | ... | @@ -24,8 +24,10 @@ const permission = { |
| 24 | 24 | return new Promise(resolve => { |
| 25 | 25 | // 向后端请求路由数据 |
| 26 | 26 | getRouters().then(res => { |
| 27 | - const sdata = JSON.parse(JSON.stringify(res.data)) | |
| 28 | - const rdata = JSON.parse(JSON.stringify(res.data)) | |
| 27 | + // const sdata = JSON.parse(JSON.stringify(res.data)) | |
| 28 | + // const rdata = JSON.parse(JSON.stringify(res.data)) | |
| 29 | + const sdata = JSON.parse(JSON.stringify(res)) | |
| 30 | + const rdata = JSON.parse(JSON.stringify(res)) | |
| 29 | 31 | const sidebarRoutes = filterAsyncRouter(sdata) |
| 30 | 32 | const rewriteRoutes = filterAsyncRouter(rdata, true) |
| 31 | 33 | rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }) | ... | ... |
src/main/java/cn/iocoder/dashboard/framework/errorcode/package-info.java
0 → 100644
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java renamed to src/main/java/cn/iocoder/dashboard/framework/excel/Excel.java
| 1 | -package com.ruoyi.common.annotation; | |
| 2 | - | |
| 3 | -import java.lang.annotation.ElementType; | |
| 4 | -import java.lang.annotation.Retention; | |
| 5 | -import java.lang.annotation.RetentionPolicy; | |
| 6 | -import java.lang.annotation.Target; | |
| 7 | -import java.math.BigDecimal; | |
| 8 | - | |
| 9 | -/** | |
| 10 | - * 自定义导出Excel数据注解 | |
| 11 | - * | |
| 12 | - * @author ruoyi | |
| 13 | - */ | |
| 14 | -@Retention(RetentionPolicy.RUNTIME) | |
| 15 | -@Target(ElementType.FIELD) | |
| 16 | -public @interface Excel | |
| 17 | -{ | |
| 18 | - /** | |
| 19 | - * 导出时在excel中排序 | |
| 20 | - */ | |
| 21 | - public int sort() default Integer.MAX_VALUE; | |
| 22 | - | |
| 23 | - /** | |
| 24 | - * 导出到Excel中的名字. | |
| 25 | - */ | |
| 26 | - public String name() default ""; | |
| 27 | - | |
| 28 | - /** | |
| 29 | - * 日期格式, 如: yyyy-MM-dd | |
| 30 | - */ | |
| 31 | - public String dateFormat() default ""; | |
| 32 | - | |
| 33 | - /** | |
| 34 | - * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) | |
| 35 | - */ | |
| 36 | - public String dictType() default ""; | |
| 37 | - | |
| 38 | - /** | |
| 39 | - * 读取内容转表达式 (如: 0=男,1=女,2=未知) | |
| 40 | - */ | |
| 41 | - public String readConverterExp() default ""; | |
| 42 | - | |
| 43 | - /** | |
| 44 | - * 分隔符,读取字符串组内容 | |
| 45 | - */ | |
| 46 | - public String separator() default ","; | |
| 47 | - | |
| 48 | - /** | |
| 49 | - * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) | |
| 50 | - */ | |
| 51 | - public int scale() default -1; | |
| 52 | - | |
| 53 | - /** | |
| 54 | - * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN | |
| 55 | - */ | |
| 56 | - public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; | |
| 57 | - | |
| 58 | - /** | |
| 59 | - * 导出类型(0数字 1字符串) | |
| 60 | - */ | |
| 61 | - public ColumnType cellType() default ColumnType.STRING; | |
| 62 | - | |
| 63 | - /** | |
| 64 | - * 导出时在excel中每个列的高度 单位为字符 | |
| 65 | - */ | |
| 66 | - public double height() default 14; | |
| 67 | - | |
| 68 | - /** | |
| 69 | - * 导出时在excel中每个列的宽 单位为字符 | |
| 70 | - */ | |
| 71 | - public double width() default 16; | |
| 72 | - | |
| 73 | - /** | |
| 74 | - * 文字后缀,如% 90 变成90% | |
| 75 | - */ | |
| 76 | - public String suffix() default ""; | |
| 77 | - | |
| 78 | - /** | |
| 79 | - * 当值为空时,字段的默认值 | |
| 80 | - */ | |
| 81 | - public String defaultValue() default ""; | |
| 82 | - | |
| 83 | - /** | |
| 84 | - * 提示信息 | |
| 85 | - */ | |
| 86 | - public String prompt() default ""; | |
| 87 | - | |
| 88 | - /** | |
| 89 | - * 设置只能选择不能输入的列内容. | |
| 90 | - */ | |
| 91 | - public String[] combo() default {}; | |
| 92 | - | |
| 93 | - /** | |
| 94 | - * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. | |
| 95 | - */ | |
| 96 | - public boolean isExport() default true; | |
| 97 | - | |
| 98 | - /** | |
| 99 | - * 另一个类中的属性名称,支持多级获取,以小数点隔开 | |
| 100 | - */ | |
| 101 | - public String targetAttr() default ""; | |
| 102 | - | |
| 103 | - /** | |
| 104 | - * 是否自动统计数据,在最后追加一行统计数据总和 | |
| 105 | - */ | |
| 106 | - public boolean isStatistics() default false; | |
| 107 | - | |
| 108 | - /** | |
| 109 | - * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右) | |
| 110 | - */ | |
| 111 | - Align align() default Align.AUTO; | |
| 112 | - | |
| 113 | - public enum Align | |
| 114 | - { | |
| 115 | - AUTO(0), LEFT(1), CENTER(2), RIGHT(3); | |
| 116 | - private final int value; | |
| 117 | - | |
| 118 | - Align(int value) | |
| 119 | - { | |
| 120 | - this.value = value; | |
| 121 | - } | |
| 122 | - | |
| 123 | - public int value() | |
| 124 | - { | |
| 125 | - return this.value; | |
| 126 | - } | |
| 127 | - } | |
| 128 | - | |
| 129 | - /** | |
| 130 | - * 字段类型(0:导出导入;1:仅导出;2:仅导入) | |
| 131 | - */ | |
| 132 | - Type type() default Type.ALL; | |
| 133 | - | |
| 134 | - public enum Type | |
| 135 | - { | |
| 136 | - ALL(0), EXPORT(1), IMPORT(2); | |
| 137 | - private final int value; | |
| 138 | - | |
| 139 | - Type(int value) | |
| 140 | - { | |
| 141 | - this.value = value; | |
| 142 | - } | |
| 143 | - | |
| 144 | - public int value() | |
| 145 | - { | |
| 146 | - return this.value; | |
| 147 | - } | |
| 148 | - } | |
| 149 | - | |
| 150 | - public enum ColumnType | |
| 151 | - { | |
| 152 | - NUMERIC(0), STRING(1), IMAGE(2); | |
| 153 | - private final int value; | |
| 154 | - | |
| 155 | - ColumnType(int value) | |
| 156 | - { | |
| 157 | - this.value = value; | |
| 158 | - } | |
| 159 | - | |
| 160 | - public int value() | |
| 161 | - { | |
| 162 | - return this.value; | |
| 163 | - } | |
| 164 | - } | |
| 165 | -} | |
| 166 | 1 | \ No newline at end of file |
| 2 | +package cn.iocoder.dashboard.framework.excel; | |
| 3 | + | |
| 4 | +import java.lang.annotation.ElementType; | |
| 5 | +import java.lang.annotation.Retention; | |
| 6 | +import java.lang.annotation.RetentionPolicy; | |
| 7 | +import java.lang.annotation.Target; | |
| 8 | +import java.math.BigDecimal; | |
| 9 | + | |
| 10 | +/** | |
| 11 | + * 自定义导出Excel数据注解 | |
| 12 | + * | |
| 13 | + * @author ruoyi | |
| 14 | + */ | |
| 15 | +@Retention(RetentionPolicy.RUNTIME) | |
| 16 | +@Target(ElementType.FIELD) | |
| 17 | +public @interface Excel { | |
| 18 | + | |
| 19 | + /** | |
| 20 | + * 导出时在excel中排序 | |
| 21 | + */ | |
| 22 | + int sort() default Integer.MAX_VALUE; | |
| 23 | + | |
| 24 | + /** | |
| 25 | + * 导出到Excel中的名字. | |
| 26 | + */ | |
| 27 | + String name() default ""; | |
| 28 | + | |
| 29 | + /** | |
| 30 | + * 日期格式, 如: yyyy-MM-dd | |
| 31 | + */ | |
| 32 | + String dateFormat() default ""; | |
| 33 | + | |
| 34 | + /** | |
| 35 | + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) | |
| 36 | + */ | |
| 37 | + String dictType() default ""; | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 读取内容转表达式 (如: 0=男,1=女,2=未知) | |
| 41 | + */ | |
| 42 | + public String readConverterExp() default ""; | |
| 43 | + | |
| 44 | + /** | |
| 45 | + * 分隔符,读取字符串组内容 | |
| 46 | + */ | |
| 47 | + public String separator() default ","; | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) | |
| 51 | + */ | |
| 52 | + public int scale() default -1; | |
| 53 | + | |
| 54 | + /** | |
| 55 | + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN | |
| 56 | + */ | |
| 57 | + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * 导出类型(0数字 1字符串) | |
| 61 | + */ | |
| 62 | + public ColumnType cellType() default ColumnType.STRING; | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * 导出时在excel中每个列的高度 单位为字符 | |
| 66 | + */ | |
| 67 | + public double height() default 14; | |
| 68 | + | |
| 69 | + /** | |
| 70 | + * 导出时在excel中每个列的宽 单位为字符 | |
| 71 | + */ | |
| 72 | + public double width() default 16; | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * 文字后缀,如% 90 变成90% | |
| 76 | + */ | |
| 77 | + String suffix() default ""; | |
| 78 | + | |
| 79 | + /** | |
| 80 | + * 当值为空时,字段的默认值 | |
| 81 | + */ | |
| 82 | + String defaultValue() default ""; | |
| 83 | + | |
| 84 | + /** | |
| 85 | + * 提示信息 | |
| 86 | + */ | |
| 87 | + String prompt() default ""; | |
| 88 | + | |
| 89 | + /** | |
| 90 | + * 设置只能选择不能输入的列内容. | |
| 91 | + */ | |
| 92 | + String[] combo() default {}; | |
| 93 | + | |
| 94 | + /** | |
| 95 | + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. | |
| 96 | + */ | |
| 97 | + boolean isExport() default true; | |
| 98 | + | |
| 99 | + /** | |
| 100 | + * 另一个类中的属性名称,支持多级获取,以小数点隔开 | |
| 101 | + */ | |
| 102 | + String targetAttr() default ""; | |
| 103 | + | |
| 104 | + /** | |
| 105 | + * 是否自动统计数据,在最后追加一行统计数据总和 | |
| 106 | + */ | |
| 107 | + boolean isStatistics() default false; | |
| 108 | + | |
| 109 | + /** | |
| 110 | + * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右) | |
| 111 | + */ | |
| 112 | + Align align() default Align.AUTO; | |
| 113 | + | |
| 114 | + enum Align { | |
| 115 | + AUTO(0), LEFT(1), CENTER(2), RIGHT(3); | |
| 116 | + private final int value; | |
| 117 | + | |
| 118 | + Align(int value) { | |
| 119 | + this.value = value; | |
| 120 | + } | |
| 121 | + | |
| 122 | + public int value() { | |
| 123 | + return this.value; | |
| 124 | + } | |
| 125 | + } | |
| 126 | + | |
| 127 | + /** | |
| 128 | + * 字段类型(0:导出导入;1:仅导出;2:仅导入) | |
| 129 | + */ | |
| 130 | + Type type() default Type.ALL; | |
| 131 | + | |
| 132 | + enum Type { | |
| 133 | + ALL(0), EXPORT(1), IMPORT(2); | |
| 134 | + private final int value; | |
| 135 | + | |
| 136 | + Type(int value) { | |
| 137 | + this.value = value; | |
| 138 | + } | |
| 139 | + | |
| 140 | + public int value() { | |
| 141 | + return this.value; | |
| 142 | + } | |
| 143 | + } | |
| 144 | + | |
| 145 | + enum ColumnType { | |
| 146 | + NUMERIC(0), STRING(1), IMAGE(2); | |
| 147 | + private final int value; | |
| 148 | + | |
| 149 | + ColumnType(int value) { | |
| 150 | + this.value = value; | |
| 151 | + } | |
| 152 | + | |
| 153 | + public int value() { | |
| 154 | + return this.value; | |
| 155 | + } | |
| 156 | + } | |
| 157 | +} | ... | ... |
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java renamed to src/main/java/cn/iocoder/dashboard/framework/excel/Excels.java
| 1 | -package com.ruoyi.common.annotation; | |
| 2 | - | |
| 3 | -import java.lang.annotation.ElementType; | |
| 4 | -import java.lang.annotation.Retention; | |
| 5 | -import java.lang.annotation.RetentionPolicy; | |
| 6 | -import java.lang.annotation.Target; | |
| 7 | - | |
| 8 | -/** | |
| 9 | - * Excel注解集 | |
| 10 | - * | |
| 11 | - * @author ruoyi | |
| 12 | - */ | |
| 13 | -@Target(ElementType.FIELD) | |
| 14 | -@Retention(RetentionPolicy.RUNTIME) | |
| 15 | -public @interface Excels | |
| 16 | -{ | |
| 17 | - Excel[] value(); | |
| 18 | -} | |
| 1 | +package cn.iocoder.dashboard.framework.excel; | |
| 2 | + | |
| 3 | +import java.lang.annotation.ElementType; | |
| 4 | +import java.lang.annotation.Retention; | |
| 5 | +import java.lang.annotation.RetentionPolicy; | |
| 6 | +import java.lang.annotation.Target; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * Excel注解集 | |
| 10 | + * | |
| 11 | + * @author ruoyi | |
| 12 | + */ | |
| 13 | +@Target(ElementType.FIELD) | |
| 14 | +@Retention(RetentionPolicy.RUNTIME) | |
| 15 | +public @interface Excels | |
| 16 | +{ | |
| 17 | + Excel[] value(); | |
| 18 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthGetRouterRespVO.java
| 1 | 1 | package cn.iocoder.dashboard.modules.system.controller.auth.vo; |
| 2 | 2 | |
| 3 | +import lombok.AllArgsConstructor; | |
| 4 | +import lombok.Builder; | |
| 3 | 5 | import lombok.Data; |
| 6 | +import lombok.NoArgsConstructor; | |
| 4 | 7 | |
| 5 | 8 | import java.util.List; |
| 6 | 9 | |
| ... | ... | @@ -10,6 +13,9 @@ import java.util.List; |
| 10 | 13 | * @author ruoyi |
| 11 | 14 | */ |
| 12 | 15 | @Data |
| 16 | +@NoArgsConstructor | |
| 17 | +@AllArgsConstructor | |
| 18 | +@Builder | |
| 13 | 19 | public class SysAuthGetRouterRespVO { |
| 14 | 20 | |
| 15 | 21 | /** |
| ... | ... | @@ -62,6 +68,9 @@ public class SysAuthGetRouterRespVO { |
| 62 | 68 | private List<SysAuthGetRouterRespVO> children; |
| 63 | 69 | |
| 64 | 70 | @Data |
| 71 | + @NoArgsConstructor | |
| 72 | + @AllArgsConstructor | |
| 73 | + @Builder | |
| 65 | 74 | public static class MetaVO { |
| 66 | 75 | |
| 67 | 76 | /** | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java
| 1 | 1 | package cn.iocoder.dashboard.modules.system.convert.auth; |
| 2 | 2 | |
| 3 | +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | |
| 3 | 4 | import cn.iocoder.dashboard.framework.security.core.LoginUser; |
| 4 | 5 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO; |
| 5 | 6 | import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO; |
| 6 | 7 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; |
| 7 | 8 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; |
| 8 | 9 | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; |
| 10 | +import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum; | |
| 11 | +import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; | |
| 9 | 12 | import cn.iocoder.dashboard.util.collection.CollectionUtils; |
| 13 | +import jodd.util.StringUtil; | |
| 14 | +import org.apache.commons.lang3.StringUtils; | |
| 10 | 15 | import org.mapstruct.Mapper; |
| 11 | 16 | import org.mapstruct.Mapping; |
| 12 | 17 | import org.mapstruct.factory.Mappers; |
| ... | ... | @@ -16,6 +21,12 @@ import java.util.List; |
| 16 | 21 | @Mapper |
| 17 | 22 | public interface SysAuthConvert { |
| 18 | 23 | |
| 24 | + /** Layout组件标识 */ | |
| 25 | + public final static String LAYOUT = "Layout"; | |
| 26 | + | |
| 27 | + /** ParentView组件标识 */ | |
| 28 | + public final static String PARENT_VIEW = "ParentView"; | |
| 29 | + | |
| 19 | 30 | SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); |
| 20 | 31 | |
| 21 | 32 | @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 |
| ... | ... | @@ -29,6 +40,88 @@ public interface SysAuthConvert { |
| 29 | 40 | .build(); |
| 30 | 41 | } |
| 31 | 42 | |
| 32 | - SysAuthGetRouterRespVO convertTreeNode(SysMenuDO menu); | |
| 43 | + default SysAuthGetRouterRespVO convertTreeNode(SysMenuDO menu) { | |
| 44 | + SysAuthGetRouterRespVO.SysAuthGetRouterRespVOBuilder respVOBuilder = SysAuthGetRouterRespVO.builder(); | |
| 45 | + respVOBuilder.menuId(menu.getMenuId()).parentId(menu.getParentId()) | |
| 46 | + .hidden("1".equals(menu.getVisible())) // TODO 芋艿:需要处理 | |
| 47 | + .name(getRouteName(menu)).path(menu.getPath()).component(getComponent(menu)) | |
| 48 | + .meta(SysAuthGetRouterRespVO.MetaVO.builder().title(menu.getMenuName()).icon(menu.getIcon()) | |
| 49 | + .noCache("1".equals(menu.getIsCache())).build()) | |
| 50 | + ; | |
| 51 | + return respVOBuilder.build(); | |
| 52 | + } | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + // TODO 芋艿:需要预处理。存储的时候 | |
| 57 | + default String getRouteName(SysMenuDO menu) { | |
| 58 | + String routerName = StringUtil.capitalize(menu.getPath()); // TODO 芋艿:看看怎么去除掉 | |
| 59 | + // 非外链并且是一级目录(类型为目录) | |
| 60 | + if (isMenuFrame(menu)) { | |
| 61 | + routerName = StringUtils.EMPTY; | |
| 62 | + } | |
| 63 | + return routerName; | |
| 64 | + } | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * 是否为菜单内部跳转 | |
| 68 | + * | |
| 69 | + * @param menu 菜单信息 | |
| 70 | + * @return 是否 | |
| 71 | + */ | |
| 72 | + // TODO 芋艿:思考下是不是可以重构下 | |
| 73 | + default boolean isMenuFrame(SysMenuDO menu) { | |
| 74 | + return MenuIdEnum.ROOT.getId().equals(menu.getParentId()) | |
| 75 | + && MenuTypeEnum.MENU.getType().equals(menu.getMenuType()) | |
| 76 | + && CommonStatusEnum.ENABLE.getStatus().equals(menu.getIsFrame()); // TODO 芋艿:思考是不是用这个好 | |
| 77 | + } | |
| 78 | + | |
| 79 | +// /** // TODO 芋艿:后面重构下 | |
| 80 | +// * 获取路由地址 | |
| 81 | +// * | |
| 82 | +// * @param menu 菜单信息 | |
| 83 | +// * @return 路由地址 | |
| 84 | +// */ | |
| 85 | +// default String getRouterPath(SysMenuDO menu) { | |
| 86 | +// String routerPath = menu.getPath(); | |
| 87 | +// // 非外链并且是一级目录(类型为目录) | |
| 88 | +// if (MenuIdEnum.ROOT.getId().equals(menu.getParentId()) | |
| 89 | +// && MenuTypeEnum.MENU.getType().equals(menu.getMenuType()) | |
| 90 | +// && CommonStatusEnum.DISABLE.getStatus().equals(menu.getIsFrame())) { | |
| 91 | +// routerPath = "/" + menu.getPath(); | |
| 92 | +// } | |
| 93 | +// // 非外链并且是一级目录(类型为菜单) | |
| 94 | +// else if (isMenuFrame(menu)) { | |
| 95 | +// routerPath = "/"; | |
| 96 | +// } | |
| 97 | +// return routerPath; | |
| 98 | +// } | |
| 99 | + | |
| 100 | + /** | |
| 101 | + * 获取组件信息 | |
| 102 | + * | |
| 103 | + * @param menu 菜单信息 | |
| 104 | + * @return 组件信息 | |
| 105 | + */ | |
| 106 | + default String getComponent(SysMenuDO menu) { | |
| 107 | + String component = LAYOUT; | |
| 108 | + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) { | |
| 109 | + component = menu.getComponent(); | |
| 110 | + } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) { | |
| 111 | + component = PARENT_VIEW; | |
| 112 | + } | |
| 113 | + return component; | |
| 114 | + } | |
| 115 | + | |
| 116 | + /** | |
| 117 | + * 是否为parent_view组件 | |
| 118 | + * | |
| 119 | + * @param menu 菜单信息 | |
| 120 | + * @return 结果 | |
| 121 | + */ | |
| 122 | + default boolean isParentView(SysMenuDO menu) { | |
| 123 | + return !MenuIdEnum.ROOT.getId().equals(menu.getParentId()) | |
| 124 | + && MenuTypeEnum.DIR.getType().equals(menu.getMenuType()); | |
| 125 | + } | |
| 33 | 126 | |
| 34 | 127 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java
| ... | ... | @@ -11,7 +11,7 @@ import java.util.List; |
| 11 | 11 | public interface SysMenuService { |
| 12 | 12 | |
| 13 | 13 | /** |
| 14 | - * | |
| 14 | + * 初始化菜单 | |
| 15 | 15 | */ |
| 16 | 16 | void init(); |
| 17 | 17 | |
| ... | ... | @@ -39,4 +39,6 @@ public interface SysMenuService { |
| 39 | 39 | List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds, Collection<String> menuTypes, |
| 40 | 40 | Collection<String> menusStatuses); |
| 41 | 41 | |
| 42 | + | |
| 43 | + | |
| 42 | 44 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
| ... | ... | @@ -12,7 +12,10 @@ import org.springframework.stereotype.Service; |
| 12 | 12 | |
| 13 | 13 | import javax.annotation.PostConstruct; |
| 14 | 14 | import javax.annotation.Resource; |
| 15 | -import java.util.*; | |
| 15 | +import java.util.Collection; | |
| 16 | +import java.util.Collections; | |
| 17 | +import java.util.List; | |
| 18 | +import java.util.Map; | |
| 16 | 19 | import java.util.stream.Collectors; |
| 17 | 20 | |
| 18 | 21 | /** |
| ... | ... | @@ -83,4 +86,5 @@ public class SysMenuServiceImpl implements SysMenuService { |
| 83 | 86 | && menusStatuses.contains(menu.getStatus())) |
| 84 | 87 | .collect(Collectors.toList()); |
| 85 | 88 | } |
| 89 | + | |
| 86 | 90 | } | ... | ... |
src/main/resources/application.yaml
| ... | ... | @@ -3,7 +3,7 @@ spring: |
| 3 | 3 | name: dashboard |
| 4 | 4 | # 数据源配置项 TODO 多数据源;TODO 监控配置 |
| 5 | 5 | datasource: |
| 6 | - url: jdbc:mysql://127.0.1:3306/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT | |
| 6 | + url: jdbc:mysql://127.0.1:33061/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT | |
| 7 | 7 | driver-class-name: com.mysql.jdbc.Driver |
| 8 | 8 | username: root |
| 9 | 9 | password: 123456 | ... | ... |