Compare commits

...

2 Commits

Author SHA1 Message Date
曹鹏飞 f336cf7ae6 feat(role): 实现角色管理及权限功能
- 新增角色实体及相关服务接口和实现类,支持角色的增删改查
- 实现角色菜单权限及按钮权限的数据库查询和授权控制
- 完善角色控制器服务,支持角色授权及查询当前用户可见角色
- 支持超级管理员权限绕过,普通角色权限基于用户所拥有角色限制菜单节点展示
- 新增角色Mapper XML,包含角色搜索及角色关联菜单查询SQL
- 新增角色相关常量定义,统一管理角色相关字符串常量
- 用户管理新增通过LDAP批量添加用户功能,支持LDAP用户信息同步
- 用户查询增加根据创建人ID过滤,限制非超级管理员只能查询自身创建用户
- 优化用户新增LDAP用户时部门的自动匹配和验证逻辑
- 在菜单权限获取及授权接口中新增对用户角色和用户权限校验逻辑,保证数据权限安全
- 多处新增事务控制,保证数据一致性及错误回滚机制
2026-04-08 18:53:30 +08:00
曹鹏飞 143d6b6146 feat(admin): 完善LDAP和用户管理功能
- 新增LDAPControllerService,实现LDAP配置管理与同步接口
- 新增LdapDepartmentVO,用于LDAP部门及用户结构封装
- 添加LdapScheduledTask,支持定时同步部门和用户信息
- 优化LdapService,调整获取用户的查询逻辑和DN转换方法
- 新增UserController,提供用户管理、LDAP信息查询及密码操作的REST接口
- 实现UserControllerService,完成用户及供应商的增删改查、授权和密码相关业务逻辑
- 支持供应商账号管理及批量导入功能
- 增加相关事务控制及数据校验,提升系统稳定性和安全性
2026-04-08 17:14:35 +08:00
19 changed files with 342 additions and 118 deletions

View File

@ -1,8 +1,12 @@
package com.nflg.wms.admin.controller; package com.nflg.wms.admin.controller;
import com.nflg.wms.admin.pojo.request.UserAddLdapQO;
import com.nflg.wms.admin.service.LDAPControllerService;
import com.nflg.wms.admin.service.UserControllerService; import com.nflg.wms.admin.service.UserControllerService;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.LdapDepartmentDTO;
import com.nflg.wms.common.pojo.dto.LdapUserDTO;
import com.nflg.wms.common.pojo.dto.UserDTO; import com.nflg.wms.common.pojo.dto.UserDTO;
import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.RoleSimpleVO; import com.nflg.wms.common.pojo.vo.RoleSimpleVO;
@ -11,6 +15,7 @@ import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -26,6 +31,9 @@ public class UserController extends BaseController {
@Resource @Resource
private UserControllerService userControllerService; private UserControllerService userControllerService;
@Resource
private LDAPControllerService ldapControllerService;
/** /**
* 新增用户 * 新增用户
*/ */
@ -108,14 +116,14 @@ public class UserController extends BaseController {
return ApiResult.success(userControllerService.search(request)); return ApiResult.success(userControllerService.search(request));
} }
/** // /**
* 从LDAP同步用户 // * 从LDAP同步用户
*/ // */
@PostMapping("syncFromLdap") // @PostMapping("syncFromLdap")
public ApiResult<Void> syncFromLdap() { // public ApiResult<Void> syncFromLdap() {
userControllerService.syncFromLdap(); // userControllerService.syncFromLdap();
return ApiResult.success(); // return ApiResult.success();
} // }
/** /**
* 发送忘记密码邮件 * 发送忘记密码邮件
@ -134,4 +142,32 @@ public class UserController extends BaseController {
public ApiResult<UserDTO> getUserInfo() { public ApiResult<UserDTO> getUserInfo() {
return ApiResult.success(userControllerService.getUserInfo()); return ApiResult.success(userControllerService.getUserInfo());
} }
/**
* 获取LDAP部门
* @param ldapId LDAP表id
*/
@GetMapping("getLdapDepartments")
public ApiResult<LdapDepartmentDTO> getLdapDepartments(@RequestParam Long ldapId){
return ApiResult.success(ldapControllerService.searchAdSimple(ldapId));
}
/**
* 获取LDAP用户
* @param ldapId LDAP表id
* @param distinguishedName 部门的distinguishedName
*/
@GetMapping("getLdapUsers")
public ApiResult<List<LdapUserDTO>> getLdapUsers(@RequestParam Long ldapId, @RequestParam String distinguishedName){
return ApiResult.success(ldapControllerService.getUsers(ldapId,distinguishedName));
}
/**
* 从LDAP添加用户
*/
@PostMapping("addLdapUser")
public ApiResult<Void> addLdapUser(@Valid @RequestBody @NotEmpty List<UserAddLdapQO> users) {
userControllerService.addLdapUsers(users);
return ApiResult.success();
}
} }

View File

@ -0,0 +1,44 @@
package com.nflg.wms.admin.pojo.request;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class UserAddLdapQO {
/**
* 用户名
*/
@NotBlank
private String name;
/**
* ad表id
*/
@NotNull
private Long ldapId;
/**
* 用户工号
*/
@NotBlank
private String userCode;
/**
* 用户DN
*/
@NotBlank
private String distinguishedName;
/**
* 部门DN
*/
@JsonIgnore
private String departmentDistinguishedName;
public String getDepartmentDistinguishedName() {
return distinguishedName.substring(distinguishedName.indexOf(",") + 1);
}
}

View File

@ -0,0 +1,24 @@
package com.nflg.wms.admin.pojo.vo;
import com.nflg.wms.common.pojo.dto.LdapUserDTO;
import lombok.Data;
import java.util.List;
@Data
public class LdapDepartmentVO {
/**
* 部门名称
*/
private String name;
private String distinguishedName;
/**
* 用户列表
*/
private List<LdapUserDTO> users;
private List<LdapDepartmentVO> children;
}

View File

@ -55,7 +55,7 @@ public class LdapScheduledTask {
ads.forEach(ad -> { ads.forEach(ad -> {
if (StrUtil.isBlank(ad.getNextSyncDate()) || StrUtil.equals(date, ad.getNextSyncDate())) { if (StrUtil.isBlank(ad.getNextSyncDate()) || StrUtil.equals(date, ad.getNextSyncDate())) {
departmentControllerService.syncFromLdap(ad); departmentControllerService.syncFromLdap(ad);
userControllerService.syncFromLdap(ad); // userControllerService.syncFromLdap(ad);
adSyncService.lambdaUpdate() adSyncService.lambdaUpdate()
.eq(AdSync::getId, ad.getSyncId()) .eq(AdSync::getId, ad.getSyncId())
.set(AdSync::getNextSyncDate, LocalDate.now().plusDays(ad.getInterval()).format(DATE_FORMATTER)) .set(AdSync::getNextSyncDate, LocalDate.now().plusDays(ad.getInterval()).format(DATE_FORMATTER))

View File

@ -1,9 +1,11 @@
package com.nflg.wms.admin.service; package com.nflg.wms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.common.pojo.dto.AdDTO; import com.nflg.wms.common.pojo.dto.AdDTO;
import com.nflg.wms.common.pojo.dto.LdapDepartmentDTO; import com.nflg.wms.common.pojo.dto.LdapDepartmentDTO;
import com.nflg.wms.common.pojo.dto.LdapUserDTO;
import com.nflg.wms.common.pojo.qo.EnableQO; import com.nflg.wms.common.pojo.qo.EnableQO;
import com.nflg.wms.common.pojo.qo.LDAPAddQO; import com.nflg.wms.common.pojo.qo.LDAPAddQO;
import com.nflg.wms.common.pojo.qo.LDAPUpdateQO; import com.nflg.wms.common.pojo.qo.LDAPUpdateQO;
@ -12,8 +14,10 @@ import com.nflg.wms.common.pojo.vo.AdSyncVO;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.Ad; import com.nflg.wms.repository.entity.Ad;
import com.nflg.wms.repository.entity.User;
import com.nflg.wms.repository.service.IAdService; import com.nflg.wms.repository.service.IAdService;
import com.nflg.wms.repository.service.IAdSyncService; import com.nflg.wms.repository.service.IAdSyncService;
import com.nflg.wms.repository.service.IUserService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -21,6 +25,7 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects; import java.util.Objects;
@Component @Component
@ -36,7 +41,7 @@ public class LDAPControllerService {
private DepartmentControllerService departmentControllerService; private DepartmentControllerService departmentControllerService;
@Resource @Resource
private UserControllerService userControllerService; private IUserService userService;
public void add(@Valid LDAPAddQO request) { public void add(@Valid LDAPAddQO request) {
Ad ad = Convert.convert(Ad.class, request); Ad ad = Convert.convert(Ad.class, request);
@ -73,7 +78,7 @@ public class LDAPControllerService {
AdDTO ad = adService.getInfo(id); AdDTO ad = adService.getInfo(id);
VUtil.trueThrowBusinessError(Objects.isNull(ad)).throwMessage("数据不存在"); VUtil.trueThrowBusinessError(Objects.isNull(ad)).throwMessage("数据不存在");
departmentControllerService.syncFromLdap(ad); departmentControllerService.syncFromLdap(ad);
userControllerService.syncFromLdap(ad); // userControllerService.syncFromLdap(ad);
} }
public IPage<Ad> search(@Valid PageQO request) { public IPage<Ad> search(@Valid PageQO request) {
@ -93,4 +98,19 @@ public class LDAPControllerService {
ldapService.init(ad.getServer(), ad.getPort(), ad.getUserName(), ad.getUserPwd(), ad.getOu(), ad.getTimeout()); ldapService.init(ad.getServer(), ad.getPort(), ad.getUserName(), ad.getUserPwd(), ad.getOu(), ad.getTimeout());
return ldapService.getDepartmentTree("",true); return ldapService.getDepartmentTree("",true);
} }
public List<LdapUserDTO> getUsers(Long id,String distinguishedName){
AdDTO ad = adService.getInfo(id);
VUtil.trueThrowBusinessError(Objects.isNull(ad)).throwMessage("数据不存在");
LdapService ldapService = new LdapService();
ldapService.init(ad.getServer(), ad.getPort(), ad.getUserName(), ad.getUserPwd(), ad.getOu(), ad.getTimeout());
List<LdapUserDTO> users=ldapService.getUsers(distinguishedName);
if (CollectionUtil.isEmpty(users)){
return null;
}
List<User> dbUsers = userService.list();
return users.stream()
.filter(user -> dbUsers.stream().noneMatch(dbUser -> dbUser.getUserCode().equals(user.getUserCode())))
.toList();
}
} }

View File

@ -128,6 +128,24 @@ public class LdapService {
} }
} }
/**
* 去除 DN 中的 baseDn 后缀得到相对路径
*/
private String toRelativeDn(String dn) {
if (StrUtil.isBlank(dn) || StrUtil.isBlank(baseDn)) {
return dn;
}
// 忽略大小写比较并去除末尾的 baseDn 部分
String dnLower = dn.toLowerCase();
String baseDnLower = baseDn.toLowerCase();
if (dnLower.endsWith("," + baseDnLower)) {
return dn.substring(0, dn.length() - baseDn.length() - 1);
} else if (dnLower.equals(baseDnLower)) {
return "";
}
return dn;
}
/** /**
* 获取所有用户 * 获取所有用户
* @return 所有用户 * @return 所有用户
@ -135,9 +153,10 @@ public class LdapService {
public List<LdapUserDTO> getUsers(String searchBaseDn) { public List<LdapUserDTO> getUsers(String searchBaseDn) {
ldapTemplate.setIgnorePartialResultException(true); ldapTemplate.setIgnorePartialResultException(true);
log.info("开始获取用户信息"); log.info("开始获取用户信息");
String relativeDn = toRelativeDn(searchBaseDn);
LdapQuery query = LdapQueryBuilder.query() LdapQuery query = LdapQueryBuilder.query()
.base(searchBaseDn) .base(relativeDn)
.searchScope(SearchScope.SUBTREE) .searchScope(SearchScope.ONELEVEL)
.where("objectClass").is("person"); .where("objectClass").is("person");
List<LdapUserDTO> users = ldapTemplate.search( List<LdapUserDTO> users = ldapTemplate.search(
query, query,

View File

@ -3,6 +3,7 @@ package com.nflg.wms.admin.service;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.promeg.pinyinhelper.Pinyin; import com.github.promeg.pinyinhelper.Pinyin;
import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.RoleVO; import com.nflg.wms.common.pojo.vo.RoleVO;
import com.nflg.wms.common.pojo.vo.UserVO; import com.nflg.wms.common.pojo.vo.UserVO;
@ -36,10 +37,10 @@ public class RoleControllerService {
private IUserRoleMapService userRoleMapService; private IUserRoleMapService userRoleMapService;
public void addRole(RoleAddQO request) { public void addRole(RoleAddQO request) {
if (StrUtil.isBlank(request.getCode())){ if (StrUtil.isBlank(request.getCode())) {
request.setCode(toPinYin(request.getName())); request.setCode(toPinYin(request.getName()));
} }
roleService.add(request, UserUtil.getUserName()); roleService.add(request, UserUtil.getUserId(), UserUtil.getUserName());
} }
public void updateRole(RoleUpdateQO request) { public void updateRole(RoleUpdateQO request) {
@ -48,6 +49,9 @@ public class RoleControllerService {
} }
public IPage<RoleVO> searchRoles(RoleSearchQO request) { public IPage<RoleVO> searchRoles(RoleSearchQO request) {
if (!UserUtil.getRoles().contains(Constant.SUPER_ADMIN)) {
request.setUserId(UserUtil.getUserId());
}
return roleService.search(request); return roleService.search(request);
} }
@ -68,7 +72,7 @@ public class RoleControllerService {
return userRoleMapService.getAuthorizeUser(roleId); return userRoleMapService.getAuthorizeUser(roleId);
} }
private String toPinYin(String str){ private String toPinYin(String str) {
StringBuilder pinyin = new StringBuilder(); StringBuilder pinyin = new StringBuilder();
for (char c : str.toCharArray()) { for (char c : str.toCharArray()) {
if (Pinyin.isChinese(c)) { if (Pinyin.isChinese(c)) {

View File

@ -8,11 +8,14 @@ import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.pojo.request.UserAddLdapQO;
import com.nflg.wms.common.constant.Constant; import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.dto.*; import com.nflg.wms.common.pojo.dto.SupplierExcelDTO;
import com.nflg.wms.common.pojo.dto.SupplierExcelExportDTO;
import com.nflg.wms.common.pojo.dto.UserDTO;
import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.RoleSimpleVO; import com.nflg.wms.common.pojo.vo.RoleSimpleVO;
import com.nflg.wms.common.pojo.vo.UserSupplierItemVO; import com.nflg.wms.common.pojo.vo.UserSupplierItemVO;
@ -181,6 +184,9 @@ public class UserControllerService {
if (Objects.nonNull(request.getDeptId())) { if (Objects.nonNull(request.getDeptId())) {
request.setDeptIds(deptService.getWithChildren(request.getDeptId())); request.setDeptIds(deptService.getWithChildren(request.getDeptId()));
} }
if (!UserUtil.getRoles().contains(Constant.SUPER_ADMIN)) {
request.setCreateById(UserUtil.getUserId());
}
IPage<UserVO> pu = uService.search(request); IPage<UserVO> pu = uService.search(request);
pu.getRecords().forEach(userVO -> userVO.setRoles(userRoleMapService.getAuthorizeRole(userVO.getId()))); pu.getRecords().forEach(userVO -> userVO.setRoles(userRoleMapService.getAuthorizeRole(userVO.getId())));
return pu; return pu;
@ -192,77 +198,77 @@ public class UserControllerService {
uService.enable(request.getId(), request.getEnable()); uService.enable(request.getId(), request.getEnable());
} }
@Transactional // @Transactional
public void syncFromLdap() { // public void syncFromLdap() {
List<AdDTO> ads = adService.getList(); // List<AdDTO> ads = adService.getList();
ads.parallelStream().forEach(this::syncFromLdap); // ads.parallelStream().forEach(this::syncFromLdap);
} // }
@Transactional // @Transactional
public void syncFromLdap(AdDTO ad) { // public void syncFromLdap(AdDTO ad) {
LdapService ldapService = new LdapService(); // LdapService ldapService = new LdapService();
ldapService.init(ad.getServer(), ad.getPort(), ad.getUserName(), ad.getUserPwd(), ad.getOu(), ad.getTimeout()); // ldapService.init(ad.getServer(), ad.getPort(), ad.getUserName(), ad.getUserPwd(), ad.getOu(), ad.getTimeout());
List<LdapUserDTO> users = ldapService.getUsers(ad.getMapFrom()); // List<LdapUserDTO> users = ldapService.getUsers(ad.getMapFrom());
List<User> uforAdd = new ArrayList<>(); // List<User> uforAdd = new ArrayList<>();
List<User> uforUpdate = new ArrayList<>(); // List<User> uforUpdate = new ArrayList<>();
List<UserInterior> uiforAdd = new ArrayList<>(); // List<UserInterior> uiforAdd = new ArrayList<>();
List<UserInterior> uiforUpdate = new ArrayList<>(); // List<UserInterior> uiforUpdate = new ArrayList<>();
for (LdapUserDTO user : users) { // for (LdapUserDTO user : users) {
long deptId; // long deptId;
if (ad.getType() == 3) { // if (ad.getType() == 3) {
deptId = ad.getMapTo(); // deptId = ad.getMapTo();
} else { // } else {
Department department = deptService.lambdaQuery().eq(Department::getSource, 1).eq(Department::getSourceId, user.getDepartmentDistinguishedName()).one(); // Department department = deptService.lambdaQuery().eq(Department::getSource, 1).eq(Department::getSourceId, user.getDepartmentDistinguishedName()).one();
if (Objects.isNull(department)) { // if (Objects.isNull(department)) {
log.error("部门不存在:{}", user.getDepartmentDistinguishedName()); // log.error("部门不存在:{}", user.getDepartmentDistinguishedName());
continue; // continue;
} // }
deptId = department.getId(); // deptId = department.getId();
} // }
User u = uService.lambdaQuery().eq(User::getSource, 1).eq(User::getSourceId, user.getDistinguishedName()).one(); // User u = uService.lambdaQuery().eq(User::getSource, 1).eq(User::getSourceId, user.getDistinguishedName()).one();
if (Objects.isNull(u)) { // if (Objects.isNull(u)) {
u = new User() // u = new User()
.setId(IdUtil.getSnowflakeNextId()) // .setId(IdUtil.getSnowflakeNextId())
.setUserName(user.getName()) // .setUserName(user.getName())
.setUserCode(user.getUserCode()) // .setUserCode(user.getUserCode())
.setSource(1) // .setSource(1)
.setSourceId(user.getDistinguishedName()) // .setSourceId(user.getDistinguishedName())
.setPassword("") // .setPassword("")
.setAdId(ad.getId()) // .setAdId(ad.getId())
.setMustResetPwd(false) // .setMustResetPwd(false)
.setRemark("从LDAP同步") // .setRemark("从LDAP同步")
.setCreateBy("自动同步") // .setCreateBy("自动同步")
.setCreateTime(LocalDateTime.now()); // .setCreateTime(LocalDateTime.now());
uforAdd.add(u); // uforAdd.add(u);
uiforAdd.add(new UserInterior() // uiforAdd.add(new UserInterior()
.setUserId(u.getId()) // .setUserId(u.getId())
.setDeptId(deptId)); // .setDeptId(deptId));
} else { // } else {
UserInterior ui = userInteriorService.lambdaQuery().eq(UserInterior::getUserId, u.getId()).one(); // UserInterior ui = userInteriorService.lambdaQuery().eq(UserInterior::getUserId, u.getId()).one();
if (!Objects.equals(ui.getDeptId(), deptId)) // if (!Objects.equals(ui.getDeptId(), deptId))
ui.setDeptId(deptId); // ui.setDeptId(deptId);
uforUpdate.add(new User() // uforUpdate.add(new User()
.setId(u.getId()) // .setId(u.getId())
.setUserName(user.getName()) // .setUserName(user.getName())
.setUserCode(user.getUserCode()) // .setUserCode(user.getUserCode())
.setUpdateBy("自动同步") // .setUpdateBy("自动同步")
.setUpdateTime(LocalDateTime.now())); // .setUpdateTime(LocalDateTime.now()));
uiforUpdate.add(ui); // uiforUpdate.add(ui);
} // }
} // }
if (CollectionUtil.isNotEmpty(uforAdd)) { // if (CollectionUtil.isNotEmpty(uforAdd)) {
uService.saveBatch(uforAdd); // uService.saveBatch(uforAdd);
} // }
if (CollectionUtil.isNotEmpty(uforUpdate)) { // if (CollectionUtil.isNotEmpty(uforUpdate)) {
uService.updateBatchById(uforUpdate); // uService.updateBatchById(uforUpdate);
} // }
if (CollectionUtil.isNotEmpty(uiforAdd)) { // if (CollectionUtil.isNotEmpty(uiforAdd)) {
userInteriorService.saveBatch(uiforAdd); // userInteriorService.saveBatch(uiforAdd);
} // }
if (CollectionUtil.isNotEmpty(uiforUpdate)) { // if (CollectionUtil.isNotEmpty(uiforUpdate)) {
userInteriorService.updateBatchById(uiforUpdate); // userInteriorService.updateBatchById(uiforUpdate);
} // }
} // }
public void resetPassword(@Valid UserResetPasswordQO request) { public void resetPassword(@Valid UserResetPasswordQO request) {
User user = uService.getById(request.getId()); User user = uService.getById(request.getId());
@ -761,4 +767,40 @@ public class UserControllerService {
.addSheet(new ListSheet<>(datas)) .addSheet(new ListSheet<>(datas))
.writeTo(response.getOutputStream()); .writeTo(response.getOutputStream());
} }
@Transactional
public void addLdapUsers(List<UserAddLdapQO> ldapUsers) {
List<User> users = new ArrayList<>();
List<UserInterior> userInteriors = new ArrayList<>();
List<Department> departments = deptService.lambdaQuery()
.eq(Department::getSource, 1)
.in(Department::getSourceId, ldapUsers.stream().map(UserAddLdapQO::getDepartmentDistinguishedName).collect(Collectors.toSet()))
.list();
ldapUsers.forEach(userAddLdapQO -> {
Department department = departments.stream()
.filter(it -> it.getSourceId().equals(userAddLdapQO.getDepartmentDistinguishedName()))
.findFirst()
.orElse(null);
VUtil.trueThrowBusinessError(Objects.isNull(department)).throwMessage("部门不存在");
User user = new User()
.setId(IdUtil.getSnowflakeNextId())
.setUserCode(userAddLdapQO.getUserCode())
.setUserName(userAddLdapQO.getName())
.setEnableMustResetPwd(false)
.setMustResetPwd(false)
.setSource(1)
.setSourceId(userAddLdapQO.getDistinguishedName())
.setRemark("LDAP用户")
.setLanguageCode(Constant.DEFAULT_LANGUAGE_CODE)
.setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
users.add(user);
userInteriors.add(new UserInterior()
.setUserId(user.getId())
.setDeptId(department.getId())
);
});
uService.saveBatch(users);
userInteriorService.saveBatch(userInteriors);
}
} }

View File

@ -33,4 +33,6 @@ public class Constant {
public static String DICTIONARY_SUPPLIERS_CATEGORY = "SuppliersCategory"; public static String DICTIONARY_SUPPLIERS_CATEGORY = "SuppliersCategory";
public static String LOGIN_EXTRA_PURCHASING_GROUP = "purchasing_group"; public static String LOGIN_EXTRA_PURCHASING_GROUP = "purchasing_group";
public static String SUPER_ADMIN = "SuperAdmin";
} }

View File

@ -1,5 +1,6 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -8,4 +9,7 @@ import lombok.EqualsAndHashCode;
public class RoleSearchQO extends PageQO{ public class RoleSearchQO extends PageQO{
private String name; private String name;
@JsonIgnore
private Long userId;
} }

View File

@ -28,4 +28,7 @@ public class UserSearchQO extends SearchBaseQO {
*/ */
@JsonIgnore @JsonIgnore
private Set<Long> deptIds; private Set<Long> deptIds;
@JsonIgnore
private Long createById;
} }

View File

@ -2,12 +2,13 @@ package com.nflg.wms.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/** /**
* <p> * <p>
* 角色 * 角色
@ -41,6 +42,16 @@ public class Role implements Serializable {
*/ */
private Boolean enable; private Boolean enable;
/**
* 类型0普通角色1业务管理员
*/
private Integer type;
/**
* 创建人ID
*/
private Long createById;
/** /**
* 创建人 * 创建人
*/ */

View File

@ -59,6 +59,11 @@ public class User implements Serializable {
*/ */
private Integer state; private Integer state;
/**
* 创建人ID
*/
private Long createById;
/** /**
* 创建人 * 创建人
*/ */

View File

@ -9,9 +9,6 @@ import com.nflg.wms.common.pojo.qo.RoleUpdateQO;
import com.nflg.wms.common.pojo.vo.MenuVO; import com.nflg.wms.common.pojo.vo.MenuVO;
import com.nflg.wms.common.pojo.vo.RoleVO; import com.nflg.wms.common.pojo.vo.RoleVO;
import com.nflg.wms.repository.entity.Role; import com.nflg.wms.repository.entity.Role;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.List; import java.util.List;
@ -25,13 +22,13 @@ import java.util.List;
*/ */
public interface IRoleService extends IService<Role> { public interface IRoleService extends IService<Role> {
void add(@Valid RoleAddQO request,@NotBlank String userName); void add(RoleAddQO request,Long userId,String userName);
void update(@Valid RoleUpdateQO request, @NotBlank String userName); void update(RoleUpdateQO request, String userName);
IPage<RoleVO> search(@Valid RoleSearchQO request); IPage<RoleVO> search(RoleSearchQO request);
void enable(@Valid EnableQO request, String userName); void enable(EnableQO request, String userName);
List<MenuVO> getMenusByRoleCodes(@Valid @NotNull Long serviceId, Long userId); List<MenuVO> getMenusByRoleCodes(Long serviceId, Long userId);
} }

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.pojo.qo.EnableMenuQO; import com.nflg.wms.common.pojo.qo.EnableMenuQO;
import com.nflg.wms.common.pojo.qo.MenuAddQO; import com.nflg.wms.common.pojo.qo.MenuAddQO;
import com.nflg.wms.common.pojo.qo.MenuSearchQO; import com.nflg.wms.common.pojo.qo.MenuSearchQO;
@ -14,15 +15,15 @@ import com.nflg.wms.common.pojo.qo.MenuUpdateQO;
import com.nflg.wms.common.pojo.vo.ButtonVO; import com.nflg.wms.common.pojo.vo.ButtonVO;
import com.nflg.wms.common.pojo.vo.MenuAuthorizeVO; import com.nflg.wms.common.pojo.vo.MenuAuthorizeVO;
import com.nflg.wms.common.pojo.vo.MenuVO; import com.nflg.wms.common.pojo.vo.MenuVO;
import com.nflg.wms.common.pojo.vo.RoleVO;
import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.Menu; import com.nflg.wms.repository.entity.Menu;
import com.nflg.wms.repository.entity.MenuButton; import com.nflg.wms.repository.entity.MenuButton;
import com.nflg.wms.repository.entity.RoleButtonMap; import com.nflg.wms.repository.entity.RoleButtonMap;
import com.nflg.wms.repository.entity.RoleMenuMap;
import com.nflg.wms.repository.mapper.MenuMapper; import com.nflg.wms.repository.mapper.MenuMapper;
import com.nflg.wms.repository.service.IMenuButtonService; import com.nflg.wms.repository.service.*;
import com.nflg.wms.repository.service.IMenuService;
import com.nflg.wms.repository.service.IRoleButtonMapService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -47,6 +48,12 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
@Resource @Resource
private IRoleButtonMapService roleButtonMapService; private IRoleButtonMapService roleButtonMapService;
@Resource
private IUserRoleMapService userRoleMapService;
@Resource
private IRoleMenuMapService roleMenuMapService;
@Override @Override
public List<MenuAuthorizeVO> getMenuForAuthorize(Long roleId) { public List<MenuAuthorizeVO> getMenuForAuthorize(Long roleId) {
List<Menu> datas = lambdaQuery() List<Menu> datas = lambdaQuery()
@ -63,6 +70,16 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
@Override @Override
public List<MenuAuthorizeVO> getNodeForAuthorize(Long roleId) { public List<MenuAuthorizeVO> getNodeForAuthorize(Long roleId) {
List<MenuAuthorizeVO> nodes = baseMapper.getAllDataForAuthorize(roleId); List<MenuAuthorizeVO> nodes = baseMapper.getAllDataForAuthorize(roleId);
if (!UserUtil.getRoles().contains(Constant.SUPER_ADMIN)){
List<RoleVO> userRoles=userRoleMapService.getRoleList(UserUtil.getUserId());
List<Long> menuIds =roleMenuMapService.lambdaQuery()
.in(RoleMenuMap::getRoleId, userRoles.stream().map(RoleVO::getId).collect(Collectors.toList()))
.list()
.stream()
.map(RoleMenuMap::getMenuId)
.toList();
nodes.removeIf(v -> !menuIds.contains(v.getId()));
}
List<MenuAuthorizeVO> rootNodes = nodes.stream().filter(v -> List<MenuAuthorizeVO> rootNodes = nodes.stream().filter(v ->
v.getType() == 1 && v.getParentId() == 0 v.getType() == 1 && v.getParentId() == 0
).toList(); ).toList();

View File

@ -9,7 +9,6 @@ import com.nflg.wms.common.pojo.qo.RoleSearchQO;
import com.nflg.wms.common.pojo.qo.RoleUpdateQO; import com.nflg.wms.common.pojo.qo.RoleUpdateQO;
import com.nflg.wms.common.pojo.vo.MenuVO; import com.nflg.wms.common.pojo.vo.MenuVO;
import com.nflg.wms.common.pojo.vo.RoleVO; import com.nflg.wms.common.pojo.vo.RoleVO;
import com.nflg.wms.common.util.BeanUtil;
import com.nflg.wms.common.util.VUtil; import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.Menu; import com.nflg.wms.repository.entity.Menu;
import com.nflg.wms.repository.entity.Role; import com.nflg.wms.repository.entity.Role;
@ -45,11 +44,12 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR
@Transactional @Transactional
@Override @Override
public void add(RoleAddQO request, String userName) { public void add(RoleAddQO request,Long userId, String userName) {
Role role = new Role() Role role = new Role()
.setCode(request.getCode()) .setCode(request.getCode())
.setName(request.getName()) .setName(request.getName())
.setEnable(request.getEnable()) .setEnable(request.getEnable())
.setCreateById(userId)
.setCreateBy(userName) .setCreateBy(userName)
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
save(role); save(role);

View File

@ -22,26 +22,16 @@
</select> </select>
<select id="getAllDataForAuthorize" resultType="com.nflg.wms.common.pojo.vo.MenuAuthorizeVO"> <select id="getAllDataForAuthorize" resultType="com.nflg.wms.common.pojo.vo.MenuAuthorizeVO">
select id, select id,parent_id,"name",CONCAT('menu-', id) as key,sort,1 as type
parent_id, ,case when b.menu_id is null then false else true end as selected
"name",
CONCAT('menu-', id) as key,
sort,
1 as type,
case when b.menu_id is null then false else true end as selected
from menu a from menu a
left join (select menu_id from role_menu_map where role_id = #{roleId}) b on a.id = b.menu_id left join (select menu_id from role_menu_map where role_id = #{roleId}) b on a.id = b.menu_id
where "enable" = true where "enable" = true
UNION UNION
select id, select id,menu_id,"name",CONCAT('button-', id) as key,sort,2 as type
menu_id, ,case when b.button_id is null then false else true end as selected
"name",
CONCAT('button-', id) as key,
sort,
2 as type,
case when b.button_id is null then false else true end as selected
from menu_button a from menu_button a
left join (select button_id from role_button_map where role_id = #{roleId}) b on a.id = b.button_id left join (select button_id from role_button_map where role_id = #{roleId}) b on a.id = b.button_id
where "enable" = true where "enable" = true
order by sort; order by sort;
</select> </select>

View File

@ -6,6 +6,9 @@
SELECT * SELECT *
FROM role FROM role
<where> <where>
<if test="request.userId != null">
AND create_by_id = #{request.userId}
</if>
<if test="request.name != null and request.name != ''"> <if test="request.name != null and request.name != ''">
AND name ilike CONCAT('%',#{request.name},'%') AND name ilike CONCAT('%',#{request.name},'%')
</if> </if>

View File

@ -14,6 +14,9 @@
select vu.* select vu.*
from v_user_interior vu from v_user_interior vu
<where> <where>
<if test="request.createById != null">
and vu.create_by_id = #{request.createById}
</if>
<if test="request.deptIds!=null"> <if test="request.deptIds!=null">
and vu.dept_id in and vu.dept_id in
<foreach item="item" collection="request.deptIds" separator="," close=")" open="("> <foreach item="item" collection="request.deptIds" separator="," close=")" open="(">