feat: bug-243 管理端权限调整,添加对客户端菜单的支持

This commit is contained in:
曹鹏飞 2025-05-26 16:25:01 +08:00
parent b4ecf2f8f0
commit 62b3f2fa30
23 changed files with 180 additions and 21 deletions

View File

@ -458,4 +458,16 @@ public class AppUserController extends ControllerBase {
emailService.sendEmail(request.getEmail(), subject, content);
return ApiResult.success();
}
/**
* 授权角色
* @param request 请求参数
*/
@PostMapping("authorizeRole")
@MethodInfoMark(value = "授权角色", menuName = "账号管理")
@ApiMark(moduleName = "账号管理", apiName = "授权角色")
public ApiResult<Void> authorizeRole(@Valid @RequestBody AuthorizeRoleRequest request) {
appUserService.authorizeRole(request);
return ApiResult.success();
}
}

View File

@ -22,6 +22,7 @@ import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.EecExcelUtil;
import com.nflg.mobilebroken.common.util.PageUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
import com.nflg.mobilebroken.repository.entity.DictionaryItemTranslate;
import com.nflg.mobilebroken.repository.entity.Language;
import com.nflg.mobilebroken.repository.service.IDictionaryItemService;
@ -37,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.IOException;
@ -212,4 +214,15 @@ public class DictionaryController extends ControllerBase {
throw new NflgException(STATE.BusinessError, "文件处理失败:" + e.getMessage());
}
}
/**
* 根据字典编码获取字典值列表
* @param dictionaryCode 字典编码
* @return 字典值列表
*/
@GetMapping("getListByDictionaryCode")
@ApiMark(moduleName = "字典管理", apiName = "根据字典编码获取字典值列表",isPublic = true)
public ApiResult<List<DictionaryItem>> getListByDictionaryCode(@Valid @RequestParam @NotBlank String dictionaryCode){
return ApiResult.success(dictionaryItemService.getListByDictionaryCode(dictionaryCode));
}
}

View File

@ -1,22 +1,24 @@
package com.nflg.mobilebroken.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.mobilebroken.admin.annotation.ApiMark;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AdminMenuButtonVO;
import com.nflg.mobilebroken.common.pojo.vo.ApiVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.repository.service.IAdminApiService;
import com.nflg.mobilebroken.repository.service.IAdminMenuButtonApiMapService;
import com.nflg.mobilebroken.repository.service.IAdminMenuButtonService;
import com.nflg.mobilebroken.repository.service.IAdminMenuService;
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.Objects;
/**
* 菜单相关接口
@ -39,6 +41,9 @@ public class MenuController extends ControllerBase {
@Resource
private IAdminMenuButtonApiMapService adminMenuButtonApiMapService;
@Resource
private IDictionaryItemService dictionaryItemService;
/**
* 搜索菜单
* @param request 请求信息
@ -46,7 +51,22 @@ public class MenuController extends ControllerBase {
@PostMapping("searchMenu")
@ApiMark(moduleName = "菜单管理", apiName = "搜索菜单")
public ApiResult<PageData<MenuVO>> searchMenu(@Valid @RequestBody MenuSearchRequest request) {
return ApiResult.success(adminMenuService.search(request));
List<DictionaryItem> items=dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SERVICE);
IPage<MenuVO> page=adminMenuService.search(request);
bindMenuService(page.getRecords(),items);
return ApiResult.success(page);
}
private void bindMenuService(List<MenuVO> datas,List<DictionaryItem> items){
if (CollectionUtil.isNotEmpty(datas)){
datas.forEach(m -> {
if (Objects.nonNull(m.getServiceDescId())){
DictionaryItem item=items.stream().filter(i -> i.getId().equals(m.getServiceDescId())).findFirst().get();
m.setServiceDesc(item.getValue());
}
bindMenuService(m.getChildren(),items);
});
}
}
/**

View File

@ -88,7 +88,7 @@ public class AdminController extends ControllerBase {
@GetMapping("getPermissionMenus")
public ApiResult<List<MenuVO>> getPermissionMenus() {
VUtils.trueThrow(!SaTokenAdminUtil.isLogin()).throwMessage(STATE.LoginError,"请重新登录");
return ApiResult.success(adminRoleService.getMenusByRoleCodes(AdminUserUtil.getUserId()));
return ApiResult.success(adminRoleService.getMenusByRoleCodes("admin",AdminUserUtil.getUserId(), "admin"));
}
/**

View File

@ -8,9 +8,13 @@ import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.constant.UserState;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.vo.AppLoginVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.common.util.AppUserUtil;
import com.nflg.mobilebroken.common.util.SaTokenAdminUtil;
import com.nflg.mobilebroken.common.util.SaTokenAppUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.service.IAdminRoleService;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService;
import org.springframework.web.bind.annotation.GetMapping;
@ -20,6 +24,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.chrono.ChronoLocalDate;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@ -37,6 +42,9 @@ public class AppController extends ControllerBase {
@Resource
private IDictionaryItemTranslateService dictionaryItemTranslateService;
@Resource
private IAdminRoleService adminRoleService;
/**
* 用户端登录
* @param userName 用户名
@ -80,4 +88,14 @@ public class AppController extends ControllerBase {
// StpUtil.logout();
// return ApiResult.success();
//}
/**
* 获取权限菜单
* @return 权限列表
*/
@GetMapping("getPermissionMenus")
public ApiResult<List<MenuVO>> getPermissionMenus() {
VUtils.trueThrow(!SaTokenAdminUtil.isLogin()).throwMessage(STATE.LoginError,"请重新登录");
return ApiResult.success(adminRoleService.getMenusByRoleCodes("app",AppUserUtil.getUserId(), "app"));
}
}

View File

@ -122,4 +122,5 @@ public class Constant {
public static final String DICTIONARY_AD_TYPE ="AdvertisementType";
public static final String DICTIONARY_AD_POSITION ="AdvertisementPosition";
public static final String DICTIONARY_SERVICE = "SystemService";
}

View File

@ -34,4 +34,8 @@ public class MenuAddRequest {
// 是否显示
@NotNull
private boolean show;
//服务标识字典项ID
@NotNull
private Integer serviceDescId;
}

View File

@ -6,10 +6,7 @@ import lombok.experimental.Accessors;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
@Data
@ -106,6 +103,9 @@ public class AppUserForAdminVO {
//职位id
private Integer titleId;
//所属角色
private Collection<RoleSimpleVO> roles;
//下级账号
private List<AppUserForAdminVO> children=new ArrayList<>();

View File

@ -46,6 +46,12 @@ public class MenuVO {
// 修改时间
private LocalDateTime updateTime;
//服务标识字典项ID
private Integer serviceDescId;
//服务标识字典项名称
private String serviceDesc;
//下级菜单
private List<MenuVO> children = new ArrayList<>();
}

View File

@ -66,6 +66,11 @@ public class AdminMenu implements Serializable {
*/
private Integer sort;
/**
* 服务标识字典项ID
*/
private Integer serviceDescId;
/**
* 创建人
*/

View File

@ -3,11 +3,12 @@ package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
@ -36,4 +37,9 @@ public class AdminUserRoleMap implements Serializable {
* 用户id
*/
private Integer userId;
/**
* 来源平台
*/
private String platform;
}

View File

@ -23,7 +23,7 @@ public interface AdminRoleMapper extends BaseMapper<AdminRole> {
List<String> getUrlsByRoleCodes(List<String> roleCodes);
List<MenuVO> getMenusByRoleCodes(Integer userId);
List<MenuVO> getMenusByRoleCodes(String from,Integer userId,Integer serviceId);
IPage<RoleVO> search(RoleSearchRequest request, Page<?> page);

View File

@ -23,4 +23,6 @@ public interface DictionaryItemMapper extends BaseMapper<DictionaryItem> {
String getName(String dictionaryCode, String itemCode);
List<DictionaryItem> getListByDictionaryCode(String code);
DictionaryItem getByCode(String dictionaryCode, String dictionaryItemCode);
}

View File

@ -31,7 +31,7 @@ public interface IAdminRoleService extends IService<AdminRole> {
List<String> getUrlsByRoleCodes(List<String> roleCodes);
List<MenuVO> getMenusByRoleCodes(Integer userId);
List<MenuVO> getMenusByRoleCodes(String from,Integer userId,String serviceName);
IPage<RoleVO> search(RoleSearchRequest request);

View File

@ -10,6 +10,7 @@ import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.CompanyVO;
import com.nflg.mobilebroken.repository.entity.AppUser;
import javax.validation.Valid;
import java.util.List;
/**
@ -63,4 +64,6 @@ public interface IAppUserService extends IService<AppUser> {
void deleteAppUser(Integer id);
List<AreaSimpleVO> getSimpleAreas(Integer userId);
void authorizeRole(@Valid AuthorizeRoleRequest request);
}

View File

@ -25,4 +25,6 @@ public interface IDictionaryItemService extends IService<DictionaryItem> {
Integer getId(String dictionaryName, String dictionaryItemName);
List<DictionaryItem> getListByDictionaryCode(String code);
DictionaryItem getByCode(String dictionaryCode, String DictionaryItemCode);
}

View File

@ -74,6 +74,7 @@ public class AdminMenuServiceImpl extends ServiceImpl<AdminMenuMapper, AdminMenu
.setSort(request.getSort())
.setEnable(request.isEnable())
.setShow(request.isShow())
.setServiceDescId(request.getServiceDescId())
.setParentId(request.getParentId())
.setCreateBy(AdminUserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
@ -90,6 +91,7 @@ public class AdminMenuServiceImpl extends ServiceImpl<AdminMenuMapper, AdminMenu
.setSort(request.getSort())
.setEnable(request.isEnable())
.setShow(request.isShow())
.setServiceDescId(request.getServiceDescId())
.setParentId(request.getParentId())
.setUpdateBy(AdminUserUtil.getUserName())
.setUpdateTime(LocalDateTime.now());

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.repository.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.pojo.request.EnableRoleRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleAddRequest;
import com.nflg.mobilebroken.common.pojo.request.RoleSearchRequest;
@ -11,11 +12,14 @@ import com.nflg.mobilebroken.common.pojo.vo.ButtonVO;
import com.nflg.mobilebroken.common.pojo.vo.MenuVO;
import com.nflg.mobilebroken.common.pojo.vo.RoleVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AdminMenu;
import com.nflg.mobilebroken.repository.entity.AdminRole;
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
import com.nflg.mobilebroken.repository.mapper.AdminRoleMapper;
import com.nflg.mobilebroken.repository.service.IAdminMenuService;
import com.nflg.mobilebroken.repository.service.IAdminRoleService;
import com.nflg.mobilebroken.repository.service.IDictionaryItemService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -37,6 +41,9 @@ public class AdminRoleServiceImpl extends ServiceImpl<AdminRoleMapper, AdminRole
@Resource
private IAdminMenuService menuService;
@Resource
private IDictionaryItemService dictionaryItemService;
@Override
public void add(RoleAddRequest request) {
AdminRole adminRole = new AdminRole()
@ -76,8 +83,10 @@ public class AdminRoleServiceImpl extends ServiceImpl<AdminRoleMapper, AdminRole
}
@Override
public List<MenuVO> getMenusByRoleCodes(Integer userId) {
List<MenuVO> menus=baseMapper.getMenusByRoleCodes(userId);
public List<MenuVO> getMenusByRoleCodes(String from,Integer userId,String serviceName) {
DictionaryItem service = dictionaryItemService.getByCode(Constant.DICTIONARY_SERVICE, serviceName);
VUtils.trueThrowBusinessError(Objects.isNull(service)).throwMessage("无效的服务:"+serviceName);
List<MenuVO> menus=baseMapper.getMenusByRoleCodes(from,userId,service.getId());
for (int i = 0; i < menus.size(); i++) {
MenuVO menu = menus.get(i);
bindParent(menu, menus);

View File

@ -176,10 +176,12 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Override
public void authorizeRole(AuthorizeRoleRequest request) {
adminUserRoleMapService.remove(new LambdaQueryWrapper<AdminUserRoleMap>()
.eq(AdminUserRoleMap::getUserId, request.getUserId()));
.eq(AdminUserRoleMap::getUserId, request.getUserId())
.eq(AdminUserRoleMap::getPlatform, "admin"));
if (CollectionUtil.isNotEmpty(request.getRoleIds())) {
adminUserRoleMapService.saveBatch(request.getRoleIds().stream().map(roleId -> new AdminUserRoleMap()
.setRoleId(roleId)
.setPlatform("admin")
.setUserId(request.getUserId()))
.collect(Collectors.toList()));
}
@ -365,6 +367,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
private Collection<RoleSimpleVO> getRoles(Integer userId) {
Collection<Integer> roleIds = adminUserRoleMapService.lambdaQuery()
.eq(AdminUserRoleMap::getUserId, userId)
.eq(AdminUserRoleMap::getPlatform, "admin")
.list()
.stream()
.map(AdminUserRoleMap::getRoleId)

View File

@ -10,10 +10,7 @@ import com.nflg.mobilebroken.common.constant.*;
import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserVO;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.CompanyVO;
import com.nflg.mobilebroken.common.pojo.vo.*;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.AppUserUtil;
import com.nflg.mobilebroken.common.util.PageUtil;
@ -63,6 +60,12 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Resource
private ITBaseAreaService adminAreaService;
@Resource
private IAdminUserRoleMapService adminUserRoleMapService;
@Resource
private IAdminRoleService roleService;
@Resource
private RedisTemplate<String, String> redisTemplate;
@ -288,6 +291,20 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
}
}
@Override
public void authorizeRole(AuthorizeRoleRequest request) {
adminUserRoleMapService.remove(new LambdaQueryWrapper<AdminUserRoleMap>()
.eq(AdminUserRoleMap::getUserId, request.getUserId())
.eq(AdminUserRoleMap::getPlatform, "app"));
if (CollectionUtil.isNotEmpty(request.getRoleIds())) {
adminUserRoleMapService.saveBatch(request.getRoleIds().stream().map(roleId -> new AdminUserRoleMap()
.setRoleId(roleId)
.setPlatform("app")
.setUserId(request.getUserId()))
.collect(Collectors.toList()));
}
}
private void bindChildren1(AreaSimpleVO vo) {
List<AppArea> datas = appAreaService.lambdaQuery().eq(AppArea::getParentId, vo.getId()).eq(AppArea::getEnable, true).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getName())).collect(Collectors.toList());
@ -377,9 +394,33 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
.skip((long) (request.getPage() - 1) * request.getPageSize())
.limit(request.getPageSize())
.collect(Collectors.toList());
page.forEach(it->{
if (it.getKey().startsWith("u-")) {
it.setRoles(getRoles(it.getId()));
}
});
return new PageData<AppUserForAdminVO>().setPage(request.getPage()).setPageSize(request.getPageSize()).setTotal(primarys.size()).setItems(page);
}
private Collection<RoleSimpleVO> getRoles(Integer userId) {
Collection<Integer> roleIds = adminUserRoleMapService.lambdaQuery()
.eq(AdminUserRoleMap::getUserId, userId)
.eq(AdminUserRoleMap::getPlatform, "app")
.list()
.stream()
.map(AdminUserRoleMap::getRoleId)
.collect(Collectors.toSet());
if (CollectionUtil.isEmpty(roleIds)) {
return Collections.emptyList();
}
return roleService.lambdaQuery()
.in(AdminRole::getId, roleIds)
.list()
.stream()
.map(r -> new RoleSimpleVO().setId(r.getId()).setName(r.getName()))
.collect(Collectors.toSet());
}
public PageData<AppUserForAdminVO> searchAppUserForAdmin1(SearchAppUserForAdminRequest request) {
Page<AppUser> page = lambdaQuery()
.eq(AppUser::getIsDel, false)

View File

@ -135,4 +135,9 @@ public class DictionaryItemServiceImpl extends ServiceImpl<DictionaryItemMapper,
public List<DictionaryItem> getListByDictionaryCode(String code) {
return baseMapper.getListByDictionaryCode(code);
}
@Override
public DictionaryItem getByCode(String dictionaryCode, String DictionaryItemCode) {
return baseMapper.getByCode(dictionaryCode, DictionaryItemCode);
}
}

View File

@ -30,7 +30,7 @@
INNER JOIN admin_role_menu_map rmm ON r.id=rmm.role_id
INNER JOIN admin_menu m ON rmm.menu_id=m.id
INNER JOIN admin_user_role_map urm ON urm.role_id=r.id
WHERE m.`enable`=1 AND r.`enable`=1 AND urm.user_id=#{userId}
WHERE m.`enable`=1 AND r.`enable`=1 AND urm.user_id=#{userId} AND m.service_desc_id=#{serviceId} AND urm.platform=#{from}
</select>
<select id="search" resultType="com.nflg.mobilebroken.common.pojo.vo.RoleVO">

View File

@ -16,4 +16,11 @@
WHERE d.`code`=#{code}
ORDER BY di.id
</select>
<select id="getByCode" resultType="com.nflg.mobilebroken.repository.entity.DictionaryItem">
SELECT di.*
FROM dictionary d
INNER JOIN dictionary_item di ON d.id=di.dictionary_id
WHERE d.`code`= #{dictionaryCode} AND di.`code`= #{dictionaryItemCode}
</select>
</mapper>