芋道导入逻辑

一、代码 

 @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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915582.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle7.6.1+springboot3.2.4创建微服务工程

目录 一、创建主工程cloud-demo并删除src目录 二、创建子工程user-service/order-service 三、更改父工程build.gradle文件 四、子工程使用mybatis框架 五、子工程使用mybatis-plus框架 六、相关数据库创建 七、最终目录结构 一、创建主工程cloud-demo并删除src目录 二、…

电脑windows系统深度维护指南

&#x1f5a5;️ 电脑系统全方位维护指南 预防故障 提升性能 延长寿命 &#x1f50d; 引言&#xff1a;为什么需要系统维护&#xff1f; 电脑如同汽车&#xff0c;定期保养可避免&#xff1a; ✅ 突发蓝屏死机 ✅ 系统卡顿崩溃 ✅ 硬件过早损坏 ✅ 数据丢失风险 本指南提供…

字节内部流传的数据分析手册

之前2领导整理内部分享的&#xff0c;所以很多内部业务的分析&#xff0c;比如工作中怎么落地、怎么推进。(数据都是脱敏的哈) **里面的内容都偏应用&#xff0c;比如产品迭代怎么做数据评估、用户增长靠什么指标拆解、AB实验怎么设计、运营活动怎么闭环。**数据分析都是很实际…

Nginx Proxy Manager + LB + Openappsec + Web UI 构建下一代WAF

Nginx Proxy Manager + LB + Openappsec + Web UI部署 一、环境介绍 二、系统参数优化 三、安装docker 四、创建docker网络 五、创建测试容器 六、部署NPM和openappsec 1、下载docker-compose文件 2、拉取相关镜像 3、web UI 获取token 4、修改compose文件并安装 七、登陆NPM配…

【React】npm install报错npm : 无法加载文件 D:\APP\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

使用vsCode打开react项目安装依赖时报错&#xff0c;把terminal打开的powershell改成command prompt即可

深入解析C#装箱转换:值类型如何“变身”为引用类型?

当你将 int i 赋值给 object oi 时&#xff0c; 看似简单的操作背后&#xff0c;藏着一场精密的类型转换革命&#xff01;&#x1f511; 一、核心概念&#xff1a;什么是装箱&#xff1f; 装箱&#xff08;Boxing&#xff09; 是C#中的一种隐式转换机制&#xff0c;它将值类型&…

java list 与set 集合的迭代器在进行元素操作时出现数据混乱问题及原因

为什么 List 和 Set 迭代器删除结果不同&#xff1f;1. List 和 Set 的本质差异List&#xff08;如 ArrayList&#xff09;&#xff1a;有序集合&#xff0c;元素按插入顺序存储&#xff0c;允许重复元素。迭代器遍历时&#xff0c;元素按索引顺序返回。删除操作&#xff08;通…

大语言模型:人像摄影的“达芬奇转世”?——从算法解析到光影重塑的智能摄影革命

导言在摄影术诞生之初&#xff0c;达芬奇或许无法想象&#xff0c;他对于光影、比例和解剖的严谨研究&#xff0c;会在数百年后以另一种形式重生。今天&#xff0c;当摄影师面对复杂的光线环境或苦苦寻找最佳构图时&#xff0c;一位由代码构筑的“光影军师”正悄然降临——大语…

Java——MyBatis从入门到精通:一站式学习指南

MyBatis从入门到精通&#xff1a;一站式学习指南 作为一款优秀的半自动ORM框架&#xff0c;MyBatis以其灵活的SQL控制和简洁的配置方式&#xff0c;成为Java后端开发中持久层框架的首选。本文将从基础概念到高级特性&#xff0c;全面讲解MyBatis的使用方法&#xff0c;包含实用…

面试150 添加与搜索单词--数据结构设计

思路 通过哈希法去实现&#xff0c;这里主要描述search的思路&#xff1a;如果’.‘不在word中&#xff0c;我们只需要去查询word在不在set中。如果’.‘存在&#xff0c;我们对哈希中的字符串进行遍历w&#xff0c;如果当前字符串的长度不等于word跳过,对word进行遍历&#xf…

学习打卡网站(搭子版本)

概述 之前用了网上的一些学习打卡类app&#xff0c;基本都是收费的&#xff0c;而且有些自己想要的功能却没有&#xff0c;甚至还有广告&#xff0c;正好暑假是个需要容易懒惰的时间&#xff0c;所以干脆自己做了一个能和学习搭子一起记录计划的小网站。 昨天早上开始写&#x…

分享如何在Window系统的云服务器上部署网站及域名解析+SSL

最近看到阿里云的服务器有个199的活动&#xff0c;买了个2核4G带宽5M的服务器&#xff0c;用于小网站的运营也足够&#xff0c;于是就买一个&#xff0c;并且我还挑了个新加坡的站点&#xff0c;本想着运营独立站&#xff0c;用新加坡的站点外网访问会更友好一点。于是问题就来…

FastAdmin系统框架通用操作平滑迁移到新服务器的详细步骤-优雅草卓伊凡

FastAdmin系统框架通用操作平滑迁移到新服务器的详细步骤-优雅草卓伊凡我们蜻蜓hr系统采用的后端框架就是fastadmin&#xff0c;因此我们平稳迁移以此为例&#xff0c;为什么要迁移一份是因为有甲方需要。迁移FastAdmin系统到新服务器需要确保数据完整性和系统功能正常。以下是…

Request和Response相关介绍

Request 和 Response 是什么&#xff1f; Request&#xff08;请求对象&#xff09;&#xff1a;用来接收浏览器发过来的数据。 Response&#xff08;响应对象&#xff09;&#xff1a;用来把服务器处理后的结果返回给浏览器。 1. request 的作用&#xff08;获取请求数据&am…

Springboot 实现热部署

spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署&#xff0c;提高开发者的开发效率&#xff0c;无需手动重启Spring Boot应用。引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>s…

虚拟机扩展磁盘容量后扩展分区大小

1. 首先检查磁盘剩余空间sudo fdisk -l /dev/sda2. 如果有未分配空间&#xff0c;直接扩展分区sudo fdisk /dev/sda在fdisk交互界面中&#xff0c;依次写入d # 删除分区 3 # 例如选择分区3&#xff08;/dev/sda3&#xff09; n # 新建分区 p # 主分区 3 # 分区号3 # 起始扇…

元宇宙与游戏:虚实交融的数字文明新纪元

引言&#xff1a;当游戏遇见元宇宙在纽约现代艺术博物馆&#xff08;MoMA&#xff09;的"虚拟世界"特展中&#xff0c;一幅数字艺术作品《元宇宙诞生》引发观展热潮。这幅由AI与人类艺术家共同创作的作品&#xff0c;描绘了游戏《堡垒之夜》的虚拟演唱会与现实世界交…

音视频学习(四十二):H264帧间压缩技术

必要性与优势 原始数字视频数据量庞大&#xff0c;未经压缩的视频难以有效传输和存储。例如&#xff0c;一个 1080p、30fps 的无压缩视频&#xff0c;每秒数据量可达数百兆比特。视频压缩的目标是在保证视觉质量的前提下&#xff0c;最大限度地减少数据冗余。视频数据中存在多种…

微服务雪崩防护最佳实践之sentinel

思考1、当服务访问量达到一定程度&#xff0c;流量扛不住的时候&#xff0c;该如何处理&#xff1f;2、服务之间相互依赖&#xff0c;当服务A出现响应时间过长&#xff0c;影响到服务B的响应&#xff0c;进而产生连锁反应&#xff0c;直至影响整个依赖链上的所有服务&#xff0…

阿里云监控及运维常见问题

云监控介绍&#xff1a;阿里云的云监控服务&#xff08;CloudMonitor&#xff09;是一款简单易用、功能强大的监控工具&#xff0c;主要用来帮助用户实时监控阿里 云上的各种资源&#xff08;比如服务器、数据库、网络等&#xff09;&#xff0c;并在出现问题时及时发出警报&am…