角色管理

This commit is contained in:
2022-12-16 14:15:19 +08:00
parent 67bdfa66c9
commit ee0eaacc2d
17 changed files with 245 additions and 33 deletions

View File

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.query.PageQuery;
import org.nl.modules.logging.annotation.Log; import org.nl.modules.logging.annotation.Log;
import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.ISysParamService;
@@ -41,7 +42,7 @@ class SysParamController {
@ApiOperation("查询系统参数") @ApiOperation("查询系统参数")
//@SaCheckPermission("param:list") //@SaCheckPermission("param:list")
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page){ public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page){
return new ResponseEntity<>(paramService.queryAll(whereJson, page), HttpStatus.OK); return new ResponseEntity<>(TableDataInfo.build(paramService.queryAll(whereJson, page)), HttpStatus.OK);
} }
@PostMapping @PostMapping

View File

@@ -1,18 +1,21 @@
package org.nl.system.controller.role; package org.nl.system.controller.role;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.nl.common.TableDataInfo; import org.nl.common.TableDataInfo;
import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.query.PageQuery;
import org.nl.modules.logging.annotation.Log; import org.nl.modules.logging.annotation.Log;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.system.service.role.ISysRoleService; import org.nl.system.service.role.ISysRoleService;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* <p> * <p>
@@ -52,5 +55,23 @@ public class SysRoleController {
roleService.update(param); roleService.update(param);
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} }
@Log("删除角色")
@ApiOperation("删除角色")
@DeleteMapping
@SaCheckPermission("roles:del")
public ResponseEntity<Object> delete(@RequestBody Set<Long> ids) {
roleService.deleteBatchByIds(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@Log("修改角色菜单")
@ApiOperation("修改角色菜单")
@PutMapping(value = "/menu")
// @SaCheckPermission("roles:edit")
public ResponseEntity<Object> updateMenu(@RequestBody JSONObject form) {
roleService.updateMenu(form);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} }

View File

@@ -0,0 +1,21 @@
package org.nl.system.controller.role;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 角色菜单关联 前端控制器
* </p>
*
* @author generator
* @since 2022-12-16
*/
@RestController
@RequestMapping("/sysRolesMenus")
public class SysRolesMenusController {
}

View File

@@ -1,6 +1,8 @@
package org.nl.system.service.dict.dao; package org.nl.system.service.dict.dao;
import java.math.BigDecimal; import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable; import java.io.Serializable;
import lombok.Data; import lombok.Data;
@@ -24,6 +26,7 @@ public class Dict implements Serializable {
/** /**
* 字典标识 * 字典标识
*/ */
@TableId
private Long dictId; private Long dictId;
/** /**

View File

@@ -5,7 +5,6 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.query.PageQuery;
import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.exception.BadRequestException;
@@ -14,9 +13,7 @@ import org.nl.modules.tools.MapOf;
import org.nl.system.service.param.ISysParamService; import org.nl.system.service.param.ISysParamService;
import org.nl.system.service.param.dao.Param; import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.dao.mapper.SysParamMapper; import org.nl.system.service.param.dao.mapper.SysParamMapper;
import org.nl.system.service.param.dto.ParamQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;

View File

@@ -4,10 +4,10 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.query.PageQuery;
import org.nl.system.service.dict.dao.Dict;
import org.nl.system.service.role.dao.SysRole; import org.nl.system.service.role.dao.SysRole;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* <p> * <p>
@@ -26,4 +26,22 @@ public interface ISysRoleService extends IService<SysRole> {
* @param param * @param param
*/ */
void create(JSONObject param); void create(JSONObject param);
/**
* 更新角色
* @param param
*/
void update(JSONObject param);
/**
* 删除角色
* @param ids
*/
void deleteBatchByIds(Set<Long> ids);
/**
* 更新角色菜单
* @param form
*/
void updateMenu(JSONObject form);
} }

View File

@@ -0,0 +1,16 @@
package org.nl.system.service.role;
import org.nl.system.service.role.dao.SysRolesMenus;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 角色菜单关联 服务类
* </p>
*
* @author generator
* @since 2022-12-16
*/
public interface ISysRolesMenusService extends IService<SysRolesMenus> {
}

View File

@@ -1,11 +1,14 @@
package org.nl.system.service.role.dao; package org.nl.system.service.role.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
/** /**
* <p> * <p>
@@ -25,7 +28,8 @@ public class SysRole implements Serializable {
/** /**
* ID * ID
*/ */
private Long roleId; @TableId
private String roleId;
/** /**
* 名称 * 名称
@@ -75,17 +79,23 @@ public class SysRole implements Serializable {
/** /**
* 修改人标识 * 修改人标识
*/ */
private Long updateOptid; private Long updateId;
/** /**
* 修改人 * 修改人
*/ */
private String updateOptname; private String updateName;
/** /**
* 修改时间 * 修改时间
*/ */
private String updateTime; private String updateTime;
/**
* 角色菜单
*/
@TableField(exist = false)
private List<SysRolesMenus> menus;
} }

View File

@@ -0,0 +1,34 @@
package org.nl.system.service.role.dao;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 角色菜单关联
* </p>
*
* @author generator
* @since 2022-12-16
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("sys_roles_menus")
public class SysRolesMenus implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 菜单ID
*/
private String menuId;
/**
* 角色ID
*/
private String roleId;
}

View File

@@ -14,5 +14,5 @@ import java.util.List;
* @since 2022-12-15 * @since 2022-12-15
*/ */
public interface SysRoleMapper extends BaseMapper<SysRole> { public interface SysRoleMapper extends BaseMapper<SysRole> {
List<SysRole> list();
} }

View File

@@ -2,7 +2,4 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.system.service.role.dao.mapper.SysRoleMapper"> <mapper namespace="org.nl.system.service.role.dao.mapper.SysRoleMapper">
<select id="list" resultType="org.nl.system.service.role.dao.SysRole">
SELECT * FROM sys_role
</select>
</mapper> </mapper>

View File

@@ -0,0 +1,16 @@
package org.nl.system.service.role.dao.mapper;
import org.nl.system.service.role.dao.SysRolesMenus;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 角色菜单关联 Mapper 接口
* </p>
*
* @author generator
* @since 2022-12-16
*/
public interface SysRolesMenusMapper extends BaseMapper<SysRolesMenus> {
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.system.service.role.dao.mapper.SysRolesMenusMapper">
</mapper>

View File

@@ -4,7 +4,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
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;
@@ -13,15 +13,17 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.common.domain.query.PageQuery; import org.nl.common.domain.query.PageQuery;
import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.system.service.dict.dao.Dict;
import org.nl.system.service.role.ISysRoleService; import org.nl.system.service.role.ISysRoleService;
import org.nl.system.service.role.dao.SysRole; import org.nl.system.service.role.dao.SysRole;
import org.nl.system.service.role.dao.SysRolesMenus;
import org.nl.system.service.role.dao.mapper.SysRoleMapper; import org.nl.system.service.role.dao.mapper.SysRoleMapper;
import org.nl.system.service.role.dao.mapper.SysRolesMenusMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* <p> * <p>
@@ -37,18 +39,25 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
@Autowired @Autowired
private SysRoleMapper roleMapper; private SysRoleMapper roleMapper;
@Autowired
private SysRolesMenusMapper rolesMenusMapper;
@Override @Override
public IPage<SysRole> query(Map param, PageQuery page) { public IPage<SysRole> query(Map param, PageQuery page) {
String blurry = null; String blurry = null;
if (ObjectUtil.isNotEmpty(param.get("blurry"))) blurry = param.get("blurry").toString(); if (ObjectUtil.isNotEmpty(param.get("blurry"))) blurry = param.get("blurry").toString();
LambdaQueryWrapper<SysRole> lam = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SysRole> lam = new LambdaQueryWrapper<>();
lam.like(ObjectUtil.isNotEmpty(blurry), SysRole::getName, blurry); lam.like(ObjectUtil.isNotEmpty(blurry), SysRole::getName, blurry);
IPage<SysRole> pages = new Page<>(page.getPage(), page.getSize()); IPage<SysRole> pages = new Page<>(page.getPage() + 1, page.getSize());
roleMapper.selectPage(pages, lam); roleMapper.selectPage(pages, lam);
// 需要吧menus反回去
pages.getRecords().forEach(sysRole -> sysRole.setMenus(rolesMenusMapper.selectList(new LambdaQueryWrapper<SysRolesMenus>()
.eq(SysRolesMenus::getRoleId, sysRole.getRoleId()))));
return pages; return pages;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void create(JSONObject param) { public void create(JSONObject param) {
//判断角色名字是否存在 //判断角色名字是否存在
String name = param.getString("name"); String name = param.getString("name");
@@ -62,13 +71,60 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
String nickName = SecurityUtils.getCurrentNickName(); String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now(); String now = DateUtil.now();
// 插入 // 插入
sysRole.setRoleId(IdUtil.getSnowflake(1,1).nextId()); sysRole.setRoleId(IdUtil.getSnowflake(1,1).nextIdStr());
sysRole.setCreateId(userId); sysRole.setCreateId(userId);
sysRole.setCreateName(nickName); sysRole.setCreateName(nickName);
sysRole.setCreateTime(now); sysRole.setCreateTime(now);
sysRole.setUpdateOptid(userId); sysRole.setUpdateId(userId);
sysRole.setUpdateOptname(nickName); sysRole.setUpdateName(nickName);
sysRole.setUpdateTime(now); sysRole.setUpdateTime(now);
roleMapper.insert(sysRole); roleMapper.insert(sysRole);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void update(JSONObject param) {
SysRole sysRole = JSONObject.parseObject(JSONObject.toJSONString(param), SysRole.class);
//判断角色名字是否存在
String name = sysRole.getName();
if (StrUtil.isEmpty(name)) throw new BadRequestException("角色名字不能为空!");
//判断角色名字是否存在
SysRole role = roleMapper.selectOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getName, sysRole.getName())
.ne(SysRole::getRoleId, sysRole.getRoleId()));
if (ObjectUtil.isNotEmpty(role)) throw new BadRequestException("角色【" + name + "】已存在!");
Long userId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
sysRole.setUpdateId(userId);
sysRole.setUpdateName(nickName);
sysRole.setUpdateTime(now);
roleMapper.updateById(sysRole);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteBatchByIds(Set<Long> ids) {
// 删除角色表
roleMapper.deleteBatchIds(ids);
// 删除角色用户表
rolesMenusMapper.deleteBatchIds(ids);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMenu(JSONObject form) {
Long roleId = form.getLong("roleId");
JSONArray menus = form.getJSONArray("menus");
// 删除
rolesMenusMapper.delete(new LambdaQueryWrapper<SysRolesMenus>().eq(SysRolesMenus::getRoleId, roleId));
for (int i = 0; i < menus.size(); i++) {
JSONObject rmObj = menus.getJSONObject(i);
SysRolesMenus rolesMenus = new SysRolesMenus();
rolesMenus.setRoleId(roleId.toString());
rolesMenus.setMenuId(rmObj.getString("menuId"));
rolesMenusMapper.insert(rolesMenus);
}
}
} }

View File

@@ -0,0 +1,20 @@
package org.nl.system.service.role.impl;
import org.nl.system.service.role.dao.SysRolesMenus;
import org.nl.system.service.role.dao.mapper.SysRolesMenusMapper;
import org.nl.system.service.role.ISysRolesMenusService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 角色菜单关联 服务实现类
* </p>
*
* @author generator
* @since 2022-12-16
*/
@Service
public class SysRolesMenusServiceImpl extends ServiceImpl<SysRolesMenusMapper, SysRolesMenus> implements ISysRolesMenusService {
}

View File

@@ -9,13 +9,10 @@ import org.nl.AppRun;
import org.nl.system.service.dict.ISysDictService; import org.nl.system.service.dict.ISysDictService;
import org.nl.system.service.dict.dao.Dict; import org.nl.system.service.dict.dao.Dict;
import org.nl.system.service.dict.dao.mapper.SysDictMapper; import org.nl.system.service.dict.dao.mapper.SysDictMapper;
import org.nl.system.service.role.dao.SysRole;
import org.nl.system.service.role.dao.mapper.SysRoleMapper; import org.nl.system.service.role.dao.mapper.SysRoleMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import java.util.function.Consumer;
/** /**
* @Author: lyd * @Author: lyd
* @Description: * @Description:

View File

@@ -112,7 +112,7 @@
check-strictly check-strictly
accordion accordion
show-checkbox show-checkbox
node-key="menu_id" node-key="menuId"
@check="menuChange" @check="menuChange"
/> />
</el-card> </el-card>
@@ -164,7 +164,7 @@ export default {
methods: { methods: {
getMenuDatas(node, resolve) { getMenuDatas(node, resolve) {
setTimeout(() => { setTimeout(() => {
getMenusTree(node.data.menu_id ? node.data.menu_id : 0).then(res => { getMenusTree(node.data.menuId ? node.data.menuId : 0).then(res => {
resolve(res) resolve(res)
}) })
}, 100) }, 100)
@@ -184,7 +184,7 @@ export default {
// 初始化默认选中的key // 初始化默认选中的key
_this.menuIds = [] _this.menuIds = []
_this.menus.forEach(function(data) { _this.menus.forEach(function(data) {
_this.menuIds.push(data.menu_id) _this.menuIds.push(data.menuId)
}) })
}) })
} }
@@ -203,20 +203,20 @@ export default {
// 清空菜单的选中 // 清空菜单的选中
this.$refs.menu.setCheckedKeys([]) this.$refs.menu.setCheckedKeys([])
// 保存当前的角色id // 保存当前的角色id
this.currentId = val.role_id this.currentId = val.roleId
// 初始化默认选中的key // 初始化默认选中的key
this.menuIds = [] this.menuIds = []
val.menus.forEach(function(data) { val.menus.forEach(function(data) {
_this.menuIds.push(data.menu_id) _this.menuIds.push(data.menuId)
}) })
this.showButton = true this.showButton = true
} }
}, },
menuChange(menu) { menuChange(menu) {
// 获取该节点的所有子节点id 包含自身 // 获取该节点的所有子节点id 包含自身
getChild(menu.menu_id).then(childIds => { getChild(menu.menuId).then(childIds => {
// 判断是否在 menuIds 中,如果存在则删除,否则添加 // 判断是否在 menuIds 中,如果存在则删除,否则添加
if (this.menuIds.indexOf(menu.menu_id) !== -1) { if (this.menuIds.indexOf(menu.menuId) !== -1) {
for (let i = 0; i < childIds.length; i++) { for (let i = 0; i < childIds.length; i++) {
const index = this.menuIds.indexOf(childIds[i]) const index = this.menuIds.indexOf(childIds[i])
if (index !== -1) { if (index !== -1) {
@@ -237,10 +237,10 @@ export default {
// 保存菜单 // 保存菜单
saveMenu() { saveMenu() {
this.menuLoading = true this.menuLoading = true
const role = { role_id: this.currentId, menus: [] } const role = { roleId: this.currentId, menus: [] }
// 得到已选中的 key 值 // 得到已选中的 key 值
this.menuIds.forEach(function(menu_id) { this.menuIds.forEach(function(menuId) {
const menu = { menu_id: menu_id } const menu = { menuId: menuId }
role.menus.push(menu) role.menus.push(menu)
}) })
crudRoles.editMenu(role).then(() => { crudRoles.editMenu(role).then(() => {
@@ -257,7 +257,7 @@ export default {
// 无刷新更新 表格数据 // 无刷新更新 表格数据
crudRoles.get(this.currentId).then(res => { crudRoles.get(this.currentId).then(res => {
for (let i = 0; i < this.crud.data.length; i++) { for (let i = 0; i < this.crud.data.length; i++) {
if (res.menu_id === this.crud.data[i].menu_id) { if (res.menuId === this.crud.data[i].menuId) {
this.crud.data[i] = res this.crud.data[i] = res
break break
} }