优化:🔥 深度优化后端 CRUD 公共组件,并抽取前端下载功能到 CRUD 公共组件

1. 后端抽取导出功能到 CRUD 公共组件
2. 查询列表及导出接口支持排序参数
3. 深度优化 BaseServiceImpl 中的 CRUD 公共实现
4. 前端抽取公共下载组件
5. 优化部分细节并修复部分错误
This commit is contained in:
2023-02-13 21:15:06 +08:00
parent 142d315a8d
commit 03b57fb021
25 changed files with 457 additions and 307 deletions

View File

@@ -18,8 +18,6 @@ package top.charles7c.cnadmin.system.service;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseService;
@@ -53,14 +51,4 @@ public interface DeptService extends BaseService<DeptVO, DeptDetailVO, DeptQuery
* @return 树列表
*/
List<Tree<Long>> buildTree(List<DeptVO> list);
/**
* 导出
*
* @param query
* 查询条件
* @param response
* 响应对象
*/
void export(DeptQuery query, HttpServletResponse response);
}

View File

@@ -84,7 +84,7 @@ public interface UserService {
* 根据 ID 查询
*
* @param userId
* 用户ID
* 用户 ID
* @return 用户信息
*/
UserDO getById(Long userId);

View File

@@ -17,32 +17,24 @@
package top.charles7c.cnadmin.system.service.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
import top.charles7c.cnadmin.common.base.BaseVO;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
import top.charles7c.cnadmin.common.util.ExcelUtils;
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import top.charles7c.cnadmin.common.util.TreeUtils;
import top.charles7c.cnadmin.common.util.helper.QueryHelper;
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
import top.charles7c.cnadmin.system.mapper.DeptMapper;
import top.charles7c.cnadmin.system.model.entity.DeptDO;
@@ -51,7 +43,6 @@ import top.charles7c.cnadmin.system.model.request.DeptRequest;
import top.charles7c.cnadmin.system.model.vo.DeptDetailVO;
import top.charles7c.cnadmin.system.model.vo.DeptVO;
import top.charles7c.cnadmin.system.service.DeptService;
import top.charles7c.cnadmin.system.service.UserService;
/**
* 部门业务实现类
@@ -64,38 +55,6 @@ import top.charles7c.cnadmin.system.service.UserService;
public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO, DeptDetailVO, DeptQuery, DeptRequest>
implements DeptService {
private final UserService userService;
@Override
public List<DeptVO> list(DeptQuery query) {
List<DeptDO> deptList = this.listDept(query);
List<DeptVO> list = BeanUtil.copyToList(deptList, DeptVO.class);
list.forEach(this::fill);
return list;
}
/**
* 查询列表
*
* @param query
* 查询条件
* @return 列表信息
*/
private List<DeptDO> listDept(DeptQuery query) {
QueryWrapper<DeptDO> queryWrapper = QueryHelper.build(query);
queryWrapper.lambda().orderByAsc(DeptDO::getParentId).orderByAsc(DeptDO::getDeptSort)
.orderByDesc(DeptDO::getCreateTime);
List<DeptDO> deptList = baseMapper.selectList(queryWrapper);
return CollUtil.isNotEmpty(deptList) ? deptList : Collections.emptyList();
}
@Override
public DeptDetailVO get(Long id) {
DeptDetailVO deptDetailVO = super.get(id);
this.fillDetail(deptDetailVO);
return deptDetailVO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long create(DeptRequest request) {
@@ -103,11 +62,9 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
boolean isExist = this.checkNameExist(deptName, request.getParentId(), request.getDeptId());
CheckUtils.throwIf(() -> isExist, String.format("新增失败,'%s'已存在", deptName));
// 保存部门信息
DeptDO deptDO = BeanUtil.copyProperties(request, DeptDO.class);
deptDO.setStatus(DisEnableStatusEnum.ENABLE);
baseMapper.insert(deptDO);
return deptDO.getDeptId();
// 保存信息
request.setStatus(DisEnableStatusEnum.ENABLE);
return super.create(request);
}
@Override
@@ -189,14 +146,6 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
});
}
@Override
public void export(DeptQuery query, HttpServletResponse response) {
List<DeptDO> deptList = this.listDept(query);
List<DeptDetailVO> list = BeanUtil.copyToList(deptList, DeptDetailVO.class);
list.forEach(this::fillDetail);
ExcelUtils.export(list, "部门数据", DeptDetailVO.class, response);
}
/**
* 检查名称是否存在
*
@@ -213,34 +162,12 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
.eq(DeptDO::getParentId, parentId).ne(deptId != null, DeptDO::getDeptId, deptId));
}
/**
* 填充数据
*
* @param baseVO
* 待填充列表信息
*/
private void fill(BaseVO baseVO) {
Long createUser = baseVO.getCreateUser();
if (createUser == null) {
return;
@Override
public void fillDetail(Object detailObj) {
super.fillDetail(detailObj);
if (detailObj instanceof DeptDetailVO) {
DeptDetailVO detailVO = (DeptDetailVO)detailObj;
detailVO.setParentName(ExceptionUtils.exToNull(() -> this.get(detailVO.getParentId()).getDeptName()));
}
baseVO.setCreateUserString(ExceptionUtils.exToNull(() -> userService.getById(createUser)).getNickname());
}
/**
* 填充详情数据
*
* @param detailVO
* 待填充详情信息
*/
private void fillDetail(DeptDetailVO detailVO) {
this.fill(detailVO);
Long updateUser = detailVO.getUpdateUser();
if (updateUser == null) {
return;
}
detailVO.setUpdateUserString(ExceptionUtils.exToNull(() -> userService.getById(updateUser)).getNickname());
detailVO.setParentName(ExceptionUtils.exToNull(() -> this.get(detailVO.getParentId()).getDeptName()));
}
}

View File

@@ -16,8 +16,6 @@
package top.charles7c.cnadmin.system.service.impl;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -25,15 +23,8 @@ import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import cn.hutool.core.bean.BeanUtil;
import top.charles7c.cnadmin.common.base.BaseDetailVO;
import top.charles7c.cnadmin.common.base.BaseServiceImpl;
import top.charles7c.cnadmin.common.base.BaseVO;
import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum;
import top.charles7c.cnadmin.common.model.query.PageQuery;
import top.charles7c.cnadmin.common.model.vo.PageDataVO;
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
import top.charles7c.cnadmin.system.mapper.RoleMapper;
import top.charles7c.cnadmin.system.model.entity.RoleDO;
@@ -42,7 +33,6 @@ import top.charles7c.cnadmin.system.model.request.RoleRequest;
import top.charles7c.cnadmin.system.model.vo.RoleDetailVO;
import top.charles7c.cnadmin.system.model.vo.RoleVO;
import top.charles7c.cnadmin.system.service.RoleService;
import top.charles7c.cnadmin.system.service.UserService;
/**
* 角色业务实现类
@@ -55,22 +45,6 @@ import top.charles7c.cnadmin.system.service.UserService;
public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO, RoleDetailVO, RoleQuery, RoleRequest>
implements RoleService {
private final UserService userService;
@Override
public PageDataVO<RoleVO> page(RoleQuery query, PageQuery pageQuery) {
PageDataVO<RoleVO> pageDataVO = super.page(query, pageQuery);
pageDataVO.getList().forEach(this::fill);
return pageDataVO;
}
@Override
public RoleDetailVO get(Long id) {
RoleDetailVO roleDetailVO = super.get(id);
this.fillDetail(roleDetailVO);
return roleDetailVO;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long create(RoleRequest request) {
@@ -79,10 +53,8 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
CheckUtils.throwIf(() -> isExist, String.format("新增失败,'%s'已存在", roleName));
// 保存信息
RoleDO roleDO = BeanUtil.copyProperties(request, RoleDO.class);
roleDO.setStatus(DisEnableStatusEnum.ENABLE);
baseMapper.insert(roleDO);
return roleDO.getRoleId();
request.setStatus(DisEnableStatusEnum.ENABLE);
return super.create(request);
}
@Override
@@ -95,12 +67,6 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
super.update(request);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(List<Long> ids) {
super.delete(ids);
}
/**
* 检查名称是否存在
*
@@ -114,34 +80,4 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
return baseMapper.exists(Wrappers.<RoleDO>lambdaQuery().eq(RoleDO::getRoleName, roleName).ne(roleId != null,
RoleDO::getRoleId, roleId));
}
/**
* 填充数据
*
* @param baseVO
* 待填充列表信息
*/
private void fill(BaseVO baseVO) {
Long createUser = baseVO.getCreateUser();
if (createUser == null) {
return;
}
baseVO.setCreateUserString(ExceptionUtils.exToNull(() -> userService.getById(createUser)).getNickname());
}
/**
* 填充详情数据
*
* @param detailVO
* 待填充详情信息
*/
private void fillDetail(BaseDetailVO detailVO) {
this.fill(detailVO);
Long updateUser = detailVO.getUpdateUser();
if (updateUser == null) {
return;
}
detailVO.setUpdateUserString(ExceptionUtils.exToNull(() -> userService.getById(updateUser)).getNickname());
}
}

View File

@@ -36,6 +36,7 @@ import cn.hutool.core.util.StrUtil;
import top.charles7c.cnadmin.common.config.properties.LocalStorageProperties;
import top.charles7c.cnadmin.common.consts.FileConstants;
import top.charles7c.cnadmin.common.model.dto.LoginUser;
import top.charles7c.cnadmin.common.service.CommonUserService;
import top.charles7c.cnadmin.common.util.FileUtils;
import top.charles7c.cnadmin.common.util.SecureUtils;
import top.charles7c.cnadmin.common.util.helper.LoginHelper;
@@ -52,7 +53,7 @@ import top.charles7c.cnadmin.system.service.UserService;
*/
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
public class UserServiceImpl implements UserService, CommonUserService {
private final UserMapper userMapper;
private final LocalStorageProperties localStorageProperties;
@@ -155,4 +156,9 @@ public class UserServiceImpl implements UserService {
CheckUtils.throwIfNull(userDO, String.format("ID为 [%s] 的用户已不存在", userId));
return userDO;
}
@Override
public String getNicknameById(Long userId) {
return this.getById(userId).getNickname();
}
}