refactor: 项目目录结构优化

This commit is contained in:
haoxr
2023-11-07 23:34:22 +08:00
parent 791dc49a52
commit f93190e81d
27 changed files with 68 additions and 64 deletions

View File

@@ -0,0 +1,15 @@
package com.youlai.system.plugin.easyexcel;
import com.alibaba.excel.event.AnalysisEventListener;
/**
* 自定义解析结果监听器
*
* @author haoxr
* @since 2023/03/01
*/
public abstract class MyAnalysisEventListener<T> extends AnalysisEventListener<T> {
private String msg;
public abstract String getMsg();
}

View File

@@ -0,0 +1,175 @@
package com.youlai.system.plugin.easyexcel;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.youlai.system.common.base.IBaseEnum;
import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.GenderEnum;
import com.youlai.system.common.enums.StatusEnum;
import com.youlai.system.converter.UserConverter;
import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.entity.SysUserRole;
import com.youlai.system.model.vo.UserImportVO;
import com.youlai.system.service.SysRoleService;
import com.youlai.system.service.SysUserRoleService;
import com.youlai.system.service.SysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户导入监听器
* <p>
* <a href="https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read#%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E8%AF%BB%E7%9A%84%E7%9B%91%E5%90%AC%E5%99%A8">最简单的读的监听器</a>
*
* @author haoxr
* @since 2022/4/10 20:49
*/
@Slf4j
public class UserImportListener extends MyAnalysisEventListener<UserImportVO> {
// 有效条数
private int validCount;
// 无效条数
private int invalidCount;
// 导入返回信息
StringBuilder msg = new StringBuilder();
// 部门ID
private final Long deptId;
private final SysUserService userService;
private final PasswordEncoder passwordEncoder;
private final UserConverter userConverter;
private final SysRoleService roleService;
private final SysUserRoleService userRoleService;
public UserImportListener(Long deptId) {
this.deptId = deptId;
this.userService = SpringUtil.getBean(SysUserService.class);
this.passwordEncoder = SpringUtil.getBean(PasswordEncoder.class);
this.roleService = SpringUtil.getBean(SysRoleService.class);
this.userRoleService = SpringUtil.getBean(SysUserRoleService.class);
this.userConverter = SpringUtil.getBean(UserConverter.class);
}
/**
* 每一条数据解析都会来调用
* <p>
* 1. 数据校验;全字段校验
* 2. 数据持久化;
*
* @param userImportVO 一行数据,类似于 {@link AnalysisContext#readRowHolder()}
* @param analysisContext
*/
@Override
public void invoke(UserImportVO userImportVO, AnalysisContext analysisContext) {
log.info("解析到一条用户数据:{}", JSONUtil.toJsonStr(userImportVO));
// 校验数据
StringBuilder validationMsg = new StringBuilder();
String username = userImportVO.getUsername();
if (StrUtil.isBlank(username)) {
validationMsg.append("用户名为空;");
} else {
long count = userService.count(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));
if (count > 0) {
validationMsg.append("用户名已存在;");
}
}
String nickname = userImportVO.getNickname();
if (StrUtil.isBlank(nickname)) {
validationMsg.append("用户昵称为空;");
}
String mobile = userImportVO.getMobile();
if (StrUtil.isBlank(mobile)) {
validationMsg.append("手机号码为空;");
} else {
if (!Validator.isMobile(mobile)) {
validationMsg.append("手机号码不正确;");
}
}
if (validationMsg.length() == 0) {
// 校验通过,持久化至数据库
SysUser entity = userConverter.importVo2Entity(userImportVO);
entity.setDeptId(deptId); // 部门
entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); // 默认密码
// 性别翻译
String genderLabel = userImportVO.getGender();
if (StrUtil.isNotBlank(genderLabel)) {
Integer genderValue = (Integer) IBaseEnum.getValueByLabel(genderLabel, GenderEnum.class);
entity.setGender(genderValue);
}
// 角色解析
String roleCodes = userImportVO.getRoleCodes();
List<Long> roleIds = null;
if (StrUtil.isNotBlank(roleCodes)) {
roleIds = roleService.list(
new LambdaQueryWrapper<SysRole>()
.in(SysRole::getCode, roleCodes.split(","))
.eq(SysRole::getStatus, StatusEnum.ENABLE.getValue())
.select(SysRole::getId)
).stream()
.map(role -> role.getId())
.collect(Collectors.toList());
}
boolean saveResult = userService.save(entity);
if (saveResult) {
validCount++;
// 保存用户角色关联
if (CollectionUtil.isNotEmpty(roleIds)) {
List<SysUserRole> userRoles = roleIds.stream()
.map(roleId -> new SysUserRole(entity.getId(), roleId))
.collect(Collectors.toList());
userRoleService.saveBatch(userRoles);
}
} else {
invalidCount++;
msg.append("" + (validCount + invalidCount) + "行数据保存失败;<br/>");
}
} else {
invalidCount++;
msg.append("" + (validCount + invalidCount) + "行数据校验失败:").append(validationMsg + "<br/>");
}
}
/**
* 所有数据解析完成会来调用
*
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
@Override
public String getMsg() {
// 总结信息
String summaryMsg = StrUtil.format("导入用户结束:成功{}条,失败{}条;<br/>{}", validCount, invalidCount, msg);
return summaryMsg;
}
}