Ver Fonte

:tada: 增加用户导入导出功能

smallchill há 6 anos atrás
pai
commit
422d899403
19 ficheiros alterados com 492 adições e 45 exclusões
  1. 4 0
      pom.xml
  2. 103 37
      src/main/java/org/springblade/common/cache/SysCache.java
  3. 14 1
      src/main/java/org/springblade/common/cache/UserCache.java
  4. 5 0
      src/main/java/org/springblade/common/constant/CommonConstant.java
  5. 41 0
      src/main/java/org/springblade/modules/system/controller/UserController.java
  6. 89 0
      src/main/java/org/springblade/modules/system/excel/UserExcel.java
  7. 40 0
      src/main/java/org/springblade/modules/system/excel/UserImporter.java
  8. 9 0
      src/main/java/org/springblade/modules/system/mapper/PostMapper.java
  9. 13 0
      src/main/java/org/springblade/modules/system/mapper/PostMapper.xml
  10. 10 0
      src/main/java/org/springblade/modules/system/mapper/UserMapper.java
  11. 4 0
      src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
  12. 9 0
      src/main/java/org/springblade/modules/system/service/IDeptService.java
  13. 19 0
      src/main/java/org/springblade/modules/system/service/IPostService.java
  14. 9 0
      src/main/java/org/springblade/modules/system/service/IRoleService.java
  15. 29 0
      src/main/java/org/springblade/modules/system/service/IUserService.java
  16. 10 0
      src/main/java/org/springblade/modules/system/service/impl/DeptServiceImpl.java
  17. 22 3
      src/main/java/org/springblade/modules/system/service/impl/PostServiceImpl.java
  18. 10 0
      src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java
  19. 52 4
      src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java

+ 4 - 0
pom.xml

@@ -94,6 +94,10 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-swagger</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-excel</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-ui</artifactId>

+ 103 - 37
src/main/java/org/springblade/common/cache/SysCache.java

@@ -18,14 +18,9 @@ package org.springblade.common.cache;
 
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.tool.utils.SpringUtil;
-import org.springblade.modules.system.entity.Dept;
-import org.springblade.modules.system.entity.Menu;
-import org.springblade.modules.system.entity.Role;
-import org.springblade.modules.system.entity.Tenant;
-import org.springblade.modules.system.service.IDeptService;
-import org.springblade.modules.system.service.IMenuService;
-import org.springblade.modules.system.service.IRoleService;
-import org.springblade.modules.system.service.ITenantService;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.modules.system.entity.*;
+import org.springblade.modules.system.service.*;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -41,11 +36,17 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 public class SysCache {
 	private static final String MENU_ID = "menu:id:";
 	private static final String DEPT_ID = "dept:id:";
+	private static final String DEPT_NAME = "dept:name:";
 	private static final String DEPT_NAME_ID = "deptName:id:";
 	private static final String DEPT_NAMES_ID = "deptNames:id:";
 	private static final String DEPT_CHILD_ID = "deptChild:id:";
 	private static final String DEPT_CHILDIDS_ID = "deptChildIds:id:";
+	private static final String POST_ID = "post:id:";
+	private static final String POST_NAME = "post:name:";
+	private static final String POST_NAME_ID = "postName:id:";
+	private static final String POST_NAMES_ID = "postNames:id:";
 	private static final String ROLE_ID = "role:id:";
+	private static final String ROLE_NAME = "role:name:";
 	private static final String ROLE_NAME_ID = "roleName:id:";
 	private static final String ROLE_NAMES_ID = "roleNames:id:";
 	private static final String ROLE_ALIAS_ID = "roleAlias:id:";
@@ -55,12 +56,14 @@ public class SysCache {
 
 	private static IMenuService menuService;
 	private static IDeptService deptService;
+	private static IPostService postService;
 	private static IRoleService roleService;
 	private static ITenantService tenantService;
 
 	static {
 		menuService = SpringUtil.getBean(IMenuService.class);
 		deptService = SpringUtil.getBean(IDeptService.class);
+		postService = SpringUtil.getBean(IPostService.class);
 		roleService = SpringUtil.getBean(IRoleService.class);
 		tenantService = SpringUtil.getBean(ITenantService.class);
 	}
@@ -86,43 +89,24 @@ public class SysCache {
 	}
 
 	/**
-	 * 获取部门名
-	 *
-	 * @param id 主键
-	 * @return 部门名
-	 */
-	public static String getDeptName(Long id) {
-		return CacheUtil.get(SYS_CACHE, DEPT_NAME_ID, id, () -> deptService.getById(id).getDeptName());
-	}
-
-	/**
-	 * 获取角色
+	 * 获取部门id
 	 *
-	 * @param id 主键
-	 * @return Role
+	 * @param tenantId  租户id
+	 * @param deptNames 部门名
+	 * @return
 	 */
-	public static Role getRole(Long id) {
-		return CacheUtil.get(SYS_CACHE, ROLE_ID, id, () -> roleService.getById(id));
+	public static String getDeptIds(String tenantId, String deptNames) {
+		return CacheUtil.get(SYS_CACHE, DEPT_NAME, tenantId + StringPool.DASH + deptNames, () -> deptService.getDeptIds(tenantId, deptNames));
 	}
 
 	/**
-	 * 获取角色名
-	 *
-	 * @param id 主键
-	 * @return 角色名
-	 */
-	public static String getRoleName(Long id) {
-		return CacheUtil.get(SYS_CACHE, ROLE_NAME_ID, id, () -> roleService.getById(id).getRoleName());
-	}
-
-	/**
-	 * 获取角色别名
+	 * 获取部门名
 	 *
 	 * @param id 主键
-	 * @return 角色别
+	 * @return 部门名
 	 */
-	public static String getRoleAlias(Long id) {
-		return CacheUtil.get(SYS_CACHE, ROLE_ALIAS_ID, id, () -> roleService.getById(id).getRoleAlias());
+	public static String getDeptName(Long id) {
+		return CacheUtil.get(SYS_CACHE, DEPT_NAME_ID, id, () -> deptService.getById(id).getDeptName());
 	}
 
 
@@ -170,6 +154,78 @@ public class SysCache {
 		return deptIdList;
 	}
 
+	/**
+	 * 获取岗位
+	 *
+	 * @param id 主键
+	 * @return
+	 */
+	public static Post getPost(Long id) {
+		return CacheUtil.get(SYS_CACHE, POST_ID, id, () -> postService.getById(id));
+	}
+
+	/**
+	 * 获取岗位id
+	 *
+	 * @param tenantId  租户id
+	 * @param postNames 岗位名
+	 * @return
+	 */
+	public static String getPostIds(String tenantId, String postNames) {
+		return CacheUtil.get(SYS_CACHE, POST_NAME, tenantId + StringPool.DASH + postNames, () -> postService.getPostIds(tenantId, postNames));
+	}
+
+	/**
+	 * 获取岗位名
+	 *
+	 * @param id 主键
+	 * @return 岗位名
+	 */
+	public static String getPostName(Long id) {
+		return CacheUtil.get(SYS_CACHE, POST_NAME_ID, id, () -> postService.getById(id).getPostName());
+	}
+
+	/**
+	 * 获取岗位名集合
+	 *
+	 * @param postIds 主键集合
+	 * @return 岗位名
+	 */
+	public static List<String> getPostNames(String postIds) {
+		return CacheUtil.get(SYS_CACHE, POST_NAMES_ID, postIds, () -> postService.getPostNames(postIds));
+	}
+
+	/**
+	 * 获取角色
+	 *
+	 * @param id 主键
+	 * @return Role
+	 */
+	public static Role getRole(Long id) {
+		return CacheUtil.get(SYS_CACHE, ROLE_ID, id, () -> roleService.getById(id));
+	}
+
+	/**
+	 * 获取角色id
+	 *
+	 * @param tenantId  租户id
+	 * @param roleNames 角色名
+	 * @return
+	 */
+	public static String getRoleIds(String tenantId, String roleNames) {
+		return CacheUtil.get(SYS_CACHE, ROLE_NAME, tenantId + StringPool.DASH + roleNames, () -> roleService.getRoleIds(tenantId, roleNames));
+	}
+
+	/**
+	 * 获取角色名
+	 *
+	 * @param id 主键
+	 * @return 角色名
+	 */
+	public static String getRoleName(Long id) {
+		return CacheUtil.get(SYS_CACHE, ROLE_NAME_ID, id, () -> roleService.getById(id).getRoleName());
+	}
+
 	/**
 	 * 获取角色名集合
 	 *
@@ -180,6 +236,16 @@ public class SysCache {
 		return CacheUtil.get(SYS_CACHE, ROLE_NAMES_ID, roleIds, () -> roleService.getRoleNames(roleIds));
 	}
 
+	/**
+	 * 获取角色别名
+	 *
+	 * @param id 主键
+	 * @return 角色别名
+	 */
+	public static String getRoleAlias(Long id) {
+		return CacheUtil.get(SYS_CACHE, ROLE_ALIAS_ID, id, () -> roleService.getById(id).getRoleAlias());
+	}
+
 	/**
 	 * 获取角色别名集合
 	 *

+ 14 - 1
src/main/java/org/springblade/common/cache/UserCache.java

@@ -19,6 +19,7 @@ package org.springblade.common.cache;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringPool;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.service.IUserService;
@@ -33,6 +34,7 @@ import static org.springblade.core.launch.constant.FlowConstant.TASK_USR_PREFIX;
  */
 public class UserCache {
 	private static final String USER_CACHE_ID = "user:id:";
+	private static final String USER_CACHE_ACCOUNT = "user:account:";
 
 	private static IUserService userService;
 
@@ -52,7 +54,7 @@ public class UserCache {
 	}
 
 	/**
-	 * 获取用户
+	 * 获取用户
 	 *
 	 * @param userId 用户id
 	 * @return
@@ -61,4 +63,15 @@ public class UserCache {
 		return CacheUtil.get(USER_CACHE, USER_CACHE_ID, userId, () -> userService.getById(userId));
 	}
 
+	/**
+	 * 获取用户
+	 *
+	 * @param tenantId 租户id
+	 * @param account  账号名
+	 * @return
+	 */
+	public static User getUser(String tenantId, String account) {
+		return CacheUtil.get(USER_CACHE, USER_CACHE_ACCOUNT, tenantId + StringPool.DASH + account, () -> userService.getByAccount(tenantId, account));
+	}
+
 }

+ 5 - 0
src/main/java/org/springblade/common/constant/CommonConstant.java

@@ -60,6 +60,11 @@ public interface CommonConstant {
 	 */
 	String DEFAULT_PASSWORD = "123456";
 
+	/**
+	 * 默认密码参数值
+	 */
+	String DEFAULT_PARAM_PASSWORD = "account.initPassword";
+
 	/**
 	 * 默认排序字段
 	 */

+ 41 - 0
src/main/java/org/springblade/modules/system/controller/UserController.java

@@ -25,6 +25,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -34,16 +35,22 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.constant.RoleConstant;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.StringPool;
+import org.springblade.modules.system.excel.UserExcel;
 import org.springblade.modules.system.entity.User;
+import org.springblade.modules.system.excel.UserImporter;
 import org.springblade.modules.system.service.IUserService;
 import org.springblade.modules.system.vo.UserVO;
 import org.springblade.modules.system.wrapper.UserWrapper;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -214,5 +221,39 @@ public class UserController {
 		return R.data(list);
 	}
 
+	/**
+	 * 导入用户
+	 */
+	@PostMapping("import-user")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "导入用户", notes = "传入excel")
+	public R importUser(MultipartFile file, Integer isCovered) {
+		UserImporter userImporter = new UserImporter(userService, isCovered == 1);
+		ExcelUtil.save(file, userImporter, UserExcel.class);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 导出用户
+	 */
+	@GetMapping("export-user")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "导出用户", notes = "传入user")
+	public void exportUser(@ApiIgnore @RequestParam Map<String, Object> user, BladeUser bladeUser, HttpServletResponse response) {
+		QueryWrapper<UserExcel> queryWrapper = Condition.getQueryWrapper(user, UserExcel.class);
+		List<UserExcel> list = userService.exportUser((!AuthUtil.isAdministrator()) ? queryWrapper.lambda().eq(UserExcel::getTenantId, bladeUser.getTenantId()) : queryWrapper);
+		ExcelUtil.export(response, "用户数据" + DateUtil.time(), "用户数据表", list, UserExcel.class);
+	}
+
+	/**
+	 * 导出模板
+	 */
+	@GetMapping("export-template")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "导出模板")
+	public void exportUser(HttpServletResponse response) {
+		List<UserExcel> list = new ArrayList<>();
+		ExcelUtil.export(response, "用户数据模板", "用户数据表", list, UserExcel.class);
+	}
 
 }

+ 89 - 0
src/main/java/org/springblade/modules/system/excel/UserExcel.java

@@ -0,0 +1,89 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * UserDTO
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class UserExcel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@ColumnWidth(15)
+	@ExcelProperty("租户编号")
+	private String tenantId;
+
+	@ColumnWidth(15)
+	@ExcelProperty("账户")
+	private String account;
+
+	@ColumnWidth(10)
+	@ExcelProperty("昵称")
+	private String name;
+
+	@ColumnWidth(10)
+	@ExcelProperty("姓名")
+	private String realName;
+
+	@ExcelProperty("邮箱")
+	private String email;
+
+	@ColumnWidth(15)
+	@ExcelProperty("手机")
+	private String phone;
+
+	@ExcelIgnore
+	@ExcelProperty("角色ID")
+	private String roleId;
+
+	@ExcelIgnore
+	@ExcelProperty("部门ID")
+	private String deptId;
+
+	@ExcelIgnore
+	@ExcelProperty("岗位ID")
+	private String postId;
+
+	@ExcelProperty("角色名称")
+	private String roleName;
+
+	@ExcelProperty("部门名称")
+	private String deptName;
+
+	@ExcelProperty("岗位名称")
+	private String postName;
+
+	@ColumnWidth(20)
+	@ExcelProperty("生日")
+	private Date birthday;
+
+}

+ 40 - 0
src/main/java/org/springblade/modules/system/excel/UserImporter.java

@@ -0,0 +1,40 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.system.excel;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.excel.support.ExcelImporter;
+import org.springblade.modules.system.service.IUserService;
+
+import java.util.List;
+
+/**
+ * 用户数据导入类
+ *
+ * @author Chill
+ */
+@RequiredArgsConstructor
+public class UserImporter implements ExcelImporter<UserExcel> {
+
+	private final IUserService service;
+	private final Boolean isCovered;
+
+	@Override
+	public void save(List<UserExcel> data) {
+		service.importUser(data, isCovered);
+	}
+}

+ 9 - 0
src/main/java/org/springblade/modules/system/mapper/PostMapper.java

@@ -20,6 +20,7 @@ import org.springblade.modules.system.entity.Post;
 import org.springblade.modules.system.vo.PostVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+
 import java.util.List;
 
 /**
@@ -38,4 +39,12 @@ public interface PostMapper extends BaseMapper<Post> {
 	 */
 	List<PostVO> selectPostPage(IPage page, PostVO post);
 
+	/**
+	 * 获取岗位名
+	 *
+	 * @param ids
+	 * @return
+	 */
+	List<String> getPostNames(Long[] ids);
+
 }

+ 13 - 0
src/main/java/org/springblade/modules/system/mapper/PostMapper.xml

@@ -24,4 +24,17 @@
         select * from blade_post where is_deleted = 0
     </select>
 
+    <select id="getPostNames" resultType="java.lang.String">
+        SELECT
+            post_name
+        FROM
+            blade_post
+        WHERE
+            id IN
+            <foreach collection="array" item="ids" index="index" open="(" close=")" separator=",">
+                #{ids}
+            </foreach>
+            and is_deleted = 0
+    </select>
+
 </mapper>

+ 10 - 0
src/main/java/org/springblade/modules/system/mapper/UserMapper.java

@@ -16,9 +16,11 @@
  */
 package org.springblade.modules.system.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.system.excel.UserExcel;
 import org.springblade.modules.system.entity.User;
 
 import java.util.List;
@@ -51,4 +53,12 @@ public interface UserMapper extends BaseMapper<User> {
 	 */
 	User getUser(String tenantId, String account, String password);
 
+	/**
+	 * 获取导出用户数据
+	 *
+	 * @param queryWrapper
+	 * @return
+	 */
+	List<UserExcel> exportUser(@Param("ew") Wrapper<UserExcel> queryWrapper);
+
 }

+ 4 - 0
src/main/java/org/springblade/modules/system/mapper/UserMapper.xml

@@ -75,4 +75,8 @@
             tenant_id = #{param1} and account = #{param2} and password = #{param3} and is_deleted = 0
     </select>
 
+    <select id="exportUser" resultType="org.springblade.modules.system.excel.UserExcel">
+        SELECT id, tenant_id, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM blade_user ${ew.customSqlSegment}
+    </select>
+
 </mapper>

+ 9 - 0
src/main/java/org/springblade/modules/system/service/IDeptService.java

@@ -57,6 +57,15 @@ public interface IDeptService extends IService<Dept> {
 	 */
 	List<DeptVO> lazyTree(String tenantId, Long parentId);
 
+	/**
+	 * 获取部门ID
+	 *
+	 * @param tenantId
+	 * @param deptNames
+	 * @return
+	 */
+	String getDeptIds(String tenantId, String deptNames);
+
 	/**
 	 * 获取部门名
 	 *

+ 19 - 0
src/main/java/org/springblade/modules/system/service/IPostService.java

@@ -21,6 +21,8 @@ import org.springblade.modules.system.vo.PostVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.List;
+
 /**
  * 岗位表 服务类
  *
@@ -37,4 +39,21 @@ public interface IPostService extends BaseService<Post> {
 	 */
 	IPage<PostVO> selectPostPage(IPage<PostVO> page, PostVO post);
 
+	/**
+	 * 获取岗位ID
+	 *
+	 * @param tenantId
+	 * @param postNames
+	 * @return
+	 */
+	String getPostIds(String tenantId, String postNames);
+
+	/**
+	 * 获取岗位名
+	 *
+	 * @param postIds
+	 * @return
+	 */
+	List<String> getPostNames(String postIds);
+
 }

+ 9 - 0
src/main/java/org/springblade/modules/system/service/IRoleService.java

@@ -59,6 +59,15 @@ public interface IRoleService extends IService<Role> {
 	 */
 	boolean grant(@NotEmpty List<Long> roleIds, List<Long> menuIds, List<Long> dataScopeIds, List<Long> apiScopeIds);
 
+	/**
+	 * 获取角色ID
+	 *
+	 * @param tenantId
+	 * @param roleNames
+	 * @return
+	 */
+	String getRoleIds(String tenantId, String roleNames);
+
 	/**
 	 * 获取角色名
 	 *

+ 29 - 0
src/main/java/org/springblade/modules/system/service/IUserService.java

@@ -17,11 +17,15 @@
 package org.springblade.modules.system.service;
 
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.modules.system.excel.UserExcel;
 import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.entity.UserInfo;
 
+import java.util.List;
+
 /**
  * 服务类
  *
@@ -29,6 +33,15 @@ import org.springblade.modules.system.entity.UserInfo;
  */
 public interface IUserService extends BaseService<User> {
 
+	/**
+	 * 根据账号获取用户
+	 *
+	 * @param tenantId
+	 * @param account
+	 * @return
+	 */
+	User getByAccount(String tenantId, String account);
+
 	/**
 	 * 新增用户
 	 *
@@ -117,4 +130,20 @@ public interface IUserService extends BaseService<User> {
 	 * @return
 	 */
 	boolean removeUser(String userIds);
+
+	/**
+	 * 导入用户数据
+	 *
+	 * @param data
+	 * @return
+	 */
+	void importUser(List<UserExcel> data, Boolean isCovered);
+
+	/**
+	 * 获取导出用户数据
+	 *
+	 * @param queryWrapper
+	 * @return
+	 */
+	List<UserExcel> exportUser(Wrapper<UserExcel> queryWrapper);
 }

+ 10 - 0
src/main/java/org/springblade/modules/system/service/impl/DeptServiceImpl.java

@@ -32,6 +32,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 服务实现类
@@ -72,6 +73,15 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements ID
 		return ForestNodeMerger.merge(baseMapper.lazyTree(tenantId, parentId));
 	}
 
+	@Override
+	public String getDeptIds(String tenantId, String deptNames) {
+		List<Dept> deptList = baseMapper.selectList(Wrappers.<Dept>query().lambda().eq(Dept::getTenantId, tenantId).in(Dept::getDeptName, Func.toStrList(deptNames)));
+		if (deptList != null && deptList.size() > 0) {
+			return deptList.stream().map(dept -> Func.toStr(dept.getId())).distinct().collect(Collectors.joining(","));
+		}
+		return null;
+	}
+
 	@Override
 	public List<String> getDeptNames(String deptIds) {
 		return baseMapper.getDeptNames(Func.toLongArray(deptIds));

+ 22 - 3
src/main/java/org/springblade/modules/system/service/impl/PostServiceImpl.java

@@ -16,13 +16,18 @@
  */
 package org.springblade.modules.system.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.modules.system.entity.Post;
-import org.springblade.modules.system.vo.PostVO;
 import org.springblade.modules.system.mapper.PostMapper;
 import org.springblade.modules.system.service.IPostService;
-import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.system.vo.PostVO;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 岗位表 服务实现类
@@ -37,4 +42,18 @@ public class PostServiceImpl extends BaseServiceImpl<PostMapper, Post> implement
 		return page.setRecords(baseMapper.selectPostPage(page, post));
 	}
 
+	@Override
+	public String getPostIds(String tenantId, String postNames) {
+		List<Post> postList = baseMapper.selectList(Wrappers.<Post>query().lambda().eq(Post::getTenantId, tenantId).in(Post::getPostName, Func.toStrList(postNames)));
+		if (postList != null && postList.size() > 0) {
+			return postList.stream().map(post -> Func.toStr(post.getId())).distinct().collect(Collectors.joining(","));
+		}
+		return null;
+	}
+
+	@Override
+	public List<String> getPostNames(String postIds) {
+		return baseMapper.getPostNames(Func.toLongArray(postIds));
+	}
+
 }

+ 10 - 0
src/main/java/org/springblade/modules/system/service/impl/RoleServiceImpl.java

@@ -43,6 +43,7 @@ import org.springframework.validation.annotation.Validated;
 import javax.validation.constraints.NotEmpty;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.springblade.common.constant.CommonConstant.API_SCOPE_CATEGORY;
 import static org.springblade.common.constant.CommonConstant.DATA_SCOPE_CATEGORY;
@@ -122,6 +123,15 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
 		return true;
 	}
 
+	@Override
+	public String getRoleIds(String tenantId, String roleNames) {
+		List<Role> roleList = baseMapper.selectList(Wrappers.<Role>query().lambda().eq(Role::getTenantId, tenantId).in(Role::getRoleName, Func.toStrList(roleNames)));
+		if (roleList != null && roleList.size() > 0) {
+			return roleList.stream().map(role -> Func.toStr(role.getId())).distinct().collect(Collectors.joining(","));
+		}
+		return null;
+	}
+
 	@Override
 	public List<String> getRoleNames(String roleIds) {
 		return baseMapper.getRoleNames(Func.toLongArray(roleIds));

+ 52 - 4
src/main/java/org/springblade/modules/system/service/impl/UserServiceImpl.java

@@ -17,19 +17,20 @@
 package org.springblade.modules.system.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.common.cache.ParamCache;
 import org.springblade.common.cache.SysCache;
+import org.springblade.common.cache.UserCache;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.constant.BladeConstant;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.DigestUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.core.tool.utils.*;
+import org.springblade.modules.system.excel.UserExcel;
 import org.springblade.modules.system.entity.Tenant;
 import org.springblade.modules.system.entity.User;
 import org.springblade.modules.system.entity.UserDept;
@@ -43,6 +44,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+
+import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD;
 
 /**
  * 服务实现类
@@ -56,6 +60,11 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 	private IUserDeptService userDeptService;
 	private IRoleService roleService;
 
+	@Override
+	public User getByAccount(String tenantId, String account) {
+		return baseMapper.selectOne(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId).eq(User::getAccount, account));
+	}
+
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public boolean submit(User user) {
@@ -181,4 +190,43 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
 		return deleteLogic(Func.toLongList(userIds));
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void importUser(List<UserExcel> data, Boolean isCovered) {
+		data.forEach(userExcel -> {
+			User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class));
+			// 设置部门ID
+			user.setDeptId(SysCache.getDeptIds(userExcel.getTenantId(), userExcel.getDeptName()));
+			// 设置岗位ID
+			user.setPostId(SysCache.getPostIds(userExcel.getTenantId(), userExcel.getPostName()));
+			// 设置角色ID
+			user.setRoleId(SysCache.getRoleIds(userExcel.getTenantId(), userExcel.getRoleName()));
+			// 覆盖数据
+			if (isCovered) {
+				// 查询用户是否存在
+				User oldUser = UserCache.getUser(userExcel.getTenantId(), userExcel.getAccount());
+				if (oldUser != null) {
+					user.setId(oldUser.getId());
+					this.updateUser(user);
+					return;
+				}
+			}
+			// 获取默认密码配置
+			String initPassword = ParamCache.getValue(DEFAULT_PARAM_PASSWORD);
+			user.setPassword(DigestUtil.encrypt(initPassword));
+			this.submit(user);
+		});
+	}
+
+	@Override
+	public List<UserExcel> exportUser(Wrapper<UserExcel> queryWrapper) {
+		List<UserExcel> userList = baseMapper.exportUser(queryWrapper);
+		userList.forEach(user -> {
+			user.setRoleName(StringUtil.join(SysCache.getRoleNames(user.getRoleId())));
+			user.setDeptName(StringUtil.join(SysCache.getDeptNames(user.getDeptId())));
+			user.setPostName(StringUtil.join(SysCache.getPostNames(user.getPostId())));
+		});
+		return userList;
+	}
+
 }