diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java index aa4378ca..de077e9a 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java @@ -20,11 +20,6 @@ public class AdminCacheConst extends CacheKeyConst { */ public static final String DEPARTMENT_LIST_CACHE = "department_list_cache"; - /** - * 部门map - */ - public static final String DEPARTMENT_MAP_CACHE = "department_map_cache"; - /** * 部门树 */ @@ -54,4 +49,20 @@ public class AdminCacheConst extends CacheKeyConst { public static final String CATEGORY_TREE = "category_tree_cache"; } + /** + * 登录相关 + */ + public static class Login { + + /** + * 请求用户信息 + */ + public static final String REQUEST_EMPLOYEE = "login_request_employee"; + + /** + * 请求用户信息权限 + */ + public static final String USER_PERMISSION = "login_user_permission"; + } + } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java index d726a9a5..7f9cc0e9 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/goods/domain/form/GoodsQueryForm.java @@ -17,7 +17,7 @@ import org.hibernate.validator.constraints.Length; * @Date 2021-10-25 20:26:54 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Data public class GoodsQueryForm extends PageParam { 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 24f07738..191965f9 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 @@ -1,6 +1,5 @@ package net.lab1024.sa.admin.module.business.goods.domain.vo; -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; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/controller/EnterpriseController.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java similarity index 97% rename from smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/controller/EnterpriseController.java rename to smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java index ab06bd02..d919537b 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/controller/EnterpriseController.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseController.java @@ -1,4 +1,4 @@ -package net.lab1024.sa.admin.module.business.oa.enterprise.controller; +package net.lab1024.sa.admin.module.business.oa.enterprise; import cn.dev33.satoken.annotation.SaCheckPermission; import io.swagger.v3.oas.annotations.Operation; @@ -8,7 +8,6 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import net.lab1024.sa.admin.constant.AdminSwaggerTagConst; -import net.lab1024.sa.admin.module.business.oa.enterprise.service.EnterpriseService; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.form.*; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseEmployeeVO; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseExcelVO; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/manager/EnterpriseEmployeeManager.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseEmployeeManager.java similarity index 90% rename from smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/manager/EnterpriseEmployeeManager.java rename to smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseEmployeeManager.java index a3c21d84..f90b21ac 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/manager/EnterpriseEmployeeManager.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseEmployeeManager.java @@ -1,4 +1,4 @@ -package net.lab1024.sa.admin.module.business.oa.enterprise.manager; +package net.lab1024.sa.admin.module.business.oa.enterprise; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import net.lab1024.sa.admin.module.business.oa.enterprise.dao.EnterpriseEmployeeDao; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/service/EnterpriseService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseService.java similarity index 98% rename from smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/service/EnterpriseService.java rename to smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseService.java index 37848774..5ea17e6c 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/service/EnterpriseService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/enterprise/EnterpriseService.java @@ -1,4 +1,4 @@ -package net.lab1024.sa.admin.module.business.oa.enterprise.service; +package net.lab1024.sa.admin.module.business.oa.enterprise; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; @@ -13,7 +13,6 @@ import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseEm import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseExcelVO; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseListVO; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseVO; -import net.lab1024.sa.admin.module.business.oa.enterprise.manager.EnterpriseEmployeeManager; import net.lab1024.sa.admin.module.system.department.service.DepartmentService; import net.lab1024.sa.base.common.code.UserErrorCode; import net.lab1024.sa.base.common.domain.PageResult; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/service/InvoiceService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/service/InvoiceService.java index dc7eb521..bfa87e09 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/service/InvoiceService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/oa/invoice/service/InvoiceService.java @@ -3,7 +3,7 @@ package net.lab1024.sa.admin.module.business.oa.invoice.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import net.lab1024.sa.admin.module.business.oa.enterprise.service.EnterpriseService; +import net.lab1024.sa.admin.module.business.oa.enterprise.EnterpriseService; import net.lab1024.sa.admin.module.business.oa.enterprise.domain.vo.EnterpriseVO; import net.lab1024.sa.admin.module.business.oa.invoice.dao.InvoiceDao; import net.lab1024.sa.admin.module.business.oa.invoice.domain.*; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/controller/DataScopeController.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/DataScopeController.java similarity index 94% rename from smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/controller/DataScopeController.java rename to smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/DataScopeController.java index 32bdf8b6..8f2fec8e 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/controller/DataScopeController.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/datascope/DataScopeController.java @@ -1,4 +1,4 @@ -package net.lab1024.sa.admin.module.system.datascope.controller; +package net.lab1024.sa.admin.module.system.datascope; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java index 4924d5a5..011f0168 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java @@ -5,7 +5,6 @@ import net.lab1024.sa.admin.module.system.department.domain.entity.DepartmentEnt import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; import java.util.List; @@ -32,4 +31,5 @@ public interface DepartmentDao extends BaseMapper { */ List listAll(); + DepartmentVO selectDepartmentVO(@Param("departmentId")Long departmentId); } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java index a53a74e3..d829d355 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java @@ -29,7 +29,7 @@ import java.util.stream.Collectors; * @Date 2022-01-12 20:37:48 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Slf4j @Service @@ -42,7 +42,7 @@ public class DepartmentCacheManager { log.info("clear " + cache); } - @CacheEvict(value = {AdminCacheConst.Department.DEPARTMENT_LIST_CACHE, AdminCacheConst.Department.DEPARTMENT_MAP_CACHE, AdminCacheConst.Department.DEPARTMENT_SELF_CHILDREN_CACHE, AdminCacheConst.Department.DEPARTMENT_TREE_CACHE, AdminCacheConst.Department.DEPARTMENT_PATH_CACHE,}, allEntries = true) + @CacheEvict(value = {AdminCacheConst.Department.DEPARTMENT_LIST_CACHE, AdminCacheConst.Department.DEPARTMENT_SELF_CHILDREN_CACHE, AdminCacheConst.Department.DEPARTMENT_TREE_CACHE, AdminCacheConst.Department.DEPARTMENT_PATH_CACHE,}, allEntries = true) public void clearCache() { logClearInfo(AdminCacheConst.Department.DEPARTMENT_LIST_CACHE); } @@ -56,19 +56,8 @@ public class DepartmentCacheManager { return departmentDao.listAll(); } - /** - * 部门map - * - */ - @Cacheable(AdminCacheConst.Department.DEPARTMENT_MAP_CACHE) - public Map getDepartmentMap() { - return departmentDao.listAll().stream().collect(Collectors.toMap(DepartmentVO::getDepartmentId, Function.identity())); - } - - /** * 缓存部门树结构 - * */ @Cacheable(AdminCacheConst.Department.DEPARTMENT_TREE_CACHE) public List getDepartmentTree() { @@ -78,7 +67,6 @@ public class DepartmentCacheManager { /** * 缓存某个部门的下级id列表 - * */ @Cacheable(AdminCacheConst.Department.DEPARTMENT_SELF_CHILDREN_CACHE) public List getDepartmentSelfAndChildren(Long departmentId) { @@ -89,7 +77,6 @@ public class DepartmentCacheManager { /** * 部门的路径名称 - * */ @Cacheable(AdminCacheConst.Department.DEPARTMENT_PATH_CACHE) public Map getDepartmentPathMap() { @@ -125,7 +112,6 @@ public class DepartmentCacheManager { /** * 构建部门树结构 - * */ public List buildTree(List voList) { if (CollectionUtils.isEmpty(voList)) { @@ -140,7 +126,7 @@ public class DepartmentCacheManager { return treeVOList; } - /** + /** * 构建所有根节点的下级树形结构 * 返回值为层序遍历结果 * [由于departmentDao中listAll给出数据根据Sort降序 所以同一层中Sort值较大的优先遍历] @@ -148,7 +134,7 @@ public class DepartmentCacheManager { private List recursiveBuildTree(List nodeList, List allDepartmentList) { int nodeSize = nodeList.size(); List childIdList = new ArrayList<>(); - for(int i = 0; i < nodeSize; i++) { + for (int i = 0; i < nodeSize; i++) { int preIndex = i - 1; int nextIndex = i + 1; DepartmentTreeVO node = nodeList.get(i); @@ -167,14 +153,14 @@ public class DepartmentCacheManager { tempChildIdList = this.recursiveBuildTree(children, allDepartmentList); } - if(CollectionUtils.isEmpty(node.getSelfAndAllChildrenIdList())) { + if (CollectionUtils.isEmpty(node.getSelfAndAllChildrenIdList())) { node.setSelfAndAllChildrenIdList( new ArrayList<>() ); } node.getSelfAndAllChildrenIdList().add(node.getDepartmentId()); - if(CollectionUtils.isNotEmpty(tempChildIdList)) { + if (CollectionUtils.isNotEmpty(tempChildIdList)) { node.getSelfAndAllChildrenIdList().addAll(tempChildIdList); childIdList.addAll(tempChildIdList); } @@ -182,7 +168,7 @@ public class DepartmentCacheManager { } // 保证本层遍历顺序 - for(int i = nodeSize - 1; i >= 0; i--) { + for (int i = nodeSize - 1; i >= 0; i--) { childIdList.add(0, nodeList.get(i).getDepartmentId()); } @@ -192,7 +178,6 @@ public class DepartmentCacheManager { /** * 获取子元素 - * */ private List getChildren(Long departmentId, List voList) { List childrenEntityList = voList.stream().filter(e -> departmentId.equals(e.getParentId())).collect(Collectors.toList()); @@ -205,7 +190,6 @@ public class DepartmentCacheManager { /** * 通过部门id,获取当前以及下属部门 - * */ public List selfAndChildrenIdList(Long departmentId, List voList) { List selfAndChildrenIdList = Lists.newArrayList(); diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java index 5f7d1520..3c38e705 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java @@ -26,7 +26,7 @@ import java.util.Map; * @Date 2022-01-12 20:37:48 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Service public class DepartmentService { @@ -44,7 +44,6 @@ public class DepartmentService { /** * 新增添加部门 - * */ public ResponseDTO addDepartment(DepartmentAddForm departmentAddForm) { @@ -57,7 +56,6 @@ public class DepartmentService { /** * 更新部门信息 - * */ public ResponseDTO updateDepartment(DepartmentUpdateForm updateDTO) { if (updateDTO.getParentId() == null) { @@ -78,7 +76,6 @@ public class DepartmentService { * 根据id删除部门 * 1、需要判断当前部门是否有子部门,有子部门则不允许删除 * 2、需要判断当前部门是否有员工,有员工则不能删除 - * */ public ResponseDTO deleteDepartment(Long departmentId) { DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); @@ -122,7 +119,6 @@ public class DepartmentService { /** * 自身以及所有下级的部门id列表 - * */ public List selfAndChildrenIdList(Long departmentId) { return departmentCacheManager.getDepartmentSelfAndChildren(departmentId); @@ -131,7 +127,6 @@ public class DepartmentService { /** * 获取所有部门 - * */ public List listAll() { return departmentCacheManager.getDepartmentList(); @@ -140,10 +135,9 @@ public class DepartmentService { /** * 获取部门 - * */ public DepartmentVO getDepartmentById(Long departmentId) { - return departmentCacheManager.getDepartmentMap().get(departmentId); + return departmentDao.selectDepartmentVO(departmentId); } /** @@ -153,38 +147,4 @@ public class DepartmentService { return departmentCacheManager.getDepartmentPathMap().get(departmentId); } - /** - * 查询全部父级部门(不包含自己) - * - */ - public List queryAllParentDepartment(Long departmentId) { - List list = new ArrayList<>(); - - Map departmentMap = departmentCacheManager.getDepartmentMap(); - DepartmentVO departmentVO = departmentMap.get(departmentId); - while (departmentVO != null) { - list.add(departmentVO); - departmentVO = departmentMap.get(departmentVO.getParentId()); - } - Collections.reverse(list); - return list; - } - - /** - * 查询全部父级部门(不包含自己) - * - */ - public List queryAllParentDepartmentIdList(Long departmentId) { - List list = new ArrayList<>(); - - Map departmentMap = departmentCacheManager.getDepartmentMap(); - DepartmentVO departmentVO = departmentMap.get(departmentId); - while (departmentVO != null) { - list.add(departmentVO.getDepartmentId()); - departmentVO = departmentMap.get(departmentVO.getParentId()); - } - Collections.reverse(list); - return list; - } - } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdatePasswordForm.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdatePasswordForm.java index f3d96baf..07202e26 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdatePasswordForm.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/employee/domain/form/EmployeeUpdatePasswordForm.java @@ -2,9 +2,7 @@ package net.lab1024.sa.admin.module.system.employee.domain.form; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; import lombok.Data; -import net.lab1024.sa.base.common.util.SmartVerificationUtil; /** * 修改密码所需参数 diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java new file mode 100644 index 00000000..8fdc9a1d --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java @@ -0,0 +1,162 @@ +package net.lab1024.sa.admin.module.system.login.manager; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.sa.admin.constant.AdminCacheConst; +import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.sa.admin.module.system.department.service.DepartmentService; +import net.lab1024.sa.admin.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; +import net.lab1024.sa.admin.module.system.login.domain.RequestEmployee; +import net.lab1024.sa.admin.module.system.menu.domain.vo.MenuVO; +import net.lab1024.sa.admin.module.system.role.domain.vo.RoleVO; +import net.lab1024.sa.admin.module.system.role.service.RoleEmployeeService; +import net.lab1024.sa.admin.module.system.role.service.RoleMenuService; +import net.lab1024.sa.base.common.constant.StringConst; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.domain.UserPermission; +import net.lab1024.sa.base.common.enumeration.UserTypeEnum; +import net.lab1024.sa.base.common.util.SmartBeanUtil; +import net.lab1024.sa.base.module.support.file.service.IFileStorageService; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 登录Manager + * + * @Author 1024创新实验室: 卓大 + * @Date 2025-05-03 22:56:34 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@Slf4j +@Service +public class LoginManager { + + @Resource + private DepartmentService departmentService; + + @Resource + private IFileStorageService fileStorageService; + + @Resource + private EmployeeService employeeService; + + @Resource + private RoleEmployeeService roleEmployeeService; + + @Resource + private RoleMenuService roleMenuService; + + + /** + * 获取请求用户信息 + */ + @Cacheable(AdminCacheConst.Login.REQUEST_EMPLOYEE) + public RequestEmployee getRequestEmployee(Long requestEmployeeId ) { + if (requestEmployeeId == null) { + return null; + } + // 员工基本信息 + EmployeeEntity employeeEntity = employeeService.getById(requestEmployeeId); + if (employeeEntity == null) { + return null; + } + + return this.loadLoginInfo(employeeEntity); + } + + /** + * 获取登录的用户信息 + */ + @CachePut(value = AdminCacheConst.Login.REQUEST_EMPLOYEE, key = "#employeeEntity.employeeId") + public RequestEmployee loadLoginInfo(EmployeeEntity employeeEntity) { + // 基础信息 + RequestEmployee requestEmployee = SmartBeanUtil.copy(employeeEntity, RequestEmployee.class); + requestEmployee.setUserType(UserTypeEnum.ADMIN_EMPLOYEE); + + // 部门信息 + DepartmentVO department = departmentService.getDepartmentById(employeeEntity.getDepartmentId()); + requestEmployee.setDepartmentName(null == department ? StringConst.EMPTY : department.getName()); + + // 头像信息 + String avatar = employeeEntity.getAvatar(); + if (StringUtils.isNotBlank(avatar)) { + ResponseDTO getFileUrl = fileStorageService.getFileUrl(avatar); + if (BooleanUtils.isTrue(getFileUrl.getOk())) { + requestEmployee.setAvatar(getFileUrl.getData()); + } + } + return requestEmployee; + } + + + /** + * 获取用户的权限(包含 角色列表、权限列表) + */ + @Cacheable(AdminCacheConst.Login.USER_PERMISSION) + public UserPermission getUserPermission(Long employeeId) { + if(null == employeeId){ + return null; + } + + return this.loadUserPermission(employeeId); + } + + /** + * 获取用户的权限(包含 角色列表、权限列表) + */ + @CachePut(AdminCacheConst.Login.USER_PERMISSION) + public UserPermission loadUserPermission(Long employeeId) { + UserPermission userPermission = new UserPermission(); + userPermission.setPermissionList(new ArrayList<>()); + userPermission.setRoleList(new ArrayList<>()); + + // 角色列表 + List roleList = roleEmployeeService.getRoleIdList(employeeId); + userPermission.getRoleList().addAll(roleList.stream().map(RoleVO::getRoleCode).collect(Collectors.toSet())); + + // 前端菜单和功能点清单 + EmployeeEntity employeeEntity = employeeService.getById(employeeId); + + List menuAndPointsList = roleMenuService.getMenuList(roleList.stream().map(RoleVO::getRoleId).collect(Collectors.toList()), employeeEntity.getAdministratorFlag()); + + // 权限列表 + HashSet permissionSet = new HashSet<>(); + for (MenuVO menu : menuAndPointsList) { + if (menu.getPermsType() == null) { + continue; + } + + String perms = menu.getApiPerms(); + if (StringUtils.isEmpty(perms)) { + continue; + } + //接口权限 + String[] split = perms.split(","); + permissionSet.addAll(Arrays.asList(split)); + } + userPermission.getPermissionList().addAll(permissionSet); + + return userPermission; + } + + + @CacheEvict(value = {AdminCacheConst.Login.USER_PERMISSION, AdminCacheConst.Login.REQUEST_EMPLOYEE}, allEntries = true) + public void clear(){ + + } + + +} 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 27bbc71b..c5fa8c7d 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 @@ -6,17 +6,16 @@ import cn.hutool.core.lang.UUID; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.servlet.JakartaServletUtil; -import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; import net.lab1024.sa.admin.module.system.department.service.DepartmentService; import net.lab1024.sa.admin.module.system.employee.domain.entity.EmployeeEntity; import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; import net.lab1024.sa.admin.module.system.login.domain.LoginForm; import net.lab1024.sa.admin.module.system.login.domain.LoginResultVO; import net.lab1024.sa.admin.module.system.login.domain.RequestEmployee; +import net.lab1024.sa.admin.module.system.login.manager.LoginManager; import net.lab1024.sa.admin.module.system.menu.domain.vo.MenuVO; import net.lab1024.sa.admin.module.system.role.domain.vo.RoleVO; import net.lab1024.sa.admin.module.system.role.service.RoleEmployeeService; @@ -48,21 +47,22 @@ import net.lab1024.sa.base.module.support.mail.MailService; import net.lab1024.sa.base.module.support.mail.constant.MailTemplateCodeEnum; import net.lab1024.sa.base.module.support.redis.RedisService; import net.lab1024.sa.base.module.support.securityprotect.domain.LoginFailEntity; -import net.lab1024.sa.base.module.support.securityprotect.service.*; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; +import net.lab1024.sa.base.module.support.securityprotect.service.Level3ProtectConfigService; +import net.lab1024.sa.base.module.support.securityprotect.service.SecurityLoginService; +import net.lab1024.sa.base.module.support.securityprotect.service.SecurityPasswordService; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.*; -import java.util.concurrent.ConcurrentMap; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.stream.Collectors; /** * 登录 * - * @Author 1024创新实验室: 开云 - * @Date 2021-12-01 22:56:34 + * @Author 1024创新实验室: 卓大 + * @Date 2025-05-03 22:56:34 * @Wechat zhuoda1024 * @Email lab1024@163.com * @Copyright 1024创新实验室 @@ -76,22 +76,6 @@ public class LoginService implements StpInterface { */ private static final String SUPER_PASSWORD_LOGIN_ID_PREFIX = "S"; - /** - * 最大在线缓存人数 - */ - private static final long CACHE_MAX_ONLINE_PERSON_COUNT = 1000L; - - /** - * 登录信息二级缓存 - */ - private final ConcurrentMap loginEmployeeCache = new ConcurrentLinkedHashMap.Builder().maximumWeightedCapacity(CACHE_MAX_ONLINE_PERSON_COUNT).build(); - - - /** - * 权限 缓存 - */ - private final ConcurrentMap permissionCache = new ConcurrentLinkedHashMap.Builder().maximumWeightedCapacity(CACHE_MAX_ONLINE_PERSON_COUNT).build(); - @Resource private EmployeeService employeeService; @@ -134,6 +118,9 @@ public class LoginService implements StpInterface { @Resource private RedisService redisService; + @Resource + private LoginManager loginManager; + /** * 获取验证码 */ @@ -224,10 +211,7 @@ public class LoginService implements StpInterface { } // 获取员工信息 - RequestEmployee requestEmployee = loadLoginInfo(employeeEntity); - - // 放入缓存 - loginEmployeeCache.put(employeeEntity.getEmployeeId(), requestEmployee); + RequestEmployee requestEmployee = loginManager.loadLoginInfo(employeeEntity); // 移除登录失败 securityLoginService.removeLoginFail(employeeEntity.getEmployeeId(), UserTypeEnum.ADMIN_EMPLOYEE); @@ -242,8 +226,8 @@ public class LoginService implements StpInterface { // 设置 token loginResultVO.setToken(token); - // 清除权限缓存 - permissionCache.remove(employeeEntity.getEmployeeId()); + // 更新用户权限 + loginManager.loadUserPermission(employeeEntity.getEmployeeId()); return ResponseDTO.ok(loginResultVO); } @@ -262,10 +246,6 @@ public class LoginService implements StpInterface { List menuAndPointsList = roleMenuService.getMenuList(roleList.stream().map(RoleVO::getRoleId).collect(Collectors.toList()), requestEmployee.getAdministratorFlag()); loginResultVO.setMenuList(menuAndPointsList); - // 更新下后端权限缓存 - UserPermission userPermission = getUserPermission(requestEmployee.getUserId()); - permissionCache.put(requestEmployee.getUserId(), userPermission); - // 上次登录信息 LoginLogVO loginLogVO = loginLogService.queryLastByUserId(requestEmployee.getEmployeeId(), UserTypeEnum.ADMIN_EMPLOYEE, LoginLogResultEnum.LOGIN_SUCCESS); if (loginLogVO != null) { @@ -289,32 +269,6 @@ public class LoginService implements StpInterface { } - /** - * 获取登录的用户信息 - */ - private RequestEmployee loadLoginInfo(EmployeeEntity employeeEntity) { - - // 基础信息 - RequestEmployee requestEmployee = SmartBeanUtil.copy(employeeEntity, RequestEmployee.class); - requestEmployee.setUserType(UserTypeEnum.ADMIN_EMPLOYEE); - - // 部门信息 - DepartmentVO department = departmentService.getDepartmentById(employeeEntity.getDepartmentId()); - requestEmployee.setDepartmentName(null == department ? StringConst.EMPTY : department.getName()); - - // 头像信息 - String avatar = employeeEntity.getAvatar(); - if (StringUtils.isNotBlank(avatar)) { - ResponseDTO getFileUrl = fileStorageService.getFileUrl(avatar); - if (BooleanUtils.isTrue(getFileUrl.getOk())) { - requestEmployee.setAvatar(getFileUrl.getData()); - } - } - - return requestEmployee; - } - - /** * 根据登陆token 获取员请求工信息 */ @@ -328,17 +282,7 @@ public class LoginService implements StpInterface { return null; } - RequestEmployee requestEmployee = loginEmployeeCache.get(requestEmployeeId); - if (requestEmployee == null) { - // 员工基本信息 - EmployeeEntity employeeEntity = employeeService.getById(requestEmployeeId); - if (employeeEntity == null) { - return null; - } - - requestEmployee = this.loadLoginInfo(employeeEntity); - loginEmployeeCache.put(requestEmployeeId, requestEmployee); - } + RequestEmployee requestEmployee = loginManager.getRequestEmployee(requestEmployeeId); // 更新请求ip和user agent requestEmployee.setUserAgent(JakartaServletUtil.getHeaderIgnoreCase(request, RequestHeaderConst.USER_AGENT)); @@ -382,7 +326,7 @@ public class LoginService implements StpInterface { StpUtil.logout(); // 清空登录信息缓存 - loginEmployeeCache.remove(requestUser.getUserId()); + loginManager.clear(); //保存登出日志 LoginLogEntity loginEntity = LoginLogEntity.builder() @@ -400,14 +344,6 @@ public class LoginService implements StpInterface { return ResponseDTO.ok(); } - /** - * 清除员工登录缓存 - */ - public void clearLoginEmployeeCache(Long employeeId) { - // 清空登录信息缓存 - loginEmployeeCache.remove(employeeId); - } - /** * 保存登录日志 */ @@ -435,12 +371,7 @@ public class LoginService implements StpInterface { return Collections.emptyList(); } - UserPermission userPermission = permissionCache.get(employeeId); - if (userPermission == null) { - userPermission = getUserPermission(employeeId); - permissionCache.put(employeeId, userPermission); - } - + UserPermission userPermission = loginManager.getUserPermission(employeeId); return userPermission.getPermissionList(); } @@ -451,51 +382,10 @@ public class LoginService implements StpInterface { return Collections.emptyList(); } - UserPermission userPermission = permissionCache.get(employeeId); - if (userPermission == null) { - userPermission = getUserPermission(employeeId); - permissionCache.put(employeeId, userPermission); - } + UserPermission userPermission = loginManager.getUserPermission(employeeId); return userPermission.getRoleList(); } - /** - * 获取用户的权限(包含 角色列表、权限列表) - */ - private UserPermission getUserPermission(Long employeeId) { - - UserPermission userPermission = new UserPermission(); - userPermission.setPermissionList(new ArrayList<>()); - userPermission.setRoleList(new ArrayList<>()); - - // 角色列表 - List roleList = roleEmployeeService.getRoleIdList(employeeId); - userPermission.getRoleList().addAll(roleList.stream().map(RoleVO::getRoleCode).collect(Collectors.toSet())); - - // 前端菜单和功能点清单 - EmployeeEntity employeeEntity = employeeService.getById(employeeId); - - List menuAndPointsList = roleMenuService.getMenuList(roleList.stream().map(RoleVO::getRoleId).collect(Collectors.toList()), employeeEntity.getAdministratorFlag()); - - // 权限列表 - HashSet permissionSet = new HashSet<>(); - for (MenuVO menu : menuAndPointsList) { - if (menu.getPermsType() == null) { - continue; - } - - String perms = menu.getApiPerms(); - if (StringUtils.isEmpty(perms)) { - continue; - } - //接口权限 - String[] split = perms.split(","); - permissionSet.addAll(Arrays.asList(split)); - } - userPermission.getPermissionList().addAll(permissionSet); - - return userPermission; - } /** * 发送 邮箱 验证码 @@ -590,4 +480,8 @@ public class LoginService implements StpInterface { String redisVerificationCodeKey = redisService.generateRedisKey(RedisKeyConst.Support.LOGIN_VERIFICATION_CODE, UserTypeEnum.ADMIN_EMPLOYEE.getValue() + RedisKeyConst.SEPARATOR + employeeId); redisService.delete(redisVerificationCodeKey); } + + public void clearLoginEmployeeCache(Long employeeId) { + loginManager.clear(); + } } diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleEmployeeManager.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleEmployeeManager.java index 6e2d9751..ba33dfd2 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleEmployeeManager.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/role/manager/RoleEmployeeManager.java @@ -3,11 +3,7 @@ package net.lab1024.sa.admin.module.system.role.manager; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import net.lab1024.sa.admin.module.system.role.dao.RoleEmployeeDao; import net.lab1024.sa.admin.module.system.role.domain.entity.RoleEmployeeEntity; -import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; /** * 角色员工 manager diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml index 326d94f5..8ee2974d 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml @@ -19,5 +19,16 @@ WHERE parent_id = #{departmentId} + + \ No newline at end of file diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/annoation/DataSource.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/annoation/DataSource.java deleted file mode 100644 index 140aa7c6..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/annoation/DataSource.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lab1024.sa.base.common.annoation; - -import net.lab1024.sa.base.constant.DataSourceTypeEnum; - -import java.lang.annotation.*; - -/** - * 切换数据源名称 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -@Inherited -public @interface DataSource { - - /** - * 切换数据源名称 - */ - public DataSourceTypeEnum value() default DataSourceTypeEnum.SLAVE; -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/aspect/DataSourceAspect.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/aspect/DataSourceAspect.java deleted file mode 100644 index 1e31e254..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/aspect/DataSourceAspect.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.lab1024.sa.base.common.aspect; - -import net.lab1024.sa.base.common.annoation.DataSource; -import net.lab1024.sa.base.handler.DynamicDataSourceContextHandler; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -/** - * 多数据源处理 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -@Aspect -@Order(1) -@Component -public class DataSourceAspect { - - /** - * aop切点,有相关注解的方法才做增强处理 - */ - @Pointcut("@annotation(net.lab1024.sa.base.common.annoation.DataSource) || @within(net.lab1024.sa.base.common.annoation.DataSource)") - public void dsPointCut() { - } - - /** - * 环绕通知 - */ - @Around("dsPointCut()") - public Object around(ProceedingJoinPoint point) throws Throwable { - DataSource dataSource = getDataSource(point); - - if (dataSource != null) { - DynamicDataSourceContextHandler.setDataSourceType(dataSource.value().name()); - } - - try { - return point.proceed(); - } finally { - DynamicDataSourceContextHandler.clearDataSourceType(); - } - } - - /** - * 获取需要切换的数据源 - */ - public DataSource getDataSource(ProceedingJoinPoint point) { - MethodSignature signature = (MethodSignature) point.getSignature(); - DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); - - // 方法注解为空,则取类注解 - if (Objects.nonNull(dataSource)) { - return dataSource; - } - - return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); - } -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java index c10897d0..355b9482 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java @@ -2,6 +2,7 @@ package net.lab1024.sa.base.common.domain; import lombok.Data; +import java.io.Serializable; import java.util.List; /** @@ -15,7 +16,7 @@ import java.util.List; */ @Data -public class UserPermission { +public class UserPermission implements Serializable { /** * 权限列表 diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java index bf6de16a..356b082c 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java @@ -1,11 +1,14 @@ package net.lab1024.sa.base.config; +import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; import net.lab1024.sa.base.module.support.cache.CacheService; import net.lab1024.sa.base.module.support.cache.CaffeineCacheServiceImpl; import net.lab1024.sa.base.module.support.cache.RedisCacheServiceImpl; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.serializer.RedisSerializationContext; /** * 缓存配置 @@ -19,6 +22,14 @@ public class CacheConfig { private static final String REDIS_CACHE = "redis"; private static final String CAFFEINE_CACHE = "caffeine"; + @Bean + @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = REDIS_CACHE) + public RedisCacheConfiguration redisCacheConfiguration() { + return RedisCacheConfiguration.defaultCacheConfig() + .disableCachingNullValues() + .computePrefixWith(name -> "cache:" + name + ":") + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer())); + } @Bean @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = REDIS_CACHE) diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/DataSourceConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/DataSourceConfig.java new file mode 100644 index 00000000..24fdc89d --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/DataSourceConfig.java @@ -0,0 +1,201 @@ +package net.lab1024.sa.base.config; + +import com.alibaba.druid.filter.Filter; +import com.alibaba.druid.filter.stat.StatFilter; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.jakarta.StatViewServlet; +import com.alibaba.druid.support.jakarta.WebStatFilter; +import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.sa.base.common.domain.DataScopePlugin; +import net.lab1024.sa.base.handler.MybatisPlusFillHandler; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.aop.support.DefaultPointcutAdvisor; +import org.springframework.aop.support.JdkRegexpMethodPointcut; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 数据源配置 + * + * @Author 1024创新实验室-主任: 卓大 + * @Date 2017-11-28 15:21:10 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@Slf4j +@Configuration +public class DataSourceConfig { + + @Value("${spring.datasource.driver-class-name}") + String driver; + + @Value("${spring.datasource.url}") + String url; + + @Value("${spring.datasource.username}") + String username; + + @Value("${spring.datasource.password}") + String password; + + @Value("${spring.datasource.initial-size}") + int initialSize; + + @Value("${spring.datasource.min-idle}") + int minIdle; + + @Value("${spring.datasource.max-active}") + int maxActive; + + @Value("${spring.datasource.max-wait}") + long maxWait; + + @Value("${spring.datasource.time-between-eviction-runs-millis}") + long timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.min-evictable-idle-time-millis}") + long minEvictableIdleTimeMillis; + + @Value("${spring.datasource.filters}") + String filters; + + @Value("${spring.datasource.druid.username}") + String druidUserName; + + @Value("${spring.datasource.druid.password}") + String druidPassword; + + @Value("${spring.datasource.druid.login.enabled}") + boolean druidLoginEnable; + + @Value("${spring.datasource.druid.method.pointcut}") + String methodPointcut; + + @jakarta.annotation.Resource + private MybatisPlusInterceptor paginationInterceptor; + + @jakarta.annotation.Resource + private DataScopePlugin dataScopePlugin; + + @Bean + @Primary + public DataSource druidDataSource() { + DruidDataSource druidDataSource = new DruidDataSource(); + druidDataSource.setDbType(DbType.MYSQL.getDb()); + druidDataSource.setDriverClassName(driver); + druidDataSource.setUrl(url); + druidDataSource.setUsername(username); + druidDataSource.setPassword(password); + druidDataSource.setInitialSize(initialSize); + druidDataSource.setMinIdle(minIdle); + druidDataSource.setMaxActive(maxActive); + druidDataSource.setMaxWait(maxWait); + druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + druidDataSource.setValidationQuery("SELECT 1"); + try { + druidDataSource.setFilters(filters); + ArrayList arrayList = new ArrayList<>(); + StatFilter statFilter = new StatFilter(); + statFilter.setMergeSql(true); + statFilter.setSlowSqlMillis(1000); + statFilter.setLogSlowSql(true); + arrayList.add(statFilter); + druidDataSource.setProxyFilters(arrayList); + druidDataSource.init(); + } catch (SQLException e) { + log.error("初始化数据源出错", e); + } + + return druidDataSource; + } + + @Bean + public SqlSessionFactory sqlSessionFactory() throws Exception { + MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); + factoryBean.setDataSource(druidDataSource()); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] resources = resolver.getResources("classpath*:/mapper/**/*.xml"); + factoryBean.setMapperLocations(resources); + + // 设置 MyBatis-Plus 分页插件 注意此处myBatisPlugin一定要放在后面 + List pluginsList = new ArrayList<>(); + pluginsList.add(paginationInterceptor); + if (dataScopePlugin != null) { + pluginsList.add(dataScopePlugin); + } + factoryBean.setPlugins(pluginsList.toArray(new Interceptor[0])); + // 添加字段自动填充处理 + factoryBean.setGlobalConfig(new GlobalConfig().setBanner(false).setMetaObjectHandler(new MybatisPlusFillHandler())); + + return factoryBean.getObject(); + } + + /** + * 非正式环境 才加载 + * + * @return + */ + @Conditional(SystemEnvironmentConfig.class) + @Bean + public ServletRegistrationBean druidServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); + servletRegistrationBean.setServlet(new StatViewServlet()); + servletRegistrationBean.addUrlMappings("/druid/*"); + Map initParameters = new HashMap(); + //不设置用户名密码可以直接通过druid/index.html访问 + if (druidLoginEnable) { + initParameters.put("loginUsername", druidUserName); + initParameters.put("loginPassword", druidPassword); + } + initParameters.put("resetEnable", "false"); + servletRegistrationBean.setInitParameters(initParameters); + return servletRegistrationBean; + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns("/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/*"); + return filterRegistrationBean; + } + + @Bean + public JdkRegexpMethodPointcut jdkRegexpMethodPointcut() { + JdkRegexpMethodPointcut jdkRegexpMethodPointcut = new JdkRegexpMethodPointcut(); + jdkRegexpMethodPointcut.setPatterns(methodPointcut); + return jdkRegexpMethodPointcut; + } + + @Bean + public DefaultPointcutAdvisor defaultPointcutAdvisor() { + DefaultPointcutAdvisor pointcutAdvisor = new DefaultPointcutAdvisor(); + pointcutAdvisor.setPointcut(jdkRegexpMethodPointcut()); + pointcutAdvisor.setAdvice(new DruidStatInterceptor()); + return pointcutAdvisor; + } + +} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/DruidConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/DruidConfig.java deleted file mode 100644 index bae70ba3..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/config/DruidConfig.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.lab1024.sa.base.config; - -import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceBuilder; -import lombok.extern.slf4j.Slf4j; -import net.lab1024.sa.base.constant.DataSourceTypeEnum; -import net.lab1024.sa.base.handler.DynamicDataSourceHandler; -import net.lab1024.sa.base.properties.DruidProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import javax.sql.DataSource; -import java.util.HashMap; -import java.util.Map; - -/** - * Druid 配置多数据源 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -@Slf4j -@Configuration -public class DruidConfig { - - /** - * 这里以map的方式存储所有的自定义的数据源,其中key是枚举类的字符串值,value是创建好且赋值好的数据源对象 - */ - private static Map targetDataSources = new HashMap<>(); - - /** - * DruidProperties(属性配置对象,见后面6 spring会根据配置文件的值将该对象的属性赋值 - * 然后调用dataSource()方法将创建好的数据源对象赋值好然后交给spring管理 - * 这里是配置的主数据源也是默认的数据源 - */ - @Bean - @ConfigurationProperties("spring.datasource.druid.master") - public DataSource masterDataSource(DruidProperties druidProperties) { - DataSource dataSource = druidProperties.dataSource(DruidDataSourceBuilder.create().build()); - targetDataSources.put(DataSourceTypeEnum.MASTER.name(), dataSource); - return dataSource; - } - - /** - * 配置从数据源,注意从数据源配置“name = "enabled", havingValue = "true"”参数 - */ - @Bean - @ConfigurationProperties("spring.datasource.druid.slave") - @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") - public DataSource slaveDataSource(DruidProperties druidProperties) { - DataSource dataSource = druidProperties.dataSource(DruidDataSourceBuilder.create().build()); - targetDataSources.put(DataSourceTypeEnum.SLAVE.name(), dataSource); - return dataSource; - } - - /** - * 之后所有需要增加的数据源可以在这里从上到下依次添加 - * 只需要按照上面的方式(slaveDataSource的方法照葫芦画瓢)注入bean,然后再在配置文件中配置好相关的参数 - * 最后添加该数据源所对应的枚举类作为该数据源的key即可 - **/ - - /** - * 使用 @Qualifier 注解指定将两个数据源作为入参 - */ - @Bean(name = "dynamicDataSource") - @Primary - public DynamicDataSourceHandler dataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Autowired(required = false) @Qualifier("slaveDataSource") DataSource slaveDataSource) { - Map targetDataSources = new HashMap<>(); - targetDataSources.put(DataSourceTypeEnum.MASTER.name(), masterDataSource); - log.info("加载动态数据源:{}", DataSourceTypeEnum.MASTER.name()); - - // 如果从数据源不为空 则添加到 targetDataSources 中 - if (slaveDataSource != null) { - targetDataSources.put(DataSourceTypeEnum.SLAVE.name(), slaveDataSource); - log.info("加载动态数据源:{}", DataSourceTypeEnum.SLAVE.name()); - } - - return new DynamicDataSourceHandler(masterDataSource, targetDataSources); - } -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/constant/DataSourceTypeEnum.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/constant/DataSourceTypeEnum.java deleted file mode 100644 index bb1628fd..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/constant/DataSourceTypeEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.lab1024.sa.base.constant; - -/** - * 数据源类型 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -public enum DataSourceTypeEnum { - - /** - * 主库 - */ - MASTER, - - /** - * 从库 - */ - SLAVE -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/handler/DynamicDataSourceContextHandler.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/handler/DynamicDataSourceContextHandler.java deleted file mode 100644 index a52140e5..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/handler/DynamicDataSourceContextHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.sa.base.handler; - -import lombok.extern.slf4j.Slf4j; - -/** - * 数据源切换处理 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -@Slf4j -public class DynamicDataSourceContextHandler { - - /** - * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, - * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 - */ - private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); - - /** - * 设置数据源的变量 - */ - public static void setDataSourceType(String dsType) { - log.info("切换到 {} 数据源", dsType); - CONTEXT_HOLDER.set(dsType); - } - - /** - * 获得数据源的变量 - */ - public static String getDataSourceType() { - return CONTEXT_HOLDER.get(); - } - - /** - * 清空数据源变量 - */ - public static void clearDataSourceType() { - CONTEXT_HOLDER.remove(); - } -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/handler/DynamicDataSourceHandler.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/handler/DynamicDataSourceHandler.java deleted file mode 100644 index 73cf744e..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/handler/DynamicDataSourceHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lab1024.sa.base.handler; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; - -import javax.sql.DataSource; -import java.util.Map; - -/** - * 动态数据源 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -@Slf4j -public class DynamicDataSourceHandler extends AbstractRoutingDataSource { - - /** - * targetDataSources:将所有的数据源以Map的形式传入到AbstractRoutingDataSource的实现类中,以供后面进行动态数据源选择 - */ - public DynamicDataSourceHandler(DataSource defaultTargetDataSource, Map targetDataSources) { - super.setDefaultTargetDataSource(defaultTargetDataSource); - super.setTargetDataSources(targetDataSources); - super.afterPropertiesSet(); - } - - /** - * 系统每次选择数据源的时候会执行这个方法拿到key,再通过key去内部的数据源targetDataSources Map中找到对应的数据源对象 - */ - @Override - protected Object determineCurrentLookupKey() { - return DynamicDataSourceContextHandler.getDataSourceType(); - } -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java index 9b5d07bc..ef6255c7 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java @@ -1,17 +1,8 @@ package net.lab1024.sa.base.module.support.cache; -import com.google.common.collect.Lists; -import jakarta.annotation.Resource; -import net.lab1024.sa.base.constant.ReloadConst; -import net.lab1024.sa.base.module.support.reload.core.annoation.SmartReload; -import org.springframework.cache.caffeine.CaffeineCache; -import org.springframework.cache.caffeine.CaffeineCacheManager; import org.springframework.stereotype.Service; -import java.util.Collection; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; /** * 缓存服务 diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java index efd88d9a..68b77e45 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/codegenerator/service/variable/backend/domain/MapperVariableService.java @@ -3,10 +3,8 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen import cn.hutool.core.bean.BeanUtil; import net.lab1024.sa.base.module.support.codegenerator.constant.CodeQueryFieldQueryTypeEnum; import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm; -import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdateField; import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeQueryField; import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService; -import org.apache.commons.collections4.CollectionUtils; import java.util.ArrayList; import java.util.HashMap; diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/job/api/domain/SmartJobUpdateForm.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/job/api/domain/SmartJobUpdateForm.java index 860b4a92..c9f73a5d 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/job/api/domain/SmartJobUpdateForm.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/job/api/domain/SmartJobUpdateForm.java @@ -1,13 +1,8 @@ package net.lab1024.sa.base.module.support.job.api.domain; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; -import net.lab1024.sa.base.common.swagger.SchemaEnum; -import net.lab1024.sa.base.common.validator.enumeration.CheckEnum; -import net.lab1024.sa.base.module.support.job.constant.SmartJobTriggerTypeEnum; -import org.hibernate.validator.constraints.Length; /** * 定时任务 更新 diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/message/domain/MessageTemplateSendForm.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/message/domain/MessageTemplateSendForm.java index 9f70ac69..5bb7236e 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/message/domain/MessageTemplateSendForm.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/message/domain/MessageTemplateSendForm.java @@ -1,10 +1,13 @@ package net.lab1024.sa.base.module.support.message.domain; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; import net.lab1024.sa.base.common.enumeration.UserTypeEnum; import net.lab1024.sa.base.module.support.message.constant.MessageTemplateEnum; +import java.util.List; import java.util.Map; /** @@ -25,6 +28,10 @@ public class MessageTemplateSendForm { @NotNull(message = "接收者id不能为空") private Long receiverUserId; + @Schema(description = "接收者id") + @NotEmpty(message = "接收者id不能为空") + private List receiverUserIdList; + /** * 相关业务id | 可选 * 用于跳转具体业务 diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/SmartReloadManager.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/SmartReloadManager.java index 98773e18..f28116d8 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/SmartReloadManager.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/SmartReloadManager.java @@ -11,9 +11,6 @@ import net.lab1024.sa.base.module.support.reload.core.thread.SmartReloadRunnable import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Service; import org.springframework.util.ReflectionUtils; diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/thread/SmartReloadRunnable.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/thread/SmartReloadRunnable.java index 88cb1a40..0e656c07 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/thread/SmartReloadRunnable.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/reload/core/thread/SmartReloadRunnable.java @@ -2,7 +2,6 @@ package net.lab1024.sa.base.module.support.reload.core.thread; import lombok.extern.slf4j.Slf4j; import net.lab1024.sa.base.module.support.reload.core.AbstractSmartReloadCommand; -import net.lab1024.sa.base.module.support.reload.core.SmartReloadManager; import net.lab1024.sa.base.module.support.reload.core.domain.SmartReloadItem; import net.lab1024.sa.base.module.support.reload.core.domain.SmartReloadObject; import net.lab1024.sa.base.module.support.reload.core.domain.SmartReloadResult; diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/annoation/RepeatSubmit.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/annoation/RepeatSubmit.java index 7469ba68..371f7b95 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/annoation/RepeatSubmit.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/annoation/RepeatSubmit.java @@ -13,7 +13,7 @@ import java.lang.annotation.Target; * @Date 2020-11-25 20:56:58 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitCaffeineTicket.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitCaffeineTicket.java index a2070a34..c18cc038 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitCaffeineTicket.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitCaffeineTicket.java @@ -2,7 +2,6 @@ package net.lab1024.sa.base.module.support.repeatsubmit.ticket; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; -import net.lab1024.sa.base.module.support.repeatsubmit.annoation.RepeatSubmit; import java.util.concurrent.TimeUnit; import java.util.function.Function; diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitRedisTicket.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitRedisTicket.java index cb1404df..f940fdbb 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitRedisTicket.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/repeatsubmit/ticket/RepeatSubmitRedisTicket.java @@ -1,9 +1,7 @@ package net.lab1024.sa.base.module.support.repeatsubmit.ticket; -import net.lab1024.sa.base.module.support.repeatsubmit.annoation.RepeatSubmit; import org.springframework.data.redis.core.ValueOperations; -import java.util.concurrent.TimeUnit; import java.util.function.Function; /** diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/properties/DruidProperties.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/properties/DruidProperties.java deleted file mode 100644 index a625ce47..00000000 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/properties/DruidProperties.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.lab1024.sa.base.properties; - -import com.alibaba.druid.pool.DruidDataSource; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -/** - * Druid 配置属性 - * - * @Author 钟家兴 - * @Date 2025-05-01 14:49 - * @Wechat JavaerEngineer - * @Email lab1024@163.com - * @Copyright 1024创新实验室 - */ -@Configuration -public class DruidProperties { - - @Value("${spring.datasource.druid.initial-size}") - private int initialSize; - - @Value("${spring.datasource.druid.min-idle}") - private int minIdle; - - @Value("${spring.datasource.druid.max-active}") - private int maxActive; - - @Value("${spring.datasource.druid.max-wait}") - private int maxWait; - - @Value("${spring.datasource.druid.connect-timeout}") - private int connectTimeout; - - @Value("${spring.datasource.druid.socket-timeout}") - private int socketTimeout; - - @Value("${spring.datasource.druid.time-between-eviction-runs-millis}") - private int timeBetweenEvictionRunsMillis; - - @Value("${spring.datasource.druid.min-evictable-idle-time-millis}") - private int minEvictableIdleTimeMillis; - - @Value("${spring.datasource.druid.max-evictable-idle-time-millis}") - private int maxEvictableIdleTimeMillis; - - /** - * 构建datasource - */ - public DruidDataSource dataSource(DruidDataSource datasource) - { - // 配置初始化大小、最小、最大 - datasource.setInitialSize(initialSize); - datasource.setMaxActive(maxActive); - datasource.setMinIdle(minIdle); - - // 配置获取连接等待超时的时间 - datasource.setMaxWait(maxWait); - - // 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 - datasource.setConnectTimeout(connectTimeout); - - // 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 - datasource.setSocketTimeout(socketTimeout); - - // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); - - // 配置一个连接在池中最小、最大生存的时间,单位是毫秒 - datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); - datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); - return datasource; - } -} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/js/list.vue.vm b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/js/list.vue.vm index bb4332fb..e90d74d2 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/js/list.vue.vm +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/code-generator-template/js/list.vue.vm @@ -22,12 +22,12 @@ #end #if($field.queryTypeEnum == "Dict") - + #end #if($field.queryTypeEnum == "Enum") - + #end #if($field.queryTypeEnum == "Date") 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 840bc752..400b9780 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 @@ -1,28 +1,18 @@ spring: # 数据库连接信息 datasource: - type: com.alibaba.druid.pool.DruidDataSource + url: jdbc:p6spy:mysql://127.0.0.1:3306/smart_admin_v3?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai + username: root + password: SmartAdmin666 driver-class-name: com.p6spy.engine.spy.P6SpyDriver + initial-size: 2 + min-idle: 2 + max-active: 10 + max-wait: 60000 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + filters: stat druid: - master: - url: jdbc:p6spy:mysql://127.0.0.1:3306/smart_admin_v3?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai - username: root - password: SmartAdmin666 - slave: - enabled: true - url: jdbc:p6spy:mysql://127.0.0.1:3306/smart_admin_v3_slave?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai - username: root - password: SmartAdmin666 - initial-size: 2 - min-idle: 2 - max-active: 10 - max-wait: 60000 - connect-timeout: 30000 - socket-timeout: 30000 - time-between-eviction-runs-millis: 60000 - min-evictable-idle-time-millis: 300000 - max-evictable-idle-time-millis: 300000 - filters: stat username: druid password: 1024 login: @@ -36,7 +26,7 @@ spring: database: 1 host: 127.0.0.1 port: 6379 - password: 123456 + password: timeout: 10000ms lettuce: pool: diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/pre/sa-base.yaml b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/pre/sa-base.yaml index eac78946..2836bad0 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/pre/sa-base.yaml +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/pre/sa-base.yaml @@ -67,7 +67,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/prod/sa-base.yaml b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/prod/sa-base.yaml index ab70b8f9..4cef6a5e 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/prod/sa-base.yaml +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/prod/sa-base.yaml @@ -66,7 +66,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/test/sa-base.yaml b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/test/sa-base.yaml index eac78946..2836bad0 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/resources/test/sa-base.yaml +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/resources/test/sa-base.yaml @@ -67,7 +67,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java index aa4378ca..de077e9a 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/constant/AdminCacheConst.java @@ -20,11 +20,6 @@ public class AdminCacheConst extends CacheKeyConst { */ public static final String DEPARTMENT_LIST_CACHE = "department_list_cache"; - /** - * 部门map - */ - public static final String DEPARTMENT_MAP_CACHE = "department_map_cache"; - /** * 部门树 */ @@ -54,4 +49,20 @@ public class AdminCacheConst extends CacheKeyConst { public static final String CATEGORY_TREE = "category_tree_cache"; } + /** + * 登录相关 + */ + public static class Login { + + /** + * 请求用户信息 + */ + public static final String REQUEST_EMPLOYEE = "login_request_employee"; + + /** + * 请求用户信息权限 + */ + public static final String USER_PERMISSION = "login_user_permission"; + } + } diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java index 4924d5a5..011f0168 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java @@ -5,7 +5,6 @@ import net.lab1024.sa.admin.module.system.department.domain.entity.DepartmentEnt import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; import java.util.List; @@ -32,4 +31,5 @@ public interface DepartmentDao extends BaseMapper { */ List listAll(); + DepartmentVO selectDepartmentVO(@Param("departmentId")Long departmentId); } diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java index 5a4ecc4d..cf2bcb15 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/manager/DepartmentCacheManager.java @@ -10,7 +10,6 @@ import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; import net.lab1024.sa.base.common.util.SmartBeanUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.math.NumberUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -30,7 +29,7 @@ import java.util.stream.Collectors; * @Date 2022-01-12 20:37:48 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Slf4j @Service @@ -43,7 +42,7 @@ public class DepartmentCacheManager { log.info("clear " + cache); } - @CacheEvict(value = {AdminCacheConst.Department.DEPARTMENT_LIST_CACHE, AdminCacheConst.Department.DEPARTMENT_MAP_CACHE, AdminCacheConst.Department.DEPARTMENT_SELF_CHILDREN_CACHE, AdminCacheConst.Department.DEPARTMENT_TREE_CACHE, AdminCacheConst.Department.DEPARTMENT_PATH_CACHE,}, allEntries = true) + @CacheEvict(value = {AdminCacheConst.Department.DEPARTMENT_LIST_CACHE, AdminCacheConst.Department.DEPARTMENT_SELF_CHILDREN_CACHE, AdminCacheConst.Department.DEPARTMENT_TREE_CACHE, AdminCacheConst.Department.DEPARTMENT_PATH_CACHE,}, allEntries = true) public void clearCache() { logClearInfo(AdminCacheConst.Department.DEPARTMENT_LIST_CACHE); } @@ -57,19 +56,8 @@ public class DepartmentCacheManager { return departmentDao.listAll(); } - /** - * 部门map - * - */ - @Cacheable(AdminCacheConst.Department.DEPARTMENT_MAP_CACHE) - public Map getDepartmentMap() { - return departmentDao.listAll().stream().collect(Collectors.toMap(DepartmentVO::getDepartmentId, Function.identity())); - } - - /** * 缓存部门树结构 - * */ @Cacheable(AdminCacheConst.Department.DEPARTMENT_TREE_CACHE) public List getDepartmentTree() { @@ -79,7 +67,6 @@ public class DepartmentCacheManager { /** * 缓存某个部门的下级id列表 - * */ @Cacheable(AdminCacheConst.Department.DEPARTMENT_SELF_CHILDREN_CACHE) public List getDepartmentSelfAndChildren(Long departmentId) { @@ -90,7 +77,6 @@ public class DepartmentCacheManager { /** * 部门的路径名称 - * */ @Cacheable(AdminCacheConst.Department.DEPARTMENT_PATH_CACHE) public Map getDepartmentPathMap() { @@ -126,7 +112,6 @@ public class DepartmentCacheManager { /** * 构建部门树结构 - * */ public List buildTree(List voList) { if (CollectionUtils.isEmpty(voList)) { @@ -141,15 +126,15 @@ public class DepartmentCacheManager { return treeVOList; } - /** + /** * 构建所有根节点的下级树形结构 - * 返回值为层序遍历结果 + * 返回值为层序遍历结果 * [由于departmentDao中listAll给出数据根据Sort降序 所以同一层中Sort值较大的优先遍历] */ private List recursiveBuildTree(List nodeList, List allDepartmentList) { int nodeSize = nodeList.size(); List childIdList = new ArrayList<>(); - for(int i = 0; i < nodeSize; i++) { + for (int i = 0; i < nodeSize; i++) { int preIndex = i - 1; int nextIndex = i + 1; DepartmentTreeVO node = nodeList.get(i); @@ -161,39 +146,38 @@ public class DepartmentCacheManager { } List children = getChildren(node.getDepartmentId(), allDepartmentList); - + List tempChildIdList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(children)) { node.setChildren(children); tempChildIdList = this.recursiveBuildTree(children, allDepartmentList); } - if(CollectionUtils.isEmpty(node.getSelfAndAllChildrenIdList())) { + if (CollectionUtils.isEmpty(node.getSelfAndAllChildrenIdList())) { node.setSelfAndAllChildrenIdList( new ArrayList<>() ); } node.getSelfAndAllChildrenIdList().add(node.getDepartmentId()); - - if(CollectionUtils.isNotEmpty(tempChildIdList)) { + + if (CollectionUtils.isNotEmpty(tempChildIdList)) { node.getSelfAndAllChildrenIdList().addAll(tempChildIdList); childIdList.addAll(tempChildIdList); } - + } - + // 保证本层遍历顺序 - for(int i = nodeSize - 1; i >= 0; i--) { + for (int i = nodeSize - 1; i >= 0; i--) { childIdList.add(0, nodeList.get(i).getDepartmentId()); } - + return childIdList; } /** * 获取子元素 - * */ private List getChildren(Long departmentId, List voList) { List childrenEntityList = voList.stream().filter(e -> departmentId.equals(e.getParentId())).collect(Collectors.toList()); @@ -206,7 +190,6 @@ public class DepartmentCacheManager { /** * 通过部门id,获取当前以及下属部门 - * */ public List selfAndChildrenIdList(Long departmentId, List voList) { List selfAndChildrenIdList = Lists.newArrayList(); diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java index dade9aaa..faa955a9 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java @@ -14,10 +14,7 @@ import net.lab1024.sa.base.common.util.SmartBeanUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Map; /** * 部门 service @@ -26,7 +23,7 @@ import java.util.Map; * @Date 2022-01-12 20:37:48 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ @Service public class DepartmentService { @@ -44,7 +41,6 @@ public class DepartmentService { /** * 新增添加部门 - * */ public ResponseDTO addDepartment(DepartmentAddForm departmentAddForm) { @@ -57,7 +53,6 @@ public class DepartmentService { /** * 更新部门信息 - * */ public ResponseDTO updateDepartment(DepartmentUpdateForm updateDTO) { if (updateDTO.getParentId() == null) { @@ -78,7 +73,6 @@ public class DepartmentService { * 根据id删除部门 * 1、需要判断当前部门是否有子部门,有子部门则不允许删除 * 2、需要判断当前部门是否有员工,有员工则不能删除 - * */ public ResponseDTO deleteDepartment(Long departmentId) { DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); @@ -122,7 +116,6 @@ public class DepartmentService { /** * 自身以及所有下级的部门id列表 - * */ public List selfAndChildrenIdList(Long departmentId) { return departmentCacheManager.getDepartmentSelfAndChildren(departmentId); @@ -131,7 +124,6 @@ public class DepartmentService { /** * 获取所有部门 - * */ public List listAll() { return departmentCacheManager.getDepartmentList(); @@ -140,10 +132,9 @@ public class DepartmentService { /** * 获取部门 - * */ public DepartmentVO getDepartmentById(Long departmentId) { - return departmentCacheManager.getDepartmentMap().get(departmentId); + return departmentDao.selectDepartmentVO(departmentId); } /** @@ -153,38 +144,4 @@ public class DepartmentService { return departmentCacheManager.getDepartmentPathMap().get(departmentId); } - /** - * 查询全部父级部门(不包含自己) - * - */ - public List queryAllParentDepartment(Long departmentId) { - List list = new ArrayList<>(); - - Map departmentMap = departmentCacheManager.getDepartmentMap(); - DepartmentVO departmentVO = departmentMap.get(departmentId); - while (departmentVO != null) { - list.add(departmentVO); - departmentVO = departmentMap.get(departmentVO.getParentId()); - } - Collections.reverse(list); - return list; - } - - /** - * 查询全部父级部门(不包含自己) - * - */ - public List queryAllParentDepartmentIdList(Long departmentId) { - List list = new ArrayList<>(); - - Map departmentMap = departmentCacheManager.getDepartmentMap(); - DepartmentVO departmentVO = departmentMap.get(departmentId); - while (departmentVO != null) { - list.add(departmentVO.getDepartmentId()); - departmentVO = departmentMap.get(departmentVO.getParentId()); - } - Collections.reverse(list); - return list; - } - } diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java index 0b61e3d2..783ae444 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/RequestEmployee.java @@ -7,6 +7,8 @@ import net.lab1024.sa.base.common.enumeration.GenderEnum; import net.lab1024.sa.base.common.enumeration.UserTypeEnum; import net.lab1024.sa.base.common.swagger.SchemaEnum; +import java.io.Serializable; + /** * 请求员工登录信息 * @@ -17,7 +19,7 @@ import net.lab1024.sa.base.common.swagger.SchemaEnum; * @Copyright 1024创新实验室 */ @Data -public class RequestEmployee implements RequestUser { +public class RequestEmployee implements RequestUser, Serializable { @Schema(description = "员工id") private Long employeeId; diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java new file mode 100644 index 00000000..e3b0c607 --- /dev/null +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java @@ -0,0 +1,162 @@ +package net.lab1024.sa.admin.module.system.login.manager; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.sa.admin.constant.AdminCacheConst; +import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.sa.admin.module.system.department.service.DepartmentService; +import net.lab1024.sa.admin.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; +import net.lab1024.sa.admin.module.system.login.domain.RequestEmployee; +import net.lab1024.sa.admin.module.system.menu.domain.vo.MenuVO; +import net.lab1024.sa.admin.module.system.role.domain.vo.RoleVO; +import net.lab1024.sa.admin.module.system.role.service.RoleEmployeeService; +import net.lab1024.sa.admin.module.system.role.service.RoleMenuService; +import net.lab1024.sa.base.common.constant.StringConst; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.domain.UserPermission; +import net.lab1024.sa.base.common.enumeration.UserTypeEnum; +import net.lab1024.sa.base.common.util.SmartBeanUtil; +import net.lab1024.sa.base.module.support.file.service.IFileStorageService; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 登录Manager + * + * @Author 1024创新实验室: 卓大 + * @Date 2025-05-03 22:56:34 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@Slf4j +@Service +public class LoginManager { + + @Resource + private DepartmentService departmentService; + + @Resource + private IFileStorageService fileStorageService; + + @Resource + private EmployeeService employeeService; + + @Resource + private RoleEmployeeService roleEmployeeService; + + @Resource + private RoleMenuService roleMenuService; + + + /** + * 获取请求用户信息 + */ + @Cacheable(AdminCacheConst.Login.REQUEST_EMPLOYEE) + public RequestEmployee getRequestEmployee(Long requestEmployeeId ) { + if (requestEmployeeId == null) { + return null; + } + // 员工基本信息 + EmployeeEntity employeeEntity = employeeService.getById(requestEmployeeId); + if (employeeEntity == null) { + return null; + } + + return this.loadLoginInfo(employeeEntity); + } + + /** + * 获取登录的用户信息 + */ + @CachePut(value = AdminCacheConst.Login.REQUEST_EMPLOYEE, key = "#employeeEntity.employeeId") + public RequestEmployee loadLoginInfo(EmployeeEntity employeeEntity) { + // 基础信息 + RequestEmployee requestEmployee = SmartBeanUtil.copy(employeeEntity, RequestEmployee.class); + requestEmployee.setUserType(UserTypeEnum.ADMIN_EMPLOYEE); + + // 部门信息 + DepartmentVO department = departmentService.getDepartmentById(employeeEntity.getDepartmentId()); + requestEmployee.setDepartmentName(null == department ? StringConst.EMPTY : department.getName()); + + // 头像信息 + String avatar = employeeEntity.getAvatar(); + if (StringUtils.isNotBlank(avatar)) { + ResponseDTO getFileUrl = fileStorageService.getFileUrl(avatar); + if (BooleanUtils.isTrue(getFileUrl.getOk())) { + requestEmployee.setAvatar(getFileUrl.getData()); + } + } + return requestEmployee; + } + + + /** + * 获取用户的权限(包含 角色列表、权限列表) + */ + @Cacheable(AdminCacheConst.Login.USER_PERMISSION) + public UserPermission getUserPermission(Long employeeId) { + if(null == employeeId){ + return null; + } + + return this.loadUserPermission(employeeId); + } + + /** + * 获取用户的权限(包含 角色列表、权限列表) + */ + @CachePut(AdminCacheConst.Login.USER_PERMISSION) + public UserPermission loadUserPermission(Long employeeId) { + UserPermission userPermission = new UserPermission(); + userPermission.setPermissionList(new ArrayList<>()); + userPermission.setRoleList(new ArrayList<>()); + + // 角色列表 + List roleList = roleEmployeeService.getRoleIdList(employeeId); + userPermission.getRoleList().addAll(roleList.stream().map(RoleVO::getRoleCode).collect(Collectors.toSet())); + + // 前端菜单和功能点清单 + EmployeeEntity employeeEntity = employeeService.getById(employeeId); + + List menuAndPointsList = roleMenuService.getMenuList(roleList.stream().map(RoleVO::getRoleId).collect(Collectors.toList()), employeeEntity.getAdministratorFlag()); + + // 权限列表 + HashSet permissionSet = new HashSet<>(); + for (MenuVO menu : menuAndPointsList) { + if (menu.getPermsType() == null) { + continue; + } + + String perms = menu.getApiPerms(); + if (StringUtils.isEmpty(perms)) { + continue; + } + //接口权限 + String[] split = perms.split(","); + permissionSet.addAll(Arrays.asList(split)); + } + userPermission.getPermissionList().addAll(permissionSet); + + return userPermission; + } + + + @CacheEvict(value = {AdminCacheConst.Login.USER_PERMISSION, AdminCacheConst.Login.REQUEST_EMPLOYEE}, allEntries = true) + public void clear(){ + + } + + +} diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java index 9193530e..21f62753 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java @@ -6,7 +6,6 @@ import cn.hutool.core.lang.UUID; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.servlet.ServletUtil; -import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; import lombok.extern.slf4j.Slf4j; import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; import net.lab1024.sa.admin.module.system.department.service.DepartmentService; @@ -15,6 +14,7 @@ import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; import net.lab1024.sa.admin.module.system.login.domain.LoginForm; import net.lab1024.sa.admin.module.system.login.domain.LoginResultVO; import net.lab1024.sa.admin.module.system.login.domain.RequestEmployee; +import net.lab1024.sa.admin.module.system.login.manager.LoginManager; import net.lab1024.sa.admin.module.system.menu.domain.vo.MenuVO; import net.lab1024.sa.admin.module.system.role.domain.vo.RoleVO; import net.lab1024.sa.admin.module.system.role.service.RoleEmployeeService; @@ -56,15 +56,16 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; -import java.util.*; -import java.util.concurrent.ConcurrentMap; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.stream.Collectors; /** * 登录 * - * @Author 1024创新实验室: 开云 - * @Date 2021-12-01 22:56:34 + * @Author 1024创新实验室: 卓大 + * @Date 2025-05-03 22:56:34 * @Wechat zhuoda1024 * @Email lab1024@163.com * @Copyright 1024创新实验室 @@ -78,22 +79,6 @@ public class LoginService implements StpInterface { */ private static final String SUPER_PASSWORD_LOGIN_ID_PREFIX = "S"; - /** - * 最大在线缓存人数 - */ - private static final long CACHE_MAX_ONLINE_PERSON_COUNT = 1000L; - - /** - * 登录信息二级缓存 - */ - private final ConcurrentMap loginEmployeeCache = new ConcurrentLinkedHashMap.Builder().maximumWeightedCapacity(CACHE_MAX_ONLINE_PERSON_COUNT).build(); - - - /** - * 权限 缓存 - */ - private final ConcurrentMap permissionCache = new ConcurrentLinkedHashMap.Builder().maximumWeightedCapacity(CACHE_MAX_ONLINE_PERSON_COUNT).build(); - @Resource private EmployeeService employeeService; @@ -136,6 +121,9 @@ public class LoginService implements StpInterface { @Resource private RedisService redisService; + @Resource + private LoginManager loginManager; + /** * 获取验证码 */ @@ -226,10 +214,7 @@ public class LoginService implements StpInterface { } // 获取员工信息 - RequestEmployee requestEmployee = loadLoginInfo(employeeEntity); - - // 放入缓存 - loginEmployeeCache.put(employeeEntity.getEmployeeId(), requestEmployee); + RequestEmployee requestEmployee = loginManager.loadLoginInfo(employeeEntity); // 移除登录失败 securityLoginService.removeLoginFail(employeeEntity.getEmployeeId(), UserTypeEnum.ADMIN_EMPLOYEE); @@ -244,8 +229,8 @@ public class LoginService implements StpInterface { // 设置 token loginResultVO.setToken(token); - // 清除权限缓存 - permissionCache.remove(employeeEntity.getEmployeeId()); + // 更新用户权限 + loginManager.loadUserPermission(employeeEntity.getEmployeeId()); return ResponseDTO.ok(loginResultVO); } @@ -264,10 +249,6 @@ public class LoginService implements StpInterface { List menuAndPointsList = roleMenuService.getMenuList(roleList.stream().map(RoleVO::getRoleId).collect(Collectors.toList()), requestEmployee.getAdministratorFlag()); loginResultVO.setMenuList(menuAndPointsList); - // 更新下后端权限缓存 - UserPermission userPermission = getUserPermission(requestEmployee.getUserId()); - permissionCache.put(requestEmployee.getUserId(), userPermission); - // 上次登录信息 LoginLogVO loginLogVO = loginLogService.queryLastByUserId(requestEmployee.getEmployeeId(), UserTypeEnum.ADMIN_EMPLOYEE, LoginLogResultEnum.LOGIN_SUCCESS); if (loginLogVO != null) { @@ -291,32 +272,6 @@ public class LoginService implements StpInterface { } - /** - * 获取登录的用户信息 - */ - private RequestEmployee loadLoginInfo(EmployeeEntity employeeEntity) { - - // 基础信息 - RequestEmployee requestEmployee = SmartBeanUtil.copy(employeeEntity, RequestEmployee.class); - requestEmployee.setUserType(UserTypeEnum.ADMIN_EMPLOYEE); - - // 部门信息 - DepartmentVO department = departmentService.getDepartmentById(employeeEntity.getDepartmentId()); - requestEmployee.setDepartmentName(null == department ? StringConst.EMPTY : department.getName()); - - // 头像信息 - String avatar = employeeEntity.getAvatar(); - if (StringUtils.isNotBlank(avatar)) { - ResponseDTO getFileUrl = fileStorageService.getFileUrl(avatar); - if (BooleanUtils.isTrue(getFileUrl.getOk())) { - requestEmployee.setAvatar(getFileUrl.getData()); - } - } - - return requestEmployee; - } - - /** * 根据登陆token 获取员请求工信息 */ @@ -330,17 +285,7 @@ public class LoginService implements StpInterface { return null; } - RequestEmployee requestEmployee = loginEmployeeCache.get(requestEmployeeId); - if (requestEmployee == null) { - // 员工基本信息 - EmployeeEntity employeeEntity = employeeService.getById(requestEmployeeId); - if (employeeEntity == null) { - return null; - } - - requestEmployee = this.loadLoginInfo(employeeEntity); - loginEmployeeCache.put(requestEmployeeId, requestEmployee); - } + RequestEmployee requestEmployee = loginManager.getRequestEmployee(requestEmployeeId); // 更新请求ip和user agent requestEmployee.setUserAgent(ServletUtil.getHeaderIgnoreCase(request, RequestHeaderConst.USER_AGENT)); @@ -384,7 +329,7 @@ public class LoginService implements StpInterface { StpUtil.logout(); // 清空登录信息缓存 - loginEmployeeCache.remove(requestUser.getUserId()); + loginManager.clear(); //保存登出日志 LoginLogEntity loginEntity = LoginLogEntity.builder() @@ -402,14 +347,6 @@ public class LoginService implements StpInterface { return ResponseDTO.ok(); } - /** - * 清除员工登录缓存 - */ - public void clearLoginEmployeeCache(Long employeeId) { - // 清空登录信息缓存 - loginEmployeeCache.remove(employeeId); - } - /** * 保存登录日志 */ @@ -437,12 +374,7 @@ public class LoginService implements StpInterface { return Collections.emptyList(); } - UserPermission userPermission = permissionCache.get(employeeId); - if (userPermission == null) { - userPermission = getUserPermission(employeeId); - permissionCache.put(employeeId, userPermission); - } - + UserPermission userPermission = loginManager.getUserPermission(employeeId); return userPermission.getPermissionList(); } @@ -453,51 +385,10 @@ public class LoginService implements StpInterface { return Collections.emptyList(); } - UserPermission userPermission = permissionCache.get(employeeId); - if (userPermission == null) { - userPermission = getUserPermission(employeeId); - permissionCache.put(employeeId, userPermission); - } + UserPermission userPermission = loginManager.getUserPermission(employeeId); return userPermission.getRoleList(); } - /** - * 获取用户的权限(包含 角色列表、权限列表) - */ - private UserPermission getUserPermission(Long employeeId) { - - UserPermission userPermission = new UserPermission(); - userPermission.setPermissionList(new ArrayList<>()); - userPermission.setRoleList(new ArrayList<>()); - - // 角色列表 - List roleList = roleEmployeeService.getRoleIdList(employeeId); - userPermission.getRoleList().addAll(roleList.stream().map(RoleVO::getRoleCode).collect(Collectors.toSet())); - - // 前端菜单和功能点清单 - EmployeeEntity employeeEntity = employeeService.getById(employeeId); - - List menuAndPointsList = roleMenuService.getMenuList(roleList.stream().map(RoleVO::getRoleId).collect(Collectors.toList()), employeeEntity.getAdministratorFlag()); - - // 权限列表 - HashSet permissionSet = new HashSet<>(); - for (MenuVO menu : menuAndPointsList) { - if (menu.getPermsType() == null) { - continue; - } - - String perms = menu.getApiPerms(); - if (StringUtils.isEmpty(perms)) { - continue; - } - //接口权限 - String[] split = perms.split(","); - permissionSet.addAll(Arrays.asList(split)); - } - userPermission.getPermissionList().addAll(permissionSet); - - return userPermission; - } /** * 发送 邮箱 验证码 @@ -592,4 +483,8 @@ public class LoginService implements StpInterface { String redisVerificationCodeKey = redisService.generateRedisKey(RedisKeyConst.Support.LOGIN_VERIFICATION_CODE, UserTypeEnum.ADMIN_EMPLOYEE.getValue() + RedisKeyConst.SEPARATOR + employeeId); redisService.delete(redisVerificationCodeKey); } + + public void clearLoginEmployeeCache(Long employeeId) { + loginManager.clear(); + } } diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml b/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml index 326d94f5..8ee2974d 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml @@ -19,5 +19,16 @@ WHERE parent_id = #{departmentId} + + \ No newline at end of file diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java index c10897d0..355b9482 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/common/domain/UserPermission.java @@ -2,6 +2,7 @@ package net.lab1024.sa.base.common.domain; import lombok.Data; +import java.io.Serializable; import java.util.List; /** @@ -15,7 +16,7 @@ import java.util.List; */ @Data -public class UserPermission { +public class UserPermission implements Serializable { /** * 权限列表 diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java index bf6de16a..5beb7413 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/config/CacheConfig.java @@ -1,11 +1,17 @@ package net.lab1024.sa.base.config; +import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; import net.lab1024.sa.base.module.support.cache.CacheService; import net.lab1024.sa.base.module.support.cache.CaffeineCacheServiceImpl; import net.lab1024.sa.base.module.support.cache.RedisCacheServiceImpl; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +import javax.annotation.Resource; /** * 缓存配置 @@ -20,6 +26,18 @@ public class CacheConfig { private static final String CAFFEINE_CACHE = "caffeine"; + @Resource + private RedisConnectionFactory factory; + + @Bean + @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = REDIS_CACHE) + public RedisCacheConfiguration redisCacheConfiguration() { + return RedisCacheConfiguration.defaultCacheConfig() + .disableCachingNullValues() + .computePrefixWith(name -> "cache:" + name + ":") + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer())); + } + @Bean @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = REDIS_CACHE) public CacheService redisCacheService() { 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 640cf540..fbc5185e 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 @@ -66,7 +66,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: @@ -88,8 +88,8 @@ file: region: oss-cn-hangzhou endpoint: oss-cn-hangzhou.aliyuncs.com bucket-name: 1024lab-smart-admin - access-key: - secret-key: + access-key: + secret-key: url-prefix: https://${file.storage.cloud.bucket-name}.${file.storage.cloud.endpoint}/ private-url-expire-seconds: 3600 diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/pre/sa-base.yaml b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/pre/sa-base.yaml index df370a8f..ca25d856 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/pre/sa-base.yaml +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/pre/sa-base.yaml @@ -66,7 +66,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/prod/sa-base.yaml b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/prod/sa-base.yaml index 4d47b216..d00ad41d 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/prod/sa-base.yaml +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/prod/sa-base.yaml @@ -65,7 +65,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/test/sa-base.yaml b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/test/sa-base.yaml index df370a8f..ca25d856 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/resources/test/sa-base.yaml +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/resources/test/sa-base.yaml @@ -66,7 +66,7 @@ spring: # 缓存实现类型 cache: - type: caffeine + type: redis # tomcat 配置,主要用于 配置 访问日志(便于将来排查错误) server: diff --git a/smart-admin-web-javascript/README.en.md b/smart-admin-web-javascript/README.en.md deleted file mode 100644 index e69de29b..00000000 diff --git a/smart-admin-web-javascript/README.md b/smart-admin-web-javascript/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/smart-admin-web-javascript/src/assets/images/login/login-min.gif b/smart-admin-web-javascript/src/assets/images/login/login-min.gif new file mode 100644 index 00000000..2a7608bf Binary files /dev/null and b/smart-admin-web-javascript/src/assets/images/login/login-min.gif differ diff --git a/smart-admin-web-javascript/src/components/support/dict-label/index.vue b/smart-admin-web-javascript/src/components/support/dict-label/index.vue index 1f5d3f03..0a5b2490 100644 --- a/smart-admin-web-javascript/src/components/support/dict-label/index.vue +++ b/smart-admin-web-javascript/src/components/support/dict-label/index.vue @@ -8,7 +8,7 @@ const props = defineProps({ dictCode: String, - dataValue: String, + dataValue: [String, Number], }); const dataLabels = computed(() => { return useDictStore().getDataLabels(props.dictCode, props.dataValue); diff --git a/smart-admin-web-javascript/src/store/modules/system/dict.js b/smart-admin-web-javascript/src/store/modules/system/dict.js index 02afa1dc..3540c4d4 100644 --- a/smart-admin-web-javascript/src/store/modules/system/dict.js +++ b/smart-admin-web-javascript/src/store/modules/system/dict.js @@ -1,6 +1,4 @@ import { defineStore } from 'pinia'; -import { dictApi } from '/@/api/support/dict-api'; -import { smartSentry } from '/@/lib/smart-sentry'; import { DICT_SPLIT } from '/@/constants/support/dict-const.js'; import _ from 'lodash'; @@ -23,14 +21,21 @@ export const useDictStore = defineStore({ // 获取字典的值名称 getDataLabels(dictCode, dataValue) { - if (!dataValue) { + if (_.isNil(dataValue) || _.isNaN(dataValue)) { return ''; } + let dict = this.getDictData(dictCode); if (dict.length === 0) { return ''; } + // 是数字的话,需要特殊处理 + if(_.isNumber(dataValue)){ + let target = _.find(dict, { dataValue: dataValue }); + return target ? target.dataLabel : ''; + } + let valueArray = dataValue.split(DICT_SPLIT); let result = []; for (let item of valueArray) { @@ -42,7 +47,7 @@ export const useDictStore = defineStore({ return result.join(DICT_SPLIT); }, // 初始化字典 - initData(dictDataList){ + initData(dictDataList) { this.dictMap.clear(); for (let data of dictDataList) { let dataArray = this.dictMap.get(data.dictCode); diff --git a/smart-admin-web-javascript/src/views/business/erp/goods/goods-list.vue b/smart-admin-web-javascript/src/views/business/erp/goods/goods-list.vue index 429a8dfe..c4be7333 100644 --- a/smart-admin-web-javascript/src/views/business/erp/goods/goods-list.vue +++ b/smart-admin-web-javascript/src/views/business/erp/goods/goods-list.vue @@ -495,40 +495,32 @@ function camelToUnderscore(str) { return str.replace(/([A-Z])/g, '_$1').toLowerCase(); } - + // 动态设置表格高度 const yHeight = ref(0); - + onMounted(() => { + resetGetHeight(); + }); function resetGetHeight() { - // 搜索部分高度 - let doc = document.querySelector('.ant-form'); - // 按钮部分高度 - let btn = document.querySelector('.smart-table-btn-block'); - // 表格头高度 - let tableCell = document.querySelector('.ant-table-cell'); - // 分页高度 - let page = document.querySelector('.smart-query-table-page'); - // 内容区总高度 - let box = document.querySelector('.admin-content'); - setTimeout(() => { + // 搜索部分高度 + let doc = document.querySelector('.ant-form'); + // 按钮部分高度 + let btn = document.querySelector('.smart-table-btn-block'); + // 表格头高度 + let tableCell = document.querySelector('.ant-table-cell'); + // 分页高度 + let page = document.querySelector('.smart-query-table-page'); + // 内容区总高度 + let box = document.querySelector('.admin-content'); + setTimeout(() => { let dueHeight = doc.offsetHeight + 10 + 24 + btn.offsetHeight + 15 + tableCell.offsetHeight + page.offsetHeight + 20; yHeight.value = box.offsetHeight - dueHeight; }, 100); } - - // 定义一个变量来存储节流后的回调函数 - let throttledResizeHandler; - onMounted(() => { - resetGetHeight(); - throttledResizeHandler = _.throttle(() => { - resetGetHeight(); - }, 1000); - - window.addEventListener('resize', throttledResizeHandler); - }); - - // 在组件销毁时移除 resize 事件监听器 - onUnmounted(() => { - window.removeEventListener('resize', throttledResizeHandler); - }); + window.addEventListener( + 'resize', + _.throttle(() => { + resetGetHeight(); + }, 1000) + ); diff --git a/smart-admin-web-javascript/src/views/support/code-generator/code-generator-list.vue b/smart-admin-web-javascript/src/views/support/code-generator/code-generator-list.vue index 83bdb9f0..80e96c75 100644 --- a/smart-admin-web-javascript/src/views/support/code-generator/code-generator-list.vue +++ b/smart-admin-web-javascript/src/views/support/code-generator/code-generator-list.vue @@ -41,7 +41,7 @@ - + @@ -56,11 +56,9 @@