mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 02:08:43 +08:00 
			
		
		
		
	1. 完成用户导出的功能
2. 完成前后端的导出的封装
This commit is contained in:
		| @@ -16,7 +16,7 @@ import './assets/icons' // icon | |||||||
| import './permission' // permission control | import './permission' // permission control | ||||||
| import { getDicts } from "@/api/system/dict/data"; | import { getDicts } from "@/api/system/dict/data"; | ||||||
| import { getConfigKey } from "@/api/system/config"; | import { getConfigKey } from "@/api/system/config"; | ||||||
| import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, download, handleTree } from "@/utils/ruoyi"; | import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, download, handleTree, downloadExcel } from "@/utils/ruoyi"; | ||||||
| import Pagination from "@/components/Pagination"; | import Pagination from "@/components/Pagination"; | ||||||
| // 自定义表格工具扩展 | // 自定义表格工具扩展 | ||||||
| import RightToolbar from "@/components/RightToolbar" | import RightToolbar from "@/components/RightToolbar" | ||||||
| @@ -33,6 +33,7 @@ Vue.prototype.addDateRange = addDateRange | |||||||
| Vue.prototype.selectDictLabel = selectDictLabel | Vue.prototype.selectDictLabel = selectDictLabel | ||||||
| Vue.prototype.selectDictLabels = selectDictLabels | Vue.prototype.selectDictLabels = selectDictLabels | ||||||
| Vue.prototype.download = download | Vue.prototype.download = download | ||||||
|  | Vue.prototype.downloadExcel = downloadExcel | ||||||
| Vue.prototype.handleTree = handleTree | Vue.prototype.handleTree = handleTree | ||||||
|  |  | ||||||
| Vue.prototype.msgSuccess = function (msg) { | Vue.prototype.msgSuccess = function (msg) { | ||||||
|   | |||||||
| @@ -101,6 +101,21 @@ export function download(fileName) { | |||||||
| 	window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true; | 	window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 下载 Excel 方法 | ||||||
|  | export function downloadExcel(data, fileName) { | ||||||
|  |   // 创建 blob | ||||||
|  |   let blob = new Blob([data], {type: 'application/vnd.ms-excel'}); | ||||||
|  |   // 创建 href 超链接,点击进行下载 | ||||||
|  |   window.URL = window.URL || window.webkitURL; | ||||||
|  |   let href = URL.createObjectURL(blob); | ||||||
|  |   let downA = document.createElement("a"); | ||||||
|  |   downA.href =  href; | ||||||
|  |   downA.download = fileName; | ||||||
|  |   downA.click(); | ||||||
|  |   // 销毁超连接 | ||||||
|  |   window.URL.revokeObjectURL(href); | ||||||
|  | } | ||||||
|  |  | ||||||
| // 字符串格式化(%s ) | // 字符串格式化(%s ) | ||||||
| export function sprintf(str) { | export function sprintf(str) { | ||||||
| 	var args = arguments, flag = true, i = 1; | 	var args = arguments, flag = true, i = 1; | ||||||
|   | |||||||
| @@ -510,7 +510,7 @@ export default { | |||||||
|       this.reset(); |       this.reset(); | ||||||
|     }, |     }, | ||||||
|     // 取消按钮(角色权限) |     // 取消按钮(角色权限) | ||||||
|     cancelMenu() { |     cancelRole() { | ||||||
|       this.openRole = false; |       this.openRole = false; | ||||||
|       this.reset(); |       this.reset(); | ||||||
|     }, |     }, | ||||||
| @@ -647,7 +647,10 @@ export default { | |||||||
|     }, |     }, | ||||||
|     /** 导出按钮操作 */ |     /** 导出按钮操作 */ | ||||||
|     handleExport() { |     handleExport() { | ||||||
|       const queryParams = this.queryParams; |       const queryParams = this.addDateRange(this.queryParams, [ | ||||||
|  |         this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, | ||||||
|  |         this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, | ||||||
|  |       ]); | ||||||
|       this.$confirm('是否确认导出所有用户数据项?', "警告", { |       this.$confirm('是否确认导出所有用户数据项?', "警告", { | ||||||
|           confirmButtonText: "确定", |           confirmButtonText: "确定", | ||||||
|           cancelButtonText: "取消", |           cancelButtonText: "取消", | ||||||
| @@ -655,15 +658,7 @@ export default { | |||||||
|         }).then(function() { |         }).then(function() { | ||||||
|           return exportUser(queryParams); |           return exportUser(queryParams); | ||||||
|         }).then(response => { |         }).then(response => { | ||||||
|           // this.download(response.msg); |           this.downloadExcel(response, '用户数据.xls'); | ||||||
|           let blob = new Blob([response], {type: 'application/vnd.ms-excel'}); |  | ||||||
|           window.URL = window.URL || window.webkitURL; |  | ||||||
|           let href = URL.createObjectURL(blob); |  | ||||||
|           let downA = document.createElement("a"); |  | ||||||
|           downA.href =  href;// |  | ||||||
|           downA.download = '123321.xls'; |  | ||||||
|           downA.click(); |  | ||||||
|           window.URL.revokeObjectURL(href); |  | ||||||
|         }) |         }) | ||||||
|     }, |     }, | ||||||
|     /** 导入按钮操作 */ |     /** 导入按钮操作 */ | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ public class DictConvert implements Converter<Object> { | |||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|         // 生成 Excel 小表格 |         // 生成 Excel 小表格 | ||||||
|         return new CellData<>(dictData.getValue()); |         return new CellData<>(dictData.getLabel()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static DictTypeEnum getType(ExcelContentProperty contentProperty) { |     private static DictTypeEnum getType(ExcelContentProperty contentProperty) { | ||||||
|   | |||||||
| @@ -0,0 +1,27 @@ | |||||||
|  | package cn.iocoder.dashboard.framework.excel.core.util; | ||||||
|  |  | ||||||
|  | import com.alibaba.excel.EasyExcel; | ||||||
|  | import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; | ||||||
|  |  | ||||||
|  | import javax.servlet.http.HttpServletResponse; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.net.URLEncoder; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Excel 工具类 | ||||||
|  |  */ | ||||||
|  | public class ExcelUtils { | ||||||
|  |  | ||||||
|  |     public static void write(HttpServletResponse response, String filename, String sheetName, | ||||||
|  |                                  Class<?> head, List<?> data) throws IOException { | ||||||
|  |         // 设置 header 和 contentType | ||||||
|  |         response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); | ||||||
|  |         response.setContentType("application/vnd.ms-excel;charset=UTF-8"); | ||||||
|  |         // 输出 Excel | ||||||
|  |         EasyExcel.write(response.getOutputStream(), head) | ||||||
|  |                 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 | ||||||
|  |                 .sheet(sheetName).doWrite(data); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.user; | |||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.iocoder.dashboard.common.pojo.CommonResult; | import cn.iocoder.dashboard.common.pojo.CommonResult; | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
|  | import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; | ||||||
| import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; | import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; | ||||||
| @@ -10,7 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | |||||||
| import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; | import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; | ||||||
| import cn.iocoder.dashboard.modules.system.service.user.SysUserService; | import cn.iocoder.dashboard.modules.system.service.user.SysUserService; | ||||||
| import cn.iocoder.dashboard.util.collection.CollectionUtils; | import cn.iocoder.dashboard.util.collection.CollectionUtils; | ||||||
| import com.alibaba.excel.EasyExcel; | import cn.iocoder.dashboard.util.collection.MapUtils; | ||||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||||
| import io.swagger.annotations.ApiImplicitParam; | import io.swagger.annotations.ApiImplicitParam; | ||||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||||
| @@ -20,7 +21,10 @@ import org.springframework.web.bind.annotation.*; | |||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.*; | import java.util.ArrayList; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
| import static cn.iocoder.dashboard.common.pojo.CommonResult.success; | import static cn.iocoder.dashboard.common.pojo.CommonResult.success; | ||||||
|  |  | ||||||
| @@ -37,7 +41,7 @@ public class SysUserController { | |||||||
|     @ApiOperation("获得用户分页列表") |     @ApiOperation("获得用户分页列表") | ||||||
|     @GetMapping("/page") |     @GetMapping("/page") | ||||||
| //    @PreAuthorize("@ss.hasPermi('system:user:list')") | //    @PreAuthorize("@ss.hasPermi('system:user:list')") | ||||||
|     public CommonResult<PageResult<SysUserPageItemRespVO>> pageUsers(SysUserPageReqVO reqVO) { |     public CommonResult<PageResult<SysUserPageItemRespVO>> pageUsers(@Validated SysUserPageReqVO reqVO) { | ||||||
|         // 获得用户分页列表 |         // 获得用户分页列表 | ||||||
|         PageResult<SysUserDO> pageResult = userService.pageUsers(reqVO); |         PageResult<SysUserDO> pageResult = userService.pageUsers(reqVO); | ||||||
|         if (CollUtil.isEmpty(pageResult.getList())) { |         if (CollUtil.isEmpty(pageResult.getList())) { | ||||||
| @@ -45,13 +49,8 @@ public class SysUserController { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 获得拼接需要的数据 |         // 获得拼接需要的数据 | ||||||
|         Map<Long, SysDeptDO> deptMap; |  | ||||||
|         Collection<Long> deptIds = CollectionUtils.convertList(pageResult.getList(), SysUserDO::getDeptId); |         Collection<Long> deptIds = CollectionUtils.convertList(pageResult.getList(), SysUserDO::getDeptId); | ||||||
|         if (CollUtil.isNotEmpty(deptIds)) { |         Map<Long, SysDeptDO> deptMap = deptService.getDeptMap(deptIds); | ||||||
|             deptMap = CollectionUtils.convertMap(deptService.listDepts(deptIds), SysDeptDO::getId); |  | ||||||
|         } else { |  | ||||||
|             deptMap = Collections.emptyMap(); |  | ||||||
|         } |  | ||||||
|         // 拼接结果返回 |         // 拼接结果返回 | ||||||
|         List<SysUserPageItemRespVO> userList = new ArrayList<>(pageResult.getList().size()); |         List<SysUserPageItemRespVO> userList = new ArrayList<>(pageResult.getList().size()); | ||||||
|         pageResult.getList().forEach(user -> { |         pageResult.getList().forEach(user -> { | ||||||
| @@ -121,11 +120,29 @@ public class SysUserController { | |||||||
|  |  | ||||||
|     @ApiOperation("导出用户") |     @ApiOperation("导出用户") | ||||||
|     @GetMapping("/export") |     @GetMapping("/export") | ||||||
|     public void exportUsers(HttpServletResponse response) throws IOException { | //    @PreAuthorize("@ss.hasPermi('system:user:export')") , @Validated SysUserExportReqVO reqVO | ||||||
|         String fileName = "测试文件.xls"; | //    @Log(title = "用户管理", businessType = BusinessType.EXPORT) | ||||||
|         response.addHeader("Content-Disposition", "attachment;filename=" + fileName); |     public void exportUsers(HttpServletResponse response, @Validated SysUserExportReqVO reqVO) throws IOException { | ||||||
|         response.setContentType("application/vnd.ms-excel;charset=UTF-8"); |         // 获得用户列表 | ||||||
|         EasyExcel.write(response.getOutputStream(), SysUserExcelVO.class).sheet().doWrite(new ArrayList<>()); |         List<SysUserDO> users = userService.listUsers(reqVO); | ||||||
|  |  | ||||||
|  |         // 获得拼接需要的数据 | ||||||
|  |         Collection<Long> deptIds = CollectionUtils.convertList(users, SysUserDO::getDeptId); | ||||||
|  |         Map<Long, SysDeptDO> deptMap = deptService.getDeptMap(deptIds); | ||||||
|  |         // 拼接数据 | ||||||
|  |         List<SysUserExcelVO> excelUsers = new ArrayList<>(users.size()); | ||||||
|  |         users.forEach(user -> { | ||||||
|  |             SysUserExcelVO excelVO = SysUserConvert.INSTANCE.convert02(user); | ||||||
|  |             MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> { | ||||||
|  |                 excelVO.setDeptName(dept.getName()); | ||||||
|  |                 excelVO.setDeptLeader(dept.getLeader()); | ||||||
|  |             }); | ||||||
|  |             excelUsers.add(excelVO); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         // 输出 | ||||||
|  |         ExcelUtils.write(response, "用户数据.xls", "用户列表", | ||||||
|  |                 SysUserExcelVO.class, excelUsers); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| //    @Log(title = "用户管理", businessType = BusinessType.EXPORT) | //    @Log(title = "用户管理", businessType = BusinessType.EXPORT) | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ public class SysUserExcelVO { | |||||||
|     @ExcelProperty("用户名称") |     @ExcelProperty("用户名称") | ||||||
|     private String username; |     private String username; | ||||||
|  |  | ||||||
|     @ExcelProperty("用户名称") |     @ExcelProperty("用户昵称") | ||||||
|     private String nickname; |     private String nickname; | ||||||
|  |  | ||||||
|     @ExcelProperty("用户邮箱") |     @ExcelProperty("用户邮箱") | ||||||
|   | |||||||
| @@ -0,0 +1,40 @@ | |||||||
|  | package cn.iocoder.dashboard.modules.system.controller.user.vo.user; | ||||||
|  |  | ||||||
|  | import io.swagger.annotations.ApiModel; | ||||||
|  | import io.swagger.annotations.ApiModelProperty; | ||||||
|  | import lombok.AllArgsConstructor; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.NoArgsConstructor; | ||||||
|  | import org.springframework.format.annotation.DateTimeFormat; | ||||||
|  |  | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  | import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||||||
|  |  | ||||||
|  | @ApiModel(value = "用户导出 Request VO", description = "参数和 SysUserPageReqVO 是一致的") | ||||||
|  | @Data | ||||||
|  | @NoArgsConstructor | ||||||
|  | @AllArgsConstructor | ||||||
|  | public class SysUserExportReqVO { | ||||||
|  |  | ||||||
|  |     @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配") | ||||||
|  |     private String username; | ||||||
|  |  | ||||||
|  |     @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配") | ||||||
|  |     private String mobile; | ||||||
|  |  | ||||||
|  |     @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") | ||||||
|  |     private Integer status; | ||||||
|  |  | ||||||
|  |     @ApiModelProperty(value = "开始时间", example = "2020-10-24") | ||||||
|  |     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||||
|  |     private Date beginTime; | ||||||
|  |  | ||||||
|  |     @ApiModelProperty(value = "结束时间", example = "2020-10-24") | ||||||
|  |     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||||||
|  |     private Date endTime; | ||||||
|  |  | ||||||
|  |     @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") | ||||||
|  |     private Long deptId; | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.modules.system.convert.user; | |||||||
|  |  | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExcelVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; | ||||||
| @@ -27,4 +28,6 @@ public interface SysUserConvert { | |||||||
|  |  | ||||||
|     SysUserDO convert(SysUserUpdateReqVO bean); |     SysUserDO convert(SysUserUpdateReqVO bean); | ||||||
|  |  | ||||||
|  |     SysUserExcelVO convert02(SysUserDO bean); | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dao.user; | |||||||
|  |  | ||||||
| import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; | import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; | ||||||
| import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils; | import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | ||||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||||||
| @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||||
| import com.baomidou.mybatisplus.core.metadata.IPage; | import com.baomidou.mybatisplus.core.metadata.IPage; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
|  |  | ||||||
|  | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| @Mapper | @Mapper | ||||||
| @@ -26,7 +28,7 @@ public interface SysUserMapper extends BaseMapper<SysUserDO> { | |||||||
|         return selectOne(new QueryWrapper<SysUserDO>().eq("email", email)); |         return selectOne(new QueryWrapper<SysUserDO>().eq("email", email)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     default IPage<SysUserDO> selectList(SysUserPageReqVO reqVO, List<Long> deptIds) { |     default IPage<SysUserDO> selectList(SysUserPageReqVO reqVO, Collection<Long> deptIds) { | ||||||
|         return selectPage(MyBatisUtils.buildPage(reqVO), |         return selectPage(MyBatisUtils.buildPage(reqVO), | ||||||
|                 new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername()) |                 new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername()) | ||||||
|                         .likeIfPresent("mobile", reqVO.getMobile()) |                         .likeIfPresent("mobile", reqVO.getMobile()) | ||||||
| @@ -35,5 +37,13 @@ public interface SysUserMapper extends BaseMapper<SysUserDO> { | |||||||
|                         .inIfPresent("dept_id", deptIds)); |                         .inIfPresent("dept_id", deptIds)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     default List<SysUserDO> selectList(SysUserExportReqVO reqVO, Collection<Long> deptIds) { | ||||||
|  |         return selectList(new QueryWrapperX<SysUserDO>().likeIfPresent("username", reqVO.getUsername()) | ||||||
|  |                 .likeIfPresent("mobile", reqVO.getMobile()) | ||||||
|  |                 .eqIfPresent("status", reqVO.getStatus()) | ||||||
|  |                 .betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()) | ||||||
|  |                 .inIfPresent("dept_id", deptIds)); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,12 +1,16 @@ | |||||||
| package cn.iocoder.dashboard.modules.system.service.dept; | package cn.iocoder.dashboard.modules.system.service.dept; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; | import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptCreateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; | import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptListReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; | import cn.iocoder.dashboard.modules.system.controller.dept.vo.dept.SysDeptUpdateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; | ||||||
|  | import cn.iocoder.dashboard.util.collection.CollectionUtils; | ||||||
|  |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
|  | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 部门 Service 接口 |  * 部门 Service 接口 | ||||||
| @@ -35,6 +39,20 @@ public interface SysDeptService { | |||||||
|      */ |      */ | ||||||
|     List<SysDeptDO> listDepts(Collection<Long> ids); |     List<SysDeptDO> listDepts(Collection<Long> ids); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获得指定编号的部门 Map | ||||||
|  |      * | ||||||
|  |      * @param ids 部门编号数组 | ||||||
|  |      * @return 部门 Map | ||||||
|  |      */ | ||||||
|  |     default Map<Long, SysDeptDO> getDeptMap(Collection<Long> ids) { | ||||||
|  |         if (CollUtil.isEmpty(ids)) { | ||||||
|  |             return Collections.emptyMap(); | ||||||
|  |         } | ||||||
|  |         List<SysDeptDO> list = listDepts(ids); | ||||||
|  |         return CollectionUtils.convertMap(list, SysDeptDO::getId); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 筛选部门列表 |      * 筛选部门列表 | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; | |||||||
| import com.google.common.collect.ImmutableTable; | import com.google.common.collect.ImmutableTable; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
|  |  | ||||||
|  | import javax.annotation.PostConstruct; | ||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Comparator; | import java.util.Comparator; | ||||||
| @@ -56,6 +57,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { | |||||||
|     private SysDictDataMapper dictDataMapper; |     private SysDictDataMapper dictDataMapper; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|  |     @PostConstruct | ||||||
|     public void init() { |     public void init() { | ||||||
|         // 获得字典数据 |         // 获得字典数据 | ||||||
|         List<SysDictDataDO> list = this.listDictDatas(); |         List<SysDictDataDO> list = this.listDictDatas(); | ||||||
|   | |||||||
| @@ -2,23 +2,19 @@ package cn.iocoder.dashboard.modules.system.service.user; | |||||||
|  |  | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 用户 Service 接口 |  * 用户 Service 接口 | ||||||
|  * |  * | ||||||
|  * @author 芋道源码 |  * @author 芋道源码 | ||||||
|  */ |  */ | ||||||
| public interface SysUserService { | public interface SysUserService { | ||||||
| //    /** |  | ||||||
| //     * 根据条件分页查询用户列表 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     * @return 用户信息集合信息 |  | ||||||
| //     */ |  | ||||||
| //    public List<SysUser> selectUserList(SysUser user); |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 通过用户名查询用户 |      * 通过用户名查询用户 | ||||||
| @@ -44,6 +40,14 @@ public interface SysUserService { | |||||||
|      */ |      */ | ||||||
|     PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO); |     PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获得用户列表 | ||||||
|  |      * | ||||||
|  |      * @param reqVO 列表请求 | ||||||
|  |      * @return 用户列表 | ||||||
|  |      */ | ||||||
|  |     List<SysUserDO> listUsers(SysUserExportReqVO reqVO); | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 创建用户 |      * 创建用户 | ||||||
|      * |      * | ||||||
| @@ -82,77 +86,6 @@ public interface SysUserService { | |||||||
|      */ |      */ | ||||||
|     void updateUserStatus(Long id, Integer status); |     void updateUserStatus(Long id, Integer status); | ||||||
|  |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 根据用户ID查询用户所属角色组 |  | ||||||
| //     * |  | ||||||
| //     * @param userName 用户名 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public String selectUserRoleGroup(String userName); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 根据用户ID查询用户所属岗位组 |  | ||||||
| //     * |  | ||||||
| //     * @param userName 用户名 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public String selectUserPostGroup(String userName); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 校验用户名称是否唯一 |  | ||||||
| //     * |  | ||||||
| //     * @param userName 用户名称 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public String checkUserNameUnique(String userName); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 校验手机号码是否唯一 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public String checkPhoneUnique(SysUser user); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 校验email是否唯一 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public String checkEmailUnique(SysUser user); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 校验用户是否允许操作 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     */ |  | ||||||
| //    public void checkUserAllowed(SysUser user); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 新增用户信息 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public int insertUser(SysUser user); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 修改用户信息 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public int updateUser(SysUser user); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 修改用户状态 |  | ||||||
| //     * |  | ||||||
| //     * @param user 用户信息 |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public int updateUserStatus(SysUser user); |  | ||||||
| // | // | ||||||
| //    /** | //    /** | ||||||
| //     * 修改用户基本信息 | //     * 修改用户基本信息 | ||||||
| @@ -187,22 +120,7 @@ public interface SysUserService { | |||||||
| //     * @return 结果 | //     * @return 结果 | ||||||
| //     */ | //     */ | ||||||
| //    public int resetUserPwd(String userName, String password); | //    public int resetUserPwd(String userName, String password); | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 通过用户ID删除用户 |  | ||||||
| //     * |  | ||||||
| //     * @param userId 用户ID |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public int deleteUserById(Long userId); |  | ||||||
| // |  | ||||||
| //    /** |  | ||||||
| //     * 批量删除用户信息 |  | ||||||
| //     * |  | ||||||
| //     * @param userIds 需要删除的用户ID |  | ||||||
| //     * @return 结果 |  | ||||||
| //     */ |  | ||||||
| //    public int deleteUserByIds(Long[] userIds); |  | ||||||
| // | // | ||||||
| //    /** | //    /** | ||||||
| //     * 导入用户数据 | //     * 导入用户数据 | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | |||||||
| import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; | import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; | import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; | import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; | ||||||
| @@ -77,15 +78,29 @@ public class SysUserServiceImpl implements SysUserService { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO) { |     public PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO) { | ||||||
|         // 处理部门查询条件 |         return SysUserConvert.INSTANCE.convertPage(userMapper.selectList(reqVO, | ||||||
|         List<Long> deptIds = Collections.emptyList(); |                 this.getDeptCondition(reqVO.getDeptId()))); | ||||||
|         if (reqVO.getDeptId() != null) { |  | ||||||
|             deptIds = CollectionUtils.convertList(deptService.listDeptsByParentIdFromCache( |  | ||||||
|                     reqVO.getDeptId(), true), SysDeptDO::getId); |  | ||||||
|             deptIds.add(reqVO.getDeptId()); |  | ||||||
|     } |     } | ||||||
|         // 执行查询 |  | ||||||
|         return SysUserConvert.INSTANCE.convertPage(userMapper.selectList(reqVO, deptIds)); |     @Override | ||||||
|  |     public List<SysUserDO> listUsers(SysUserExportReqVO reqVO) { | ||||||
|  |         return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId())); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获得部门条件:查询指定部门的子部门编号们,包括自身 | ||||||
|  |      * | ||||||
|  |      * @param deptId 部门编号 | ||||||
|  |      * @return 部门编号集合 | ||||||
|  |      */ | ||||||
|  |     private Set<Long> getDeptCondition(Long deptId) { | ||||||
|  |         if (deptId == null) { | ||||||
|  |             return Collections.emptySet(); | ||||||
|  |         } | ||||||
|  |         Set<Long> deptIds = CollectionUtils.convertSet(deptService.listDeptsByParentIdFromCache( | ||||||
|  |                 deptId, true), SysDeptDO::getId); | ||||||
|  |         deptIds.add(deptId); // 包括自身 | ||||||
|  |         return deptIds; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package cn.iocoder.dashboard.util.collection; | package cn.iocoder.dashboard.util.collection; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.collection.CollectionUtil; | import cn.hutool.core.collection.CollectionUtil; | ||||||
|  |  | ||||||
| import java.util.*; | import java.util.*; | ||||||
| @@ -19,37 +20,61 @@ public class CollectionUtils { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T> List<T> filterList(Collection<T> from, Predicate<T> predicate) { |     public static <T> List<T> filterList(Collection<T> from, Predicate<T> predicate) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new ArrayList<>(); | ||||||
|  |         } | ||||||
|         return from.stream().filter(predicate).collect(Collectors.toList()); |         return from.stream().filter(predicate).collect(Collectors.toList()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) { |     public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new ArrayList<>(); | ||||||
|  |         } | ||||||
|         return from.stream().map(func).collect(Collectors.toList()); |         return from.stream().map(func).collect(Collectors.toList()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T, U> Set<U> convertSet(List<T> from, Function<T, U> func) { |     public static <T, U> Set<U> convertSet(List<T> from, Function<T, U> func) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new HashSet<>(); | ||||||
|  |         } | ||||||
|         return from.stream().map(func).collect(Collectors.toSet()); |         return from.stream().map(func).collect(Collectors.toSet()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T, K> Map<K, T> convertMap(List<T> from, Function<T, K> keyFunc) { |     public static <T, K> Map<K, T> convertMap(List<T> from, Function<T, K> keyFunc) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new HashMap<>(); | ||||||
|  |         } | ||||||
|         return from.stream().collect(Collectors.toMap(keyFunc, item -> item)); |         return from.stream().collect(Collectors.toMap(keyFunc, item -> item)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T, K, V> Map<K, V> convertMap(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) { |     public static <T, K, V> Map<K, V> convertMap(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new HashMap<>(); | ||||||
|  |         } | ||||||
|         return from.stream().collect(Collectors.toMap(keyFunc, valueFunc)); |         return from.stream().collect(Collectors.toMap(keyFunc, valueFunc)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T, K> Map<K, List<T>> convertMultiMap(List<T> from, Function<T, K> keyFunc) { |     public static <T, K> Map<K, List<T>> convertMultiMap(List<T> from, Function<T, K> keyFunc) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new HashMap<>(); | ||||||
|  |         } | ||||||
|         return from.stream().collect(Collectors.groupingBy(keyFunc, |         return from.stream().collect(Collectors.groupingBy(keyFunc, | ||||||
|                 Collectors.mapping(t -> t, Collectors.toList()))); |                 Collectors.mapping(t -> t, Collectors.toList()))); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static <T, K, V> Map<K, List<V>> convertMultiMap(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) { |     public static <T, K, V> Map<K, List<V>> convertMultiMap(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new HashMap<>(); | ||||||
|  |         } | ||||||
|         return from.stream().collect(Collectors.groupingBy(keyFunc, |         return from.stream().collect(Collectors.groupingBy(keyFunc, | ||||||
|                 Collectors.mapping(valueFunc, Collectors.toList()))); |                 Collectors.mapping(valueFunc, Collectors.toList()))); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // 暂时没想好名字,先以 2 结尾噶 |     // 暂时没想好名字,先以 2 结尾噶 | ||||||
|     public static <T, K, V> Map<K, Set<V>> convertMultiMap2(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) { |     public static <T, K, V> Map<K, Set<V>> convertMultiMap2(List<T> from, Function<T, K> keyFunc, Function<T, V> valueFunc) { | ||||||
|  |         if (CollUtil.isEmpty(from)) { | ||||||
|  |             return new HashMap<>(); | ||||||
|  |         } | ||||||
|         return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); |         return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,11 +1,14 @@ | |||||||
| package cn.iocoder.dashboard.util.collection; | package cn.iocoder.dashboard.util.collection; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.collection.CollectionUtil; | import cn.hutool.core.collection.CollectionUtil; | ||||||
| import com.google.common.collect.Multimap; | import com.google.common.collect.Multimap; | ||||||
|  |  | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.function.Consumer; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Map 工具类 |  * Map 工具类 | ||||||
| @@ -14,6 +17,13 @@ import java.util.List; | |||||||
|  */ |  */ | ||||||
| public class MapUtils { | public class MapUtils { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 从哈希表表中,获得 keys 对应的所有 value 数组 | ||||||
|  |      * | ||||||
|  |      * @param multimap 哈希表 | ||||||
|  |      * @param keys keys | ||||||
|  |      * @return value 数组 | ||||||
|  |      */ | ||||||
|     public static <K, V> List<V> getList(Multimap<K, V> multimap, Collection<K> keys) { |     public static <K, V> List<V> getList(Multimap<K, V> multimap, Collection<K> keys) { | ||||||
|         List<V> result = new ArrayList<>(); |         List<V> result = new ArrayList<>(); | ||||||
|         keys.forEach(k -> { |         keys.forEach(k -> { | ||||||
| @@ -26,4 +36,23 @@ public class MapUtils { | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 从哈希表查找到 key 对应的 value,然后进一步处理 | ||||||
|  |      * 注意,如果查找到的 value 为 null 时,不进行处理 | ||||||
|  |      * | ||||||
|  |      * @param map 哈希表 | ||||||
|  |      * @param key key | ||||||
|  |      * @param consumer 进一步处理的逻辑 | ||||||
|  |      */ | ||||||
|  |     public static <K, V> void findAndThen(Map<K, V> map, K key, Consumer<V> consumer) { | ||||||
|  |         if (CollUtil.isEmpty(map)) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         V value = map.get(key); | ||||||
|  |         if (value == null) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         consumer.accept(value); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV