commit:同步2.0版本

This commit is contained in:
Jerry
2021-10-21 14:07:36 +08:00
parent e4a296695e
commit 8431b3bf62
179 changed files with 2677 additions and 8491 deletions

View File

@@ -19,6 +19,11 @@
<artifactId>common-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.orange.demo</groupId>
<artifactId>common-datafilter</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 通用业务依赖 -->
<dependency>
<groupId>com.orange.demo</groupId>

View File

@@ -50,6 +50,13 @@ public class SysUserDto {
@NotBlank(message = "数据验证失败,用户显示名称不能为空!")
private String showName;
/**
* 用户部门Id。
*/
@ApiModelProperty(value = "用户部门Id", required = true)
@NotNull(message = "数据验证失败用户部门Id不能为空")
private Long deptId;
/**
* 用户类型(0: 管理员 1: 系统管理用户 2: 系统业务用户)。
*/

View File

@@ -9,12 +9,12 @@ import java.util.Map;
import java.util.List;
/**
* SysUserVO对象。
* SysUserVO视图对象。
*
* @author Jerry
* @date 2020-08-08
*/
@ApiModel("SysUserVO实体对象")
@ApiModel("SysUserVO视图对象")
@Data
public class SysUserVo {
@@ -36,6 +36,12 @@ public class SysUserVo {
@ApiModelProperty(value = "用户显示名称")
private String showName;
/**
* 用户部门Id。
*/
@ApiModelProperty(value = "用户部门Id")
private Long deptId;
/**
* 用户类型(0: 管理员 1: 系统管理用户 2: 系统业务用户)。
*/
@@ -84,6 +90,18 @@ public class SysUserVo {
@ApiModelProperty(value = "多对多用户角色数据集合")
private List<Map<String, Object>> sysUserRoleList;
/**
* 多对多用户数据权限数据集合。
*/
@ApiModelProperty(value = "多对多用户数据权限数据集合")
private List<Map<String, Object>> sysDataPermUserList;
/**
* deptId 字典关联数据。
*/
@ApiModelProperty(value = "deptId 字典关联数据")
private Map<String, Object> deptIdDictMap;
/**
* userType 常量字典关联数据。
*/

View File

@@ -64,26 +64,40 @@
<orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.2.6" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.2.6" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.1.5" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.4.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.3.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.14.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.14.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.1.5" level="project" />
<orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.1.5" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.3.0" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.5" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.5" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.3.0" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.2.0" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:3.2" level="project" />
<orderEntry type="module" module-name="common-datafilter" />
<orderEntry type="module" module-name="common-redis" />
<orderEntry type="library" name="Maven: org.redisson:redisson:3.15.4" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver-dns:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec-dns:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: javax.cache:cache-api:1.1.1" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.16.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.reactivex.rxjava3:rxjava:3.0.12" level="project" />
<orderEntry type="library" name="Maven: org.jboss.marshalling:jboss-marshalling-river:2.0.11.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.marshalling:jboss-marshalling:2.0.11.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.4" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-bean:5.1.6" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-core:5.1.6" level="project" />
<orderEntry type="module" module-name="application-common" />
<orderEntry type="module" module-name="common-swagger" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-micro-spring-boot-starter:2.0.8" level="project" />
@@ -151,11 +165,7 @@
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-cluster-server-default:1.8.0" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-cluster-common-default:1.8.0" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.63.Final" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-cluster-client-default:1.8.0" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-alibaba-sentinel-datasource:2.2.5.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.csp:sentinel-datasource-nacos:1.8.0" level="project" />
@@ -218,7 +228,7 @@
<orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-javanica:1.5.18" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: io.reactivex:rxjava-reactive-streams:1.2.1" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.2.0.Final" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />

View File

@@ -1,6 +1,8 @@
package com.orange.demo.upmsservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@@ -11,6 +13,7 @@ import org.springframework.context.annotation.ComponentScan;
* @author Jerry
* @date 2020-08-08
*/
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@SpringCloudApplication
@EnableFeignClients(basePackages = "com.orange.demo")
@ComponentScan("com.orange.demo")

View File

@@ -34,4 +34,8 @@ public class ApplicationConfig {
* 通常在调试和测试阶段设置为false以便及时发现问题。
*/
private Boolean ignoreRpcError;
/**
* Session的数据权限缓存时长(单位:秒)。
*/
private Integer dataPermExpiredSeconds;
}

View File

@@ -1,30 +0,0 @@
package com.orange.demo.upmsservice.config;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
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 org.springframework.transaction.annotation.EnableTransactionManagement;
import tk.mybatis.spring.annotation.MapperScan;
import javax.sql.DataSource;
/**
* 数据源配置Bean对象。
*
* @author Jerry
* @date 2020-08-08
*/
@Configuration
@EnableTransactionManagement
@MapperScan(value = {"com.orange.demo.*.dao", "com.orange.demo.common.*.dao"})
public class DataSourceConfig {
@Bean(initMethod = "init", destroyMethod = "close")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource druidDataSource() {
return DruidDataSourceBuilder.create().build();
}
}

View File

@@ -12,10 +12,13 @@ import com.orange.demo.common.core.constant.ApplicationConstant;
import com.orange.demo.common.core.object.*;
import com.orange.demo.common.core.util.*;
import com.orange.demo.common.redis.cache.SessionCacheHelper;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.orange.demo.upmsapi.constant.SysUserStatus;
import com.orange.demo.upmsapi.constant.SysUserType;
import com.orange.demo.upmsservice.model.*;
import com.orange.demo.upmsservice.service.*;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
@@ -46,8 +49,12 @@ public class LoginController {
@Autowired
private SysMenuService sysMenuService;
@Autowired
private SysDataPermService sysDataPermService;
@Autowired
private SysPermWhitelistService sysPermWhitelistService;
@Autowired
private RedissonClient redissonClient;
@Autowired
private SessionCacheHelper cacheHelper;
@Autowired
private PasswordEncoder passwordEncoder;
@@ -65,6 +72,7 @@ public class LoginController {
@ApiImplicitParam(name = "loginName", defaultValue = "admin"),
@ApiImplicitParam(name = "password", defaultValue = "IP3ccke3GhH45iGHB5qP9p7iZw6xUyj28Ju10rnBiPKOI35sc%2BjI7%2FdsjOkHWMfUwGYGfz8ik31HC2Ruk%2Fhkd9f6RPULTHj7VpFdNdde2P9M4mQQnFBAiPM7VT9iW3RyCtPlJexQ3nAiA09OqG%2F0sIf1kcyveSrulxembARDbDo%3D")
})
@OperationLog(type = SysOperationLogType.LOGIN, saveResponse = false)
@PostMapping("/doLogin")
public ResponseResult<JSONObject> doLogin(
@MyRequestBody String loginName, @MyRequestBody String password) throws Exception {
@@ -87,6 +95,8 @@ public class LoginController {
errorMessage = "登录失败,用户账号被锁定!";
return ResponseResult.error(ErrorCodeEnum.INVALID_USER_STATUS, errorMessage);
}
String patternKey = RedisKeyUtil.getSessionIdPrefix(user.getLoginName(), MyCommonUtil.getDeviceType()) + "*";
redissonClient.getKeys().deleteByPatternAsync(patternKey);
JSONObject jsonData = this.buildLoginData(user);
return ResponseResult.success(jsonData);
}
@@ -96,9 +106,11 @@ public class LoginController {
*
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.LOGOUT)
@PostMapping("/doLogout")
public ResponseResult<Void> doLogout() {
TokenData tokenData = TokenData.takeFromRequest();
sysDataPermService.removeDataPermCache(tokenData.getSessionId());
cacheHelper.removeAllSessionCache(tokenData.getSessionId());
return ResponseResult.success();
}
@@ -143,7 +155,7 @@ public class LoginController {
@PostMapping("/changePassword")
public ResponseResult<Void> changePassword(
@MyRequestBody String oldPass, @MyRequestBody String newPass) throws Exception {
if (MyCommonUtil.existBlankArgument(oldPass, oldPass)) {
if (MyCommonUtil.existBlankArgument(newPass, oldPass)) {
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
TokenData tokenData = TokenData.takeFromRequest();
@@ -169,6 +181,7 @@ public class LoginController {
TokenData tokenData = new TokenData();
String sessionId = user.getLoginName() + "_" + deviceType + "_" + MyCommonUtil.generateUuid();
tokenData.setUserId(user.getUserId());
tokenData.setDeptId(user.getDeptId());
tokenData.setIsAdmin(isAdmin);
tokenData.setLoginName(user.getLoginName());
tokenData.setShowName(user.getShowName());
@@ -197,6 +210,9 @@ public class LoginController {
}
jsonData.put("menuList", menuList);
jsonData.put("permCodeList", permCodeList);
if (user.getUserType() != SysUserType.TYPE_ADMIN) {
sysDataPermService.putDataPermCache(sessionId, user.getUserId(), user.getDeptId());
}
return jsonData;
}
}

View File

@@ -1,6 +1,7 @@
package com.orange.demo.upmsservice.controller;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.TypeReference;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
@@ -10,6 +11,8 @@ import com.orange.demo.common.core.util.MyModelUtil;
import com.orange.demo.common.core.util.MyCommonUtil;
import com.orange.demo.common.core.annotation.MyRequestBody;
import com.orange.demo.common.core.validator.UpdateGroup;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.orange.demo.upmsapi.dto.SysMenuDto;
import com.orange.demo.upmsapi.vo.SysMenuVo;
import com.orange.demo.upmsapi.constant.SysMenuType;
@@ -43,8 +46,8 @@ public class SysMenuController {
* @param permCodeIdListString 与当前菜单Id绑定的权限Id列表多个权限之间逗号分隔。
* @return 应答结果对象包含新增菜单的主键Id。
*/
@SuppressWarnings("unchecked")
@ApiOperationSupport(ignoreParameters = {"sysMenuDto.menuId"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(
@MyRequestBody SysMenuDto sysMenuDto, @MyRequestBody String permCodeIdListString) {
@@ -70,7 +73,7 @@ public class SysMenuController {
}
Set<Long> permCodeIdSet = null;
if (result.getData() != null) {
permCodeIdSet = (Set<Long>) result.getData().get("permCodeIdSet");
permCodeIdSet = result.getData().getObject("permCodeIdSet", new TypeReference<Set<Long>>(){});
}
sysMenuService.saveNew(sysMenu, permCodeIdSet);
return ResponseResult.success(sysMenu.getMenuId());
@@ -83,7 +86,7 @@ public class SysMenuController {
* @param permCodeIdListString 与当前菜单Id绑定的权限Id列表多个权限之间逗号分隔。
* @return 应答结果对象。
*/
@SuppressWarnings("unchecked")
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(
@MyRequestBody SysMenuDto sysMenuDto, @MyRequestBody String permCodeIdListString) {
@@ -118,7 +121,7 @@ public class SysMenuController {
}
Set<Long> permCodeIdSet = null;
if (result.getData() != null) {
permCodeIdSet = (Set<Long>) result.getData().get("permCodeIdSet");
permCodeIdSet = result.getData().getObject("permCodeIdSet", new TypeReference<Set<Long>>(){});
}
if (!sysMenuService.update(sysMenu, originalSysMenu, permCodeIdSet)) {
errorMessage = "数据验证失败,当前权限字并不存在,请刷新后重试!";
@@ -133,6 +136,7 @@ public class SysMenuController {
* @param menuId 指定菜单主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long menuId) {
if (MyCommonUtil.existBlankArgument(menuId)) {

View File

@@ -2,6 +2,7 @@ package com.orange.demo.upmsservice.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import com.orange.demo.common.core.constant.ErrorCodeEnum;
import com.orange.demo.common.core.object.*;
@@ -9,6 +10,8 @@ import com.orange.demo.common.core.util.MyModelUtil;
import com.orange.demo.common.core.util.MyCommonUtil;
import com.orange.demo.common.core.annotation.MyRequestBody;
import com.orange.demo.common.core.validator.UpdateGroup;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.orange.demo.upmsapi.dto.SysPermCodeDto;
import com.orange.demo.upmsapi.vo.SysPermCodeVo;
import com.orange.demo.upmsservice.model.SysPermCode;
@@ -42,8 +45,8 @@ public class SysPermCodeController {
* @param permIdListString 与当前权限Id绑定的权限资源Id列表多个权限资源之间逗号分隔。
* @return 应答结果对象包含新增权限字的主键Id。
*/
@SuppressWarnings("unchecked")
@ApiOperationSupport(ignoreParameters = {"sysPermCodeDto.permCodeId"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(
@MyRequestBody SysPermCodeDto sysPermCodeDto, @MyRequestBody String permIdListString) {
@@ -58,7 +61,7 @@ public class SysPermCodeController {
}
Set<Long> permIdSet = null;
if (result.getData() != null) {
permIdSet = (Set<Long>) result.getData().get("permIdSet");
permIdSet = result.getData().getObject("permIdSet", new TypeReference<Set<Long>>(){});
}
sysPermCode = sysPermCodeService.saveNew(sysPermCode, permIdSet);
return ResponseResult.success(sysPermCode.getPermCodeId());
@@ -71,7 +74,7 @@ public class SysPermCodeController {
* @param permIdListString 与当前权限Id绑定的权限资源Id列表多个权限资源之间逗号分隔。
* @return 应答结果对象。
*/
@SuppressWarnings("unchecked")
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(
@MyRequestBody SysPermCodeDto sysPermCodeDto, @MyRequestBody String permIdListString) {
@@ -91,7 +94,7 @@ public class SysPermCodeController {
}
Set<Long> permIdSet = null;
if (result.getData() != null) {
permIdSet = (Set<Long>) result.getData().get("permIdSet");
permIdSet = result.getData().getObject("permIdSet", new TypeReference<Set<Long>>(){});
}
try {
if (!sysPermCodeService.update(sysPermCode, originalSysPermCode, permIdSet)) {
@@ -111,6 +114,7 @@ public class SysPermCodeController {
* @param permCodeId 指定的权限字主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long permCodeId) {
if (MyCommonUtil.existBlankArgument(permCodeId)) {

View File

@@ -12,6 +12,8 @@ import com.orange.demo.common.core.util.MyCommonUtil;
import com.orange.demo.common.core.util.MyPageUtil;
import com.orange.demo.common.core.annotation.MyRequestBody;
import com.orange.demo.common.core.validator.UpdateGroup;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.orange.demo.upmsapi.dto.SysPermDto;
import com.orange.demo.upmsapi.vo.SysPermVo;
import com.orange.demo.upmsservice.model.SysPerm;
@@ -45,6 +47,7 @@ public class SysPermController {
* @return 应答结果对象包含新增权限资源的主键Id。
*/
@ApiOperationSupport(ignoreParameters = {"sysPermDto.permId"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(@MyRequestBody SysPermDto sysPermDto) {
String errorMessage = MyCommonUtil.getModelValidationError(sysPermDto);
@@ -66,6 +69,7 @@ public class SysPermController {
* @param sysPermDto 更新权限资源对象。
* @return 应答结果对象包含更新权限资源的主键Id。
*/
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(@MyRequestBody SysPermDto sysPermDto) {
String errorMessage = MyCommonUtil.getModelValidationError(sysPermDto, Default.class, UpdateGroup.class);
@@ -92,6 +96,7 @@ public class SysPermController {
* @param permId 指定的权限资源主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long permId) {
if (MyCommonUtil.existBlankArgument(permId)) {

View File

@@ -9,6 +9,8 @@ import com.orange.demo.common.core.util.MyModelUtil;
import com.orange.demo.common.core.util.MyCommonUtil;
import com.orange.demo.common.core.annotation.MyRequestBody;
import com.orange.demo.common.core.validator.UpdateGroup;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.orange.demo.upmsapi.dto.SysPermModuleDto;
import com.orange.demo.upmsapi.vo.SysPermModuleVo;
import com.orange.demo.upmsservice.model.SysPerm;
@@ -46,6 +48,7 @@ public class SysPermModuleController {
* @return 应答结果对象包含新增权限资源模块的主键Id。
*/
@ApiOperationSupport(ignoreParameters = {"sysPermModuleDto.moduleId"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(@MyRequestBody SysPermModuleDto sysPermModuleDto) {
String errorMessage = MyCommonUtil.getModelValidationError(sysPermModuleDto);
@@ -68,6 +71,7 @@ public class SysPermModuleController {
* @param sysPermModuleDto 更新权限资源模块对象。
* @return 应答结果对象包含新增权限资源模块的主键Id。
*/
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(@MyRequestBody SysPermModuleDto sysPermModuleDto) {
String errorMessage = MyCommonUtil.getModelValidationError(sysPermModuleDto, Default.class, UpdateGroup.class);
@@ -99,6 +103,7 @@ public class SysPermModuleController {
* @param moduleId 指定的权限资源模块主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long moduleId) {
if (MyCommonUtil.existBlankArgument(moduleId)) {

View File

@@ -1,9 +1,10 @@
package com.orange.demo.upmsservice.controller;
import com.github.pagehelper.Page;
import com.github.pagehelper.page.PageMethod;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import com.alibaba.fastjson.TypeReference;
import com.github.pagehelper.Page;
import com.github.pagehelper.page.PageMethod;
import lombok.extern.slf4j.Slf4j;
import com.orange.demo.common.core.validator.UpdateGroup;
import com.orange.demo.common.core.constant.ErrorCodeEnum;
@@ -12,6 +13,8 @@ import com.orange.demo.common.core.util.MyCommonUtil;
import com.orange.demo.common.core.util.MyModelUtil;
import com.orange.demo.common.core.util.MyPageUtil;
import com.orange.demo.common.core.annotation.MyRequestBody;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.orange.demo.upmsapi.dto.SysRoleDto;
import com.orange.demo.upmsapi.dto.SysUserDto;
import com.orange.demo.upmsapi.vo.SysRoleVo;
@@ -52,8 +55,8 @@ public class SysRoleController {
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔。
* @return 应答结果对象包含新增角色的主键Id。
*/
@SuppressWarnings("unchecked")
@ApiOperationSupport(ignoreParameters = {"sysRoleDto.roleId", "sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(
@MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString) {
@@ -68,7 +71,7 @@ public class SysRoleController {
}
Set<Long> menuIdSet = null;
if (result.getData() != null) {
menuIdSet = (Set<Long>) result.getData().get("menuIdSet");
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
}
sysRoleService.saveNew(sysRole, menuIdSet);
return ResponseResult.success(sysRole.getRoleId());
@@ -81,8 +84,8 @@ public class SysRoleController {
* @param menuIdListString 与当前角色Id绑定的menuId列表多个menuId之间逗号分隔。
* @return 应答结果对象。
*/
@SuppressWarnings("unchecked")
@ApiOperationSupport(ignoreParameters = {"sysRoleDto.createTimeStart", "sysRoleDto.createTimeEnd"})
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(
@MyRequestBody SysRoleDto sysRoleDto, @MyRequestBody String menuIdListString) {
@@ -102,7 +105,7 @@ public class SysRoleController {
}
Set<Long> menuIdSet = null;
if (result.getData() != null) {
menuIdSet = (Set<Long>) result.getData().get("menuIdSet");
menuIdSet = result.getData().getObject("menuIdSet", new TypeReference<Set<Long>>(){});
}
if (!sysRoleService.update(sysRole, originalSysRole, menuIdSet)) {
errorMessage = "更新失败,数据不存在,请刷新后重试!";
@@ -117,6 +120,7 @@ public class SysRoleController {
* @param roleId 指定角色主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long roleId) {
if (MyCommonUtil.existBlankArgument(roleId)) {
@@ -251,6 +255,7 @@ public class SysRoleController {
* @param userIdListString 逗号分隔的用户Id列表。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.ADD_M2M)
@PostMapping("/addUserRole")
public ResponseResult<Void> addUserRole(
@MyRequestBody Long roleId, @MyRequestBody String userIdListString) {
@@ -281,6 +286,7 @@ public class SysRoleController {
* @param userId 指定用户主键Id。
* @return 应答数据结果。
*/
@OperationLog(type = SysOperationLogType.DELETE_M2M)
@PostMapping("/deleteUserRole")
public ResponseResult<Void> deleteUserRole(
@MyRequestBody Long roleId, @MyRequestBody Long userId) {

View File

@@ -1,6 +1,8 @@
package com.orange.demo.upmsservice.controller;
import com.alibaba.fastjson.TypeReference;
import com.orange.demo.common.log.annotation.OperationLog;
import com.orange.demo.common.log.model.constant.SysOperationLogType;
import com.github.pagehelper.page.PageMethod;
import com.orange.demo.upmsservice.model.*;
import com.orange.demo.upmsservice.service.*;
@@ -12,8 +14,6 @@ import com.orange.demo.common.core.constant.*;
import com.orange.demo.common.core.base.controller.BaseController;
import com.orange.demo.common.core.base.service.IBaseService;
import com.orange.demo.common.core.annotation.MyRequestBody;
import com.orange.demo.common.core.validator.AddGroup;
import com.orange.demo.common.core.validator.UpdateGroup;
import com.orange.demo.upmsservice.config.ApplicationConfig;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
@@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.groups.Default;
import java.util.*;
/**
@@ -49,46 +48,55 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
/**
* 新增用户操作。
*
* @param sysUserDto 新增用户对象。
* @param roleIdListString 逗号分隔的角色Id列表。
* @param sysUserDto 新增用户对象。
* @param dataPermIdListString 逗号分隔的数据权限Id列表。
* @param roleIdListString 逗号分隔的角色Id列表。
* @return 应答结果对象包含新增用户的主键Id。
*/
@ApiOperationSupport(ignoreParameters = {
"sysUserDto.userId",
"sysUserDto.createTimeStart",
"sysUserDto.createTimeEnd"})
@OperationLog(type = SysOperationLogType.ADD)
@PostMapping("/add")
public ResponseResult<Long> add(
@MyRequestBody SysUserDto sysUserDto, @MyRequestBody String roleIdListString) {
String errorMessage = MyCommonUtil.getModelValidationError(sysUserDto, Default.class, AddGroup.class);
@MyRequestBody SysUserDto sysUserDto,
@MyRequestBody String dataPermIdListString,
@MyRequestBody String roleIdListString) {
String errorMessage = MyCommonUtil.getModelValidationError(sysUserDto, false);
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
SysUser sysUser = MyModelUtil.copyTo(sysUserDto, SysUser.class);
CallResult result = sysUserService.verifyRelatedData(
sysUser, null, roleIdListString);
sysUser, null, roleIdListString, dataPermIdListString);
if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
}
Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>() {});
sysUserService.saveNew(sysUser, roleIdSet);
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {});
sysUserService.saveNew(sysUser, roleIdSet, dataPermIdSet);
return ResponseResult.success(sysUser.getUserId());
}
/**
* 更新用户操作。
*
* @param sysUserDto 更新用户对象。
* @param roleIdListString 逗号分隔的角色Id列表。
* @param sysUserDto 更新用户对象。
* @param dataPermIdListString 逗号分隔的数据权限Id列表。
* @param roleIdListString 逗号分隔的角色Id列表。
* @return 应答结果对象。
*/
@ApiOperationSupport(ignoreParameters = {
"sysUserDto.createTimeStart",
"sysUserDto.createTimeEnd"})
@OperationLog(type = SysOperationLogType.UPDATE)
@PostMapping("/update")
public ResponseResult<Void> update(
@MyRequestBody SysUserDto sysUserDto, @MyRequestBody String roleIdListString) {
String errorMessage = MyCommonUtil.getModelValidationError(sysUserDto, Default.class, UpdateGroup.class);
@MyRequestBody SysUserDto sysUserDto,
@MyRequestBody String dataPermIdListString,
@MyRequestBody String roleIdListString) {
String errorMessage = MyCommonUtil.getModelValidationError(sysUserDto, true);
if (errorMessage != null) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
}
@@ -98,12 +106,13 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
}
SysUser sysUser = MyModelUtil.copyTo(sysUserDto, SysUser.class);
CallResult result = sysUserService.verifyRelatedData(
sysUser, originalUser, roleIdListString);
sysUser, originalUser, roleIdListString, dataPermIdListString);
if (!result.isSuccess()) {
return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, result.getErrorMessage());
}
Set<Long> roleIdSet = result.getData().getObject("roleIdSet", new TypeReference<Set<Long>>() {});
if (!sysUserService.update(sysUser, originalUser, roleIdSet)) {
Set<Long> dataPermIdSet = result.getData().getObject("dataPermIdSet", new TypeReference<Set<Long>>() {});
if (!sysUserService.update(sysUser, originalUser, roleIdSet, dataPermIdSet)) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
}
return ResponseResult.success();
@@ -132,6 +141,7 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
* @param userId 删除对象主键Id。
* @return 应答结果对象。
*/
@OperationLog(type = SysOperationLogType.DELETE)
@PostMapping("/delete")
public ResponseResult<Void> delete(@MyRequestBody Long userId) {
String errorMessage;
@@ -170,8 +180,7 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
}
SysUser sysUserFilter = MyModelUtil.copyTo(sysUserDtoFilter, SysUser.class);
String orderBy = MyOrderParam.buildOrderBy(orderParam, SysUser.class);
List<SysUser> sysUserList =
sysUserService.getSysUserListWithRelation(sysUserFilter, orderBy);
List<SysUser> sysUserList = sysUserService.getSysUserListWithRelation(sysUserFilter, orderBy);
return ResponseResult.success(MyPageUtil.makeResponseData(sysUserList, SysUser.INSTANCE));
}
@@ -187,8 +196,7 @@ public class SysUserController extends BaseController<SysUser, SysUserVo, Long>
return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
}
// 这里查看用户数据时候需要把用户多对多关联的角色和数据权限Id一并查出。
SysUser sysUser =
sysUserService.getByIdWithRelation(userId, MyRelationParam.full());
SysUser sysUser = sysUserService.getByIdWithRelation(userId, MyRelationParam.full());
if (sysUser == null) {
return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
}

View File

@@ -14,6 +14,13 @@ import java.util.*;
*/
public interface SysUserMapper extends BaseDaoMapper<SysUser> {
/**
* 批量插入对象列表。
*
* @param sysUserList 新增对象列表。
*/
void insertList(List<SysUser> sysUserList);
/**
* 获取过滤后的对象列表。
*
@@ -68,6 +75,32 @@ public interface SysUserMapper extends BaseDaoMapper<SysUser> {
@Param("sysUserFilter") SysUser sysUserFilter,
@Param("orderBy") String orderBy);
/**
* 根据数据权限Id获取关联的用户Id列表。
*
* @param dataPermId 关联的数据权限Id。
* @param sysUserFilter 用户过滤条件对象。
* @param orderBy order by从句的参数。
* @return 和DataPermId关联的用户列表。
*/
List<SysUser> getSysUserListByDataPermId(
@Param("dataPermId") Long dataPermId,
@Param("sysUserFilter") SysUser sysUserFilter,
@Param("orderBy") String orderBy);
/**
* 根据数据权限Id获取和当前数据权限Id没有建立多对多关联关系的用户Id列表。
*
* @param dataPermId 关联的数据权限Id。
* @param sysUserFilter 用户过滤条件对象。
* @param orderBy order by从句的参数。
* @return 和DataPermId没有建立关联关系的用户列表。
*/
List<SysUser> getNotInSysUserListByDataPermId(
@Param("dataPermId") Long dataPermId,
@Param("sysUserFilter") SysUser sysUserFilter,
@Param("orderBy") String orderBy);
/**
* 查询用户的权限资源地址列表。同时返回详细的分配路径。
*

View File

@@ -6,6 +6,7 @@
<result column="login_name" jdbcType="VARCHAR" property="loginName"/>
<result column="password" jdbcType="VARCHAR" property="password"/>
<result column="show_name" jdbcType="VARCHAR" property="showName"/>
<result column="dept_id" jdbcType="BIGINT" property="deptId"/>
<result column="user_type" jdbcType="INTEGER" property="userType"/>
<result column="head_image_url" jdbcType="VARCHAR" property="headImageUrl"/>
<result column="user_status" jdbcType="INTEGER" property="userStatus"/>
@@ -16,6 +17,39 @@
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
</resultMap>
<insert id="insertList">
INSERT INTO zz_sys_user
(user_id,
login_name,
password,
show_name,
dept_id,
user_type,
head_image_url,
user_status,
deleted_flag,
create_user_id,
update_user_id,
create_time,
update_time)
VALUES
<foreach collection="list" index="index" item="item" separator="," >
(#{item.userId},
#{item.loginName},
#{item.password},
#{item.showName},
#{item.deptId},
#{item.userType},
#{item.headImageUrl},
#{item.userStatus},
#{item.deletedFlag},
#{item.createUserId},
#{item.updateUserId},
#{item.createTime},
#{item.updateTime})
</foreach>
</insert>
<!-- 如果有逻辑删除字段过滤,请写到这里 -->
<sql id="filterRef">
<!-- 这里必须加上全包名否则当filterRef被其他Mapper.xml包含引用的时候就会调用Mapper.xml中的该SQL片段 -->
@@ -34,6 +68,9 @@
<bind name = "safeSysUserShowName" value = "'%' + sysUserFilter.showName + '%'" />
AND zz_sys_user.show_name LIKE #{safeSysUserShowName}
</if>
<if test="sysUserFilter.deptId != null">
AND zz_sys_user.dept_id = #{sysUserFilter.deptId}
</if>
<if test="sysUserFilter.userStatus != null">
AND zz_sys_user.user_status = #{sysUserFilter.userStatus}
</if>
@@ -103,6 +140,34 @@
</if>
</select>
<select id="getSysUserListByDataPermId" resultMap="BaseResultMap">
SELECT
zz_sys_user.*
FROM
zz_sys_data_perm_user,
zz_sys_user
<where>
AND zz_sys_data_perm_user.data_perm_id = #{dataPermId}
AND zz_sys_data_perm_user.user_id = zz_sys_user.user_id
<include refid="filterRef"/>
</where>
<if test="orderBy != null and orderBy != ''">
ORDER BY ${orderBy}
</if>
</select>
<select id="getNotInSysUserListByDataPermId" resultMap="BaseResultMap">
SELECT * FROM zz_sys_user
<where>
NOT EXISTS (SELECT * FROM zz_sys_data_perm_user
WHERE zz_sys_data_perm_user.data_perm_id = #{dataPermId} AND zz_sys_data_perm_user.user_id = zz_sys_user.user_id)
<include refid="filterRef"/>
</where>
<if test="orderBy != null and orderBy != ''">
ORDER BY ${orderBy}
</if>
</select>
<!-- 以下查询仅用于权限分配的问题定位,由于关联表较多,可能会给系统运行带来性能影响 -->
<select id="getSysPermListWithDetail" resultType="map">
SELECT

View File

@@ -1,6 +1,6 @@
package com.orange.demo.upmsservice.model;
import com.orange.demo.common.core.annotation.DeletedFlagColumn;
import com.baomidou.mybatisplus.annotation.*;
import com.orange.demo.common.core.annotation.RelationManyToMany;
import com.orange.demo.common.core.base.model.BaseModel;
import com.orange.demo.common.core.base.mapper.BaseModelMapper;
@@ -11,7 +11,6 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import javax.persistence.*;
import java.util.*;
/**
@@ -22,56 +21,55 @@ import java.util.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "zz_sys_menu")
@TableName(value = "zz_sys_menu")
public class SysMenu extends BaseModel {
/**
* 主键Id。
*/
@Id
@Column(name = "menu_id")
@TableId(value = "menu_id")
private Long menuId;
/**
* 父菜单Id目录菜单的父菜单为null。
*/
@Column(name = "parent_id")
@TableField(value = "parent_id")
private Long parentId;
/**
* 菜单显示名称。
*/
@Column(name = "menu_name")
@TableField(value = "menu_name")
private String menuName;
/**
* 菜单类型(0: 目录 1: 菜单 2: 按钮 3: UI片段)。
*/
@Column(name = "menu_type")
@TableField(value = "menu_type")
private Integer menuType;
/**
* 前端表单路由名称仅用于menu_type为1的菜单类型。
*/
@Column(name = "form_router_name")
@TableField(value = "form_router_name")
private String formRouterName;
/**
* 在线表单主键Id仅用于在线表单绑定的菜单。
*/
@Column(name = "online_form_id")
@TableField(value = "online_form_id")
private Long onlineFormId;
/**
* 在线表单菜单的权限控制类型具体值可参考SysOnlineMenuPermType常量对象。
*/
@Column(name = "online_menu_perm_type")
@TableField(value = "online_menu_perm_type")
private Integer onlineMenuPermType;
/**
* 菜单显示顺序 (值越小,排序越靠前)。
*/
@Column(name = "show_order")
@TableField(value = "show_order")
private Integer showOrder;
/**
@@ -82,15 +80,15 @@ public class SysMenu extends BaseModel {
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)。
*/
@DeletedFlagColumn
@Column(name = "deleted_flag")
@TableLogic
@TableField(value = "deleted_flag")
private Integer deletedFlag;
@RelationManyToMany(
relationMapperName = "sysMenuPermCodeMapper",
relationMasterIdField = "menuId",
relationModelClass = SysMenuPermCode.class)
@Transient
@TableField(exist = false)
private List<SysMenuPermCode> sysMenuPermCodeList;
@Mapper

View File

@@ -1,9 +1,8 @@
package com.orange.demo.upmsservice.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import javax.persistence.*;
/**
* 菜单与权限字关联实体对象。
*
@@ -11,20 +10,18 @@ import javax.persistence.*;
* @date 2020-08-08
*/
@Data
@Table(name = "zz_sys_menu_perm_code")
@TableName(value = "zz_sys_menu_perm_code")
public class SysMenuPermCode {
/**
* 关联菜单Id。
*/
@Id
@Column(name = "menu_id")
@TableField(value = "menu_id")
private Long menuId;
/**
* 关联权限字Id。
*/
@Id
@Column(name = "perm_code_id")
@TableField(value = "perm_code_id")
private Long permCodeId;
}

View File

@@ -1,12 +1,11 @@
package com.orange.demo.upmsservice.model;
import com.orange.demo.common.core.annotation.DeletedFlagColumn;
import com.baomidou.mybatisplus.annotation.*;
import com.orange.demo.common.core.base.model.BaseModel;
import com.orange.demo.common.core.annotation.RelationDict;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.*;
import java.util.*;
/**
@@ -17,26 +16,25 @@ import java.util.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "zz_sys_perm")
@TableName(value = "zz_sys_perm")
public class SysPerm extends BaseModel {
/**
* 权限Id。
*/
@Id
@Column(name = "perm_id")
@TableId(value = "perm_id")
private Long permId;
/**
* 权限所在的权限模块Id。
*/
@Column(name = "module_id")
@TableField(value = "module_id")
private Long moduleId;
/**
* 权限名称。
*/
@Column(name = "perm_name")
@TableField(value = "perm_name")
private String permName;
/**
@@ -47,14 +45,14 @@ public class SysPerm extends BaseModel {
/**
* 权限在当前模块下的顺序,由小到大。
*/
@Column(name = "show_order")
@TableField(value = "show_order")
private Integer showOrder;
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)。
*/
@DeletedFlagColumn
@Column(name = "deleted_flag")
@TableLogic
@TableField(value = "deleted_flag")
private Integer deletedFlag;
@RelationDict(
@@ -63,6 +61,6 @@ public class SysPerm extends BaseModel {
slaveModelClass = SysPermModule.class,
slaveIdField = "moduleId",
slaveNameField = "moduleName")
@Transient
@TableField(exist = false)
private Map<String, Object> moduleIdDictMap;
}

View File

@@ -1,6 +1,6 @@
package com.orange.demo.upmsservice.model;
import com.orange.demo.common.core.annotation.DeletedFlagColumn;
import com.baomidou.mybatisplus.annotation.*;
import com.orange.demo.common.core.annotation.RelationManyToMany;
import com.orange.demo.common.core.base.model.BaseModel;
import com.orange.demo.common.core.base.mapper.BaseModelMapper;
@@ -11,7 +11,6 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import javax.persistence.*;
import java.util.*;
/**
@@ -22,58 +21,57 @@ import java.util.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "zz_sys_perm_code")
@TableName(value = "zz_sys_perm_code")
public class SysPermCode extends BaseModel {
/**
* 主键Id。
*/
@Id
@Column(name = "perm_code_id")
@TableId(value = "perm_code_id")
private Long permCodeId;
/**
* 上级权限字Id。
*/
@Column(name = "parent_id")
@TableField(value = "parent_id")
private Long parentId;
/**
* 权限字标识(一般为有含义的英文字符串)。
*/
@Column(name = "perm_code")
@TableField(value = "perm_code")
private String permCode;
/**
* 权限类型(0: 表单 1: UI片段 2: 操作)。
*/
@Column(name = "perm_code_type")
@TableField(value = "perm_code_type")
private Integer permCodeType;
/**
* 显示名称。
*/
@Column(name = "show_name")
@TableField(value = "show_name")
private String showName;
/**
* 显示顺序(数值越小,越靠前)。
*/
@Column(name = "show_order")
@TableField(value = "show_order")
private Integer showOrder;
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)。
*/
@DeletedFlagColumn
@Column(name = "deleted_flag")
@TableLogic
@TableField(value = "deleted_flag")
private Integer deletedFlag;
@RelationManyToMany(
relationMapperName = "sysPermCodePermMapper",
relationMasterIdField = "permCodeId",
relationModelClass = SysPermCodePerm.class)
@Transient
@TableField(exist = false)
private List<SysPermCodePerm> sysPermCodePermList;
@Mapper

View File

@@ -1,9 +1,8 @@
package com.orange.demo.upmsservice.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import javax.persistence.*;
/**
* 权限字与权限资源关联实体对象。
*
@@ -11,20 +10,18 @@ import javax.persistence.*;
* @date 2020-08-08
*/
@Data
@Table(name = "zz_sys_perm_code_perm")
@TableName(value = "zz_sys_perm_code_perm")
public class SysPermCodePerm {
/**
* 权限字Id。
*/
@Id
@Column(name = "perm_code_id")
@TableField(value = "perm_code_id")
private Long permCodeId;
/**
* 权限Id。
*/
@Id
@Column(name = "perm_id")
@TableField(value = "perm_id")
private Long permId;
}

View File

@@ -1,11 +1,10 @@
package com.orange.demo.upmsservice.model;
import com.orange.demo.common.core.annotation.DeletedFlagColumn;
import com.baomidou.mybatisplus.annotation.*;
import com.orange.demo.common.core.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.*;
import java.util.*;
/**
@@ -16,47 +15,46 @@ import java.util.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "zz_sys_perm_module")
@TableName(value = "zz_sys_perm_module")
public class SysPermModule extends BaseModel {
/**
* 权限模块Id。
*/
@Id
@Column(name = "module_id")
@TableId(value = "module_id")
private Long moduleId;
/**
* 上级权限模块Id。
*/
@Column(name = "parent_id")
@TableField(value = "parent_id")
private Long parentId;
/**
* 权限模块名称。
*/
@Column(name = "module_name")
@TableField(value = "module_name")
private String moduleName;
/**
* 权限模块类型(0: 普通模块 1: Controller模块)。
*/
@Column(name = "module_type")
@TableField(value = "module_type")
private Integer moduleType;
/**
* 权限模块在当前层级下的顺序,由小到大。
*/
@Column(name = "show_order")
@TableField(value = "show_order")
private Integer showOrder;
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)。
*/
@DeletedFlagColumn
@Column(name = "deleted_flag")
@TableLogic
@TableField(value = "deleted_flag")
private Integer deletedFlag;
@Transient
@TableField(exist = false)
private List<SysPerm> sysPermList;
}

View File

@@ -1,9 +1,8 @@
package com.orange.demo.upmsservice.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import javax.persistence.*;
/**
* 白名单实体对象。
*
@@ -11,25 +10,24 @@ import javax.persistence.*;
* @date 2020-08-08
*/
@Data
@Table(name = "zz_sys_perm_whitelist")
@TableName(value = "zz_sys_perm_whitelist")
public class SysPermWhitelist {
/**
* 权限资源的URL。
*/
@Id
@Column(name = "perm_url")
@TableId(value = "perm_url")
private String permUrl;
/**
* 权限资源所属模块名字(通常是Controller的名字)。
*/
@Column(name = "module_name")
@TableField(value = "module_name")
private String moduleName;
/**
* 权限的名称。
*/
@Column(name = "perm_name")
@TableField(value = "perm_name")
private String permName;
}

View File

@@ -1,6 +1,6 @@
package com.orange.demo.upmsservice.model;
import com.orange.demo.common.core.annotation.DeletedFlagColumn;
import com.baomidou.mybatisplus.annotation.*;
import com.orange.demo.common.core.annotation.RelationManyToMany;
import com.orange.demo.common.core.base.model.BaseModel;
import com.orange.demo.common.core.base.mapper.BaseModelMapper;
@@ -11,7 +11,6 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import javax.persistence.*;
import java.util.*;
/**
@@ -22,34 +21,33 @@ import java.util.*;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "zz_sys_role")
@TableName(value = "zz_sys_role")
public class SysRole extends BaseModel {
/**
* 主键Id。
*/
@Id
@Column(name = "role_id")
@TableId(value = "role_id")
private Long roleId;
/**
* 角色名称。
*/
@Column(name = "role_name")
@TableField(value = "role_name")
private String roleName;
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)。
*/
@DeletedFlagColumn
@Column(name = "deleted_flag")
@TableLogic
@TableField(value = "deleted_flag")
private Integer deletedFlag;
@RelationManyToMany(
relationMapperName = "sysRoleMenuMapper",
relationMasterIdField = "roleId",
relationModelClass = SysRoleMenu.class)
@Transient
@TableField(exist = false)
private List<SysRoleMenu> sysRoleMenuList;
@Mapper

View File

@@ -1,9 +1,8 @@
package com.orange.demo.upmsservice.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import javax.persistence.*;
/**
* 角色菜单实体对象。
*
@@ -11,20 +10,18 @@ import javax.persistence.*;
* @date 2020-08-08
*/
@Data
@Table(name = "zz_sys_role_menu")
@TableName(value = "zz_sys_role_menu")
public class SysRoleMenu {
/**
* 角色Id。
*/
@Id
@Column(name = "role_id")
@TableField(value = "role_id")
private Long roleId;
/**
* 菜单Id。
*/
@Id
@Column(name = "menu_id")
@TableField(value = "menu_id")
private Long menuId;
}

View File

@@ -1,18 +1,18 @@
package com.orange.demo.upmsservice.model;
import com.baomidou.mybatisplus.annotation.*;
import com.orange.demo.upmsapi.vo.SysUserVo;
import com.orange.demo.upmsapi.constant.SysUserType;
import com.orange.demo.upmsapi.constant.SysUserStatus;
import com.orange.demo.common.core.annotation.RelationDict;
import com.orange.demo.common.core.annotation.RelationConstDict;
import com.orange.demo.common.core.annotation.RelationManyToMany;
import com.orange.demo.common.core.base.model.BaseModel;
import com.orange.demo.common.core.base.mapper.BaseModelMapper;
import com.orange.demo.common.core.annotation.DeletedFlagColumn;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
import javax.persistence.*;
import java.util.Map;
import java.util.List;
@@ -25,20 +25,19 @@ import java.util.List;
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "zz_sys_user")
@TableName(value = "zz_sys_user")
public class SysUser extends BaseModel {
/**
* 用户Id。
*/
@Id
@Column(name = "user_id")
@TableId(value = "user_id")
private Long userId;
/**
* 登录用户名。
*/
@Column(name = "login_name")
@TableField(value = "login_name")
private String loginName;
/**
@@ -49,44 +48,50 @@ public class SysUser extends BaseModel {
/**
* 用户显示名称。
*/
@Column(name = "show_name")
@TableField(value = "show_name")
private String showName;
/**
* 用户部门Id。
*/
@TableField(value = "dept_id")
private Long deptId;
/**
* 用户类型(0: 管理员 1: 系统管理用户 2: 系统业务用户)。
*/
@Column(name = "user_type")
@TableField(value = "user_type")
private Integer userType;
/**
* 用户头像的Url。
*/
@Column(name = "head_image_url")
@TableField(value = "head_image_url")
private String headImageUrl;
/**
* 用户状态(0: 正常 1: 锁定)。
*/
@Column(name = "user_status")
@TableField(value = "user_status")
private Integer userStatus;
/**
* 逻辑删除标记字段(1: 正常 -1: 已删除)。
*/
@DeletedFlagColumn
@Column(name = "deleted_flag")
@TableLogic
@TableField(value = "deleted_flag")
private Integer deletedFlag;
/**
* createTime 范围过滤起始值(>=)。
*/
@Transient
@TableField(exist = false)
private String createTimeStart;
/**
* createTime 范围过滤结束值(<=)。
*/
@Transient
@TableField(exist = false)
private String createTimeEnd;
/**
@@ -96,19 +101,38 @@ public class SysUser extends BaseModel {
relationMapperName = "sysUserRoleMapper",
relationMasterIdField = "userId",
relationModelClass = SysUserRole.class)
@Transient
@TableField(exist = false)
private List<SysUserRole> sysUserRoleList;
/**
* 多对多用户数据权限数据集合。
*/
@RelationManyToMany(
relationMapperName = "sysDataPermUserMapper",
relationMasterIdField = "userId",
relationModelClass = SysDataPermUser.class)
@TableField(exist = false)
private List<SysDataPermUser> sysDataPermUserList;
@RelationDict(
masterIdField = "deptId",
slaveServiceName = "sysDeptService",
slaveModelClass = SysDept.class,
slaveIdField = "deptId",
slaveNameField = "deptName")
@TableField(exist = false)
private Map<String, Object> deptIdDictMap;
@RelationConstDict(
masterIdField = "userType",
constantDictClass = SysUserType.class)
@Transient
@TableField(exist = false)
private Map<String, Object> userTypeDictMap;
@RelationConstDict(
masterIdField = "userStatus",
constantDictClass = SysUserStatus.class)
@Transient
@TableField(exist = false)
private Map<String, Object> userStatusDictMap;
@Mapper
@@ -120,6 +144,7 @@ public class SysUser extends BaseModel {
* @return 实体对象。
*/
@Mapping(target = "sysUserRoleList", expression = "java(mapToBean(sysUserVo.getSysUserRoleList(), com.orange.demo.upmsservice.model.SysUserRole.class))")
@Mapping(target = "sysDataPermUserList", expression = "java(mapToBean(sysUserVo.getSysDataPermUserList(), com.orange.demo.upmsservice.model.SysDataPermUser.class))")
@Override
SysUser toModel(SysUserVo sysUserVo);
/**
@@ -129,6 +154,7 @@ public class SysUser extends BaseModel {
* @return 域对象。
*/
@Mapping(target = "sysUserRoleList", expression = "java(beanToMap(sysUser.getSysUserRoleList(), false))")
@Mapping(target = "sysDataPermUserList", expression = "java(beanToMap(sysUser.getSysDataPermUserList(), false))")
@Override
SysUserVo fromModel(SysUser sysUser);
}

View File

@@ -1,9 +1,8 @@
package com.orange.demo.upmsservice.model;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import javax.persistence.*;
/**
* 用户角色实体对象。
*
@@ -11,20 +10,18 @@ import javax.persistence.*;
* @date 2020-08-08
*/
@Data
@Table(name = "zz_sys_user_role")
@TableName(value = "zz_sys_user_role")
public class SysUserRole {
/**
* 用户Id。
*/
@Id
@Column(name = "user_id")
@TableField(value = "user_id")
private Long userId;
/**
* 角色Id。
*/
@Id
@Column(name = "role_id")
@TableField(value = "role_id")
private Long roleId;
}

View File

@@ -25,11 +25,12 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
/**
* 保存新增的用户对象。
*
* @param user 新增的用户对象。
* @param roleIdSet 用户角色Id集合。
* @param user 新增的用户对象。
* @param roleIdSet 用户角色Id集合。
* @param dataPermIdSet 数据权限Id集合。
* @return 新增后的用户对象。
*/
SysUser saveNew(SysUser user, Set<Long> roleIdSet);
SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> dataPermIdSet);
/**
* 更新用户对象。
@@ -37,9 +38,10 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param user 更新的用户对象。
* @param originalUser 原有的用户对象。
* @param roleIdSet 用户角色Id列表。
* @param dataPermIdSet 数据权限Id集合。
* @return 更新成功返回true否则false。
*/
boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet);
boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> dataPermIdSet);
/**
* 重置用户密码。
@@ -124,6 +126,26 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
*/
List<SysUser> getNotInSysUserListByRoleId(Long roleId, SysUser filter, String orderBy);
/**
* 获取指定数据权限的用户列表。
*
* @param dataPermId 数据权限主键Id。
* @param filter 用户过滤对象。
* @param orderBy 排序参数。
* @return 用户列表。
*/
List<SysUser> getSysUserListByDataPermId(Long dataPermId, SysUser filter, String orderBy);
/**
* 获取不属于指定数据权限的用户列表。
*
* @param dataPermId 数据权限主键Id。
* @param filter 用户过滤对象。
* @param orderBy 排序参数。
* @return 用户列表。
*/
List<SysUser> getNotInSysUserListByDataPermId(Long dataPermId, SysUser filter, String orderBy);
/**
* 查询用户的权限资源地址列表。同时返回详细的分配路径。
*
@@ -157,7 +179,9 @@ public interface SysUserService extends IBaseService<SysUser, Long> {
* @param sysUser 当前操作的对象。
* @param originalSysUser 原有对象。
* @param roleIds 逗号分隔的角色Id列表字符串。
* @param dataPermIds 逗号分隔的数据权限Id列表字符串。
* @return 验证结果。
*/
CallResult verifyRelatedData(SysUser sysUser, SysUser originalSysUser, String roleIds);
CallResult verifyRelatedData(
SysUser sysUser, SysUser originalSysUser, String roleIds, String dataPermIds);
}

View File

@@ -2,6 +2,9 @@ package com.orange.demo.upmsservice.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orange.demo.common.core.base.service.BaseService;
import com.orange.demo.common.sequence.wrapper.IdGeneratorWrapper;
import com.orange.demo.common.core.base.dao.BaseDaoMapper;
@@ -23,7 +26,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.*;
import java.util.stream.Collectors;
@@ -74,14 +76,12 @@ public class SysMenuServiceImpl extends BaseService<SysMenu, Long> implements Sy
MyModelUtil.fillCommonsForInsert(sysMenu);
sysMenuMapper.insert(sysMenu);
if (permCodeIdSet != null) {
List<SysMenuPermCode> sysMenuPermCodeList = new LinkedList<>();
for (Long permCodeId : permCodeIdSet) {
SysMenuPermCode menuPermCode = new SysMenuPermCode();
menuPermCode.setMenuId(sysMenu.getMenuId());
menuPermCode.setPermCodeId(permCodeId);
sysMenuPermCodeList.add(menuPermCode);
sysMenuPermCodeMapper.insert(menuPermCode);
}
sysMenuPermCodeMapper.insertList(sysMenuPermCodeList);
}
// 判断当前菜单是否为指向在线表单的菜单,并将根据约定,动态插入两个子菜单。
if (sysMenu.getOnlineFormId() != null) {
@@ -124,30 +124,27 @@ public class SysMenuServiceImpl extends BaseService<SysMenu, Long> implements Sy
public boolean update(SysMenu sysMenu, SysMenu originalSysMenu, Set<Long> permCodeIdSet) {
MyModelUtil.fillCommonsForUpdate(sysMenu, originalSysMenu);
sysMenu.setMenuType(originalSysMenu.getMenuType());
sysMenu.setDeletedFlag(GlobalDeletedFlag.NORMAL);
if (sysMenuMapper.updateByPrimaryKey(sysMenu) != 1) {
UpdateWrapper<SysMenu> uw = this.createUpdateQueryForNullValue(sysMenu, sysMenu.getMenuId());
if (sysMenuMapper.update(sysMenu, uw) != 1) {
return false;
}
SysMenuPermCode deletedMenuPermCode = new SysMenuPermCode();
deletedMenuPermCode.setMenuId(sysMenu.getMenuId());
sysMenuPermCodeMapper.delete(deletedMenuPermCode);
sysMenuPermCodeMapper.delete(new QueryWrapper<>(deletedMenuPermCode));
if (permCodeIdSet != null) {
List<SysMenuPermCode> sysMenuPermCodeList = new LinkedList<>();
for (Long permCodeId : permCodeIdSet) {
SysMenuPermCode menuPermCode = new SysMenuPermCode();
menuPermCode.setMenuId(sysMenu.getMenuId());
menuPermCode.setPermCodeId(permCodeId);
sysMenuPermCodeList.add(menuPermCode);
sysMenuPermCodeMapper.insert(menuPermCode);
}
sysMenuPermCodeMapper.insertList(sysMenuPermCodeList);
}
// 如果当前菜单的在线表单Id变化了就需要同步更新他的内置子菜单也同步更新。
if (ObjectUtil.notEqual(originalSysMenu.getOnlineFormId(), sysMenu.getOnlineFormId())) {
SysMenu onlineSubMenu = new SysMenu();
onlineSubMenu.setOnlineFormId(sysMenu.getOnlineFormId());
Example e = new Example(SysMenu.class);
e.createCriteria().andEqualTo("parentId", sysMenu.getMenuId());
sysMenuMapper.updateByExampleSelective(onlineSubMenu, e);
sysMenuMapper.update(onlineSubMenu,
new QueryWrapper<SysMenu>().lambda().eq(SysMenu::getParentId, sysMenu.getMenuId()));
}
return true;
}
@@ -162,23 +159,18 @@ public class SysMenuServiceImpl extends BaseService<SysMenu, Long> implements Sy
@Override
public boolean remove(SysMenu menu) {
Long menuId = menu.getMenuId();
if (!this.removeById(menuId)) {
if (sysMenuMapper.deleteById(menuId) != 1) {
return false;
}
SysRoleMenu roleMenu = new SysRoleMenu();
roleMenu.setMenuId(menuId);
sysRoleMenuMapper.delete(roleMenu);
sysRoleMenuMapper.delete(new QueryWrapper<>(roleMenu));
SysMenuPermCode menuPermCode = new SysMenuPermCode();
menuPermCode.setMenuId(menuId);
sysMenuPermCodeMapper.delete(menuPermCode);
sysMenuPermCodeMapper.delete(new QueryWrapper<>(menuPermCode));
// 如果为指向在线表单的菜单,则连同删除子菜单
if (menu.getOnlineFormId() != null) {
Example e = new Example(SysMenu.class);
Example.Criteria c = e.createCriteria().andEqualTo("parentId", menuId);
c.andEqualTo("deletedFlag", GlobalDeletedFlag.NORMAL);
SysMenu deletedSubMenu = new SysMenu();
deletedSubMenu.setDeletedFlag(GlobalDeletedFlag.DELETED);
sysMenuMapper.updateByExampleSelective(deletedSubMenu, e);
sysMenuMapper.delete(new QueryWrapper<SysMenu>().lambda().eq(SysMenu::getParentId, menuId));
}
return true;
}
@@ -190,12 +182,11 @@ public class SysMenuServiceImpl extends BaseService<SysMenu, Long> implements Sy
*/
@Override
public Collection<SysMenu> getAllMenuList() {
Example e = new Example(SysMenu.class);
e.orderBy("showOrder");
Example.Criteria c = e.createCriteria();
c.andIn("menuType", Arrays.asList(SysMenuType.TYPE_MENU, SysMenuType.TYPE_DIRECTORY));
c.andEqualTo("deletedFlag", GlobalDeletedFlag.NORMAL);
return sysMenuMapper.selectByExample(e);
QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc(this.safeMapToColumnName("showOrder"));
queryWrapper.in(this.safeMapToColumnName("menuType"),
Arrays.asList(SysMenuType.TYPE_MENU, SysMenuType.TYPE_DIRECTORY));
return sysMenuMapper.selectList(queryWrapper);
}
/**
@@ -294,12 +285,12 @@ public class SysMenuServiceImpl extends BaseService<SysMenu, Long> implements Sy
*/
@Override
public List<SysMenu> getAllOnlineMenuList(Integer menuType) {
Example e = new Example(SysMenu.class);
Example.Criteria c = e.createCriteria().andIsNotNull("onlineFormId");
LambdaQueryWrapper<SysMenu> queryWrapper =
new QueryWrapper<SysMenu>().lambda().isNotNull(SysMenu::getOnlineFormId);
if (menuType != null) {
c.andEqualTo("menuType", menuType);
queryWrapper.eq(SysMenu::getMenuType, menuType);
}
return sysMenuMapper.selectByExample(e);
return sysMenuMapper.selectList(queryWrapper);
}
/**

View File

@@ -1,6 +1,8 @@
package com.orange.demo.upmsservice.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.orange.demo.common.core.base.service.BaseService;
import com.orange.demo.common.sequence.wrapper.IdGeneratorWrapper;
import com.orange.demo.common.core.base.dao.BaseDaoMapper;
@@ -93,14 +95,12 @@ public class SysPermCodeServiceImpl extends BaseService<SysPermCode, Long> imple
MyModelUtil.fillCommonsForInsert(sysPermCode);
sysPermCodeMapper.insert(sysPermCode);
if (permIdSet != null) {
List<SysPermCodePerm> sysPermCodePermList = new LinkedList<>();
for (Long permId : permIdSet) {
SysPermCodePerm permCodePerm = new SysPermCodePerm();
permCodePerm.setPermCodeId(sysPermCode.getPermCodeId());
permCodePerm.setPermId(permId);
sysPermCodePermList.add(permCodePerm);
sysPermCodePermMapper.insert(permCodePerm);
}
sysPermCodePermMapper.insertList(sysPermCodePermList);
}
return sysPermCode;
}
@@ -117,23 +117,22 @@ public class SysPermCodeServiceImpl extends BaseService<SysPermCode, Long> imple
@Override
public boolean update(SysPermCode sysPermCode, SysPermCode originalSysPermCode, Set<Long> permIdSet) {
sysPermCode.setParentId(originalSysPermCode.getParentId());
sysPermCode.setDeletedFlag(GlobalDeletedFlag.NORMAL);
MyModelUtil.fillCommonsForUpdate(sysPermCode, originalSysPermCode);
if (sysPermCodeMapper.updateByPrimaryKey(sysPermCode) != 1) {
UpdateWrapper<SysPermCode> uw =
this.createUpdateQueryForNullValue(sysPermCode, sysPermCode.getPermCodeId());
if (sysPermCodeMapper.update(sysPermCode, uw) != 1) {
return false;
}
SysPermCodePerm deletedPermCodePerm = new SysPermCodePerm();
deletedPermCodePerm.setPermCodeId(sysPermCode.getPermCodeId());
sysPermCodePermMapper.delete(deletedPermCodePerm);
sysPermCodePermMapper.delete(new QueryWrapper<>(deletedPermCodePerm));
if (permIdSet != null) {
List<SysPermCodePerm> sysPermCodePermList = new LinkedList<>();
for (Long permId : permIdSet) {
SysPermCodePerm permCodePerm = new SysPermCodePerm();
permCodePerm.setPermCodeId(sysPermCode.getPermCodeId());
permCodePerm.setPermId(permId);
sysPermCodePermList.add(permCodePerm);
sysPermCodePermMapper.insert(permCodePerm);
}
sysPermCodePermMapper.insertList(sysPermCodePermList);
}
return true;
}
@@ -147,15 +146,15 @@ public class SysPermCodeServiceImpl extends BaseService<SysPermCode, Long> imple
@Transactional(rollbackFor = Exception.class)
@Override
public boolean remove(Long permCodeId) {
if (!this.removeById(permCodeId)) {
if (sysPermCodeMapper.deleteById(permCodeId) != 1) {
return false;
}
SysMenuPermCode menuPermCode = new SysMenuPermCode();
menuPermCode.setPermCodeId(permCodeId);
sysMenuPermCodeMapper.delete(menuPermCode);
sysMenuPermCodeMapper.delete(new QueryWrapper<>(menuPermCode));
SysPermCodePerm permCodePerm = new SysPermCodePerm();
permCodePerm.setPermCodeId(permCodeId);
sysPermCodePermMapper.delete(permCodePerm);
sysPermCodePermMapper.delete(new QueryWrapper<>(permCodePerm));
return true;
}

View File

@@ -71,8 +71,7 @@ public class SysPermModuleServiceImpl extends BaseService<SysPermModule, Long> i
@Override
public boolean update(SysPermModule sysPermModule, SysPermModule originalSysPermModule) {
MyModelUtil.fillCommonsForUpdate(sysPermModule, originalSysPermModule);
sysPermModule.setDeletedFlag(GlobalDeletedFlag.NORMAL);
return sysPermModuleMapper.updateByPrimaryKey(sysPermModule) != 0;
return sysPermModuleMapper.updateById(sysPermModule) != 0;
}
/**
@@ -84,7 +83,7 @@ public class SysPermModuleServiceImpl extends BaseService<SysPermModule, Long> i
@Transactional(rollbackFor = Exception.class)
@Override
public boolean remove(Long moduleId) {
return this.removeById(moduleId);
return sysPermModuleMapper.deleteById(moduleId) == 1;
}
/**

View File

@@ -1,5 +1,6 @@
package com.orange.demo.upmsservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import cn.hutool.core.util.ObjectUtil;
import com.orange.demo.common.core.base.service.BaseService;
import com.orange.demo.common.sequence.wrapper.IdGeneratorWrapper;
@@ -18,7 +19,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.*;
@@ -78,8 +78,7 @@ public class SysPermServiceImpl extends BaseService<SysPerm, Long> implements Sy
@Override
public boolean update(SysPerm perm, SysPerm originalPerm) {
MyModelUtil.fillCommonsForUpdate(perm, originalPerm);
perm.setDeletedFlag(GlobalDeletedFlag.NORMAL);
return sysPermMapper.updateByPrimaryKeySelective(perm) != 0;
return sysPermMapper.updateById(perm) != 0;
}
/**
@@ -91,12 +90,12 @@ public class SysPermServiceImpl extends BaseService<SysPerm, Long> implements Sy
@Transactional(rollbackFor = Exception.class)
@Override
public boolean remove(Long permId) {
if (!this.removeById(permId)) {
if (sysPermMapper.deleteById(permId) != 1) {
return false;
}
SysPermCodePerm permCodePerm = new SysPermCodePerm();
permCodePerm.setPermId(permId);
sysPermCodePermMapper.delete(permCodePerm);
sysPermCodePermMapper.delete(new QueryWrapper<>(permCodePerm));
return true;
}
@@ -108,17 +107,13 @@ public class SysPermServiceImpl extends BaseService<SysPerm, Long> implements Sy
*/
@Override
public List<SysPerm> getPermListWithRelation(SysPerm sysPermFilter) {
Example e = new Example(SysPerm.class);
e.orderBy("showOrder");
Example.Criteria c = e.createCriteria();
if (ObjectUtil.isNotNull(sysPermFilter.getModuleId())) {
c.andEqualTo("moduleId", sysPermFilter.getModuleId());
}
if (ObjectUtil.isNotNull(sysPermFilter.getUrl())) {
c.andLike("url", "%" + sysPermFilter.getUrl() + "%");
}
c.andEqualTo("deletedFlag", GlobalDeletedFlag.NORMAL);
List<SysPerm> permList = sysPermMapper.selectByExample(e);
QueryWrapper<SysPerm> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc(this.safeMapToColumnName("showOrder"));
queryWrapper.eq(ObjectUtil.isNotNull(sysPermFilter.getModuleId()),
this.safeMapToColumnName("moduleId"), sysPermFilter.getModuleId());
queryWrapper.like(ObjectUtil.isNotNull(sysPermFilter.getUrl()),
this.safeMapToColumnName("url"), "%" + sysPermFilter.getUrl() + "%");
List<SysPerm> permList = sysPermMapper.selectList(queryWrapper);
// 这里因为权限只有字典数据,所以仅仅做字典关联。
this.buildRelationForDataList(permList, MyRelationParam.dictOnly());
return permList;

View File

@@ -1,5 +1,6 @@
package com.orange.demo.upmsservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.alibaba.fastjson.JSONObject;
import com.orange.demo.common.core.base.service.BaseService;
import com.orange.demo.common.core.base.dao.BaseDaoMapper;
@@ -70,14 +71,12 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
MyModelUtil.fillCommonsForInsert(role);
sysRoleMapper.insert(role);
if (menuIdSet != null) {
List<SysRoleMenu> roleMenuList = new LinkedList<>();
for (Long menuId : menuIdSet) {
SysRoleMenu roleMenu = new SysRoleMenu();
roleMenu.setRoleId(role.getRoleId());
roleMenu.setMenuId(menuId);
roleMenuList.add(roleMenu);
sysRoleMenuMapper.insert(roleMenu);
}
sysRoleMenuMapper.insertList(roleMenuList);
}
return role;
}
@@ -93,23 +92,20 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
@Transactional(rollbackFor = Exception.class)
@Override
public boolean update(SysRole role, SysRole originalRole, Set<Long> menuIdSet) {
role.setDeletedFlag(GlobalDeletedFlag.NORMAL);
MyModelUtil.fillCommonsForUpdate(role, originalRole);
if (sysRoleMapper.updateByPrimaryKey(role) != 1) {
if (sysRoleMapper.updateById(role) != 1) {
return false;
}
SysRoleMenu deletedRoleMenu = new SysRoleMenu();
deletedRoleMenu.setRoleId(role.getRoleId());
sysRoleMenuMapper.delete(deletedRoleMenu);
sysRoleMenuMapper.delete(new QueryWrapper<>(deletedRoleMenu));
if (menuIdSet != null) {
List<SysRoleMenu> roleMenuList = new LinkedList<>();
for (Long menuId : menuIdSet) {
SysRoleMenu roleMenu = new SysRoleMenu();
roleMenu.setRoleId(role.getRoleId());
roleMenu.setMenuId(menuId);
roleMenuList.add(roleMenu);
sysRoleMenuMapper.insert(roleMenu);
}
sysRoleMenuMapper.insertList(roleMenuList);
}
return true;
}
@@ -123,15 +119,15 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
@Transactional(rollbackFor = Exception.class)
@Override
public boolean remove(Long roleId) {
if (!this.removeById(roleId)) {
if (sysRoleMapper.deleteById(roleId) != 1) {
return false;
}
SysRoleMenu roleMenu = new SysRoleMenu();
roleMenu.setRoleId(roleId);
sysRoleMenuMapper.delete(roleMenu);
sysRoleMenuMapper.delete(new QueryWrapper<>(roleMenu));
SysUserRole userRole = new SysUserRole();
userRole.setRoleId(roleId);
sysUserRoleMapper.delete(userRole);
sysUserRoleMapper.delete(new QueryWrapper<>(userRole));
return true;
}
@@ -155,7 +151,9 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
@Transactional(rollbackFor = Exception.class)
@Override
public void addUserRoleList(List<SysUserRole> userRoleList) {
sysUserRoleMapper.insertList(userRoleList);
for (SysUserRole userRole : userRoleList) {
sysUserRoleMapper.insert(userRole);
}
}
/**
@@ -171,7 +169,7 @@ public class SysRoleServiceImpl extends BaseService<SysRole, Long> implements Sy
SysUserRole userRole = new SysUserRole();
userRole.setRoleId(roleId);
userRole.setUserId(userId);
return sysUserRoleMapper.delete(userRole) == 1;
return sysUserRoleMapper.delete(new QueryWrapper<>(userRole)) == 1;
}
/**

View File

@@ -1,5 +1,7 @@
package com.orange.demo.upmsservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.alibaba.fastjson.JSONObject;
import com.orange.demo.upmsservice.service.*;
import com.orange.demo.upmsservice.dao.*;
@@ -19,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.*;
import java.util.stream.Collectors;
@@ -41,6 +42,12 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
@Autowired
private SysRoleService sysRoleService;
@Autowired
private SysDataPermService sysDataPermService;
@Autowired
private SysDataPermUserMapper sysDataPermUserMapper;
@Autowired
private SysDeptService sysDeptService;
@Autowired
private IdGeneratorWrapper idGenerator;
@Autowired
private PasswordEncoder passwordEncoder;
@@ -65,20 +72,20 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
public SysUser getSysUserByLoginName(String loginName) {
SysUser filter = new SysUser();
filter.setLoginName(loginName);
filter.setDeletedFlag(GlobalDeletedFlag.NORMAL);
return sysUserMapper.selectOne(filter);
return sysUserMapper.selectOne(new QueryWrapper<>(filter));
}
/**
* 保存新增的用户对象。
*
* @param user 新增的用户对象。
* @param roleIdSet 用户角色Id集合。
* @param user 新增的用户对象。
* @param roleIdSet 用户角色Id集合。
* @param dataPermIdSet 数据权限Id集合。
* @return 新增后的用户对象。
*/
@Transactional(rollbackFor = Exception.class)
@Override
public SysUser saveNew(SysUser user, Set<Long> roleIdSet) {
public SysUser saveNew(SysUser user, Set<Long> roleIdSet, Set<Long> dataPermIdSet) {
user.setUserId(idGenerator.nextLongId());
user.setPassword(passwordEncoder.encode(user.getPassword()));
user.setUserStatus(SysUserStatus.STATUS_NORMAL);
@@ -86,14 +93,20 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
MyModelUtil.fillCommonsForInsert(user);
sysUserMapper.insert(user);
if (CollectionUtils.isNotEmpty(roleIdSet)) {
List<SysUserRole> userRoleList = new LinkedList<>();
for (Long roleId : roleIdSet) {
SysUserRole userRole = new SysUserRole();
userRole.setUserId(user.getUserId());
userRole.setRoleId(roleId);
userRoleList.add(userRole);
sysUserRoleMapper.insert(userRole);
}
}
if (CollectionUtils.isNotEmpty(dataPermIdSet)) {
for (Long dataPermId : dataPermIdSet) {
SysDataPermUser dataPermUser = new SysDataPermUser();
dataPermUser.setDataPermId(dataPermId);
dataPermUser.setUserId(user.getUserId());
sysDataPermUserMapper.insert(dataPermUser);
}
sysUserRoleMapper.insertList(userRoleList);
}
return user;
}
@@ -104,31 +117,42 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
* @param user 更新的用户对象。
* @param originalUser 原有的用户对象。
* @param roleIdSet 用户角色Id列表。
* @param dataPermIdSet 数据权限Id集合。
* @return 更新成功返回true否则false。
*/
@Transactional(rollbackFor = Exception.class)
@Override
public boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet) {
public boolean update(SysUser user, SysUser originalUser, Set<Long> roleIdSet, Set<Long> dataPermIdSet) {
user.setLoginName(originalUser.getLoginName());
user.setPassword(originalUser.getPassword());
MyModelUtil.fillCommonsForUpdate(user, originalUser);
user.setDeletedFlag(GlobalDeletedFlag.NORMAL);
if (sysUserMapper.updateByPrimaryKey(user) != 1) {
UpdateWrapper<SysUser> uw = this.createUpdateQueryForNullValue(user, user.getUserId());
if (sysUserMapper.update(user, uw) != 1) {
return false;
}
// 先删除原有的User-Role关联关系再重新插入新的关联关系
SysUserRole deletedUserRole = new SysUserRole();
deletedUserRole.setUserId(user.getUserId());
sysUserRoleMapper.delete(deletedUserRole);
sysUserRoleMapper.delete(new QueryWrapper<>(deletedUserRole));
if (CollectionUtils.isNotEmpty(roleIdSet)) {
List<SysUserRole> userRoleList = new LinkedList<>();
for (Long roleId : roleIdSet) {
SysUserRole userRole = new SysUserRole();
userRole.setUserId(user.getUserId());
userRole.setRoleId(roleId);
userRoleList.add(userRole);
sysUserRoleMapper.insert(userRole);
}
}
// 先删除原有的DataPerm-User关联关系在重新插入新的关联关系
SysDataPermUser deletedDataPermUser = new SysDataPermUser();
deletedDataPermUser.setUserId(user.getUserId());
sysDataPermUserMapper.delete(new QueryWrapper<>(deletedDataPermUser));
if (CollectionUtils.isNotEmpty(dataPermIdSet)) {
for (Long dataPermId : dataPermIdSet) {
SysDataPermUser dataPermUser = new SysDataPermUser();
dataPermUser.setDataPermId(dataPermId);
dataPermUser.setUserId(user.getUserId());
sysDataPermUserMapper.insert(dataPermUser);
}
sysUserRoleMapper.insertList(userRoleList);
}
return true;
}
@@ -142,13 +166,10 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
@Transactional(rollbackFor = Exception.class)
@Override
public boolean changePassword(Long userId, String newPass) {
Example e = new Example(SysUser.class);
e.createCriteria()
.andEqualTo(super.idFieldName, userId)
.andEqualTo(super.deletedFlagFieldName, GlobalDeletedFlag.NORMAL);
SysUser updatedUser = new SysUser();
updatedUser.setUserId(userId);
updatedUser.setPassword(passwordEncoder.encode(newPass));
return sysUserMapper.updateByExampleSelective(updatedUser, e) == 1;
return sysUserMapper.updateById(updatedUser) == 1;
}
/**
@@ -160,13 +181,15 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
@Transactional(rollbackFor = Exception.class)
@Override
public boolean remove(Long userId) {
// 这里先删除主数据
if (!this.removeById(userId)) {
if (sysUserMapper.deleteById(userId) == 0) {
return false;
}
SysUserRole userRole = new SysUserRole();
userRole.setUserId(userId);
sysUserRoleMapper.delete(userRole);
sysUserRoleMapper.delete(new QueryWrapper<>(userRole));
SysDataPermUser dataPermUser = new SysDataPermUser();
dataPermUser.setUserId(userId);
sysDataPermUserMapper.delete(new QueryWrapper<>(dataPermUser));
return true;
}
@@ -270,6 +293,32 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
return sysUserMapper.getNotInSysUserListByRoleId(roleId, filter, orderBy);
}
/**
* 获取指定数据权限的用户列表。
*
* @param dataPermId 数据权限主键Id。
* @param filter 用户过滤对象。
* @param orderBy 排序参数。
* @return 用户列表。
*/
@Override
public List<SysUser> getSysUserListByDataPermId(Long dataPermId, SysUser filter, String orderBy) {
return sysUserMapper.getSysUserListByDataPermId(dataPermId, filter, orderBy);
}
/**
* 获取不属于指定数据权限的用户列表。
*
* @param dataPermId 数据权限主键Id。
* @param filter 用户过滤对象。
* @param orderBy 排序参数。
* @return 用户列表。
*/
@Override
public List<SysUser> getNotInSysUserListByDataPermId(Long dataPermId, SysUser filter, String orderBy) {
return sysUserMapper.getNotInSysUserListByDataPermId(dataPermId, filter, orderBy);
}
/**
* 查询用户的权限资源地址列表。同时返回详细的分配路径。
*
@@ -312,10 +361,12 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
* @param sysUser 当前操作的对象。
* @param originalSysUser 原有对象。
* @param roleIds 逗号分隔的角色Id列表字符串。
* @param dataPermIds 逗号分隔的数据权限Id列表字符串。
* @return 验证结果。
*/
@Override
public CallResult verifyRelatedData(SysUser sysUser, SysUser originalSysUser, String roleIds) {
public CallResult verifyRelatedData(
SysUser sysUser, SysUser originalSysUser, String roleIds, String dataPermIds) {
JSONObject jsonObject = new JSONObject();
if (StringUtils.isBlank(roleIds)) {
return CallResult.error("数据验证失败,用户的角色数据不能为空!");
@@ -326,6 +377,19 @@ public class SysUserServiceImpl extends BaseService<SysUser, Long> implements Sy
return CallResult.error("数据验证失败,存在不合法的用户角色,请刷新后重试!");
}
jsonObject.put("roleIdSet", roleIdSet);
if (StringUtils.isBlank(dataPermIds)) {
return CallResult.error("数据验证失败,用户的数据权限不能为空!");
}
Set<Long> dataPermIdSet = Arrays.stream(
dataPermIds.split(",")).map(Long::valueOf).collect(Collectors.toSet());
if (!sysDataPermService.existAllPrimaryKeys(dataPermIdSet)) {
return CallResult.error("数据验证失败,存在不合法的数据权限,请刷新后重试!");
}
jsonObject.put("dataPermIdSet", dataPermIdSet);
if (this.needToVerify(sysUser, originalSysUser, SysUser::getDeptId)
&& !sysDeptService.existId(sysUser.getDeptId())) {
return CallResult.error("数据验证失败关联的用户部门Id并不存在请刷新后重试");
}
return CallResult.ok(jsonObject);
}
}

View File

@@ -63,26 +63,23 @@
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:8.0.23" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.2.6" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:druid:1.2.6" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-starter:2.1.5" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.4.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.4.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.3.10.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.14.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.14.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-core:1.1.5" level="project" />
<orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-base:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-weekend:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-spring:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-extra:1.1.5" level="project" />
<orderEntry type="library" name="Maven: tk.mybatis:mapper-spring-boot-autoconfigure:2.1.5" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.3.0" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.3" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.5" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.5" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.3.0" level="project" />
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.2.0" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:3.2" level="project" />
<orderEntry type="module" module-name="common-datafilter" />
<orderEntry type="module" module-name="application-common" />
<orderEntry type="module" module-name="common-swagger" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-micro-spring-boot-starter:2.0.8" level="project" />
@@ -102,7 +99,11 @@
<orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.1.7" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:2.10.5" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:2.10.5" level="project" />
<orderEntry type="library" name="Maven: com.orange.demo:common-log:1.0.0" level="project" />
<orderEntry type="module" module-name="common-log" />
<orderEntry type="library" name="Maven: org.springframework.kafka:spring-kafka:2.5.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.2.14.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.14.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.5.RELEASE" level="project" />
<orderEntry type="module" module-name="common-redis" />
<orderEntry type="library" name="Maven: org.redisson:redisson:3.15.4" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.63.Final" level="project" />