User业务

183 阅读2分钟

一、user业务概括

  1. 用户列表分页查询
  2. 新增用户:验证新增参数是否符合要求,选择用户拥有的角色,存储用户的账号还有用户与角色的关系(对于user对象的获取通过工厂或仓库)
  3. 修改用户:验证修改参数是否符合要求,对原先存储的用户与角色关系进行删除,存储用户的账号还有用户与角色关系(对于user对象的获取通过工厂或仓库)
  4. 删除用户:判断当前删除者与创建者是否一致,根据id列表删除user对象还有用户与角色关系
  5. 根据用户获取角色数据:验证用户参数是否符合要求,直接搜
  6. 根据用户分配角色:验证用户与角色参数是否符合要求,直接赋

二、分页查询

接口层

/**
 * 用户分页查询
 */
@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>

修改与删除类似