Commit 54157196 authored by tianhongyang's avatar tianhongyang

Merge branch 'V20230915' of http://192.168.60.201/root/dsk-operate-sys into V20230915

parents 71e5d68e cd459e7f
......@@ -5,6 +5,7 @@ import com.dsk.common.annotation.Log;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
import com.dsk.common.utils.Chinese2PinyinUtils;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
......@@ -81,13 +82,16 @@ public class SysRoleController extends BaseController {
@PostMapping
public R<Void> add(@Validated @RequestBody SysRole role) {
roleService.checkRoleAllowed(role);
//应产品经理强!烈!要求,让后台自动生成权限字符,为方便后期排查bug,经考虑后将角色名的拼音设置为权限字符
role.setRoleKey(Chinese2PinyinUtils.toLowerPinyin(role.getRoleName()));
if (!roleService.checkRoleNameUnique(role)) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
} else if (!roleService.checkRoleKeyUnique(role)) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
return toAjax(roleService.insertRole(role));
}
/**
......
......@@ -3,6 +3,7 @@ package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.lock.annotation.Lock4j;
import com.dsk.common.annotation.Log;
import com.dsk.common.annotation.RepeatSubmit;
......@@ -15,9 +16,13 @@ import com.dsk.common.core.validate.AddGroup;
import com.dsk.common.core.validate.EditGroup;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.tenant.helper.TenantHelper;
import com.dsk.common.utils.StringUtils;
import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.bo.SysTenantAdminBo;
import com.dsk.system.domain.bo.SysTenantBo;
import com.dsk.system.domain.vo.SysTenantVo;
import com.dsk.system.service.ISysTenantService;
import com.dsk.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -39,11 +44,12 @@ import java.util.Arrays;
@RequestMapping("/system/tenant")
public class SysTenantController extends BaseController {
private final ISysTenantService tenantService;
private final ISysUserService userService;
/**
* 查询租户列表
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:tenant:list", orRole = "accountAdmin")
@GetMapping("/list")
public TableDataInfo<SysTenantVo> list(SysTenantBo bo, PageQuery pageQuery) {
......@@ -67,7 +73,7 @@ public class SysTenantController extends BaseController {
*
* @param id 主键
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:tenant:query", orRole = "accountAdmin")
@GetMapping("/{id}")
public R<SysTenantVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
......@@ -77,7 +83,7 @@ public class SysTenantController extends BaseController {
/**
* 新增租户
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:tenant:add", orRole = "accountAdmin")
@Log(title = "租户", businessType = BusinessType.INSERT)
@Lock4j
......@@ -90,10 +96,24 @@ public class SysTenantController extends BaseController {
return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo)));
}
/**
* 新增企业普通管理员账号
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:user:add")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping("/addTenantAdmin")
public R<Void> addTenantAdmin(@Validated @RequestBody SysTenantAdminBo tenantAdminBo) {
if (!userService.checkPhoneUnique(BeanUtil.toBean(tenantAdminBo, SysUser.class))) {
return R.fail("新增用户'" + tenantAdminBo.getPhonenumber() + "'失败,手机号码已存在");
}
return toAjax(TenantHelper.ignore(() -> tenantService.addTenantAdmin(tenantAdminBo)));
}
/**
* 修改租户
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:tenant:edit", orRole = "accountAdmin")
@Log(title = "租户", businessType = BusinessType.UPDATE)
@RepeatSubmit()
......@@ -123,7 +143,7 @@ public class SysTenantController extends BaseController {
*
* @param ids 主键串
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:tenant:remove", orRole = "accountAdmin")
@Log(title = "租户", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
......@@ -146,7 +166,7 @@ public class SysTenantController extends BaseController {
/**
* 清除动态租户
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@GetMapping("/dynamic/clear")
public R<Void> dynamicClear() {
TenantHelper.clearDynamic();
......@@ -159,7 +179,7 @@ public class SysTenantController extends BaseController {
* @param tenantId 租户id
* @param packageId 套餐id
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY,TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY},mode = SaMode.OR)
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:tenant:edit", orRole = "accountAdmin")
@Log(title = "租户", businessType = BusinessType.UPDATE)
@GetMapping("/syncTenantPackage")
......
package com.dsk.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.tree.Tree;
......@@ -9,6 +11,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.annotation.Log;
import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.constant.TenantConstants;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
......@@ -16,6 +19,7 @@ import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.tenant.helper.TenantHelper;
import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.poi.ExcelUtil;
......@@ -37,6 +41,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import java.util.*;
/**
......@@ -55,6 +60,16 @@ public class SysUserController extends BaseController {
private final ISysPostService postService;
private final ISysDeptService deptService;
/**
* 根据租户ID查询大司空超管or租户管理员为其创建的企业管理员和管理员账号数量
*/
@SaCheckRole(value = {TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.DSK_TENANT_ADMIN_ROLE_KEY}, mode = SaMode.OR)
@SaCheckPermission(value = "system:user:query", orRole = "accountAdmin")
@GetMapping("/queryTenantAdminNumCreatedByDSK/{tenantId}")
public R<Long> queryTenantAdminNumCreatedByDSK(@NotNull(message = "租户ID不能为空") @PathVariable Long tenantId) {
return R.ok(TenantHelper.ignore(() -> userService.queryTenantAdminNumCreatedByDSK(tenantId)));
}
/**
* 获取用户列表
*/
......@@ -121,10 +136,6 @@ public class SysUserController extends BaseController {
throw new ServiceException("表格中不存在待导入数据!");
}
for (SysUserImportVo userImportVo : userImportList) {
System.out.println("👉🏻:"+userImportVo);
}
//开始导入业务
List<SysUserImportVo> failImportUsers = userService.batchImportUser(userImportList, updateSupport);
......@@ -216,6 +227,7 @@ public class SysUserController extends BaseController {
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public R<Void> remove(@PathVariable Long[] userIds) {
//不能删除当前登录账号
if (ArrayUtil.contains(userIds, getUserId())) {
return R.fail("当前用户不能删除");
}
......
......@@ -187,6 +187,12 @@
<scope>compile</scope>
</dependency>
<!--中文转拼音-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
</dependency>
</dependencies>
</project>
......@@ -18,34 +18,44 @@ public interface TenantConstants {
String DISABLE = "1";
/**
* 超级管理员ID
* 大司空超级管理员ID
*/
Long SUPER_ADMIN_ID = 1L;
/**
* 超级管理员角色 roleKey
* 大司空超级管理员角色 roleKey
*/
String SUPER_ADMIN_ROLE_KEY = "superadmin";
/**
* 租户管理员角色 roleKey
* 大司空租户管理员角色
*/
String TENANT_ADMIN_ROLE_KEY = "admin";
String DSK_TENANT_ADMIN_ROLE_KEY = "accountAdmin";
/**
* 租户管理员角色名称
* 大司空租户管理员角色名称
*/
String TENANT_ADMIN_ROLE_NAME = "管理员";
String DSK_TENANT_ADMIN_ROLE_NAME = "企业账号管理员";
/**
* 大司空租户管理员角色
* 企业超级管理员角色 roleKey
*/
String DSK_TENANT_ADMIN_ROLE_KEY = "accountAdmin";
String TENANT_SUPER_ADMIN_ROLE_KEY = "tenantSuperAdmin";
/**
* 大司空租户管理员角色名称
* 企业超级管理员角色名称
*/
String DSK_TENANT_ADMIN_ROLE_NAME = "企业账号管理员";
String TENANT_SUPER_ADMIN_ROLE_NAME = "企业管理员";
/**
* 企业普通管理员角色 roleKey
*/
String TENANT_ADMIN_ROLE_KEY = "tenantAdmin";
/**
* 企业普通管理员角色名称
*/
String TENANT_ADMIN_ROLE_NAME = "管理员";
/**
* 默认租户ID
......
......@@ -169,7 +169,7 @@ public class LoginHelper {
* @return 结果
*/
public static boolean isTenantAdmin(Set<String> rolePermission) {
return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY);
return rolePermission.contains(TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY);
}
public static boolean isTenantAdmin() {
......
package com.dsk.common.utils;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* 中文转拼音工具类
*
* @author sxk
* @date 2023.11.13
*/
public class Chinese2PinyinUtils {
/**
* 中文转小写拼音
* @param chinese 待转义中文
* @return 转义后的拼音
*/
public static String toLowerPinyin(String chinese) {
StringBuilder pinyin = new StringBuilder();
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
char[] chars = chinese.toCharArray();
for (char c : chars) {
try {
String[] arr = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (arr == null || arr.length == 0) {
pinyin.append(c);
} else {
pinyin.append(arr[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}
return pinyin.toString();
}
/**
* 中文转大写拼音
* @param chinese 待转义中文
* @return 转义后的拼音
*/
public static String toUpperPinyin(String chinese) {
StringBuilder pinyin = new StringBuilder();
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
char[] chars = chinese.toCharArray();
for (char c : chars) {
try {
String[] arr = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (arr == null || arr.length == 0) {
pinyin.append(c);
} else {
pinyin.append(arr[0]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}
return pinyin.toString();
}
}
......@@ -35,10 +35,11 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://47.104.91.229:9099/prod-api`,//测试
target: `http://47.104.91.229:9099/prod-api`,//测试
// target: `https://szhapi.jiansheku.com`,//线上
// target: `http://122.9.160.122:9011`, //线上
target: `http://192.168.60.46:9098`,//施
// target: `http://192.168.0.165:9098`,//施-无线
// target: `http://192.168.60.46:9098`,//施-有线
// target: `http://192.168.60.6:9098`,//谭
changeOrigin: true,
pathRewrite: {
......
......@@ -51,7 +51,7 @@ public class SysRole extends TenantEntity {
* 角色权限
*/
@ExcelProperty(value = "角色权限")
@NotBlank(message = "权限字符不能为空")
//@NotBlank(message = "权限字符不能为空")
@Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符")
private String roleKey;
......
package com.dsk.system.domain.bo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dsk.common.annotation.Sensitive;
import com.dsk.common.core.validate.AddGroup;
import com.dsk.common.core.validate.EditGroup;
import com.dsk.common.enums.SensitiveStrategy;
import com.dsk.common.tenant.core.TenantEntity;
import com.dsk.common.xss.Xss;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;
/**
* 用户对象 sys_user
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class SysTenantAdminBo extends TenantEntity {
/**
* 租户ID
*/
@NotNull(message = "租户ID不能为空", groups = AddGroup.class)
private String tenantId;
/**
* 用户昵称
*/
@Xss(message = "用户昵称不能包含脚本字符")
@NotBlank(message = "用户昵称不能为空")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符")
private String nickName;
/**
* 手机号码
*/
@Xss(message = "用户昵称不能包含脚本字符")
@NotBlank(message = "手机号码不能为空", groups = AddGroup.class)
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phonenumber;
/**
* 租户套餐编号
*/
@NotNull(message = "租户套餐不能为空", groups = AddGroup.class)
private Long packageId;
}
......@@ -2,6 +2,7 @@ package com.dsk.system.service;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.domain.bo.SysTenantAdminBo;
import com.dsk.system.domain.bo.SysTenantBo;
import com.dsk.system.domain.vo.SysTenantVo;
......@@ -44,6 +45,14 @@ public interface ISysTenantService {
*/
Boolean insertByBo(SysTenantBo bo);
/**
* 新增企业普通管理员账号
*
* @param tenantAdminBo 用户信息
* @return 结果
*/
Boolean addTenantAdmin(SysTenantAdminBo tenantAdminBo);
/**
* 校验租户是否允许操作
*/
......
......@@ -13,7 +13,13 @@ import java.util.List;
* @author Lion Li
*/
public interface ISysUserService {
/**
* 根据租户ID查询大司空超管or租户管理员为其创建的企业管理员和管理员账号数量
*
* @param tenantId 租户ID
* @return 该企业下企业管理员和管理员账号数量
*/
Long queryTenantAdminNumCreatedByDSK(Long tenantId);
TableDataInfo<SysUser> selectPageUserList(SysUser user, PageQuery pageQuery);
......
......@@ -99,7 +99,7 @@ public class SysLoginService {
if(ReUtil.isMatch(RegexPool.MOBILE, username)) {
String defaultTenantId = RedisUtils.getCacheObject(GlobalConstants.PHONE_DEFAULT_TENANT + username);
log.info("登录用户:{} 获取缓存默认租户:"+tenantId, username);
if(StrUtil.isNotBlank(defaultTenantId)){
if(StrUtil.isEmpty(tenantId)&&StrUtil.isNotBlank(defaultTenantId)){
defaultTenantId= checkDefaultTenant(defaultTenantId,username);
tenantId=defaultTenantId;
}
......@@ -557,16 +557,16 @@ public class SysLoginService {
if (ReUtil.isMatch(RegexPool.MOBILE, username)) {
LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserName, SysUser::getStatus, SysUser::getTenantId)
.select(SysUser::getUserName, SysUser::getStatus, SysUser::getTenantId,SysUser::getDelFlag)
.eq(SysUser::getPhonenumber, username)
.orderByDesc(SysUser::getUserId);
sysUsers = userMapper.selectList(lqw);
// sysUsers = userMapper.selectUserByTenantPhone(username);
} else {
LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserName, SysUser::getStatus, SysUser::getTenantId)
.eq(SysUser::getUserName, username)
.orderByDesc(SysUser::getUserId);
sysUsers = userMapper.selectList(lqw);
// sysUsers = userMapper.selectUserByTenantUsername(username);
}
return sysUsers;
});
......
......@@ -26,6 +26,7 @@ import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.system.domain.*;
import com.dsk.system.domain.bo.SysTenantAdminBo;
import com.dsk.system.domain.bo.SysTenantBo;
import com.dsk.system.domain.vo.SysTenantVo;
import com.dsk.system.mapper.*;
......@@ -180,7 +181,9 @@ public class ISysTenantServiceImpl implements ISysTenantService {
bo.setId(add.getId());
// 根据套餐创建角色
Long roleId = createTenantRole(tenantId, bo.getPackageId());
Long roleId = createTenantRole(tenantId, bo.getPackageId(),
TenantConstants.TENANT_SUPER_ADMIN_ROLE_NAME,
TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY);
// 创建部门: 公司名是部门名称
SysDept dept = new SysDept();
......@@ -268,6 +271,89 @@ public class ISysTenantServiceImpl implements ISysTenantService {
return true;
}
/**
* 新增企业普通管理员账号
*
* @param tenantAdminBo 用户信息
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean addTenantAdmin(SysTenantAdminBo tenantAdminBo) {
String tenantId = tenantAdminBo.getTenantId();
// 根据套餐创建角色
Long roleId = createTenantRole(tenantId, tenantAdminBo.getPackageId(),
TenantConstants.TENANT_ADMIN_ROLE_NAME,
TenantConstants.TENANT_ADMIN_ROLE_KEY);
//获取部门ID
Long deptId = deptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getTenantId, tenantId)).getDeptId();
// 角色和部门关联表
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(roleId);
roleDept.setDeptId(deptId);
roleDeptMapper.insert(roleDept);
// 创建系统用户
SysUser user = new SysUser();
user.setTenantId(tenantId);
user.setPhonenumber(tenantAdminBo.getPhonenumber());
//默认新增用户名为手机号
user.setUserName(tenantAdminBo.getPhonenumber());
user.setNickName(tenantAdminBo.getNickName());
//生成8位随机密码
String password = PasswordUtils.generatePwd(8);
user.setPassword(BCrypt.hashpw(password));
user.setDeptId(deptId);
user.setCreateTime(new DateTime());
userMapper.insert(user);
// 用户和角色关联表
SysUserRole userRole = new SysUserRole();
userRole.setUserId(user.getUserId());
userRole.setRoleId(roleId);
userRoleMapper.insert(userRole);
String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
//List<SysDictType> dictTypeList = dictTypeMapper.selectList(
// new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
//List<SysDictData> dictDataList = dictDataMapper.selectList(
// new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId));
//for (SysDictType dictType : dictTypeList) {
// dictType.setDictId(null);
// dictType.setTenantId(tenantId);
//}
//for (SysDictData dictData : dictDataList) {
// dictData.setDictCode(null);
// dictData.setTenantId(tenantId);
//}
//dictTypeMapper.insertBatch(dictTypeList);
//dictDataMapper.insertBatch(dictDataList);
List<SysConfig> sysConfigList = configMapper.selectList(
new LambdaQueryWrapper<SysConfig>()
.eq(SysConfig::getTenantId, defaultTenantId)
.eq(SysConfig::getConfigType, "Y"));
for (SysConfig config : sysConfigList) {
config.setConfigId(null);
config.setTenantId(tenantId);
}
configMapper.insertBatch(sysConfigList);
//管理员新增成功,发送短信通知用户
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("company", tenantAdminBo.getNickName());
map.put("pwd", password);
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
SmsResponse smsResponse = smsBlend.sendMessage(tenantAdminBo.getPhonenumber(), "SMS_463175230", map);
if (!"OK".equals(smsResponse.getCode())) {
log.error("新增租户通知短信发送异常 => {}", smsResponse);
}
return true;
}
/**
* 生成租户id
*
......@@ -291,7 +377,7 @@ public class ISysTenantServiceImpl implements ISysTenantService {
* @param packageId 租户套餐id
* @return 角色id
*/
private Long createTenantRole(String tenantId, Long packageId) {
private Long createTenantRole(String tenantId, Long packageId, String roleName, String roleKey) {
// 获取租户套餐
SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
if (ObjectUtil.isNull(tenantPackage)) {
......@@ -303,8 +389,8 @@ public class ISysTenantServiceImpl implements ISysTenantService {
// 创建角色
SysRole role = new SysRole();
role.setTenantId(tenantId);
role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME);
role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY);
role.setRoleName(roleName);
role.setRoleKey(roleKey);
role.setRoleSort(1);
role.setStatus(TenantConstants.NORMAL);
roleMapper.insert(role);
......@@ -386,7 +472,7 @@ public class ISysTenantServiceImpl implements ISysTenantService {
List<Long> roleIds = new ArrayList<>(roles.size() - 1);
List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
roles.forEach(item -> {
if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) {
if (TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY.equals(item.getRoleKey())) {
List<SysRoleMenu> roleMenus = new ArrayList<>(menuIds.size());
menuIds.forEach(menuId -> {
SysRoleMenu roleMenu = new SysRoleMenu();
......
......@@ -7,26 +7,21 @@ import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.constant.TenantConstants;
import com.dsk.system.mapper.SysRoleDeptMapper;
import com.dsk.system.mapper.SysRoleMapper;
import com.dsk.system.mapper.SysRoleMenuMapper;
import com.dsk.system.mapper.SysUserRoleMapper;
import com.dsk.system.domain.*;
import com.dsk.system.mapper.*;
import com.dsk.system.service.ISysRoleService;
import com.dsk.common.constant.UserConstants;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.system.domain.SysRole;
import com.dsk.common.core.domain.model.LoginUser;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.system.domain.SysRoleDept;
import com.dsk.system.domain.SysRoleMenu;
import com.dsk.system.domain.SysUserRole;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -46,6 +41,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
private final SysRoleMenuMapper roleMenuMapper;
private final SysUserRoleMapper userRoleMapper;
private final SysRoleDeptMapper roleDeptMapper;
private final SysUserMapper userMapper;
@Override
public TableDataInfo<SysRole> selectPageRoleList(SysRole role, PageQuery pageQuery) {
......@@ -203,7 +199,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
// 新增不允许使用 管理员标识符
if (ObjectUtil.isNull(role.getRoleId())
&& StringUtils.equalsAny(role.getRoleKey(),
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY)) {
throw new ServiceException("不允许使用系统内置管理员角色标识符!");
}
// 修改不允许修改 管理员标识符
......@@ -212,7 +208,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
// 如果标识符不相等 判断为修改了管理员标识符
if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())
&& StringUtils.equalsAny(sysRole.getRoleKey(),
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY)) {
throw new ServiceException("不允许修改系统内置管理员角色标识符!");
}
}
......@@ -385,6 +381,9 @@ public class SysRoleServiceImpl implements ISysRoleService {
public int deleteRoleByIds(Long[] roleIds) {
for (Long roleId : roleIds) {
SysRole role = selectRoleById(roleId);
if (TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY.equals(role.getRoleKey())) {
throw new ServiceException("不允许删除企业管理员角色!");
}
checkRoleAllowed(role);
checkRoleDataScope(roleId);
if (countUserRoleByRoleId(roleId) > 0) {
......@@ -407,6 +406,15 @@ public class SysRoleServiceImpl implements ISysRoleService {
*/
@Override
public int deleteAuthUser(SysUserRole userRole) {
//若该账号仅有一个角色,则不允许取消授权
SysUser sysUser = userMapper.selectUserById(userRole.getUserId());
if (sysUser.getRoles().size() == 1) {
throw new ServiceException("至少保留一个角色在该账号下");
}
//校验企业管理员角色下是否至少有一个账号
checkAdminHasUsers(userRole.getRoleId());
int rows = userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getRoleId, userRole.getRoleId())
.eq(SysUserRole::getUserId, userRole.getUserId()));
......@@ -425,6 +433,26 @@ public class SysRoleServiceImpl implements ISysRoleService {
*/
@Override
public int deleteAuthUsers(Long roleId, Long[] userIds) {
//若该账号仅有一个角色,则不允许取消授权
StringBuilder lackRoleAccount = new StringBuilder();
for (Long userId : userIds) {
SysUser sysUser = userMapper.selectUserById(userId);
if (sysUser.getRoles().size() == 1) {
lackRoleAccount.append(sysUser.getUserName()).append(",");
}
}
//将缺少角色的账号返回给前端
if (lackRoleAccount.toString().contains(",")) {
throw new ServiceException(lackRoleAccount.substring(0, lackRoleAccount.length()-1));
}
//校验企业管理员角色下是否至少有一个账号
Integer users = checkAdminHasUsers(roleId);
//如果取消授权企业管理员角色下所有账号,则抛异常
if (users != null && userIds.length == users) {
throw new ServiceException("至少要保留一个账号在企业管理员角色下!");
}
int rows = userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getRoleId, roleId)
.in(SysUserRole::getUserId, Arrays.asList(userIds)));
......@@ -434,6 +462,39 @@ public class SysRoleServiceImpl implements ISysRoleService {
return rows;
}
/**
* 校验企业管理员角色下是否至少有一个账号
*
* @param roleId 待操作角色ID
* @return 企业管理员角色账号数量
*/
public Integer checkAdminHasUsers(Long roleId) {
Long adminRoleId = null;
Integer userNum = null;
//查询企业管理员角色ID
List<SysRole> sysRoles = selectRoleAll();
for (SysRole role : sysRoles) {
if (TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY.equals(role.getRoleKey())) {
adminRoleId = role.getRoleId();
break;
}
}
assert adminRoleId != null;
//如果待操作角色是企业管理员
if (roleId.longValue() == adminRoleId.longValue()) {
//如果目前企业管理员角色下仅有1个账号,则不允许进行删除、取消授权等操作
List<Long> userIds = userRoleMapper.selectUserIdsByRoleId(adminRoleId);
if (userIds.size() == 1) {
throw new ServiceException("至少要保留一个账号在企业管理员角色下!");
}
userNum = userIds.size();
}
return userNum;
}
/**
* 批量选择授权用户角色
*
......
......@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.constant.CacheNames;
import com.dsk.common.constant.TenantConstants;
import com.dsk.common.constant.UserConstants;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
......@@ -57,6 +58,22 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper;
/**
* 根据租户ID查询大司空超管or租户管理员为其创建的企业管理员和管理员账号数量
*
* @param tenantId 租户ID
* @return 该企业下企业管理员和管理员账号数量
*/
@Override
public Long queryTenantAdminNumCreatedByDSK(Long tenantId) {
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserId)
.eq(SysUser::getStatus, UserConstants.USER_NORMAL)
.eq(SysUser::getTenantId, tenantId)
.eq(SysUser::getCreateBy, "suadmin");
return baseMapper.selectCount(queryWrapper);
}
@Override
public TableDataInfo<SysUser> selectPageUserList(SysUser user, PageQuery pageQuery) {
Page<SysUser> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
......@@ -109,10 +126,15 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
QueryWrapper<SysUser> wrapper = Wrappers.query();
wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
.eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId())
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.like(StringUtils.isNotBlank(user.getUserName()), "u.nick_name", user.getUserName())
.eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber());
Page<SysUser> page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper);
List<SysUser> userList = page.getRecords();
for (SysUser sysUser : userList) {
sysUser.setDept(deptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getDeptId, sysUser.getDeptId())));
}
return TableDataInfo.build(page);
}
......@@ -129,9 +151,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
.and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id"))
.notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds)
.like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
.like(StringUtils.isNotBlank(user.getUserName()), "u.nick_name", user.getUserName())
.like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber());
Page<SysUser> page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper);
List<SysUser> userList = page.getRecords();
for (SysUser sysUser : userList) {
sysUser.setDept(deptMapper.selectOne(new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getDeptId, sysUser.getDeptId())));
}
return TableDataInfo.build(page);
}
......@@ -397,6 +424,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
@Transactional(rollbackFor = Exception.class)
public int updateUser(SysUser user) {
Long userId = user.getUserId();
//校验企业管理员角色下是否至少有一个账号
checkAdminHasUsers(user);
// 删除用户与角色关联
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
// 新增用户与角色管理
......@@ -408,6 +438,44 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
return baseMapper.updateById(user);
}
/**
* 校验企业管理员角色下是否至少有一个账号
*
* @param user 待修改用户
*/
void checkAdminHasUsers(SysUser user) {
//获取企业管理员角色
SysRole adminRole = roleMapper.selectOne(new LambdaQueryWrapper<SysRole>()
.select(SysRole::getRoleId)
.eq(SysRole::getStatus, UserConstants.USER_NORMAL)
.eq(SysRole::getDelFlag, UserConstants.USER_NORMAL)
.eq(SysRole::getRoleKey, TenantConstants.TENANT_SUPER_ADMIN_ROLE_KEY));
//如果目前企业管理员角色下仅有1个账号
List<Long> userIds = userRoleMapper.selectUserIdsByRoleId(adminRole.getRoleId());
int enableAccount = 0;
for (Long userId : userIds) {
SysUser sysUser = baseMapper.selectUserById(userId);
if (UserConstants.USER_NORMAL.equals(sysUser.getStatus())) {
enableAccount++;
}
}
if (enableAccount == 1) {
//如果仅有的账号ID与待修改的用户ID相同,且修改后的账号角色不包含企业管理员角色
if (userIds.get(0).longValue() == user.getUserId().longValue()
&& !ArrayUtil.contains(user.getRoleIds(), adminRole.getRoleId())) {
throw new ServiceException("至少要保留一个账号在企业管理员角色下!");
}
//如果仅有的账号ID与待修改的用户ID相同,且修改后的账号角色包含企业管理员角色,但状态为禁用
if (userIds.get(0).longValue() == user.getUserId().longValue()
&& ArrayUtil.contains(user.getRoleIds(), adminRole.getRoleId())
&& UserConstants.USER_DISABLE.equals(user.getStatus())) {
throw new ServiceException("至少要保留一个可用账号在企业管理员角色下!");
}
}
}
/**
* 用户授权角色
*
......@@ -430,6 +498,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
*/
@Override
public int updateUserStatus(SysUser user) {
//如果禁用用户
if (UserConstants.USER_DISABLE.equals(user.getStatus())) {
//校验企业管理员角色下是否至少有一个可用账号
checkAdminHasUsers(baseMapper.selectUserById(user.getUserId()));
}
return baseMapper.updateById(user);
}
......@@ -560,7 +633,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
for (Long userId : userIds) {
checkUserAllowed(new SysUser(userId));
checkUserDataScope(userId);
//校验企业管理员角色下是否至少有一个账号
checkAdminHasUsers(baseMapper.selectUserById(userId));
}
List<Long> ids = Arrays.asList(userIds);
// 删除用户与角色关联
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, ids));
......
......@@ -145,7 +145,7 @@
where t.del_flag=0
and t.status=0
and t1.phonenumber=#{phonenumber}
order by t1.create_time desc
order by t1.user_id desc
</select>
<select id="selectUserByTenantUsername" resultType="com.dsk.system.domain.SysUser">
......@@ -154,6 +154,6 @@
where t.del_flag=0
and t.status=0
and t1.user_name=#{username}
order by t1.create_time desc
order by t1.user_id desc
</select>
</mapper>
......@@ -48,6 +48,9 @@
<aws-java-sdk-s3.version>1.12.400</aws-java-sdk-s3.version>
<!-- SMS 配置 -->
<sms4j.version>2.2.0</sms4j.version>
<!--中文转拼音-->
<pinyin4j.version>2.5.1</pinyin4j.version>
</properties>
<profiles>
......@@ -324,6 +327,13 @@
<version>${dsk-operate-sys.version}</version>
</dependency>
<!--中文转拼音-->
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>${pinyin4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment