diff --git a/smart-admin-api-java17-springboot3/pom.xml b/smart-admin-api-java17-springboot3/pom.xml index 212f55df..60d8a911 100644 --- a/smart-admin-api-java17-springboot3/pom.xml +++ b/smart-admin-api-java17-springboot3/pom.xml @@ -34,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 @@ -164,6 +165,12 @@ ${commons-collections4.version} + + org.apache.commons + commons-compress + ${commons-compress.version} + + commons-codec commons-codec @@ -248,13 +255,13 @@ - com.alibaba - easyexcel - ${easy-excel.version} + cn.idev.excel + fastexcel + ${fast-excel.version} - poi-ooxml-schemas - org.apache.poi + logback-classic + ch.qos.logback 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/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 15585731..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 @@ -56,7 +56,6 @@ public class DataScopeViewService { if (DataScopeViewTypeEnum.DEPARTMENT_AND_SUB == viewType) { return this.getDepartmentAndSubEmployeeIdList(employeeId); } - // 可以查看所有员工数据 return Lists.newArrayList(); } 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/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 a4fb79a5..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 @@ -376,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()); 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 97920440..45f99636 100644 --- a/smart-admin-api-java17-springboot3/sa-base/pom.xml +++ b/smart-admin-api-java17-springboot3/sa-base/pom.xml @@ -177,6 +177,11 @@ commons-io + + org.apache.commons + commons-compress + + cn.hutool hutool-all @@ -213,8 +218,14 @@ - com.alibaba - easyexcel + cn.idev.excel + fastexcel + + + logback-classic + ch.qos.logback + + 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/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/SecurityFileService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java index 5a0117e3..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,5 +1,6 @@ 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; @@ -17,7 +18,7 @@ import java.util.Arrays; import java.util.List; /** - * 三级等保 文件上传 相关 + * 三级等保 文件 相关 * * @Author 1024创新实验室-主任:卓大 * @Date 2024/08/22 19:25:59 @@ -27,6 +28,7 @@ import java.util.List; */ @Service +@Slf4j public class SecurityFileService { @Resource @@ -96,6 +98,7 @@ public class SecurityFileService { MediaType mimetype = tika.getDetector().detect(stream, metadata); return mimetype.toString(); } catch (IOException | TikaException e) { + log.error(e.getMessage(), e); return MimeTypes.OCTET_STREAM; } } 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 64732dd4..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 @@ -35,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 @@ -47,7 +45,7 @@ public class SecurityPasswordService { @Resource private Level3ProtectConfigService level3ProtectConfigService; - static Argon2PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); + static Argon2PasswordEncoder ARGON2_PASSWORD_ENCODER = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); /** * 校验密码复杂度 @@ -87,7 +85,7 @@ public class SecurityPasswordService { // 检查最近几次是否有重复密码 List oldPasswords = passwordLogDao.selectOldPassword(requestUser.getUserType().getValue(), requestUser.getUserId(), level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes()); - boolean isDuplicate = oldPasswords.stream().anyMatch(oldPassword -> encoder.matches(newPassword, oldPassword)); + boolean isDuplicate = oldPasswords.stream().anyMatch(oldPassword -> ARGON2_PASSWORD_ENCODER.matches(newPassword, oldPassword)); if (isDuplicate) { return ResponseDTO.userErrorParam(String.format("与前%d个历史密码重复,请换个密码!", level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes())); } @@ -147,14 +145,14 @@ public class SecurityPasswordService { * 获取 加密后 的密码 */ public static String getEncryptPwd(String password) { - return encoder.encode(password); + return ARGON2_PASSWORD_ENCODER.encode(password); } /** * 校验密码是否匹配 */ public static Boolean matchesPwd( String password, String encodedPassword){ - return encoder.matches( password, encodedPassword); + return ARGON2_PASSWORD_ENCODER.matches( password, encodedPassword); } } 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_menu.* + distinct t_menu.* from t_menu left join t_role_menu on t_role_menu.menu_id = t_menu.menu_id @@ -35,8 +34,6 @@ - group by t_menu.menu_id ORDER BY t_menu.sort ASC - \ 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 b85edb17..d0864424 100644 --- a/smart-admin-api-java8-springboot2/sa-base/pom.xml +++ b/smart-admin-api-java8-springboot2/sa-base/pom.xml @@ -198,6 +198,11 @@ commons-io + + org.apache.commons + commons-compress + + cn.hutool hutool-all @@ -234,8 +239,14 @@ - com.alibaba - easyexcel + cn.idev.excel + fastexcel + + + logback-classic + ch.qos.logback + + 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/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/SecurityFileService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/securityprotect/service/SecurityFileService.java index cd1190a5..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,26 +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.detect.Detector; 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.apache.tika.parser.AutoDetectParser; 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 @@ -30,6 +28,7 @@ import java.util.List; */ @Service +@Slf4j public class SecurityFileService { @Resource @@ -74,8 +73,8 @@ public class SecurityFileService { // 文件类型安全检测 if (level3ProtectConfigService.isFileDetectFlag()) { String fileType = getFileMimeType(file); - if(ALLOWED_MIME_TYPES.stream() - .noneMatch(allowedType -> matchesMimeType(fileType, allowedType))){ + if (ALLOWED_MIME_TYPES.stream() + .noneMatch(allowedType -> matchesMimeType(fileType, allowedType))) { return ResponseDTO.userErrorParam("禁止上传此文件类型"); } } @@ -88,17 +87,17 @@ public class SecurityFileService { * * @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()); + 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; } } @@ -106,8 +105,8 @@ public class SecurityFileService { /** * 检查文件的 MIME 类型是否与指定的MIME 类型匹配(支持通配符) * - * @param fileType 文件的 MIME 类型 - * @param mimetype MIME 类型(支持通配符) + * @param fileType 文件的 MIME 类型 + * @param mimetype MIME 类型(支持通配符) * @return 是否匹配 */ private static boolean matchesMimeType(String fileType, String mimetype) { 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 98209315..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 @@ -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,7 +43,7 @@ public class SecurityPasswordService { @Resource private Level3ProtectConfigService level3ProtectConfigService; - static Argon2PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); + static Argon2PasswordEncoder ARGON2_PASSWORD_ENCODER = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); /** * 校验密码复杂度 @@ -86,7 +83,7 @@ public class SecurityPasswordService { // 检查最近几次是否有重复密码 List oldPasswords = passwordLogDao.selectOldPassword(requestUser.getUserType().getValue(), requestUser.getUserId(), level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes()); - boolean isDuplicate = oldPasswords.stream().anyMatch(oldPassword -> encoder.matches(newPassword, oldPassword)); + boolean isDuplicate = oldPasswords.stream().anyMatch(oldPassword -> ARGON2_PASSWORD_ENCODER.matches(newPassword, oldPassword)); if (isDuplicate) { return ResponseDTO.userErrorParam(String.format("与前%d个历史密码重复,请换个密码!", level3ProtectConfigService.getRegularChangePasswordNotAllowRepeatTimes())); } @@ -146,14 +143,14 @@ public class SecurityPasswordService { * 获取 加密后 的密码 */ public static String getEncryptPwd(String password) { - return encoder.encode(password); + return ARGON2_PASSWORD_ENCODER.encode(password); } /** * 校验密码是否匹配 */ - public static Boolean matchesPwd( String password, String encodedPassword){ - return encoder.matches( password, encodedPassword); + 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 @@