From 4d21c11acd8d1e2ec0c8e0a72e329302eefcc3e4 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 1 Aug 2022 13:35:19 +0800 Subject: [PATCH 01/30] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E9=94=99=E8=AF=AF=E6=AC=A1=E6=95=B0=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/auth/service/SysPasswordService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java index 06e111a7..44fe0fc0 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java @@ -60,7 +60,7 @@ public class SysPasswordService if (!matches(user, password)) { retryCount = retryCount + 1; - recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("密码输入错误%s次", maxRetryCount)); + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("密码输入错误%s次", retryCount)); redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); throw new ServiceException("用户不存在/密码错误"); } From 0484c63d9bd6b90a600e8f4153515a84d4f2a62f Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 1 Aug 2022 13:35:41 +0800 Subject: [PATCH 02/30] =?UTF-8?q?=E5=8D=87=E7=BA=A7spring-boot-admin?= =?UTF-8?q?=E5=88=B0=E6=9C=80=E6=96=B0=E7=89=882.7.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 822fe8d2..9fb85203 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ 2021.0.1.0 2.0.4 1.5.1 - 2.7.2 + 2.7.3 2.2.2 3.0.0 1.6.2 From 347a717d5c7afa873fff71009322e7d6c6ad38c7 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 1 Aug 2022 13:35:52 +0800 Subject: [PATCH 03/30] =?UTF-8?q?=E5=8D=87=E7=BA=A7spring-boot=E5=88=B0?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC2.7.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9fb85203..a12c073a 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ UTF-8 UTF-8 1.8 - 2.7.1 + 2.7.2 2021.0.3 2021.0.1.0 2.0.4 From c5eb7458c8456664f1b3960401a0ce737824f3ea Mon Sep 17 00:00:00 2001 From: huyupeng Date: Mon, 1 Aug 2022 14:52:18 +0800 Subject: [PATCH 04/30] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86XSS=E6=94=BB?= =?UTF-8?q?=E5=87=BB=E9=97=AE=E9=A2=98(#I5IRC8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java index 1052b55a..5d983549 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java @@ -387,7 +387,7 @@ public final class HTMLFilter { paramValue = processParamProtocol(paramValue); } - params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\""); + params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); } } From b51c127eb77ae8a2c9e79e1e4309e4c78f1e8671 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Wed, 3 Aug 2022 16:53:11 +0800 Subject: [PATCH 05/30] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8D=E8=BF=9B=E8=A1=8C=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/system/SysDeptMapper.xml | 2 +- .../src/main/resources/mapper/system/SysRoleMapper.xml | 6 +++--- .../src/main/resources/mapper/system/SysUserMapper.xml | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 984f89cc..000166ed 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -82,7 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index a8d3ede5..12e7f78e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -85,12 +85,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -139,7 +139,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update sys_role set del_flag = '2' where role_id = #{roleId} + update sys_role set del_flag = '2' where role_id = #{roleId} diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 371c429a..9f1839c1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -122,7 +122,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -208,7 +208,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update sys_user set del_flag = '2' where user_id = #{userId} + update sys_user set del_flag = '2' where user_id = #{userId} From 4ae26c2f8676ba73f1e17932ea03e7d581bd82af Mon Sep 17 00:00:00 2001 From: runphp Date: Thu, 4 Aug 2022 01:39:58 +0000 Subject: [PATCH 06/30] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4Hash?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=9F=90=E6=9D=A1=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/redis/service/RedisService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java index 82efb9b1..64cc7027 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java @@ -243,6 +243,18 @@ public class RedisService return redisTemplate.opsForHash().multiGet(key, hKeys); } + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return Boolean.TRUE.equals(redisTemplate.opsForHash().delete(key, hKey)); + } + /** * 获得缓存的基本对象列表 * From 5408af9d1fca48e47bd4184e73ff347e9cf2b3e8 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Sun, 7 Aug 2022 18:49:09 +0800 Subject: [PATCH 07/30] =?UTF-8?q?Excel=E6=94=AF=E6=8C=81=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E7=9A=84=E5=AD=90=E5=88=97=E8=A1=A8=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/core/annotation/Excel.java | 5 + .../common/core/utils/html/HTMLFilter.java | 2 +- .../common/core/utils/poi/ExcelUtil.java | 228 ++++++++++++++++-- 3 files changed, 213 insertions(+), 22 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java index fd20df19..10f9a91b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java @@ -83,6 +83,11 @@ public @interface Excel */ public String[] combo() default {}; + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + /** * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java index 5d983549..ba53dc93 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java @@ -332,7 +332,7 @@ public final class HTMLFilter final String name = m.group(1).toLowerCase(); if (allowed(name)) { - if (false == inArray(name, vSelfClosingTags)) + if (!inArray(name, vSelfClosingTags)) { if (vTagCounts.containsKey(name)) { diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java index c813f85b..3c6fc3e5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java @@ -4,12 +4,14 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -20,6 +22,7 @@ import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -126,6 +129,26 @@ public class ExcelUtil */ private short maxHeight; + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + /** * 统计列表 */ @@ -175,6 +198,7 @@ public class ExcelUtil createExcelField(); createWorkbook(); createTitle(); + createSubHead(); } /** @@ -184,19 +208,54 @@ public class ExcelUtil { if (StringUtils.isNotEmpty(title)) { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); titleRow.setHeightInPoints(30); Cell titleCell = titleRow.createCell(0); titleCell.setCellStyle(styles.get("title")); titleCell.setCellValue(title); - sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), - this.fields.size() - 1)); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; } } /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @return 转换后集合 */ @@ -207,7 +266,7 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @param titleNum 标题占用行数 * @return 转换后集合 @@ -219,7 +278,7 @@ public class ExcelUtil /** * 对excel表单指定表格索引名转换成list - * + * * @param sheetName 表格索引名 * @param titleNum 标题占用行数 * @param is 输入流 @@ -378,7 +437,6 @@ public class ExcelUtil * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 - * @throws IOException */ public void exportExcel(HttpServletResponse response, List list, String sheetName) { @@ -393,7 +451,6 @@ public class ExcelUtil * @param sheetName 工作表的名称 * @param title 标题 * @return 结果 - * @throws IOException */ public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) { @@ -431,7 +488,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ public void exportExcel(HttpServletResponse response) @@ -468,8 +525,20 @@ public class ExcelUtil // 写入各个字段的列头名称 for (Object[] os : fields) { + Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - this.createCell(excel, row, column++); + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } } if (Type.EXPORT.equals(type)) { @@ -481,32 +550,71 @@ public class ExcelUtil /** * 填充excel数据 - * + * * @param index 序号 * @param row 单元格行 */ + @SuppressWarnings("unchecked") public void fillExcelData(int index, Row row) { int startNo = index * sheetSize; int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; for (int i = startNo; i < endNo; i++) { - row = sheet.createRow(i + 1 + rownum - startNo); + rowNo = i > 1 ? rowNo + 1 : rowNo + i; + row = sheet.createRow(rowNo); // 得到导出对象. T vo = (T) list.get(i); + Collection subList = null; + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; - this.addCell(excel, row, vo, field, column++); + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) + { + boolean subFirst = false; + for (Object obj : subList) + { + if (subFirst) + { + rowNo++; + row = sheet.createRow(rowNo); + } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } + else + { + this.addCell(excel, row, vo, field, column++); + } } } } /** * 创建表格样式 - * + * * @param wb 工作薄对象 * @return 样式列表 */ @@ -634,7 +742,7 @@ public class ExcelUtil /** * 创建单元格 */ - public Cell createCell(Excel attr, Row row, int column) + public Cell createHeadCell(Excel attr, Row row, int column) { // 创建列 Cell cell = row.createCell(column); @@ -642,12 +750,21 @@ public class ExcelUtil cell.setCellValue(attr.name()); setDataValidation(attr, row, column); cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } return cell; } /** * 设置单元格信息 - * + * * @param value 单元格值 * @param attr 注解相关 * @param cell 单元格信息 @@ -749,6 +866,11 @@ public class ExcelUtil { // 创建cell cell = row.createCell(column); + if (isSubListValue(vo) && attr.needMerge()) + { + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); // 用于读取对象中的属性 @@ -839,7 +961,7 @@ public class ExcelUtil for (String item : convertSource) { String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) + if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { @@ -863,7 +985,7 @@ public class ExcelUtil /** * 反向解析值 男=0,女=1,未知=2 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 @@ -876,7 +998,7 @@ public class ExcelUtil for (String item : convertSource) { String[] itemArray = item.split("="); - if (StringUtils.containsAny(separator, propertyValue)) + if (StringUtils.containsAny(propertyValue, separator)) { for (String value : propertyValue.split(separator)) { @@ -1049,6 +1171,13 @@ public class ExcelUtil field.setAccessible(true); fields.add(new Object[] { field, attr }); } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } } // 多注解 @@ -1097,7 +1226,7 @@ public class ExcelUtil /** * 创建工作表 - * + * * @param sheetNo sheet数量 * @param index 序号 */ @@ -1114,7 +1243,7 @@ public class ExcelUtil /** * 获取单元格值 - * + * * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 @@ -1174,7 +1303,7 @@ public class ExcelUtil /** * 判断是否是空行 - * + * * @param row 判断的行 * @return */ @@ -1227,4 +1356,61 @@ public class ExcelUtil } return str; } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } } From c8a108b93ad9af598d16df4640722cbe9cb57a42 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 8 Aug 2022 09:26:29 +0800 Subject: [PATCH 08/30] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=A3=E9=94=81=E8=B4=A6=E6=88=B7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SysLogininforController.java | 14 ++++++++ ruoyi-ui/src/api/system/logininfor.js | 7 ++++ .../src/views/system/logininfor/index.vue | 28 ++++++++++++++- sql/{ry_20220613.sql => ry_20220808.sql} | 34 ++++++++++--------- 4 files changed, 66 insertions(+), 17 deletions(-) rename sql/{ry_20220613.sql => ry_20220808.sql} (96%) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java index 1ed6c000..1fc33abf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLogininforController.java @@ -10,12 +10,14 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.utils.poi.ExcelUtil; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.TableDataInfo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.system.api.domain.SysLogininfor; @@ -33,6 +35,9 @@ public class SysLogininforController extends BaseController @Autowired private ISysLogininforService logininforService; + @Autowired + private RedisService redisService; + @RequiresPermissions("system:logininfor:list") @GetMapping("/list") public TableDataInfo list(SysLogininfor logininfor) @@ -69,6 +74,15 @@ public class SysLogininforController extends BaseController return AjaxResult.success(); } + @RequiresPermissions("system:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock//{userName}") + public AjaxResult unlock(@PathVariable("userName") String userName) + { + redisService.deleteObject(CacheConstants.PWD_ERR_CNT_KEY + userName); + return success(); + } + @InnerAuth @PostMapping public AjaxResult add(@RequestBody SysLogininfor logininfor) diff --git a/ruoyi-ui/src/api/system/logininfor.js b/ruoyi-ui/src/api/system/logininfor.js index 8f215699..755e6bc4 100644 --- a/ruoyi-ui/src/api/system/logininfor.js +++ b/ruoyi-ui/src/api/system/logininfor.js @@ -17,6 +17,13 @@ export function delLogininfor(infoId) { }) } +// 解锁用户登录状态 +export function unlockLogininfor(userName) { + return request({ + url: '/system/logininfor/unlock/' + userName, + method: 'get' + }) +} // 清空登录日志 export function cleanLogininfor() { return request({ diff --git a/ruoyi-ui/src/views/system/logininfor/index.vue b/ruoyi-ui/src/views/system/logininfor/index.vue index 7abae290..e7207427 100644 --- a/ruoyi-ui/src/views/system/logininfor/index.vue +++ b/ruoyi-ui/src/views/system/logininfor/index.vue @@ -73,6 +73,17 @@ v-hasPermi="['system:logininfor:remove']" >清空 + + 解锁 + + + + From 59b867dcca385a5ec5b64699f0ae3f94ff769061 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 12 Aug 2022 12:19:42 +0800 Subject: [PATCH 16/30] =?UTF-8?q?=E9=99=90=E5=88=B6=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9=E9=83=A8?= =?UTF-8?q?=E9=97=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/system/controller/SysProfileController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java index 5ce76731..f8fae5cb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java @@ -82,6 +82,7 @@ public class SysProfileController extends BaseController user.setUserId(sysUser.getUserId()); user.setPassword(null); user.setAvatar(null); + user.setDeptId(null); if (userService.updateUserProfile(user) > 0) { // 更新缓存用户信息 From c960108b12faa98abab9fb4de662205d4b2bb26b Mon Sep 17 00:00:00 2001 From: RuoYi Date: Sun, 14 Aug 2022 09:42:25 +0800 Subject: [PATCH 17/30] =?UTF-8?q?=E5=AD=97=E5=85=B8=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B1=BB=E5=9E=8B=E6=96=B0=E5=A2=9E=E5=85=B6?= =?UTF-8?q?=E4=BB=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/{ry_20220808.sql => ry_20220814.sql} | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) rename sql/{ry_20220808.sql => ry_20220814.sql} (97%) diff --git a/sql/ry_20220808.sql b/sql/ry_20220814.sql similarity index 97% rename from sql/ry_20220808.sql rename to sql/ry_20220814.sql index 14692dbb..8010bfdb 100644 --- a/sql/ry_20220808.sql +++ b/sql/ry_20220814.sql @@ -466,6 +466,7 @@ insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表'); insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表'); + -- ---------------------------- -- 12、字典数据表 -- ---------------------------- @@ -506,17 +507,18 @@ insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_ty insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告'); insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态'); insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态'); -insert into sys_dict_data values(18, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); -insert into sys_dict_data values(19, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); -insert into sys_dict_data values(20, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); -insert into sys_dict_data values(21, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); -insert into sys_dict_data values(22, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); -insert into sys_dict_data values(23, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); -insert into sys_dict_data values(24, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); -insert into sys_dict_data values(25, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); -insert into sys_dict_data values(26, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); -insert into sys_dict_data values(27, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); -insert into sys_dict_data values(28, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); +insert into sys_dict_data values(18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作'); +insert into sys_dict_data values(19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作'); +insert into sys_dict_data values(20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作'); +insert into sys_dict_data values(21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作'); +insert into sys_dict_data values(22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作'); +insert into sys_dict_data values(23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作'); +insert into sys_dict_data values(24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作'); +insert into sys_dict_data values(25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作'); +insert into sys_dict_data values(26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作'); +insert into sys_dict_data values(27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作'); +insert into sys_dict_data values(28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态'); +insert into sys_dict_data values(29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态'); -- ---------------------------- From 858f576fa39233a53dfb0370341b769f4d561e08 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 15 Aug 2022 12:08:00 +0800 Subject: [PATCH 18/30] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E7=BB=84=E4=BB=B6src=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E4=B8=BAnull=E5=80=BC=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E9=97=AE=E9=A2=98(I5KBAS)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/components/ImagePreview/index.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ruoyi-ui/src/components/ImagePreview/index.vue b/ruoyi-ui/src/components/ImagePreview/index.vue index 14a245b2..2fa02d71 100644 --- a/ruoyi-ui/src/components/ImagePreview/index.vue +++ b/ruoyi-ui/src/components/ImagePreview/index.vue @@ -17,7 +17,7 @@ export default { props: { src: { type: String, - required: true + default: "" }, width: { type: [Number, String], @@ -30,10 +30,16 @@ export default { }, computed: { realSrc() { + if (!this.src) { + return; + } let real_src = this.src.split(",")[0]; return real_src; }, realSrcList() { + if (!this.src) { + return; + } let real_src_list = this.src.split(","); let srcList = []; real_src_list.forEach(item => { From a8daa1f044d20ad24206854319c0d0fd137bc144 Mon Sep 17 00:00:00 2001 From: taest <876239615@qq.com> Date: Fri, 19 Aug 2022 08:17:45 +0000 Subject: [PATCH 19/30] =?UTF-8?q?=E5=AF=86=E7=A0=81=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E9=A3=8E=E6=A0=BC=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: taest <876239615@qq.com> --- .../main/java/com/ruoyi/auth/service/SysPasswordService.java | 4 ++-- .../java/com/ruoyi/common/core/constant/CacheConstants.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java index 44fe0fc0..eb18ea87 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java @@ -21,9 +21,9 @@ public class SysPasswordService @Autowired private RedisService redisService; - private int maxRetryCount = CacheConstants.passwordMaxRetryCount; + private int maxRetryCount = CacheConstants.PASSWORD_MAX_RETRY_COUNT; - private Long lockTime = CacheConstants.passwordLockTime; + private Long lockTime = CacheConstants.PASSWORD_LOCK_TIME; @Autowired private SysRecordLogService recordLogService; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java index e63d95ec..38e556b0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java @@ -20,12 +20,12 @@ public class CacheConstants /** * 密码最大错误次数 */ - public final static int passwordMaxRetryCount = 5; + public final static int PASSWORD_MAX_RETRY_COUNT = 5; /** * 密码锁定时间,默认10(分钟) */ - public final static long passwordLockTime = 10; + public final static long PASSWORD_LOCK_TIME = 10; /** * 权限缓存前缀 From 31523867e71ec5456aa4c9a974895ee5582c68bf Mon Sep 17 00:00:00 2001 From: taest <876239615@qq.com> Date: Fri, 19 Aug 2022 08:26:05 +0000 Subject: [PATCH 20/30] =?UTF-8?q?RedisService=20=E5=88=A0=E9=99=A4Hash?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=9F=90=E6=9D=A1=E6=95=B0=E6=8D=AE=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E8=BF=94=E5=9B=9E=E5=80=BC=E5=BF=85=E4=B8=BA?= =?UTF-8?q?false=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: taest <876239615@qq.com> --- .../main/java/com/ruoyi/common/redis/service/RedisService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java index 64cc7027..46bb4d6c 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java @@ -252,7 +252,7 @@ public class RedisService */ public boolean deleteCacheMapValue(final String key, final String hKey) { - return Boolean.TRUE.equals(redisTemplate.opsForHash().delete(key, hKey)); + return redisTemplate.opsForHash().delete(key, hKey) > 0; } /** From d4c61daf9b3ced1e70415750825b03cd8da19e79 Mon Sep 17 00:00:00 2001 From: taest <876239615@qq.com> Date: Fri, 19 Aug 2022 08:32:42 +0000 Subject: [PATCH 21/30] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=B0=8F=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: taest <876239615@qq.com> --- .../com/ruoyi/system/api/domain/SysDictData.java | 2 +- .../java/com/ruoyi/auth/service/SysLoginService.java | 11 ++++++----- .../ruoyi/system/controller/SysDeptController.java | 12 ++---------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java index dadca63b..014a6915 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java @@ -131,7 +131,7 @@ public class SysDictData extends BaseEntity public boolean getDefault() { - return UserConstants.YES.equals(this.isDefault) ? true : false; + return UserConstants.YES.equals(this.isDefault); } public String getIsDefault() diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java index 37d5e46a..7f674b60 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java @@ -59,16 +59,17 @@ public class SysLoginService // 查询用户信息 R userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER); - if (R.FAIL == userResult.getCode()) - { - throw new ServiceException(userResult.getMsg()); - } - if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) { recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在"); throw new ServiceException("登录用户:" + username + " 不存在"); } + + if (R.FAIL == userResult.getCode()) + { + throw new ServiceException(userResult.getMsg()); + } + LoginUser userInfo = userResult.getData(); SysUser user = userResult.getData().getSysUser(); if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java index 43bddd62..e3cfc65e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java @@ -55,16 +55,8 @@ public class SysDeptController extends BaseController public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { List depts = deptService.selectDeptList(new SysDept()); - Iterator it = depts.iterator(); - while (it.hasNext()) - { - SysDept d = (SysDept) it.next(); - if (d.getDeptId().intValue() == deptId - || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) - { - it.remove(); - } - } + depts.removeIf(d -> d.getDeptId().intValue() == deptId + || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); return AjaxResult.success(depts); } From fcb58876e7f235b0057b6353652f7eadc1d1ae21 Mon Sep 17 00:00:00 2001 From: runphp Date: Mon, 22 Aug 2022 03:13:56 +0000 Subject: [PATCH 22/30] =?UTF-8?q?fix:=20=20user=5Fkey=20=E5=A4=B4=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=9C=AA=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: runphp --- .../ruoyi/common/security/feign/FeignRequestInterceptor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java index ccfa07f4..e8b6c73a 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java @@ -31,6 +31,11 @@ public class FeignRequestInterceptor implements RequestInterceptor { requestTemplate.header(SecurityConstants.DETAILS_USER_ID, userId); } + String userKey = headers.get(SecurityConstants.USER_KEY); + if (StringUtils.isNotEmpty(userKey)) + { + requestTemplate.header(SecurityConstants.USER_KEY, userKey); + } String userName = headers.get(SecurityConstants.DETAILS_USERNAME); if (StringUtils.isNotEmpty(userName)) { From 12d335b9acd5a27647ebb5667dc6c7258ebaea70 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 22 Aug 2022 14:45:51 +0800 Subject: [PATCH 23/30] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=81=97=E6=BC=8F=E7=9A=84prop=E5=B1=9E?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/views/system/menu/index.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/ruoyi-ui/src/views/system/menu/index.vue index b0ad1cb3..f48ce86d 100644 --- a/ruoyi-ui/src/views/system/menu/index.vue +++ b/ruoyi-ui/src/views/system/menu/index.vue @@ -107,7 +107,7 @@ - + - + @@ -195,7 +195,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -217,7 +217,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -248,7 +248,7 @@ - + From 767f7c86217336079cb9044b2f54ac010126329c Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 22 Aug 2022 15:02:29 +0800 Subject: [PATCH 24/30] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=9A=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/system/api/domain/SysRole.java | 14 ++++++++ .../core/constant/SecurityConstants.java | 5 +++ .../core/context/SecurityContextHolder.java | 10 ++++++ .../ruoyi/common/core/utils/StringUtils.java | 26 +++++++++++++++ .../datascope/annotation/DataScope.java | 5 +++ .../datascope/aspect/DataScopeAspect.java | 13 ++++++-- .../common/redis/service/RedisService.java | 4 +-- .../ruoyi/common/security/auth/AuthLogic.java | 2 ++ .../system/controller/SysDeptController.java | 27 +-------------- .../system/controller/SysRoleController.java | 20 ++++++++++- .../system/controller/SysUserController.java | 27 +++++++++++---- .../ruoyi/system/mapper/SysMenuMapper.java | 8 +++++ .../ruoyi/system/service/ISysDeptService.java | 8 +++++ .../ruoyi/system/service/ISysMenuService.java | 8 +++++ .../system/service/ISysPermissionService.java | 11 +++++-- .../service/impl/SysDeptServiceImpl.java | 13 ++++++++ .../service/impl/SysMenuServiceImpl.java | 21 ++++++++++++ .../impl/SysPermissionServiceImpl.java | 33 +++++++++++++++---- .../resources/mapper/system/SysMenuMapper.xml | 7 ++++ ruoyi-ui/src/api/system/dept.js | 16 --------- ruoyi-ui/src/api/system/role.js | 10 +++++- ruoyi-ui/src/api/system/user.js | 8 +++++ ruoyi-ui/src/views/system/role/index.vue | 17 +++------- ruoyi-ui/src/views/system/user/index.vue | 11 +++---- 24 files changed, 243 insertions(+), 81 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java index 8305b993..04a4d0ef 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java @@ -1,5 +1,6 @@ package com.ruoyi.system.api.domain; +import java.util.Set; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -59,6 +60,9 @@ public class SysRole extends BaseEntity /** 部门组(数据权限) */ private Long[] deptIds; + /** 角色菜单权限 */ + private Set permissions; + public SysRole() { @@ -204,6 +208,16 @@ public class SysRole extends BaseEntity this.deptIds = deptIds; } + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java index aecbd95a..d02baeb0 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java @@ -41,4 +41,9 @@ public class SecurityConstants * 登录用户 */ public static final String LOGIN_USER = "login_user"; + + /** + * 角色权限 + */ + public static final String ROLE_PERMISSION = "role_permission"; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java index 0a66f38f..2a8dde84 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java @@ -81,6 +81,16 @@ public class SecurityContextHolder set(SecurityConstants.USER_KEY, userKey); } + public static String getPermission() + { + return get(SecurityConstants.ROLE_PERMISSION); + } + + public static void setPermission(String permissions) + { + set(SecurityConstants.ROLE_PERMISSION, permissions); + } + public static void remove() { THREAD_LOCAL.remove(); diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java index 562a3482..f1878deb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java @@ -294,6 +294,32 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); } + /** + * 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param set 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + /** * 驼峰转下划线命名 */ diff --git a/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java b/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java index de78297a..e7911844 100644 --- a/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java +++ b/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java @@ -25,4 +25,9 @@ public @interface DataScope * 用户表的别名 */ public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; } diff --git a/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java b/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java index 61c78d29..e97944b5 100644 --- a/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java +++ b/ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java @@ -6,6 +6,8 @@ import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; +import com.ruoyi.common.core.context.SecurityContextHolder; +import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.BaseEntity; import com.ruoyi.common.datascope.annotation.DataScope; @@ -70,8 +72,9 @@ public class DataScopeAspect // 如果是超级管理员,则不过滤数据 if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), SecurityContextHolder.getPermission()); dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), - controllerDataScope.userAlias()); + controllerDataScope.userAlias(), permission); } } } @@ -83,8 +86,9 @@ public class DataScopeAspect * @param user 用户 * @param deptAlias 部门别名 * @param userAlias 用户别名 + * @param permission 权限字符 */ - public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) { StringBuilder sqlString = new StringBuilder(); List conditions = new ArrayList(); @@ -96,6 +100,11 @@ public class DataScopeAspect { continue; } + if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) + && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) + { + continue; + } if (DATA_SCOPE_ALL.equals(dataScope)) { sqlString = new StringBuilder(); diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java index 46bb4d6c..1f2d70f0 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java @@ -124,9 +124,9 @@ public class RedisService * @param collection 多个对象 * @return */ - public long deleteObject(final Collection collection) + public boolean deleteObject(final Collection collection) { - return redisTemplate.delete(collection); + return redisTemplate.delete(collection) > 0; } /** diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java index 61820df5..2d8bb999 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.springframework.util.PatternMatchUtils; +import com.ruoyi.common.core.context.SecurityContextHolder; import com.ruoyi.common.core.exception.auth.NotLoginException; import com.ruoyi.common.core.exception.auth.NotPermissionException; import com.ruoyi.common.core.exception.auth.NotRoleException; @@ -134,6 +135,7 @@ public class AuthLogic */ public void checkPermi(RequiresPermissions requiresPermissions) { + SecurityContextHolder.setPermission(StringUtils.join(requiresPermissions.value(), ",")); if (requiresPermissions.logical() == Logical.AND) { checkPermiAnd(requiresPermissions.value()); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java index e3cfc65e..eb100fab 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java @@ -1,6 +1,5 @@ package com.ruoyi.system.controller; -import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -55,8 +54,7 @@ public class SysDeptController extends BaseController public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { List depts = deptService.selectDeptList(new SysDept()); - depts.removeIf(d -> d.getDeptId().intValue() == deptId - || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); return AjaxResult.success(depts); } @@ -71,29 +69,6 @@ public class SysDeptController extends BaseController return AjaxResult.success(deptService.selectDeptById(deptId)); } - /** - * 获取部门下拉树列表 - */ - @GetMapping("/treeselect") - public AjaxResult treeselect(SysDept dept) - { - List depts = deptService.selectDeptList(dept); - return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); - } - - /** - * 加载对应角色部门列表树 - */ - @GetMapping(value = "/roleDeptTreeselect/{roleId}") - public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) - { - List depts = deptService.selectDeptList(new SysDept()); - AjaxResult ajax = AjaxResult.success(); - ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); - ajax.put("depts", deptService.buildDeptTreeSelect(depts)); - return ajax; - } - /** * 新增部门 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java index 5329e8ea..2c331554 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java @@ -21,9 +21,11 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.system.api.domain.SysDept; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; @@ -42,6 +44,9 @@ public class SysRoleController extends BaseController @Autowired private ISysUserService userService; + @Autowired + private ISysDeptService deptService; + @RequiresPermissions("system:role:list") @GetMapping("/list") public TableDataInfo list(SysRole role) @@ -219,4 +224,17 @@ public class SysRoleController extends BaseController roleService.checkRoleDataScope(roleId); return toAjax(roleService.insertAuthUsers(roleId, userIds)); } -} \ No newline at end of file + + /** + * 获取对应角色部门树列表 + */ + @RequiresPermissions("system:role:query") + @GetMapping(value = "/deptTree/{roleId}") + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return ajax; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java index cdd0b2da..b7b400de 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java @@ -29,10 +29,12 @@ import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.system.api.domain.SysDept; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysPermissionService; import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysRoleService; @@ -53,6 +55,9 @@ public class SysUserController extends BaseController @Autowired private ISysRoleService roleService; + @Autowired + private ISysDeptService deptService; + @Autowired private ISysPostService postService; @@ -116,9 +121,9 @@ public class SysUserController extends BaseController return R.fail("用户名或密码错误"); } // 角色集合 - Set roles = permissionService.getRolePermission(sysUser.getUserId()); + Set roles = permissionService.getRolePermission(sysUser); // 权限集合 - Set permissions = permissionService.getMenuPermission(sysUser.getUserId()); + Set permissions = permissionService.getMenuPermission(sysUser); LoginUser sysUserVo = new LoginUser(); sysUserVo.setSysUser(sysUser); sysUserVo.setRoles(roles); @@ -153,13 +158,13 @@ public class SysUserController extends BaseController @GetMapping("getInfo") public AjaxResult getInfo() { - Long userId = SecurityUtils.getUserId(); + SysUser user = userService.selectUserById(SecurityUtils.getUserId()); // 角色集合 - Set roles = permissionService.getRolePermission(userId); + Set roles = permissionService.getRolePermission(user); // 权限集合 - Set permissions = permissionService.getMenuPermission(userId); + Set permissions = permissionService.getMenuPermission(user); AjaxResult ajax = AjaxResult.success(); - ajax.put("user", userService.selectUserById(userId)); + ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); return ajax; @@ -309,4 +314,14 @@ public class SysUserController extends BaseController userService.insertUserAuth(userId, roleIds); return success(); } + + /** + * 获取部门树列表 + */ + @RequiresPermissions("system:user:list") + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDept dept) + { + return AjaxResult.success(deptService.selectDeptTreeList(dept)); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java index 8a141a4e..532aaa8d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java @@ -34,6 +34,14 @@ public interface SysMenuMapper */ public List selectMenuListByUserId(SysMenu menu); + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public List selectMenuPermsByRoleId(Long roleId); + /** * 根据用户ID查询权限 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index ed1f6115..1907fada 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -19,6 +19,14 @@ public interface ISysDeptService */ public List selectDeptList(SysDept dept); + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + public List selectDeptTreeList(SysDept dept); + /** * 构建前端所需要树结构 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java index 9c4daf4a..22260149 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java @@ -38,6 +38,14 @@ public interface ISysMenuService */ public Set selectMenuPermsByUserId(Long userId); + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public Set selectMenuPermsByRoleId(Long roleId); + /** * 根据用户ID查询菜单树信息 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java index f020bf9e..bc3bf322 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java @@ -2,6 +2,13 @@ package com.ruoyi.system.service; import java.util.Set; +import com.ruoyi.system.api.domain.SysUser; + +/** + * 权限信息 服务层 + * + * @author ruoyi + */ public interface ISysPermissionService { /** @@ -10,7 +17,7 @@ public interface ISysPermissionService * @param userId 用户Id * @return 角色权限信息 */ - public Set getRolePermission(Long userId); + public Set getRolePermission(SysUser user); /** * 获取菜单数据权限 @@ -18,5 +25,5 @@ public interface ISysPermissionService * @param userId 用户Id * @return 菜单权限信息 */ - public Set getMenuPermission(Long userId); + public Set getMenuPermission(SysUser user); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index f18254d1..5aca64b2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -48,6 +48,19 @@ public class SysDeptServiceImpl implements ISysDeptService return deptMapper.selectDeptList(dept); } + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + @Override + public List selectDeptTreeList(SysDept dept) + { + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + return buildDeptTreeSelect(depts); + } + /** * 构建前端所需要树结构 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index e63024c9..3569522c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -100,6 +100,27 @@ public class SysMenuServiceImpl implements ISysMenuService return permsSet; } + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) + { + List perms = menuMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) + { + if (StringUtils.isNotEmpty(perm)) + { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + /** * 根据用户ID查询菜单 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java index 46a8c7a8..d6750af1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java @@ -1,14 +1,21 @@ package com.ruoyi.system.service.impl; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysPermissionService; import com.ruoyi.system.service.ISysRoleService; +/** + * 用户权限处理 + * + * @author ruoyi + */ @Service public class SysPermissionServiceImpl implements ISysPermissionService { @@ -25,17 +32,17 @@ public class SysPermissionServiceImpl implements ISysPermissionService * @return 角色权限信息 */ @Override - public Set getRolePermission(Long userId) + public Set getRolePermission(SysUser user) { Set roles = new HashSet(); // 管理员拥有所有权限 - if (SysUser.isAdmin(userId)) + if (user.isAdmin()) { roles.add("admin"); } else { - roles.addAll(roleService.selectRolePermissionByUserId(userId)); + roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); } return roles; } @@ -47,17 +54,31 @@ public class SysPermissionServiceImpl implements ISysPermissionService * @return 菜单权限信息 */ @Override - public Set getMenuPermission(Long userId) + public Set getMenuPermission(SysUser user) { Set perms = new HashSet(); // 管理员拥有所有权限 - if (SysUser.isAdmin(userId)) + if (user.isAdmin()) { perms.add("*:*:*"); } else { - perms.addAll(menuService.selectMenuPermsByUserId(userId)); + List roles = user.getRoles(); + if (!roles.isEmpty() && roles.size() > 1) + { + // 多角色设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) + { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } + else + { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } } return perms; } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index f11402c7..e90f6baf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -111,6 +111,13 @@ where m.status = '0' and r.status = '0' and ur.user_id = #{userId} + +