一、user业务概括
- 用户列表分页查询
- 新增用户:验证新增参数是否符合要求,选择用户拥有的角色,存储用户的账号还有用户与角色的关系(对于user对象的获取通过工厂或仓库)
- 修改用户:验证修改参数是否符合要求,对原先存储的用户与角色关系进行删除,存储用户的账号还有用户与角色关系(对于user对象的获取通过工厂或仓库)
- 删除用户:判断当前删除者与创建者是否一致,根据id列表删除user对象还有用户与角色关系
- 根据用户获取角色数据:验证用户参数是否符合要求,直接搜
- 根据用户分配角色:验证用户与角色参数是否符合要求,直接赋
二、分页查询
接口层
/**
* 用户分页查询
*/
@ApiOperation("用户分页查询")
@GetMapping("/list")
@PreAuthorize("hasAuthority('sys:user:list')")
public Result list(@RequestParam Map<String, Object> params) {
Page page = userQueryService.queryPage(params);
return Result.ok().put(PageConstant.PAGE, page);
}
应用层服务
@Override
public Page queryPage(Map<String, Object> params) {
IPage<SysUserDO> page = sysUserMapper.queryPage(new Query().getPage(params), params);
return PageAssembler.toPage(page);
}
其中getPage进行分页处理
public IPage<T> getPage(Map<String, Object> params) {
return this.getPage(params, null, false);
}
public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
//分页参数
long curPage = 1;
long limit = 10;
if (params.get(PageConstant.PAGE) != null) {
curPage = Long.parseLong((String) params.get(PageConstant.PAGE));
}
if (params.get(PageConstant.LIMIT) != null) {
limit = Long.parseLong((String) params.get(PageConstant.LIMIT));
}
//分页对象
Page<T> page = new Page<>(curPage, limit);
//分页参数
params.put(PageConstant.PAGE, page);
//排序字段
//防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
String orderField = (String) params.get(PageConstant.ORDER_FIELD);
String order = (String) params.get(PageConstant.ORDER);
//前端字段排序
if (StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)) {
if (PageConstant.ASC.equalsIgnoreCase(order)) {
return page.addOrder(OrderItem.asc(orderField));
} else {
return page.addOrder(OrderItem.desc(orderField));
}
}
//没有排序字段,则不排序
if (StringUtils.isBlank(defaultOrderField)) {
return page;
}
//默认排序
if (isAsc) {
page.addOrder(OrderItem.asc(defaultOrderField));
} else {
page.addOrder(OrderItem.desc(defaultOrderField));
}
return page;
}
领域层Manager(仓库的功能扩展)的mapper
<select id="queryPage" parameterType="Map"
resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysUserDO">
SELECT
u.*
FROM
acl_user u
<where>
AND u.is_deleted='0'
<if test="params.userName != null and params.userName !=''">
AND u.user_name=#{params.userName}
</if>
</where>
</select>
三、保存user
接口层:验证输入数据是否符合要求,调用服务
/**
* 保存用户
*/
@ApiOperation("保存用户")
@SysLog("保存用户")
@PostMapping("/save")
@PreAuthorize("hasAuthority('sys:user:save')")
public Result save(@RequestBody UserCommand userCommand) {
ValidatorUtils.validateEntity(userCommand, AddGroup.class);
userApplicationService.save(userCommand);
return Result.ok();
}
应用层service
@Override
@Transactional(rollbackFor = Exception.class)
public void save(UserCommand userCommand) {
List<RoleId> roleIdList = new ArrayList<>();
if (userCommand.getRoleIdList() != null) {
userCommand.getRoleIdList().forEach(roleId -> {
roleIdList.add(new RoleId(roleId));
});
}
UserFactory userFactory = new UserFactory(userRepository);
User user = userFactory.createUser(new Mobile(userCommand.getMobile()), new Email(userCommand.getEmail()), Password.create(Password.DEFAULT),
new UserName(userCommand.getUserName()), roleIdList);
userRepository.store(user);
}
邻域层聚合的工厂创建对象方法
public User createUser(Mobile mobile, Email email, Password password, UserName userName, List<RoleId> roleIdList) {
List<User> users = userRepository.find(mobile);
Accout account;
if (users != null && !users.isEmpty()) {
for (User user : users) {
if (user.getAccount().getMobile().sameValueAs(mobile)) {
throw new RuntimeException("账号已存在");
}
}
account = users.get(0).getAccount();
}else{
account = new Account(mobile,email,password);
}
return new User(userName, account, roleIdList);
}
邻域层聚合的工厂存储对象方法,需要先删除user与role关系数据,因为更新的话会有新的关系,之前的作废
@Override
public UserId store(User user) {
SysAccountDO sysAccountDO = UserConverter.getSysAccountDO(user);
String accountId = null;
if (sysAccountDO != null) {
if (sysAccountDO.getId() != null) {
sysAccountMapper.updateById(sysAccountDO);
} else {
sysAccountMapper.insert(sysAccountDO);
}
accountId = sysAccountDO.getId();
}
SysUserDO sysUserDO = UserConverter.fromUser(user, accountId);
this.saveOrUpdate(sysUserDO);
String userId = sysUserDO.getId();
//先删除用户与角色关系
List<String> userIds = new ArrayList<>();
userIds.add(userId);
sysUserRoleMapper.deleteByUserIds(userIds);
List<RoleId> roleIds = user.getRoleIds();
if (roleIds != null && !roleIds.isEmpty()) {
//保存角色与菜单关系
for (RoleId roleId : roleIds) {
SysUserRoleDO sysUserRoleDO = new SysUserRoleDO();
sysUserRoleDO.setUserId(userId);
sysUserRoleDO.setRoleId(roleId.getId());
sysUserRoleMapper.insert(sysUserRoleDO);
}
}
return new UserId(sysUserDO.getId());
}
领域层Manager(仓库的功能扩展)的仓库实现
@Override
public List<User> find(Mobile mobile) {
Map<String, Object> params = new HashMap<>();
params.put("mobile", mobile.getMobile());
List<SysUserDO> sysUserDOList = baseMapper.queryUserNoTenant(params);
if (sysUserDOList == null || sysUserDOList.isEmpty()) {
return null;
}
List<User> users = new ArrayList<>();
for (SysUserDO sysUserDO : sysUserDOList) {
User user = UserConverter.toUser(sysUserDO, getUserAccount(sysUserDO.getAccountId()), getUserRoleIds(sysUserDO.getId()));
users.add(user);
}
return users;
}
领域层Manager(仓库的功能扩展)的mapper
<select id="queryUserNoTenant" parameterType="Map"
resultType="com.xtoon.cloud.sys.infrastructure.persistence.entity.SysUserDO">
SELECT
u.*,t.tenant_code,t.tenant_name
FROM
acl_user u
inner JOIN acl_account a ON u.account_id = a.id
<where>
AND u.is_deleted='0' AND a.is_deleted = '0'
<if test="params.mobile != null and params.mobile !=''">
AND a.mobile=#{params.mobile}
</if>
</where>
</select>
修改与删除类似