mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-11-04 10:57:10 +08:00 
			
		
		
		
	优化:🔥 深度优化后端 CRUD 公共组件,并抽取前端下载功能到 CRUD 公共组件
1. 后端抽取导出功能到 CRUD 公共组件 2. 查询列表及导出接口支持排序参数 3. 深度优化 BaseServiceImpl 中的 CRUD 公共实现 4. 前端抽取公共下载组件 5. 优化部分细节并修复部分错误
This commit is contained in:
		@@ -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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@ public interface UserService {
 | 
			
		||||
     * 根据 ID 查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId
 | 
			
		||||
     *            用户ID
 | 
			
		||||
     *            用户 ID
 | 
			
		||||
     * @return 用户信息
 | 
			
		||||
     */
 | 
			
		||||
    UserDO getById(Long userId);
 | 
			
		||||
 
 | 
			
		||||
@@ -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()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user