diff --git a/smart-admin-api-java17-springboot3/pom.xml b/smart-admin-api-java17-springboot3/pom.xml index 4d8ad346..60d8a911 100644 --- a/smart-admin-api-java17-springboot3/pom.xml +++ b/smart-admin-api-java17-springboot3/pom.xml @@ -21,6 +21,7 @@ UTF-8 3.3.1 2.0.8 + 6.4.3 3.5.7 3.9.1 4.4.0 @@ -33,10 +34,11 @@ 2.15.0 3.12.0 4.4 + 1.26.0 1.13 1.9 2.12.0 - 3.3.2 + 1.0.0 5.2.4 1.4 1.11.842 @@ -48,7 +50,7 @@ 3.1 1.37.0 2.7.0 - 1.59 + 1.80 2.13.4 2.16.1 1.2.0 @@ -56,6 +58,7 @@ 2.2 2.3.33 1.18.1 + 3.1.0 @@ -83,6 +86,12 @@ + + org.springframework.security + spring-security-crypto + ${spring-security-crypto.version} + + p6spy p6spy @@ -156,6 +165,12 @@ ${commons-collections4.version} + + org.apache.commons + commons-compress + ${commons-compress.version} + + commons-codec commons-codec @@ -235,18 +250,18 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on ${bcprov.version} - com.alibaba - easyexcel - ${easy-excel.version} + cn.idev.excel + fastexcel + ${fast-excel.version} - poi-ooxml-schemas - org.apache.poi + logback-classic + ch.qos.logback @@ -318,6 +333,12 @@ ${freemarker.version} + + org.apache.tika + tika-core + ${tika.version} + + @@ -407,4 +428,4 @@ - \ No newline at end of file + diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java index 7205c5fe..28cd5511 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/interceptor/AdminInterceptor.java @@ -2,8 +2,8 @@ package net.lab1024.sa.admin.interceptor; import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.exception.SaTokenException; -import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.strategy.SaStrategy; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; @@ -14,14 +14,9 @@ import net.lab1024.sa.admin.module.system.login.service.LoginService; import net.lab1024.sa.base.common.annoation.NoNeedLogin; import net.lab1024.sa.base.common.code.SystemErrorCode; import net.lab1024.sa.base.common.code.UserErrorCode; -import net.lab1024.sa.base.common.constant.StringConst; import net.lab1024.sa.base.common.domain.ResponseDTO; -import net.lab1024.sa.base.common.domain.SystemEnvironment; -import net.lab1024.sa.base.common.enumeration.SystemEnvironmentEnum; -import net.lab1024.sa.base.common.enumeration.UserTypeEnum; import net.lab1024.sa.base.common.util.SmartRequestUtil; import net.lab1024.sa.base.common.util.SmartResponseUtil; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @@ -47,9 +42,6 @@ public class AdminInterceptor implements HandlerInterceptor { @Resource private LoginService loginService; - @Resource - private SystemEnvironment systemEnvironment; - @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { @@ -68,17 +60,7 @@ public class AdminInterceptor implements HandlerInterceptor { // --------------- 第一步: 根据token 获取用户 --------------- String tokenValue = StpUtil.getTokenValue(); - boolean debugNumberTokenFlag = isDevDebugNumberToken(tokenValue); - - String loginId = null; - if (debugNumberTokenFlag) { - //开发、测试环境,且为数字的话,则表明为 调试临时用户,即需要调用 sa-token switch - loginId = UserTypeEnum.ADMIN_EMPLOYEE.getValue() + StringConst.COLON + tokenValue; - StpUtil.switchTo(loginId); - } else { - loginId = (String) StpUtil.getLoginIdByToken(tokenValue); - } - + String loginId = (String) StpUtil.getLoginIdByToken(tokenValue); RequestEmployee requestEmployee = loginService.getLoginEmployee(loginId, request); // --------------- 第二步: 校验 登录 --------------- @@ -86,7 +68,7 @@ public class AdminInterceptor implements HandlerInterceptor { Method method = ((HandlerMethod) handler).getMethod(); NoNeedLogin noNeedLogin = ((HandlerMethod) handler).getMethodAnnotation(NoNeedLogin.class); if (noNeedLogin != null) { - checkActiveTimeout(requestEmployee, debugNumberTokenFlag); + checkActiveTimeout(requestEmployee); return true; } @@ -96,7 +78,7 @@ public class AdminInterceptor implements HandlerInterceptor { } // 检测token 活跃频率 - checkActiveTimeout(requestEmployee, debugNumberTokenFlag); + checkActiveTimeout(requestEmployee); // --------------- 第三步: 校验 权限 --------------- @@ -143,12 +125,7 @@ public class AdminInterceptor implements HandlerInterceptor { /** * 检测:token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结 */ - private void checkActiveTimeout(RequestEmployee requestEmployee, boolean debugNumberTokenFlag) { - - // 对于开发环境的 数字 debug token ,不需要检测活跃有效期 - if (debugNumberTokenFlag) { - return; - } + private void checkActiveTimeout(RequestEmployee requestEmployee) { // 用户不在线,也不用检测 if (requestEmployee == null) { @@ -160,28 +137,11 @@ public class AdminInterceptor implements HandlerInterceptor { } - /** - * 是否为开发使用的 debug token - * - * @param token - * @return - */ - private boolean isDevDebugNumberToken(String token) { - if (!StrUtil.isNumeric(token)) { - return false; - } - return systemEnvironment.getCurrentEnvironment() == SystemEnvironmentEnum.DEV - || systemEnvironment.getCurrentEnvironment() == SystemEnvironmentEnum.TEST; - } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 清除上下文 SmartRequestUtil.remove(); - // 开发环境,关闭 sa token 的临时切换用户 - if (systemEnvironment.getCurrentEnvironment() == SystemEnvironmentEnum.DEV) { - StpUtil.endSwitch(); - } } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsImportForm.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsImportForm.java index 4b832166..d6ccbffc 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsImportForm.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsImportForm.java @@ -1,6 +1,6 @@ package net.lab1024.sa.admin.module.business.goods.domain.form; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelProperty; import lombok.Data; import java.math.BigDecimal; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsExcelVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsExcelVO.java index fc7c8d8a..98a29b18 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsExcelVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsExcelVO.java @@ -1,6 +1,7 @@ package net.lab1024.sa.admin.module.business.goods.domain.vo; -import com.alibaba.excel.annotation.ExcelProperty; + +import cn.idev.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java index 686b8e55..24f07738 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/vo/GoodsVO.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import net.lab1024.sa.admin.module.business.goods.constant.GoodsStatusEnum; -import net.lab1024.sa.base.common.json.serializer.DictValueVoSerializer; import net.lab1024.sa.base.common.swagger.SchemaEnum; import java.math.BigDecimal; @@ -32,7 +31,6 @@ public class GoodsVO { private Integer goodsStatus; @Schema(description = "产地") - @JsonSerialize(using = DictValueVoSerializer.class) private String place; @Schema(description = "商品价格") diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java index b9287196..f6b41bde 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/service/GoodsService.java @@ -1,6 +1,6 @@ package net.lab1024.sa.admin.module.business.goods.service; -import com.alibaba.excel.EasyExcel; +import cn.idev.excel.FastExcel; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.annotation.Resource; @@ -174,7 +174,7 @@ public class GoodsService { public ResponseDTO importGoods(MultipartFile file) { List dataList; try { - dataList = EasyExcel.read(file.getInputStream()).head(GoodsImportForm.class) + dataList = FastExcel.read(file.getInputStream()).head(GoodsImportForm.class) .sheet() .doReadSync(); } catch (IOException e) { @@ -194,12 +194,13 @@ public class GoodsService { */ public List getAllGoods() { List goodsEntityList = goodsDao.selectList(null); + String keyCode="GODOS_PLACE"; return goodsEntityList.stream() .map(e -> GoodsExcelVO.builder() .goodsStatus(SmartEnumUtil.getEnumDescByValue(e.getGoodsStatus(), GoodsStatusEnum.class)) .categoryName(categoryQueryService.queryCategoryName(e.getCategoryId())) - .place(Arrays.stream(e.getPlace().split(",")).map(code -> dictCacheService.selectValueNameByValueCode(code)).collect(Collectors.joining(","))) + .place(Arrays.stream(e.getPlace().split(",")).map(code -> dictCacheService.selectValueNameByValueCode(keyCode,code)).collect(Collectors.joining(","))) .price(e.getPrice()) .goodsName(e.getGoodsName()) .remark(e.getRemark()) diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseExcelVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseExcelVO.java index 023f1b67..8b9c838e 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseExcelVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/domain/vo/EnterpriseExcelVO.java @@ -1,6 +1,6 @@ package net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo; -import com.alibaba.excel.annotation.ExcelProperty; +import cn.idev.excel.annotation.ExcelProperty; import lombok.Data; /** diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeQueryForm.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeQueryForm.java index fb78500d..1e9544b5 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeQueryForm.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/domain/form/NoticeQueryForm.java @@ -28,7 +28,7 @@ public class NoticeQueryForm extends PageParam { private String documentNumber; @Schema(description = "创建人") - private Long createUserId; + private String createUserName; @Schema(description = "删除标识") private Boolean deletedFlag; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeService.java index 2236f536..e3e4afb7 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/notice/service/NoticeService.java @@ -208,6 +208,10 @@ public class NoticeService { } NoticeUpdateFormVO updateFormVO = SmartBeanUtil.copy(noticeEntity, NoticeUpdateFormVO.class); + NoticeTypeVO noticeType = noticeTypeService.getByNoticeTypeId(noticeEntity.getNoticeTypeId()); + updateFormVO.setNoticeTypeName(noticeType.getNoticeTypeName()); + updateFormVO.setPublishFlag(updateFormVO.getPublishTime() != null && updateFormVO.getPublishTime().isBefore(LocalDateTime.now())); + if (!updateFormVO.getAllVisibleFlag()) { List noticeVisibleRangeList = noticeDao.queryVisibleRange(noticeId); List employeeIdList = noticeVisibleRangeList.stream().filter(e -> NoticeVisibleRangeDataTypeEnum.EMPLOYEE.getValue().equals(e.getDataType())) diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeViewTypeEnum.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeViewTypeEnum.java index c6ce9e20..2350e2c4 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeViewTypeEnum.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/constant/DataScopeViewTypeEnum.java @@ -5,7 +5,7 @@ import net.lab1024.sa.base.common.enumeration.BaseEnum; /** - * 数据范围 种类 + * 数据可见范围类型 * * @Author 1024创新实验室: 罗伊 * @Date 2020/11/28 20:59:17 diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeSqlConfig.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeSqlConfig.java index 65995c74..3ba5c42f 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeSqlConfig.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeSqlConfig.java @@ -25,7 +25,7 @@ public class DataScopeSqlConfig { /** * join sql 具体实现类 */ - private Class joinSqlImplClazz; + private Class joinSqlImplClazz; private String joinSql; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeViewTypeVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeViewTypeVO.java index 17b55fa8..106a2fc6 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeViewTypeVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/domain/DataScopeViewTypeVO.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; /** - * 数据范围 + * 数据可见范围 * * @Author 1024创新实验室: 罗伊 * @Date 2020/11/28 20:59:17 diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeSqlConfigService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeSqlConfigService.java index 38200442..b7063914 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeSqlConfigService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeSqlConfigService.java @@ -46,6 +46,11 @@ public class DataScopeSqlConfigService { private static final String DEPARTMENT_PARAM = "#departmentIds"; + /** + * 用于拼接查看本人数据范围的 SQL + */ + private static final String CREATE_USER_ID_EQUALS = "create_user_id = "; + private final ConcurrentHashMap dataScopeMethodMap = new ConcurrentHashMap<>(); @Resource @@ -94,14 +99,23 @@ public class DataScopeSqlConfigService { * 组装需要拼接的sql */ public String getJoinSql(Map paramMap, DataScopeSqlConfig sqlConfigDTO) { - DataScopeTypeEnum dataScopeTypeEnum = sqlConfigDTO.getDataScopeType(); - String joinSql = sqlConfigDTO.getJoinSql(); Long employeeId = SmartRequestUtil.getRequestUserId(); if (employeeId == null) { return ""; } + + DataScopeTypeEnum dataScopeTypeEnum = sqlConfigDTO.getDataScopeType(); + DataScopeViewTypeEnum viewTypeEnum = dataScopeViewService.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); + + // 数据权限设置为仅本人可见时 直接返回 create_user_id = employeeId + if (DataScopeViewTypeEnum.ME == viewTypeEnum) { + return CREATE_USER_ID_EQUALS + employeeId; + } + + String joinSql = sqlConfigDTO.getJoinSql(); + if (DataScopeWhereInTypeEnum.CUSTOM_STRATEGY == sqlConfigDTO.getDataScopeWhereInType()) { - Class strategyClass = sqlConfigDTO.getJoinSqlImplClazz(); + Class strategyClass = sqlConfigDTO.getJoinSqlImplClazz(); if (strategyClass == null) { log.warn("data scope custom strategy class is null"); return ""; @@ -111,11 +125,10 @@ public class DataScopeSqlConfigService { log.warn("data scope custom strategy class:{} ,bean is null", sqlConfigDTO.getJoinSqlImplClazz()); return ""; } - DataScopeViewTypeEnum viewTypeEnum = dataScopeViewService.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); return powerStrategy.getCondition(viewTypeEnum,paramMap, sqlConfigDTO); } if (DataScopeWhereInTypeEnum.EMPLOYEE == sqlConfigDTO.getDataScopeWhereInType()) { - List canViewEmployeeIds = dataScopeViewService.getCanViewEmployeeId(dataScopeTypeEnum, employeeId); + List canViewEmployeeIds = dataScopeViewService.getCanViewEmployeeId(viewTypeEnum, employeeId); if (CollectionUtils.isEmpty(canViewEmployeeIds)) { return ""; } @@ -124,7 +137,7 @@ public class DataScopeSqlConfigService { return sql; } if (DataScopeWhereInTypeEnum.DEPARTMENT == sqlConfigDTO.getDataScopeWhereInType()) { - List canViewDepartmentIds = dataScopeViewService.getCanViewDepartmentId(dataScopeTypeEnum, employeeId); + List canViewDepartmentIds = dataScopeViewService.getCanViewDepartmentId(viewTypeEnum, employeeId); if (CollectionUtils.isEmpty(canViewDepartmentIds)) { return ""; } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeViewService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeViewService.java index b426af30..b48134e6 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeViewService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/service/DataScopeViewService.java @@ -44,10 +44,9 @@ public class DataScopeViewService { private DepartmentService departmentService; /** - * 获取某人可以查看的所有人员信息 + * 获取某人可以查看的所有人员数据 */ - public List getCanViewEmployeeId(DataScopeTypeEnum dataScopeTypeEnum, Long employeeId) { - DataScopeViewTypeEnum viewType = this.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); + public List getCanViewEmployeeId(DataScopeViewTypeEnum viewType, Long employeeId) { if (DataScopeViewTypeEnum.ME == viewType) { return this.getMeEmployeeIdList(employeeId); } @@ -61,12 +60,12 @@ public class DataScopeViewService { } /** - * 获取某人可以查看的所有部门信息 + * 获取某人可以查看的所有部门数据 */ - public List getCanViewDepartmentId(DataScopeTypeEnum dataScopeTypeEnum, Long employeeId) { - DataScopeViewTypeEnum viewType = this.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); + public List getCanViewDepartmentId(DataScopeViewTypeEnum viewType, Long employeeId) { if (DataScopeViewTypeEnum.ME == viewType) { - return this.getMeDepartmentIdList(employeeId); + // 数据可见范围类型为本人时 不可以查看任何部门数据 + return Lists.newArrayList(0L); } if (DataScopeViewTypeEnum.DEPARTMENT == viewType) { return this.getMeDepartmentIdList(employeeId); @@ -74,6 +73,7 @@ public class DataScopeViewService { if (DataScopeViewTypeEnum.DEPARTMENT_AND_SUB == viewType) { return this.getDepartmentAndSubIdList(employeeId); } + // 可以查看所有部门数据 return Lists.newArrayList(); } @@ -91,10 +91,16 @@ public class DataScopeViewService { * 根据员工id 获取各数据范围最大的可见范围 map */ public DataScopeViewTypeEnum getEmployeeDataScopeViewType(DataScopeTypeEnum dataScopeTypeEnum, Long employeeId) { - if (employeeId == null) { + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (employeeEntity == null || employeeEntity.getEmployeeId() == null) { return DataScopeViewTypeEnum.ME; } + // 如果是超级管理员 则可查看全部 + if (employeeEntity.getAdministratorFlag()) { + return DataScopeViewTypeEnum.ALL; + } + List roleIdList = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); //未设置角色 默认本人 if (CollectionUtils.isEmpty(roleIdList)) { diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/entity/DepartmentEntity.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/entity/DepartmentEntity.java index 52882f8d..3887b47f 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/entity/DepartmentEntity.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/entity/DepartmentEntity.java @@ -3,6 +3,8 @@ package net.lab1024.sa.admin.module.system.department.domain.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.FieldStrategy; import lombok.Data; import java.time.LocalDateTime; @@ -34,6 +36,7 @@ public class DepartmentEntity { /** * 负责人员工 id */ + @TableField(updateStrategy = FieldStrategy.ALWAYS) private Long managerId; /** diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/controller/EmployeeController.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/controller/EmployeeController.java index 6393827a..b86f63e8 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/controller/EmployeeController.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/controller/EmployeeController.java @@ -57,11 +57,11 @@ public class EmployeeController { return employeeService.updateEmployee(employeeUpdateForm); } - @Operation(summary = "更新登录人信息 @author 善逸") - @PostMapping("/employee/update/login") - public ResponseDTO updateByLogin(@Valid @RequestBody EmployeeUpdateForm employeeUpdateForm) { - employeeUpdateForm.setEmployeeId(SmartRequestUtil.getRequestUserId()); - return employeeService.updateEmployee(employeeUpdateForm); + @Operation(summary = "更新员工个人中心信息 @author 善逸") + @PostMapping("/employee/update/center") + public ResponseDTO updateCenter(@Valid @RequestBody EmployeeUpdateCenterForm updateCenterForm) { + updateCenterForm.setEmployeeId(SmartRequestUtil.getRequestUserId()); + return employeeService.updateCenter(updateCenterForm); } @Operation(summary = "更新登录人头像 @author 善逸") diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/dao/EmployeeDao.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/dao/EmployeeDao.java index 6ef0acab..60a510df 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/dao/EmployeeDao.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/dao/EmployeeDao.java @@ -34,31 +34,30 @@ public interface EmployeeDao extends BaseMapper { */ List selectEmployeeByDisabledAndDeleted(@Param("disabledFlag") Boolean disabledFlag, @Param("deletedFlag") Boolean deletedFlag); - /** - * 更新单个 + * 更新禁用状态 */ void updateDisableFlag(@Param("employeeId") Long employeeId, @Param("disabledFlag") Boolean disabledFlag); - /** * 通过登录名查询 */ - EmployeeEntity getByLoginName(@Param("loginName") String loginName, - @Param("disabledFlag") Boolean disabledFlag); - + EmployeeEntity getByLoginName(@Param("loginName") String loginName, @Param("deletedFlag") Boolean deletedFlag); /** * 通过姓名查询 */ - EmployeeEntity getByActualName(@Param("actualName") String actualName, - @Param("disabledFlag") Boolean disabledFlag - ); + EmployeeEntity getByActualName(@Param("actualName") String actualName, @Param("deletedFlag") Boolean deletedFlag); /** * 通过手机号查询 */ - EmployeeEntity getByPhone(@Param("phone") String phone, @Param("disabledFlag") Boolean disabledFlag); + EmployeeEntity getByPhone(@Param("phone") String phone, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 通过邮箱账号查询 + */ + EmployeeEntity getByEmail(@Param("email") String email, @Param("deletedFlag") Boolean deletedFlag); /** * 获取所有员工 @@ -67,7 +66,6 @@ public interface EmployeeDao extends BaseMapper { /** * 获取某个部门员工数 - * */ Integer countByDepartmentId(@Param("departmentId") Long departmentId, @Param("deletedFlag") Boolean deletedFlag); @@ -76,39 +74,35 @@ public interface EmployeeDao extends BaseMapper { */ List getEmployeeByIds(@Param("employeeIds") Collection employeeIds); - /** * 查询单个员工信息 */ EmployeeVO getEmployeeById(@Param("employeeId") Long employeeId); - /** * 获取某个部门的员工 */ - List selectByDepartmentId(@Param("departmentId") Long departmentId, @Param("disabledFlag") Boolean disabledFlag); - + List selectByDepartmentId(@Param("departmentId") Long departmentId, @Param("deletedFlag") Boolean deletedFlag); /** * 查询某些部门下用户名是xxx的员工 */ - List selectByActualName(@Param("departmentIdList") List departmentIdList, @Param("actualName") String actualName, @Param("disabledFlag") Boolean disabledFlag); - + List selectByActualName(@Param("departmentIdList") List departmentIdList, @Param("actualName") String actualName, @Param("deletedFlag") Boolean deletedFlag); /** * 获取某批部门的员工Id */ - List getEmployeeIdByDepartmentIdList(@Param("departmentIds") List departmentIds, @Param("disabledFlag") Boolean disabledFlag); + List getEmployeeIdByDepartmentIdList(@Param("departmentIds") List departmentIds, @Param("deletedFlag") Boolean deletedFlag); /** * 获取所有 */ - List getEmployeeId(@Param("leaveFlag") Boolean leaveFlag, @Param("disabledFlag") Boolean disabledFlag); + List getEmployeeId(@Param("leaveFlag") Boolean leaveFlag, @Param("deletedFlag") Boolean deletedFlag); /** * 获取某个部门的员工Id */ - List getEmployeeIdByDepartmentId(@Param("departmentId") Long departmentId, @Param("disabledFlag") Boolean disabledFlag); + List getEmployeeIdByDepartmentId(@Param("departmentId") Long departmentId, @Param("deletedFlag") Boolean deletedFlag); /** * 员工重置密码 diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeAddForm.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeAddForm.java index 1d071218..00792d29 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeAddForm.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeAddForm.java @@ -51,17 +51,19 @@ public class EmployeeAddForm { @Pattern(regexp = SmartVerificationUtil.PHONE_REGEXP, message = "手机号格式不正确") private String phone; - @Schema(description = "邮箱") + @Schema(description = "邮箱账号") + @NotNull(message = "邮箱账号不能为空") + @Pattern(regexp = SmartVerificationUtil.EMAIL, message = "邮箱账号格式不正确") private String email; + @Schema(description = "职务级别ID") + private Long positionId; + @Schema(description = "角色列表") private List roleIdList; @Schema(description = "备注") - @Length(max = 30, message = "备注最多200字符") + @Length(max = 200, message = "备注最多200字符") private String remark; - @Schema(description = "职务级别ID") - private Long positionId; - } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdateCenterForm.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdateCenterForm.java new file mode 100644 index 00000000..a857ae4b --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdateCenterForm.java @@ -0,0 +1,56 @@ +package net.lab1024.sa.admin.module.system.employee.domain.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.Data; +import net.lab1024.sa.base.common.enumeration.GenderEnum; +import net.lab1024.sa.base.common.swagger.SchemaEnum; +import net.lab1024.sa.base.common.util.SmartVerificationUtil; +import net.lab1024.sa.base.common.validator.enumeration.CheckEnum; +import org.hibernate.validator.constraints.Length; + +/** + * 更新员工个人中心信息 + * + * @Author 1024创新实验室: 开云 + * @Date 2021-12-20 21:06:49 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@Data +public class EmployeeUpdateCenterForm { + + @Schema(hidden = true) + private Long employeeId; + + @Schema(description = "姓名") + @NotNull(message = "姓名不能为空") + @Length(max = 30, message = "姓名最多30字符") + private String actualName; + + @SchemaEnum(GenderEnum.class) + @CheckEnum(value = GenderEnum.class, message = "性别错误") + private Integer gender; + + @Schema(description = "手机号") + @NotNull(message = "手机号不能为空") + @Pattern(regexp = SmartVerificationUtil.PHONE_REGEXP, message = "手机号格式不正确") + private String phone; + + @Schema(description = "邮箱账号") + @NotNull(message = "邮箱账号不能为空") + @Pattern(regexp = SmartVerificationUtil.EMAIL, message = "邮箱账号格式不正确") + private String email; + + @Schema(description = "职务级别ID") + private Long positionId; + + @Schema(description = "头像") + private String avatar; + + @Schema(description = "备注") + @Length(max = 200, message = "备注最多200字符") + private String remark; +} diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/service/EmployeeService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/service/EmployeeService.java index 959e474e..5d684d31 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/service/EmployeeService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/service/EmployeeService.java @@ -168,19 +168,14 @@ public class EmployeeService { return ResponseDTO.userErrorParam("部门不存在"); } - - EmployeeEntity existEntity = employeeDao.getByLoginName(employeeUpdateForm.getLoginName(), null); - if (null != existEntity && !Objects.equals(existEntity.getEmployeeId(), employeeId)) { - return ResponseDTO.userErrorParam("登录名重复"); + // 检查唯一性 + ResponseDTO checkResponse = checkUniqueness(employeeId, employeeUpdateForm.getLoginName(), employeeUpdateForm.getPhone(), employeeUpdateForm.getEmail()); + if (!checkResponse.getOk()) { + return checkResponse; } - existEntity = employeeDao.getByPhone(employeeUpdateForm.getPhone(), null); - if (null != existEntity && !Objects.equals(existEntity.getEmployeeId(), employeeId)) { - return ResponseDTO.userErrorParam("手机号已存在"); - } - - // 不更新密码 EmployeeEntity entity = SmartBeanUtil.copy(employeeUpdateForm, EmployeeEntity.class); + // 不更新密码 entity.setLoginPwd(null); // 更新数据 @@ -192,6 +187,58 @@ public class EmployeeService { return ResponseDTO.ok(); } + /** + * 更新员工个人中心信息 + */ + public ResponseDTO updateCenter(EmployeeUpdateCenterForm updateCenterForm) { + + Long employeeId = updateCenterForm.getEmployeeId(); + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (null == employeeEntity) { + return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST); + } + + // 检查唯一性 登录账号不能修改则不需要检查 + ResponseDTO checkResponse = checkUniqueness(employeeId, "", updateCenterForm.getPhone(), updateCenterForm.getEmail()); + if (!checkResponse.getOk()) { + return checkResponse; + } + + EmployeeEntity employee = SmartBeanUtil.copy(updateCenterForm, EmployeeEntity.class); + // 不更新密码 + employee.setLoginPwd(null); + + // 更新数据 + employeeDao.updateById(employee); + + // 清除员工缓存 + loginService.clearLoginEmployeeCache(employeeId); + + return ResponseDTO.ok(); + } + + /** + * 检查唯一性 + */ + private ResponseDTO checkUniqueness(Long employeeId, String loginName, String phone, String email) { + EmployeeEntity existEntity = employeeDao.getByLoginName(loginName, null); + if (null != existEntity && !Objects.equals(existEntity.getEmployeeId(), employeeId)) { + return ResponseDTO.userErrorParam("登录名重复"); + } + + existEntity = employeeDao.getByPhone(phone, null); + if (null != existEntity && !Objects.equals(existEntity.getEmployeeId(), employeeId)) { + return ResponseDTO.userErrorParam("手机号已存在"); + } + + existEntity = employeeDao.getByEmail(email, null); + if (null != existEntity && !Objects.equals(existEntity.getEmployeeId(), employeeId)) { + return ResponseDTO.userErrorParam("邮箱账号已存在"); + } + + return ResponseDTO.ok(); + } + /** * 更新登录人头像 @@ -297,38 +344,39 @@ public class EmployeeService { if (employeeEntity == null) { return ResponseDTO.error(UserErrorCode.DATA_NOT_EXIST); } + // 校验原始密码 - String oldPassword = SecurityPasswordService.getEncryptPwd(updatePasswordForm.getOldPassword()); - if (!Objects.equals(oldPassword, employeeEntity.getLoginPwd())) { + if (!SecurityPasswordService.matchesPwd(updatePasswordForm.getOldPassword(),employeeEntity.getLoginPwd()) ) { return ResponseDTO.userErrorParam("原密码有误,请重新输入"); } + // 新旧密码相同 + if (Objects.equals(updatePasswordForm.getOldPassword(), updatePasswordForm.getNewPassword()) ){ + return ResponseDTO.userErrorParam("新密码与原始密码相同,请重新输入"); + } + // 校验密码复杂度 ResponseDTO validatePassComplexity = securityPasswordService.validatePasswordComplexity(updatePasswordForm.getNewPassword()); if (!validatePassComplexity.getOk()) { return validatePassComplexity; } - // 新旧密码相同 - String newPassword = SecurityPasswordService.getEncryptPwd(updatePasswordForm.getNewPassword()); - if (Objects.equals(oldPassword, newPassword)) { - return ResponseDTO.userErrorParam("新密码与原始密码相同,请重新输入"); - } - // 根据三级等保规则,校验密码是否重复 ResponseDTO passwordRepeatTimes = securityPasswordService.validatePasswordRepeatTimes(requestUser, updatePasswordForm.getNewPassword()); if (!passwordRepeatTimes.getOk()) { return ResponseDTO.error(passwordRepeatTimes); } + // 更新密码 + String newEncryptPassword = SecurityPasswordService.getEncryptPwd(updatePasswordForm.getNewPassword()); EmployeeEntity updateEntity = new EmployeeEntity(); updateEntity.setEmployeeId(employeeId); - updateEntity.setLoginPwd(newPassword); + updateEntity.setLoginPwd(newEncryptPassword); employeeDao.updateById(updateEntity); // 保存修改密码密码记录 - securityPasswordService.saveUserChangePasswordLog(requestUser, newPassword, oldPassword); + securityPasswordService.saveUserChangePasswordLog(requestUser, newEncryptPassword, employeeEntity.getLoginPwd()); return ResponseDTO.ok(); } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/controller/LoginController.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/controller/LoginController.java index 2d01476e..cac01bf4 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/controller/LoginController.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/controller/LoginController.java @@ -59,8 +59,8 @@ public class LoginController { @Operation(summary = "退出登陆 @author 卓大") @GetMapping("/login/logout") - public ResponseDTO logout(@RequestHeader(value = RequestHeaderConst.TOKEN, required = false) String token) { - return loginService.logout(token, SmartRequestUtil.getRequestUser()); + public ResponseDTO logout() { + return loginService.logout(SmartRequestUtil.getRequestUser()); } @Operation(summary = "获取验证码 @author 卓大") diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java index 5ba92785..0b61e3d2 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java @@ -46,6 +46,12 @@ public class RequestEmployee implements RequestUser { @Schema(description = "部门名称") private String departmentName; + @Schema(description = "职务级别ID") + private Long positionId; + + @Schema(description = "邮箱") + private String email; + @Schema(description = "是否禁用") private Boolean disabledFlag; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java index 90c76eac..b118b967 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java @@ -162,10 +162,15 @@ public class LoginService implements StpInterface { // 验证登录名 EmployeeEntity employeeEntity = employeeService.getByLoginName(loginForm.getLoginName()); if (null == employeeEntity) { - return ResponseDTO.userErrorParam("登录名不存在!"); + return ResponseDTO.userErrorParam("登录名或密码错误!"); } // 验证账号状态 + if (employeeEntity.getDeletedFlag()) { + saveLoginLog(employeeEntity, ip, userAgent, "账号已删除", LoginLogResultEnum.LOGIN_FAIL); + return ResponseDTO.userErrorParam("您的账号已被删除,请联系工作人员!"); + } + if (employeeEntity.getDisabledFlag()) { saveLoginLog(employeeEntity, ip, userAgent, "账号已禁用", LoginLogResultEnum.LOGIN_FAIL); return ResponseDTO.userErrorParam("您的账号已被禁用,请联系工作人员!"); @@ -201,7 +206,7 @@ public class LoginService implements StpInterface { } // 密码错误 - if (!employeeEntity.getLoginPwd().equals(SecurityPasswordService.getEncryptPwd(requestPassword))) { + if ( !SecurityPasswordService.matchesPwd(requestPassword,employeeEntity.getLoginPwd()) ) { // 记录登录失败 saveLoginLog(employeeEntity, ip, userAgent, "密码错误", LoginLogResultEnum.LOGIN_FAIL); // 记录等级保护次数 @@ -371,10 +376,10 @@ public class LoginService implements StpInterface { /** * 退出登录 */ - public ResponseDTO logout(String token, RequestUser requestUser) { + public ResponseDTO logout(RequestUser requestUser) { // sa token 登出 - StpUtil.logoutByTokenValue(token); + StpUtil.logout(); // 清空登录信息缓存 loginEmployeeCache.remove(requestUser.getUserId()); @@ -504,10 +509,14 @@ public class LoginService implements StpInterface { // 验证登录名 EmployeeEntity employeeEntity = employeeService.getByLoginName(loginName); if (null == employeeEntity) { - return ResponseDTO.userErrorParam("登录名不存在!"); + return ResponseDTO.ok(); } // 验证账号状态 + if (employeeEntity.getDeletedFlag()) { + return ResponseDTO.userErrorParam("您的账号已被删除,请联系工作人员!"); + } + if (employeeEntity.getDisabledFlag()) { return ResponseDTO.userErrorParam("您的账号已被禁用,请联系工作人员!"); } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/business/oa/notice/NoticeMapper.xml b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/business/oa/notice/NoticeMapper.xml index b1dc8ad5..9b141c80 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/business/oa/notice/NoticeMapper.xml +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/business/oa/notice/NoticeMapper.xml @@ -2,6 +2,28 @@ + + + t_notice.notice_id, + t_notice.notice_type_id, + t_notice.title, + t_notice.all_visible_flag, + t_notice.scheduled_publish_flag, + t_notice.publish_time, + t_notice.content_text, + t_notice.content_html, + t_notice.attachment, + t_notice.page_view_count, + t_notice.user_view_count, + t_notice.source, + t_notice.author, + t_notice.document_number, + t_notice.deleted_flag, + t_notice.create_user_id, + t_notice.update_time, + t_notice.create_time + + @@ -35,32 +57,30 @@ - select - t_notice.*, + , t_notice_type.notice_type_name, (select count(*) from t_notice_view_record where t_notice_view_record.employee_id = #{requestEmployeeId} and t_notice_view_record.notice_id = t_notice.notice_id) as viewFlag @@ -142,12 +161,11 @@ order by t_notice.publish_time desc - select * from ( select - t_notice.*, + , t_notice_type.notice_type_name, (select count(*) from t_notice_view_record where t_notice_view_record.employee_id = #{requestEmployeeId} and t_notice_view_record.notice_id = t_notice.notice_id) as viewFlag @@ -198,8 +216,7 @@ ) t where viewFlag = 0 order by t.publish_time desc - select t_notice_view_record.*, t_employee.actual_name as employeeName, t_department.name as departmentName diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml index 506c6832..670d52ed 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -33,21 +33,19 @@ - UPDATE t_employee SET disabled_flag = #{disabledFlag} WHERE employee_id = #{employeeId} - @@ -57,24 +55,33 @@ FROM t_employee actual_name = #{actualName} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} - + - - SELECT * FROM t_employee department_id = #{departmentId} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} ORDER BY create_time DESC - SELECT * FROM t_employee actual_name = #{actualName} @@ -111,8 +115,8 @@ #{item} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} @@ -125,20 +129,19 @@ #{item} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} ORDER BY create_time DESC - @@ -148,8 +151,8 @@ FROM t_employee department_id = #{departmentId} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} ORDER BY create_time DESC @@ -164,7 +167,6 @@ ORDER BY create_time DESC - - SELECT t_employee.*, t_department.name AS departmentName @@ -196,5 +197,4 @@ WHERE employee_id = #{employeeId} - \ No newline at end of file diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml index 12b84f0d..448fa583 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml @@ -19,9 +19,8 @@ \ No newline at end of file diff --git a/smart-admin-api-java17-springboot3/sa-base/pom.xml b/smart-admin-api-java17-springboot3/sa-base/pom.xml index fed5c0e9..45f99636 100644 --- a/smart-admin-api-java17-springboot3/sa-base/pom.xml +++ b/smart-admin-api-java17-springboot3/sa-base/pom.xml @@ -49,6 +49,11 @@ + + org.springframework.security + spring-security-crypto + + cn.dev33 @@ -172,6 +177,11 @@ commons-io + + org.apache.commons + commons-compress + + cn.hutool hutool-all @@ -204,12 +214,18 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on - com.alibaba - easyexcel + cn.idev.excel + fastexcel + + + logback-classic + ch.qos.logback + + @@ -268,7 +284,12 @@ freemarker + + org.apache.tika + tika-core + + - \ No newline at end of file + diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java index fe5acb62..d0e4060e 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java @@ -11,7 +11,7 @@ package net.lab1024.sa.base.common.constant; */ public class RequestHeaderConst { - public static final String TOKEN = "x-access-token"; + public static final String TOKEN = "Authorization"; public static final String USER_AGENT = "user-agent"; diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/DictValueVoSerializer.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/DictValueVoSerializer.java deleted file mode 100644 index 76d0083b..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/DictValueVoSerializer.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.sa.base.common.json.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.google.common.collect.Lists; -import jakarta.annotation.Resource; -import net.lab1024.sa.base.module.support.dict.domain.vo.DictValueVO; -import net.lab1024.sa.base.module.support.dict.service.DictCacheService; -import org.apache.commons.lang3.StringUtils; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -/** - * 字典序列化 - * - * @Author 1024创新实验室: 罗伊 - * @Date 2022-08-12 22:17:53 - * @Wechat zhuoda1024 - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -public class DictValueVoSerializer extends JsonSerializer { - - @Resource - private DictCacheService dictCacheService; - - - @Override - public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - if (StringUtils.isEmpty(value)) { - jsonGenerator.writeObject(Lists.newArrayList()); - return; - } - - String[] valueCodeArray = value.split(","); - List valueCodeList = Arrays.asList(valueCodeArray); - List dictValueVOList = Lists.newArrayList(); - valueCodeList.forEach(e->{ - if(StringUtils.isNotBlank(e)){ - DictValueVO dictValueVO = dictCacheService.selectValueByValueCode(e); - if(dictValueVO != null){ - dictValueVOList.add(dictValueVO); - } - } - }); - jsonGenerator.writeObject(dictValueVOList); - - } -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java index 48fde342..c917028f 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java @@ -1,9 +1,9 @@ package net.lab1024.sa.base.common.util; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import cn.idev.excel.FastExcel; +import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder; import jakarta.servlet.http.HttpServletResponse; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -43,7 +43,7 @@ public final class SmartExcelUtil { // 设置下载消息头 SmartResponseUtil.setDownloadFileHeader(response, fileName, null); // 下载 - EasyExcel.write(response.getOutputStream(), head) + FastExcel.write(response.getOutputStream(), head) .autoCloseStream(Boolean.FALSE) .sheet(sheetName) .doWrite(data); @@ -58,7 +58,7 @@ public final class SmartExcelUtil { // 水印 Watermark watermark = new Watermark(watermarkString); // 一定要inMemory - EasyExcel.write(response.getOutputStream(), head) + FastExcel.write(response.getOutputStream(), head) .inMemory(true) .sheet(sheetName) .registerWriteHandler(new CustomWaterMarkHandler(watermark)) diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartResponseUtil.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartResponseUtil.java index 3ce4cc08..2594fa6e 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartResponseUtil.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartResponseUtil.java @@ -9,8 +9,10 @@ import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import static cn.hutool.core.util.CharsetUtil.UTF_8; /** * 返回工具栏 @@ -27,8 +29,8 @@ public class SmartResponseUtil { public static void write(HttpServletResponse response, ResponseDTO responseDTO) { // 重置response - response.setContentType("application/json"); - response.setCharacterEncoding("utf-8"); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding(UTF_8); try { response.getWriter().write(JSON.toJSONString(responseDTO)); @@ -44,20 +46,15 @@ public class SmartResponseUtil { } public static void setDownloadFileHeader(HttpServletResponse response, String fileName, Long fileSize) { - response.setCharacterEncoding("utf-8"); - try { - if (fileSize != null) { - response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileSize)); - } + response.setCharacterEncoding(UTF_8); + if (fileSize != null) { + response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileSize)); + } - if (SmartStringUtil.isNotEmpty(fileName)) { - response.setHeader(HttpHeaders.CONTENT_TYPE, MediaTypeFactory.getMediaType(fileName).orElse(MediaType.APPLICATION_OCTET_STREAM) + ";charset=utf-8"); - response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20")); - response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION); - } - } catch (UnsupportedEncodingException e) { - log.error(e.getMessage(), e); - throw new RuntimeException(e); + if (SmartStringUtil.isNotEmpty(fileName)) { + response.setHeader(HttpHeaders.CONTENT_TYPE, MediaTypeFactory.getMediaType(fileName).orElse(MediaType.APPLICATION_OCTET_STREAM) + ";charset=utf-8"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20")); + response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION); } } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java index 6d93ccda..5aff202f 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java @@ -77,7 +77,7 @@ public class SwaggerConfig { private Components components() { return new Components() - .addSecuritySchemes(RequestHeaderConst.TOKEN, new SecurityScheme().type(SecurityScheme.Type.APIKEY).in(SecurityScheme.In.HEADER).name(RequestHeaderConst.TOKEN)); + .addSecuritySchemes(RequestHeaderConst.TOKEN, new SecurityScheme().scheme("Bearer").description("请输入token,格式为[Bearer xxxxxxxx]").type(SecurityScheme.Type.APIKEY).in(SecurityScheme.In.HEADER).name(RequestHeaderConst.TOKEN)); } @Bean diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java index 569944a4..0e65d902 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java @@ -18,5 +18,5 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface DataTracerFieldDict { - + String keyCode() default ""; } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java index 0052cdf3..c67e8569 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java @@ -303,7 +303,7 @@ public class DataTracerChangeContentService { fieldContent = SmartEnumUtil.getEnumDescByValue(fieldValue, dataTracerFieldEnum.enumClass()); } } else if (dataTracerFieldDict != null) { - fieldContent = dictCacheService.selectValueNameByValueCodeSplit(fieldValue.toString()); + fieldContent = dictCacheService.selectValueNameByValueCodeSplit(dataTracerFieldDict.keyCode(), fieldValue.toString()); } else if (dataTracerFieldSql != null) { fieldContent = this.getRelateDisplayValue(fieldValue, dataTracerFieldSql); } else if (fieldValue instanceof Date) { diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java index 9e31b7e5..2f0070a1 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java @@ -52,5 +52,5 @@ public interface DictValueDao extends BaseMapper { * 跟进code查询 * */ - DictValueEntity selectByCode(@Param("valueCode") String valueCode, @Param("deletedFlag") Boolean deletedFlag); + DictValueEntity selectByCode(@Param("dictKeyId") Long dictKeyId,@Param("valueCode") String valueCode, @Param("deletedFlag") Boolean deletedFlag); } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java index 13778341..ad9edf5d 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -41,8 +42,6 @@ public class DictCacheService { private ConcurrentHashMap> DICT_CACHE = new ConcurrentHashMap<>(); - private ConcurrentHashMap VALUE_CACHE = new ConcurrentHashMap<>(); - @PostConstruct public void dictCache() { @@ -63,10 +62,6 @@ public class DictCacheService { Long dictKeyId = dictKeyEntity.getDictKeyId(); DICT_CACHE.put(keyCode, valueListMap.getOrDefault(dictKeyId, Lists.newArrayList())); } - //字典值缓存 - dictValueVOList.forEach(e -> { - VALUE_CACHE.put(e.getValueCode(), e); - }); log.info("################# 数据字典缓存初始化完毕 ###################"); } @@ -75,7 +70,6 @@ public class DictCacheService { */ public ResponseDTO cacheRefresh() { DICT_CACHE.clear(); - VALUE_CACHE.clear(); this.cacheInit(); return ResponseDTO.ok(); } @@ -92,37 +86,45 @@ public class DictCacheService { /** * 查询值code名称 - * + * @param keyCode * @param valueCode * @return */ - public String selectValueNameByValueCode(String valueCode) { - if (StrUtil.isEmpty(valueCode)) { - return null; - } - - DictValueVO dictValueVO = VALUE_CACHE.get(valueCode); - if (dictValueVO == null) { + public String selectValueNameByValueCode(String keyCode, String valueCode) { + DictValueVO dictValueVO = this.selectValueByValueCode(keyCode, valueCode); + if (dictValueVO == null){ return ""; } - return dictValueVO.getValueName(); + return dictValueVO.getValueName() + ; } - public DictValueVO selectValueByValueCode(String valueCode) { + public DictValueVO selectValueByValueCode(String keyCode, String valueCode) { if (StrUtil.isEmpty(valueCode)) { return null; } - return VALUE_CACHE.get(valueCode); - } + if (StrUtil.isEmpty(keyCode)) { + return null; + } - public String selectValueNameByValueCodeSplit(String valueCodes) { + List dictValueVOList = DICT_CACHE.get(valueCode); + if (CollectionUtils.isEmpty(dictValueVOList)) { + return null; + } + Optional option = dictValueVOList.stream().filter(e->e.getValueCode().equals(valueCode)).findFirst(); + if(option.isPresent()){ + return option.get(); + } + return null; + } + public String selectValueNameByValueCodeSplit(String keyCode, String valueCodes) { if (StrUtil.isEmpty(valueCodes)) { return ""; } List valueNameList = Lists.newArrayList(); String[] valueCodeArray = valueCodes.split(","); for (String valueCode : valueCodeArray) { - DictValueVO dictValueVO = VALUE_CACHE.get(valueCode); + DictValueVO dictValueVO = this.selectValueByValueCode(keyCode, valueCode); if (dictValueVO != null) { valueNameList.add(dictValueVO.getValueName()); } @@ -130,4 +132,4 @@ public class DictCacheService { return StringUtils.join(valueNameList, ","); } -} \ No newline at end of file +} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java index e84280ed..481b2f4b 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java @@ -66,7 +66,7 @@ public class DictService { * @return */ public synchronized ResponseDTO valueAdd(DictValueAddForm valueAddForm) { - DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueAddForm.getValueCode(), false); + DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueAddForm.getDictKeyId(),valueAddForm.getValueCode(), false); if (dictValueEntity != null) { return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); } @@ -106,7 +106,7 @@ public class DictService { if (dictKeyEntity == null || dictKeyEntity.getDeletedFlag()) { return ResponseDTO.userErrorParam("key不能存在"); } - DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueUpdateForm.getValueCode(), false); + DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueUpdateForm.getDictKeyId(),valueUpdateForm.getValueCode(), false); if (dictValueEntity != null && !dictValueEntity.getDictValueId().equals(valueUpdateForm.getDictValueId())) { return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java index 5f90b153..00cb51ed 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java @@ -161,6 +161,10 @@ public class Level3ProtectConfigService { this.maxUploadFileSizeMb = configForm.getMaxUploadFileSizeMb(); } + if (configForm.getLoginFailMaxTimes() != null) { + this.loginFailMaxTimes = configForm.getLoginFailMaxTimes(); + } + if (configForm.getLoginFailLockMinutes() != null) { this.loginFailLockSeconds = configForm.getLoginFailLockMinutes() * 60; } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java index 6774a43c..df219c0c 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java @@ -1,14 +1,24 @@ package net.lab1024.sa.base.module.support.securityprotect.service; +import lombok.extern.slf4j.Slf4j; import jakarta.annotation.Resource; import net.lab1024.sa.base.common.domain.ResponseDTO; +import org.apache.tika.config.TikaConfig; +import org.apache.tika.exception.TikaException; +import org.apache.tika.io.TikaInputStream; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaCoreProperties; +import org.apache.tika.mime.MediaType; +import org.apache.tika.mime.MimeTypes; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; /** - * 三级等保 文件上传 相关 + * 三级等保 文件 相关 * * @Author 1024创新实验室-主任:卓大 * @Date 2024/08/22 19:25:59 @@ -18,11 +28,34 @@ import java.io.File; */ @Service +@Slf4j public class SecurityFileService { @Resource private Level3ProtectConfigService level3ProtectConfigService; + // 定义白名单MIME类型 + private static final List ALLOWED_MIME_TYPES = Arrays.asList( + "application/json", + "application/zip", + "application/x-7z-compressed", + "application/pdf", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-works", + "text/csv", + "audio/*", + "video/*", + // 图片类型 svg有安全隐患,所以不使用"image/*" + "image/jpeg", + "image/png", + "image/gif", + "image/bmp" + ); /** * 检测文件安全类型 @@ -38,15 +71,51 @@ public class SecurityFileService { } // 文件类型安全检测 - if (!level3ProtectConfigService.isFileDetectFlag()) { - return ResponseDTO.ok(); + if (level3ProtectConfigService.isFileDetectFlag()) { + String fileType = getFileMimeType(file); + if(ALLOWED_MIME_TYPES.stream() + .noneMatch(allowedType -> matchesMimeType(fileType, allowedType))){ + return ResponseDTO.userErrorParam("禁止上传此文件类型"); + } } - // 检测文件类型 - // ..... - return ResponseDTO.ok(); } + /** + * 获取文件的 MIME 类型 + * + * @param file 要检查的文件 + * @return 文件的 MIME 类型 + * + */ + public static String getFileMimeType(MultipartFile file) { + try { + TikaConfig tika = new TikaConfig(); + Metadata metadata = new Metadata(); + metadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, file.getOriginalFilename()); + TikaInputStream stream = TikaInputStream.get(file.getInputStream()); + MediaType mimetype = tika.getDetector().detect(stream, metadata); + return mimetype.toString(); + } catch (IOException | TikaException e) { + log.error(e.getMessage(), e); + return MimeTypes.OCTET_STREAM; + } + } + + /** + * 检查文件的 MIME 类型是否与指定的MIME 类型匹配(支持通配符) + * + * @param fileType 文件的 MIME 类型 + * @param mimetype MIME 类型(支持通配符) + * @return 是否匹配 + */ + private static boolean matchesMimeType(String fileType, String mimetype) { + if (mimetype.endsWith("/*")) { + String prefix = mimetype.substring(0, mimetype.length() - 1); + return fileType.startsWith(prefix); + } else { + return fileType.equalsIgnoreCase(mimetype); + } + } } -; \ No newline at end of file diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java index d3a58c59..167deb0f 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java @@ -8,6 +8,7 @@ import net.lab1024.sa.base.module.support.securityprotect.dao.PasswordLogDao; import net.lab1024.sa.base.module.support.securityprotect.domain.PasswordLogEntity; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -34,10 +35,8 @@ public class SecurityPasswordService { public static final String PASSWORD_FORMAT_MSG = "密码必须为长度8-20位且必须包含大小写字母、数字、特殊符号(如:@#$%^&*()_+-=)等三种字符"; - private static final int PASSWORD_LENGTH = 8; - private static final String PASSWORD_SALT_FORMAT = "smart_%s_admin_$^&*"; @Resource @@ -46,6 +45,8 @@ public class SecurityPasswordService { @Resource private Level3ProtectConfigService level3ProtectConfigService; + static Argon2PasswordEncoder ARGON2_PASSWORD_ENCODER = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); + /** * 校验密码复杂度 */ @@ -84,8 +85,9 @@ public class SecurityPasswordService { // 检查最近几次是否有重复密码 List oldPasswords = passwordLogDao.selectOldPassword(requestUser.getUserType().getValue(), requestUser.getUserId(), level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes()); - if (oldPasswords != null && oldPasswords.contains(getEncryptPwd(newPassword))) { - return ResponseDTO.userErrorParam(String.format("与前%s个历史密码重复,请换个密码!", level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes())); + boolean isDuplicate = oldPasswords.stream().anyMatch(oldPassword -> ARGON2_PASSWORD_ENCODER.matches(newPassword, oldPassword)); + if (isDuplicate) { + return ResponseDTO.userErrorParam(String.format("与前%d个历史密码重复,请换个密码!", level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes())); } return ResponseDTO.ok(); @@ -143,7 +145,14 @@ public class SecurityPasswordService { * 获取 加密后 的密码 */ public static String getEncryptPwd(String password) { - return DigestUtils.md5Hex(String.format(PASSWORD_SALT_FORMAT, password)); + return ARGON2_PASSWORD_ENCODER.encode(password); + } + + /** + * 校验密码是否匹配 + */ + public static Boolean matchesPwd( String password, String encodedPassword){ + return ARGON2_PASSWORD_ENCODER.matches( password, encodedPassword); } } diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/dao/Dao.java.vm b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/dao/Dao.java.vm index dd01bbc0..a4bd167f 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/dao/Dao.java.vm +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/dao/Dao.java.vm @@ -37,14 +37,14 @@ public interface ${name.upperCamel}Dao extends BaseMapper<${name.upperCamel}Enti /** * 更新删除状态 */ - long updateDeleted(@Param("${primaryKeyFieldName}")${primaryKeyJavaType} ${primaryKeyFieldName},@Param("deletedFlag")boolean deletedFlag); + long updateDeleted(@Param("${primaryKeyFieldName}") ${primaryKeyJavaType} ${primaryKeyFieldName}, @Param("deletedFlag") boolean deletedFlag); #end #if($deleteInfo.deleteEnum == "Batch" || $deleteInfo.deleteEnum == "SingleAndBatch") /** * 批量更新删除状态 */ - void batchUpdateDeleted(@Param("idList")List<${primaryKeyJavaType}> idList,@Param("deletedFlag")boolean deletedFlag); + void batchUpdateDeleted(@Param("idList") List<${primaryKeyJavaType}> idList, @Param("deletedFlag") boolean deletedFlag); #end #end diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/sql/Menu.sql.vm b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/sql/Menu.sql.vm index 90525f78..9ca5cc42 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/sql/Menu.sql.vm +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/java/sql/Menu.sql.vm @@ -10,13 +10,13 @@ SET @parent_id = NULL; SELECT t_menu.menu_id INTO @parent_id FROM t_menu WHERE t_menu.menu_name = '${basic.description}'; INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id ) -VALUES ( '查询', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:query', 1, @parent_id, 1 ); +VALUES ( '查询', 3, @parent_id, false, false, true, false, '${name.lowerCamel}:query', 1, @parent_id, 1 ); INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id ) -VALUES ( '添加', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:add', 1, @parent_id, 1 ); +VALUES ( '添加', 3, @parent_id, false, false, true, false, '${name.lowerCamel}:add', 1, @parent_id, 1 ); INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id ) -VALUES ( '更新', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:update', 1, @parent_id, 1 ); +VALUES ( '更新', 3, @parent_id, false, false, true, false, '${name.lowerCamel}:update', 1, @parent_id, 1 ); INSERT INTO t_menu ( menu_name, menu_type, parent_id, frame_flag, cache_flag, visible_flag, disabled_flag, api_perms, perms_type, context_menu_id, create_user_id ) -VALUES ( '删除', 3, @parent_id, false, true, true, false, '${name.lowerCamel}:delete', 1, @parent_id, 1 ); +VALUES ( '删除', 3, @parent_id, false, false, true, false, '${name.lowerCamel}:delete', 1, @parent_id, 1 ); diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/dev/sa-base.yaml b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/dev/sa-base.yaml index 1600d310..e6cdf57d 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/dev/sa-base.yaml +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/dev/sa-base.yaml @@ -132,7 +132,9 @@ reload: # sa-token 配置 sa-token: # token 名称(同时也是 cookie 名称) - token-name: x-access-token + token-name: Authorization + # token 前缀 例如:Bearer + token-prefix: Bearer # token 有效期(单位:秒) 默认30天(2592000秒),-1 代表永久有效 timeout: 2592000 # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/mapper/support/DictValueMapper.xml b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/mapper/support/DictValueMapper.xml index f0bc3faf..1aecdc4f 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/mapper/support/DictValueMapper.xml +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/mapper/support/DictValueMapper.xml @@ -29,7 +29,7 @@ SELECT - t_notice.* , + , t_notice_type.notice_type_name as noticeTypeName, - t_employee.actual_name as createUserName, - t_department.name as departmentName + t_employee.actual_name as createUserName FROM t_notice - left join t_notice_type on t_notice_type.notice_type_id = t_notice.notice_type_id - left join t_employee on t_notice.create_user_id = t_employee.employee_id - left join t_department on t_employee.department_id = t_department.department_id + LEFT JOIN t_notice_type on t_notice.notice_type_id = t_notice_type.notice_type_id + LEFT JOIN t_employee on t_notice.create_user_id = t_employee.employee_id AND t_notice_type.notice_type_id = #{query.noticeTypeId} - + AND ( INSTR(t_notice.title,#{query.keywords}) OR INSTR(t_notice.author,#{query.keywords}) OR INSTR(t_notice.source,#{query.keywords}) ) - + AND INSTR(t_notice.document_number, #{query.documentNumber}) - - AND t_notice.create_user_id = #{createUserId} + + AND t_employee.actual_name = #{query.createUserName} - and t_notice.deleted_flag = #{query.deletedFlag} + AND t_notice.deleted_flag = #{query.deletedFlag} AND DATE_FORMAT(t_notice.create_time, '%Y-%m-%d') >= DATE_FORMAT(#{query.createTimeBegin}, @@ -84,10 +104,9 @@ - select - t_notice.*, + , t_notice_type.notice_type_name, (select count(*) from t_notice_view_record where t_notice_view_record.employee_id = #{requestEmployeeId} and t_notice_view_record.notice_id = t_notice.notice_id) as viewFlag @@ -142,12 +161,11 @@ order by t_notice.publish_time desc - select * from ( select - t_notice.*, + , t_notice_type.notice_type_name, (select count(*) from t_notice_view_record where t_notice_view_record.employee_id = #{requestEmployeeId} and t_notice_view_record.notice_id = t_notice.notice_id) as viewFlag @@ -198,8 +216,7 @@ ) t where viewFlag = 0 order by t.publish_time desc - select t_notice_view_record.*, t_employee.actual_name as employeeName, t_department.name as departmentName diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml index 506c6832..670d52ed 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -33,21 +33,19 @@ - UPDATE t_employee SET disabled_flag = #{disabledFlag} WHERE employee_id = #{employeeId} - @@ -57,24 +55,33 @@ FROM t_employee actual_name = #{actualName} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} - + - - SELECT * FROM t_employee department_id = #{departmentId} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} ORDER BY create_time DESC - SELECT * FROM t_employee actual_name = #{actualName} @@ -111,8 +115,8 @@ #{item} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} @@ -125,20 +129,19 @@ #{item} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} ORDER BY create_time DESC - @@ -148,8 +151,8 @@ FROM t_employee department_id = #{departmentId} - - AND disabled_flag = #{disabledFlag} + + AND deleted_flag = #{deletedFlag} ORDER BY create_time DESC @@ -164,7 +167,6 @@ ORDER BY create_time DESC - - SELECT t_employee.*, t_department.name AS departmentName @@ -196,5 +197,4 @@ WHERE employee_id = #{employeeId} - \ No newline at end of file diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml b/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml index 12b84f0d..448fa583 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/role/RoleMenuMapper.xml @@ -19,9 +19,8 @@ \ No newline at end of file diff --git a/smart-admin-api-java8-springboot2/sa-base/pom.xml b/smart-admin-api-java8-springboot2/sa-base/pom.xml index 52e773e1..d0864424 100644 --- a/smart-admin-api-java8-springboot2/sa-base/pom.xml +++ b/smart-admin-api-java8-springboot2/sa-base/pom.xml @@ -87,6 +87,11 @@ spring-boot-starter-test + + org.springframework.security + spring-security-crypto + + com.mysql mysql-connector-j @@ -193,6 +198,11 @@ commons-io + + org.apache.commons + commons-compress + + cn.hutool hutool-all @@ -225,12 +235,18 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on - com.alibaba - easyexcel + cn.idev.excel + fastexcel + + + logback-classic + ch.qos.logback + + @@ -298,8 +314,13 @@ freemarker + + org.apache.tika + tika-core + ${tika.version} + - \ No newline at end of file + diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java index fe5acb62..d0e4060e 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/constant/RequestHeaderConst.java @@ -11,7 +11,7 @@ package net.lab1024.sa.base.common.constant; */ public class RequestHeaderConst { - public static final String TOKEN = "x-access-token"; + public static final String TOKEN = "Authorization"; public static final String USER_AGENT = "user-agent"; diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/DictValueVoSerializer.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/DictValueVoSerializer.java deleted file mode 100644 index fceba7b4..00000000 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/json/serializer/DictValueVoSerializer.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.sa.base.common.json.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.google.common.collect.Lists; -import net.lab1024.sa.base.module.support.dict.domain.vo.DictValueVO; -import net.lab1024.sa.base.module.support.dict.service.DictCacheService; -import org.apache.commons.lang3.StringUtils; - -import javax.annotation.Resource; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -/** - * 字典序列化 - * - * @Author 1024创新实验室: 罗伊 - * @Date 2022-08-12 22:17:53 - * @Wechat zhuoda1024 - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -public class DictValueVoSerializer extends JsonSerializer { - - @Resource - private DictCacheService dictCacheService; - - - @Override - public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - if (StringUtils.isEmpty(value)) { - jsonGenerator.writeObject(Lists.newArrayList()); - return; - } - - String[] valueCodeArray = value.split(","); - List valueCodeList = Arrays.asList(valueCodeArray); - List dictValueVOList = Lists.newArrayList(); - valueCodeList.forEach(e->{ - if(StringUtils.isNotBlank(e)){ - DictValueVO dictValueVO = dictCacheService.selectValueByValueCode(e); - if(dictValueVO != null){ - dictValueVOList.add(dictValueVO); - } - } - }); - jsonGenerator.writeObject(dictValueVOList); - - } -} diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java index 47dad555..175a230a 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/util/SmartExcelUtil.java @@ -1,9 +1,9 @@ package net.lab1024.sa.base.common.util; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.write.handler.SheetWriteHandler; -import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; -import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; +import cn.idev.excel.FastExcel; +import cn.idev.excel.write.handler.SheetWriteHandler; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.poi.openxml4j.opc.PackagePartName; @@ -43,7 +43,7 @@ public final class SmartExcelUtil { // 设置下载消息头 SmartResponseUtil.setDownloadFileHeader(response, fileName, null); // 下载 - EasyExcel.write(response.getOutputStream(), head) + FastExcel.write(response.getOutputStream(), head) .autoCloseStream(Boolean.FALSE) .sheet(sheetName) .doWrite(data); @@ -58,7 +58,7 @@ public final class SmartExcelUtil { // 水印 Watermark watermark = new Watermark(watermarkString); // 一定要inMemory - EasyExcel.write(response.getOutputStream(), head) + FastExcel.write(response.getOutputStream(), head) .inMemory(true) .sheet(sheetName) .registerWriteHandler(new CustomWaterMarkHandler(watermark)) diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java index e980dba1..99e9cb77 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/SwaggerConfig.java @@ -73,7 +73,7 @@ public class SwaggerConfig { private Components components() { return new Components() - .addSecuritySchemes(RequestHeaderConst.TOKEN, new SecurityScheme().type(SecurityScheme.Type.APIKEY).in(SecurityScheme.In.HEADER).name(RequestHeaderConst.TOKEN)); + .addSecuritySchemes(RequestHeaderConst.TOKEN, new SecurityScheme().scheme("Bearer").description("请输入token,格式为[Bearer xxxxxxxx]").type(SecurityScheme.Type.APIKEY).in(SecurityScheme.In.HEADER).name(RequestHeaderConst.TOKEN)); } @Bean diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java index 14f8ff5f..68b77e45 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java @@ -40,7 +40,7 @@ public class MapperVariableService extends CodeGenerateBaseVariableService { List columnNameList = queryField.getColumnNameList(); if (columnNameList.size() == 1) { // AND INSTR(t_notice.title,#{query.keywords}) - stringBuilder.append(" AND INSTR(") + stringBuilder.append("AND INSTR(") .append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(0)) .append(",#{queryForm.") .append(queryField.getFieldName()) @@ -48,21 +48,21 @@ public class MapperVariableService extends CodeGenerateBaseVariableService { } else { for (int i = 0; i < columnNameList.size(); i++) { if (i == 0) { - stringBuilder.append("AND ( INSTR(") + stringBuilder.append("AND (\n INSTR(") .append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(i)) .append(",#{queryForm.") .append(queryField.getFieldName()) .append("})"); } else { // OR INSTR(t_notice.author,#{query.keywords}) - stringBuilder.append("\n OR INSTR(") + stringBuilder.append("\n OR INSTR(") .append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(i)) .append(",#{queryForm.") .append(queryField.getFieldName()) .append("})"); } } - stringBuilder.append("\n )"); + stringBuilder.append("\n )"); } fieldMap.put("likeStr", stringBuilder.toString()); } else if (CodeQueryFieldQueryTypeEnum.DICT.equalsValue(queryField.getQueryTypeEnum())) { diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java index 569944a4..0e65d902 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/annoation/DataTracerFieldDict.java @@ -18,5 +18,5 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface DataTracerFieldDict { - + String keyCode() default ""; } diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java index b6d8c881..808c7aac 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/datatracer/service/DataTracerChangeContentService.java @@ -303,7 +303,7 @@ public class DataTracerChangeContentService { fieldContent = SmartEnumUtil.getEnumDescByValue(fieldValue, dataTracerFieldEnum.enumClass()); } } else if (dataTracerFieldDict != null) { - fieldContent = dictCacheService.selectValueNameByValueCodeSplit(fieldValue.toString()); + fieldContent = dictCacheService.selectValueNameByValueCodeSplit(dataTracerFieldDict.keyCode(), fieldValue.toString()); } else if (dataTracerFieldSql != null) { fieldContent = this.getRelateDisplayValue(fieldValue, dataTracerFieldSql); } else if (fieldValue instanceof Date) { diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java index 9e31b7e5..2f0070a1 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/dao/DictValueDao.java @@ -52,5 +52,5 @@ public interface DictValueDao extends BaseMapper { * 跟进code查询 * */ - DictValueEntity selectByCode(@Param("valueCode") String valueCode, @Param("deletedFlag") Boolean deletedFlag); + DictValueEntity selectByCode(@Param("dictKeyId") Long dictKeyId,@Param("valueCode") String valueCode, @Param("deletedFlag") Boolean deletedFlag); } diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java index 69c01761..7279cbdb 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictCacheService.java @@ -18,6 +18,7 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -41,8 +42,6 @@ public class DictCacheService { private ConcurrentHashMap> DICT_CACHE = new ConcurrentHashMap<>(); - private ConcurrentHashMap VALUE_CACHE = new ConcurrentHashMap<>(); - @PostConstruct public void dictCache() { @@ -63,10 +62,6 @@ public class DictCacheService { Long dictKeyId = dictKeyEntity.getDictKeyId(); DICT_CACHE.put(keyCode, valueListMap.getOrDefault(dictKeyId, Lists.newArrayList())); } - //字典值缓存 - dictValueVOList.forEach(e -> { - VALUE_CACHE.put(e.getValueCode(), e); - }); log.info("################# 数据字典缓存初始化完毕 ###################"); } @@ -75,7 +70,6 @@ public class DictCacheService { */ public ResponseDTO cacheRefresh() { DICT_CACHE.clear(); - VALUE_CACHE.clear(); this.cacheInit(); return ResponseDTO.ok(); } @@ -92,37 +86,45 @@ public class DictCacheService { /** * 查询值code名称 - * + * @param keyCode * @param valueCode * @return */ - public String selectValueNameByValueCode(String valueCode) { - if (StrUtil.isEmpty(valueCode)) { - return null; - } - - DictValueVO dictValueVO = VALUE_CACHE.get(valueCode); - if (dictValueVO == null) { + public String selectValueNameByValueCode(String keyCode, String valueCode) { + DictValueVO dictValueVO = this.selectValueByValueCode(keyCode, valueCode); + if (dictValueVO == null){ return ""; } - return dictValueVO.getValueName(); + return dictValueVO.getValueName() + ; } - public DictValueVO selectValueByValueCode(String valueCode) { + public DictValueVO selectValueByValueCode(String keyCode, String valueCode) { if (StrUtil.isEmpty(valueCode)) { return null; } - return VALUE_CACHE.get(valueCode); - } + if (StrUtil.isEmpty(keyCode)) { + return null; + } - public String selectValueNameByValueCodeSplit(String valueCodes) { + List dictValueVOList = DICT_CACHE.get(valueCode); + if (CollectionUtils.isEmpty(dictValueVOList)) { + return null; + } + Optional option = dictValueVOList.stream().filter(e->e.getValueCode().equals(valueCode)).findFirst(); + if(option.isPresent()){ + return option.get(); + } + return null; + } + public String selectValueNameByValueCodeSplit(String keyCode, String valueCodes) { if (StrUtil.isEmpty(valueCodes)) { return ""; } List valueNameList = Lists.newArrayList(); String[] valueCodeArray = valueCodes.split(","); for (String valueCode : valueCodeArray) { - DictValueVO dictValueVO = VALUE_CACHE.get(valueCode); + DictValueVO dictValueVO = this.selectValueByValueCode(keyCode, valueCode); if (dictValueVO != null) { valueNameList.add(dictValueVO.getValueName()); } @@ -130,4 +132,4 @@ public class DictCacheService { return StringUtils.join(valueNameList, ","); } -} \ No newline at end of file +} diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java index 439f96f6..f162472b 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/dict/service/DictService.java @@ -1,6 +1,8 @@ package net.lab1024.sa.base.module.support.dict.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; import net.lab1024.sa.base.common.code.UserErrorCode; import net.lab1024.sa.base.common.domain.PageResult; import net.lab1024.sa.base.common.domain.ResponseDTO; @@ -26,7 +28,7 @@ import java.util.List; * @Date 2022/5/26 19:40:55 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Service public class DictService { @@ -37,6 +39,10 @@ public class DictService { private DictValueDao dictValueDao; @Resource private DictCacheService dictCacheService; + /** + * CODE锁 + */ + private static final Interner CODE_POOL = Interners.newWeakInterner(); /** @@ -45,15 +51,15 @@ public class DictService { * @param keyAddForm * @return */ - public synchronized ResponseDTO keyAdd(DictKeyAddForm keyAddForm) { - DictKeyEntity dictKeyEntity = dictKeyDao.selectByCode(keyAddForm.getKeyCode(), false); - if (dictKeyEntity != null) { - return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + public ResponseDTO keyAdd(DictKeyAddForm keyAddForm) { + synchronized (CODE_POOL.intern(keyAddForm.getKeyCode())) { + DictKeyEntity dictKeyEntity = dictKeyDao.selectByCode(keyAddForm.getKeyCode(), false); + if (dictKeyEntity != null) { + return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + } + dictKeyEntity = SmartBeanUtil.copy(keyAddForm, DictKeyEntity.class); + dictKeyDao.insert(dictKeyEntity); } - dictKeyEntity = SmartBeanUtil.copy(keyAddForm, DictKeyEntity.class); - dictKeyDao.insert(dictKeyEntity); - //刷新缓存 - dictCacheService.cacheRefresh(); return ResponseDTO.ok(); } @@ -63,15 +69,16 @@ public class DictService { * @param valueAddForm * @return */ - public synchronized ResponseDTO valueAdd(DictValueAddForm valueAddForm) { - DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueAddForm.getValueCode(), false); - if (dictValueEntity != null) { - return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + public ResponseDTO valueAdd(DictValueAddForm valueAddForm) { + + synchronized (CODE_POOL.intern(valueAddForm.getValueCode())) { + DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueAddForm.getDictKeyId(),valueAddForm.getValueCode(), false); + if (dictValueEntity != null) { + return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + } + dictValueEntity = SmartBeanUtil.copy(valueAddForm, DictValueEntity.class); + dictValueDao.insert(dictValueEntity); } - dictValueEntity = SmartBeanUtil.copy(valueAddForm, DictValueEntity.class); - dictValueDao.insert(dictValueEntity); - //刷新缓存 - dictCacheService.cacheRefresh(); return ResponseDTO.ok(); } @@ -81,15 +88,15 @@ public class DictService { * @param keyUpdateForm * @return */ - public synchronized ResponseDTO keyEdit(DictKeyUpdateForm keyUpdateForm) { - DictKeyEntity dictKeyEntity = dictKeyDao.selectByCode(keyUpdateForm.getKeyCode(), false); - if (dictKeyEntity != null && !dictKeyEntity.getDictKeyId().equals(keyUpdateForm.getDictKeyId())) { - return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + public ResponseDTO keyEdit(DictKeyUpdateForm keyUpdateForm) { + synchronized (CODE_POOL.intern(keyUpdateForm.getKeyCode())) { + DictKeyEntity dictKeyEntity = dictKeyDao.selectByCode(keyUpdateForm.getKeyCode(), false); + if (dictKeyEntity != null && !dictKeyEntity.getDictKeyId().equals(keyUpdateForm.getDictKeyId())) { + return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + } + DictKeyEntity dictKeyUpdateEntity = SmartBeanUtil.copy(keyUpdateForm, DictKeyEntity.class); + dictKeyDao.updateById(dictKeyUpdateEntity); } - DictKeyEntity dictKeyUpdateEntity = SmartBeanUtil.copy(keyUpdateForm, DictKeyEntity.class); - dictKeyDao.updateById(dictKeyUpdateEntity); - //刷新缓存 - dictCacheService.cacheRefresh(); return ResponseDTO.ok(); } @@ -99,19 +106,19 @@ public class DictService { * @param valueUpdateForm * @return */ - public synchronized ResponseDTO valueEdit(DictValueUpdateForm valueUpdateForm) { + public ResponseDTO valueEdit(DictValueUpdateForm valueUpdateForm) { DictKeyEntity dictKeyEntity = dictKeyDao.selectById(valueUpdateForm.getDictKeyId()); if (dictKeyEntity == null || dictKeyEntity.getDeletedFlag()) { return ResponseDTO.userErrorParam("key不能存在"); } - DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueUpdateForm.getValueCode(), false); - if (dictValueEntity != null && !dictValueEntity.getDictValueId().equals(valueUpdateForm.getDictValueId())) { - return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + synchronized (CODE_POOL.intern(valueUpdateForm.getValueCode())) { + DictValueEntity dictValueEntity = dictValueDao.selectByCode(valueUpdateForm.getDictKeyId() ,valueUpdateForm.getValueCode(), false); + if (dictValueEntity != null && !dictValueEntity.getDictValueId().equals(valueUpdateForm.getDictValueId())) { + return ResponseDTO.error(UserErrorCode.ALREADY_EXIST); + } + DictValueEntity dictValueUpdateEntity = SmartBeanUtil.copy(valueUpdateForm, DictValueEntity.class); + dictValueDao.updateById(dictValueUpdateEntity); } - DictValueEntity dictValueUpdateEntity = SmartBeanUtil.copy(valueUpdateForm, DictValueEntity.class); - dictValueDao.updateById(dictValueUpdateEntity); - //刷新缓存 - dictCacheService.cacheRefresh(); return ResponseDTO.ok(); } @@ -121,13 +128,11 @@ public class DictService { * @param keyIdList * @return */ - public synchronized ResponseDTO keyDelete(List keyIdList) { + public ResponseDTO keyDelete(List keyIdList) { if (CollectionUtils.isEmpty(keyIdList)) { return ResponseDTO.ok(); } dictKeyDao.updateDeletedFlagByIdList(keyIdList, true); - //刷新缓存 - dictCacheService.cacheRefresh(); return ResponseDTO.ok(); } @@ -137,13 +142,11 @@ public class DictService { * @param valueIdList * @return */ - public synchronized ResponseDTO valueDelete(List valueIdList) { + public ResponseDTO valueDelete(List valueIdList) { if (CollectionUtils.isEmpty(valueIdList)) { return ResponseDTO.ok(); } dictValueDao.updateDeletedFlagByIdList(valueIdList, true); - //刷新缓存 - dictCacheService.cacheRefresh(); return ResponseDTO.ok(); } diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java index 343b868d..db573d2a 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/Level3ProtectConfigService.java @@ -162,6 +162,10 @@ public class Level3ProtectConfigService { this.maxUploadFileSizeMb = configForm.getMaxUploadFileSizeMb(); } + if (configForm.getLoginFailMaxTimes() != null) { + this.loginFailMaxTimes = configForm.getLoginFailMaxTimes(); + } + if (configForm.getLoginFailLockMinutes() != null) { this.loginFailLockSeconds = configForm.getLoginFailLockMinutes() * 60; } diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java index cdea03a4..e49bee98 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java @@ -1,14 +1,24 @@ package net.lab1024.sa.base.module.support.securityprotect.service; +import lombok.extern.slf4j.Slf4j; import net.lab1024.sa.base.common.domain.ResponseDTO; +import org.apache.tika.config.TikaConfig; +import org.apache.tika.exception.TikaException; +import org.apache.tika.io.TikaInputStream; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.metadata.TikaCoreProperties; +import org.apache.tika.mime.MediaType; +import org.apache.tika.mime.MimeTypes; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; /** - * 三级等保 文件上传 相关 + * 三级等保 文件 相关 * * @Author 1024创新实验室-主任:卓大 * @Date 2024/08/22 19:25:59 @@ -18,11 +28,34 @@ import java.io.File; */ @Service +@Slf4j public class SecurityFileService { @Resource private Level3ProtectConfigService level3ProtectConfigService; + // 定义白名单MIME类型 + private static final List ALLOWED_MIME_TYPES = Arrays.asList( + "application/json", + "application/zip", + "application/x-7z-compressed", + "application/pdf", + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.ms-works", + "text/csv", + "audio/*", + "video/*", + // 图片类型 svg有安全隐患,所以不使用"image/*" + "image/jpeg", + "image/png", + "image/gif", + "image/bmp" + ); /** * 检测文件安全类型 @@ -38,15 +71,50 @@ public class SecurityFileService { } // 文件类型安全检测 - if (!level3ProtectConfigService.isFileDetectFlag()) { - return ResponseDTO.ok(); + if (level3ProtectConfigService.isFileDetectFlag()) { + String fileType = getFileMimeType(file); + if (ALLOWED_MIME_TYPES.stream() + .noneMatch(allowedType -> matchesMimeType(fileType, allowedType))) { + return ResponseDTO.userErrorParam("禁止上传此文件类型"); + } } - // 检测文件类型 - // ..... - return ResponseDTO.ok(); } + /** + * 获取文件的 MIME 类型 + * + * @param file 要检查的文件 + * @return 文件的 MIME 类型 + */ + public static String getFileMimeType(MultipartFile file) { + try { + TikaConfig tika = new TikaConfig(); + Metadata metadata = new Metadata(); + metadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, file.getOriginalFilename()); + TikaInputStream stream = TikaInputStream.get(file.getInputStream()); + MediaType mimetype = tika.getDetector().detect(stream, metadata); + return mimetype.toString(); + } catch (IOException | TikaException e) { + log.error(e.getMessage(), e); + return MimeTypes.OCTET_STREAM; + } + } + + /** + * 检查文件的 MIME 类型是否与指定的MIME 类型匹配(支持通配符) + * + * @param fileType 文件的 MIME 类型 + * @param mimetype MIME 类型(支持通配符) + * @return 是否匹配 + */ + private static boolean matchesMimeType(String fileType, String mimetype) { + if (mimetype.endsWith("/*")) { + String prefix = mimetype.substring(0, mimetype.length() - 1); + return fileType.startsWith(prefix); + } else { + return fileType.equalsIgnoreCase(mimetype); + } + } } -; \ No newline at end of file diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java index 3d371b44..b4fc8712 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityPasswordService.java @@ -5,8 +5,8 @@ import net.lab1024.sa.base.common.domain.ResponseDTO; import net.lab1024.sa.base.common.util.SmartStringUtil; import net.lab1024.sa.base.module.support.securityprotect.dao.PasswordLogDao; import net.lab1024.sa.base.module.support.securityprotect.domain.PasswordLogEntity; -import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -34,11 +34,8 @@ public class SecurityPasswordService { public static final String PASSWORD_FORMAT_MSG = "密码必须为长度8-20位且必须包含大小写字母、数字、特殊符号(如:@#$%^&*()_+-=)等三种字符"; - private static final int PASSWORD_LENGTH = 8; - private static final String PASSWORD_SALT_FORMAT = "smart_%s_admin_$^&*"; - @Resource private PasswordLogDao passwordLogDao; @@ -46,6 +43,8 @@ public class SecurityPasswordService { @Resource private Level3ProtectConfigService level3ProtectConfigService; + static Argon2PasswordEncoder ARGON2_PASSWORD_ENCODER = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); + /** * 校验密码复杂度 */ @@ -84,8 +83,9 @@ public class SecurityPasswordService { // 检查最近几次是否有重复密码 List oldPasswords = passwordLogDao.selectOldPassword(requestUser.getUserType().getValue(), requestUser.getUserId(), level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes()); - if (oldPasswords != null && oldPasswords.contains(getEncryptPwd(newPassword))) { - return ResponseDTO.userErrorParam(String.format("与前%s个历史密码重复,请换个密码!", level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes())); + boolean isDuplicate = oldPasswords.stream().anyMatch(oldPassword -> ARGON2_PASSWORD_ENCODER.matches(newPassword, oldPassword)); + if (isDuplicate) { + return ResponseDTO.userErrorParam(String.format("与前%d个历史密码重复,请换个密码!", level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes())); } return ResponseDTO.ok(); @@ -143,7 +143,14 @@ public class SecurityPasswordService { * 获取 加密后 的密码 */ public static String getEncryptPwd(String password) { - return DigestUtils.md5Hex(String.format(PASSWORD_SALT_FORMAT, password)); + return ARGON2_PASSWORD_ENCODER.encode(password); + } + + /** + * 校验密码是否匹配 + */ + public static Boolean matchesPwd(String password, String encodedPassword) { + return ARGON2_PASSWORD_ENCODER.matches(password, encodedPassword); } } diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/dev/sa-base.yaml b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/dev/sa-base.yaml index 6137e6d2..1e1766c3 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/dev/sa-base.yaml +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/dev/sa-base.yaml @@ -131,7 +131,9 @@ reload: # sa-token 配置 sa-token: # token 名称(同时也是 cookie 名称) - token-name: x-access-token + token-name: Authorization + # token 前缀 例如:Bearer + token-prefix: Bearer # token 有效期(单位:秒) 默认30天(2592000秒),-1 代表永久有效 timeout: 2592000 # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/mapper/support/DictValueMapper.xml b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/mapper/support/DictValueMapper.xml index f0bc3faf..1aecdc4f 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/mapper/support/DictValueMapper.xml +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/mapper/support/DictValueMapper.xml @@ -29,7 +29,7 @@