芋道导入逻辑

发布于:2025-07-20 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、代码 

 @PostMapping("/import")
    @Operation(summary = "导入用户")
    @Parameters({
            @Parameter(name = "file", description = "Excel 文件", required = true),
            @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
    })
    @PreAuthorize("@ss.hasPermission('system:user:import')")
    public CommonResult<UserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
                                                      @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
        List<UserImportExcelVO> list = ExcelUtils.read(file, UserImportExcelVO.class);
        return success(userService.importUserList(list, updateSupport));
    }
  @Override
    @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
    public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
        // 1.1 参数校验
        if (CollUtil.isEmpty(importUsers)) {
            throw exception(USER_IMPORT_LIST_IS_EMPTY);
        }
        // 1.2 初始化密码不能为空
        String initPassword = configApi.getConfigValueByKey(USER_INIT_PASSWORD_KEY).getCheckedData();
        if (StrUtil.isEmpty(initPassword)) {
            throw exception(USER_IMPORT_INIT_PASSWORD);
        }

        // 2. 遍历,逐个创建 or 更新
        UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
                .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
        importUsers.forEach(importUser -> {
            // 2.1.1 校验字段是否符合要求
            try {
                ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword));
            } catch (ConstraintViolationException ex){
                respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
                return;
            }
            // 2.1.2 校验,判断是否有不符合的原因
            try {
                validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
                        importUser.getDeptId(), null);
            } catch (ServiceException ex) {
                respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
                return;
            }

            // 2.2.1 判断如果不存在,在进行插入
            AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername());
            if (existUser == null) {
                userMapper.insert(BeanUtils.toBean(importUser, AdminUserDO.class)
                        .setPassword(encodePassword(initPassword)).setPostIds(new HashSet<>())); // 设置默认密码及空岗位编号数组
                respVO.getCreateUsernames().add(importUser.getUsername());
                return;
            }
            // 2.2.2 如果存在,判断是否允许更新
            if (!isUpdateSupport) {
                respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg());
                return;
            }
            AdminUserDO updateUser = BeanUtils.toBean(importUser, AdminUserDO.class);
            updateUser.setId(existUser.getId());
            userMapper.updateById(updateUser);
            respVO.getUpdateUsernames().add(importUser.getUsername());
        });
        return respVO;
    }

二、密码判断 

✅ 1. configApi.getConfigValueByKey(...)

这是调用 配置中心 APIconfigApi)的方法,去根据配置项的 key 获取对应的值。

  • USER_INIT_PASSWORD_KEY 是常量,通常定义为字符串 "sys.user.init-password"(或者类似的 key)。

  • 意思是:去配置系统里找“用户初始密码”的配置。

✅ 2. .getCheckedData()

这是对配置结果的 封装处理,用于确保该配置值是存在并有效的。

  • 如果配置项未设置或值为空,它可能会抛出异常(提示配置缺失),避免后面使用 null 值。

  • 所以这是一个 带校验的安全获取配置值方式

三、校验数据 (加注解)

 

当执行 validate(userSaveReqVO) 时,如果 username 是空,或者 email 格式不对,或者 password 长度不合适,都会被检测出来,然后抛出异常。

 

字段名 校验规则 说明
username @NotBlank@Pattern@Size(4~30) 用户账号不能为空,且只能是字母数字,长度4~30
nickname @Size(max=30) 用户昵称最长30个字符
email @Email@Size(max=50) 必须是合法邮箱,最长50字符
mobile @Mobile(自定义手机校验注解) 手机号格式校验
password @Length(4~16) + @AssertTrue(isPasswordValid) 新增用户时密码不能为空且长度4~16

 


网站公告

今日签到

点亮在社区的每一天
去签到