提交 7f62b751 编写于 作者: lakernote's avatar lakernote

(add)[整体](数据权限全新改版,支持指定到具体的mapper和method)

上级 21f7d442
......@@ -30,17 +30,19 @@
> 视频正在实时更新中,欢迎大家批评指导
#### 🌰 在线演示
🌽**地址**[http://101.132.189.23:81/admin/login.html](http://101.132.189.23:81/admin/login.html)
> **低配机轻点拍**,**穷比**✈️✈️✈️✈️✈️✈️✈️
- **用户名/密码****laker**/**lakernote**(老李提交请假申请)
- **用户名/密码****laker**/**lakernote****普通员工**-老李提交请假申请)
- **用户名/密码****yang**/**lakernote**(杨总审批)
- **用户名/密码****yang**/**lakernote****部门领导**-杨总审批)
- **用户名/密码****zhang**/**lakernote**(大于2天张总审批)
- **用户名/密码****zhang**/**lakernote****公司领导**-大于2天张总审批)
> **当前处于开发阶段** ,由于我前端技术小白水平,开发进度较慢,还有很多功能未开发完成,有想一起开发的小伙伴,请加微信☎️【**lakernote**】联系我。
......@@ -59,6 +61,7 @@
| **基于SpringTask定时任务(支持动态CRUD任务)** 🐾 | ✅ | [基于Spring Task实现动态管理任务](https://blog.csdn.net/abu935009066/article/details/116142630) |
| **在线WebLog、动态修改日志级别** 🐾 | ✅ | [在线WebLog、动态修改日志级别](https://blog.csdn.net/abu935009066/article/details/114121941) |
| **保证服务的幂等性和防止重复请求** 🐾 | ✅ | [相关文档](https://blog.csdn.net/abu935009066/article/details/117471885) |
| **独特的数据权限过滤功能** 🐾 | ✅ | |
| **前端路由守卫** | ❎ | |
| **前端按钮控制** | ❎ | |
......@@ -263,6 +266,7 @@ ext_log // 影响前端代码生成路径D:\JT\easy-admin/web/admin/view/ext/
#### 🌺部署教程
**整体部署规划结构如下:**
......@@ -332,13 +336,13 @@ web
### ☎️联系方式☎️
**个人微信: lakernote**(进群加我拉你)
**个人微信: lakernote**(进群加我拉你,备注:easyadmin
![](https://img-blog.csdnimg.cn/cf8ed2c013614143b346a453a9082232.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGFrZXJub3Rl,size_10,color_FFFFFF,t_70,g_se,x_16#pic_center)
------------------------------------------------
**微信公众号** : **Java大厂面试官**
**微信公众号** : **李哥聊架构**
![](https://img-blog.csdnimg.cn/2020110915544650.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FidTkzNTAwOTA2Ng==,size_16,color_FFFFFF,t_70#pic_center)
\ No newline at end of file
此差异已折叠。
......@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import com.laker.admin.framework.utils.EasyAdminSecurityUtils;
import com.laker.admin.module.sys.entity.SysDataPower;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
......@@ -48,25 +47,25 @@ public class LakerDataPermissionHandler implements DataPermissionHandler {
if (userInfoAndPowers.isSuperAdmin()) {
return where;
}
List<SysDataPower> userDataPowers = userInfoAndPowers.getUserDataPowers();
List<UserDataPower> userDataPowers = userInfoAndPowers.getUserDataPowers();
if (CollUtil.isEmpty(userDataPowers)) {
return where;
}
Optional<SysDataPower> dataPower = userDataPowers.stream()
.filter(sysDataPower -> StrUtil.equalsIgnoreCase(mapper, sysDataPower.getMapper())
&& StrUtil.equalsIgnoreCase(method, sysDataPower.getMethod()))
String powerCode = mapper + "." + method;
Optional<UserDataPower> dataPower = userDataPowers.stream()
.filter(sysDataPower -> StrUtil.equalsIgnoreCase(powerCode, sysDataPower.getPowerCode()))
.findFirst();
if (!dataPower.isPresent()) {
return where;
}
try {
// 1. 获取权限过滤相关信息
log.info("进行权限过滤,dataPowerFilterType:{} , where: {},mappedStatementId: {}", dataPower.get().getFilterType(), where, mappedStatementId);
log.info("进行权限过滤,dataPowerFilterType:{} , where: {},mappedStatementId: {}", dataPower.get().getDataFilterType(), where, mappedStatementId);
Expression expression = new HexValue(" 1 = 1 ");
if (where == null) {
where = expression;
}
switch (dataPower.get().getFilterType()) {
switch (dataPower.get().getDataFilterType()) {
// 查看全部
case ALL:
return where;
......
package com.laker.admin.framework.ext.mybatis;
import com.laker.admin.module.enums.DataFilterTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDataPower {
private String powerCode;
private DataFilterTypeEnum dataFilterType;
}
package com.laker.admin.framework.ext.mybatis;
import com.laker.admin.module.sys.entity.SysDataPower;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
......@@ -25,7 +24,7 @@ public class UserInfoAndPowers {
private String userTableAlias;
private String sql;
private Set<Long> deptIds;
private List<SysDataPower> userDataPowers;
private List<UserDataPower> userDataPowers;
public Boolean isSuperAdmin() {
return userId.longValue() == 1L;
......
......@@ -3,9 +3,8 @@ package com.laker.admin.framework.ext.satoken;
import cn.dev33.satoken.action.SaTokenActionDefaultImpl;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpUtil;
import com.laker.admin.framework.utils.EasyAdminSecurityUtils;
import com.laker.admin.framework.ext.mybatis.UserInfoAndPowers;
import com.laker.admin.module.enums.DataFilterTypeEnum;
import com.laker.admin.framework.utils.EasyAdminSecurityUtils;
import org.springframework.stereotype.Component;
import java.lang.reflect.AnnotatedElement;
......@@ -26,7 +25,7 @@ public class SaTokenExtActionImpl extends SaTokenActionDefaultImpl {
@Override
protected void validateAnnotation(AnnotatedElement target) {
UserInfoAndPowers currentUserInfo = EasyAdminSecurityUtils.getCurrentUserInfo();
if (currentUserInfo.isSuperAdmin()) {
if (currentUserInfo != null && currentUserInfo.isSuperAdmin()) {
return;
}
super.validateAnnotation(target);
......
......@@ -2,7 +2,7 @@ package com.laker.admin.framework.ext.satoken;
import cn.dev33.satoken.stp.StpInterface;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.laker.admin.module.sys.entity.SysMenu;
import com.laker.admin.module.sys.entity.SysPower;
import com.laker.admin.module.sys.entity.SysRolePower;
import com.laker.admin.module.sys.entity.SysUserRole;
import com.laker.admin.module.sys.service.ISysMenuService;
......@@ -35,8 +35,8 @@ public class StpInterfaceImpl implements StpInterface {
List<SysRolePower> rolePowerLists = sysRolePowerService.list(Wrappers.<SysRolePower>lambdaQuery().in(SysRolePower::getRoleId, roleIds));
List<Long> powerIds = rolePowerLists.stream().map(sysRolePower -> sysRolePower.getPowerId()).collect(Collectors.toList());
// 2是按钮
List<SysMenu> sysMenus = menuService.list(Wrappers.<SysMenu>lambdaQuery().in(SysMenu::getMenuId, powerIds).eq(SysMenu::getType, 2));
List<String> strings = sysMenus.stream().map(sysMenu -> sysMenu.getPowerCode()).collect(Collectors.toList());
List<SysPower> sysPowers = menuService.list(Wrappers.<SysPower>lambdaQuery().in(SysPower::getMenuId, powerIds).eq(SysPower::getType, 2));
List<String> strings = sysPowers.stream().map(sysMenu -> sysMenu.getPowerCode()).collect(Collectors.toList());
return strings;
}
......
......@@ -13,15 +13,16 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.laker.admin.framework.EasyAdminConstants;
import com.laker.admin.framework.aop.Metrics;
import com.laker.admin.framework.cache.ICache;
import com.laker.admin.framework.ext.mybatis.UserDataPower;
import com.laker.admin.framework.ext.mybatis.UserInfoAndPowers;
import com.laker.admin.framework.ext.satoken.MySaTokenListener;
import com.laker.admin.framework.ext.satoken.OnlineUser;
import com.laker.admin.framework.model.PageResponse;
import com.laker.admin.framework.model.Response;
import com.laker.admin.framework.utils.PageDtoUtil;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.laker.admin.module.sys.entity.SysDept;
import com.laker.admin.module.sys.entity.SysUser;
import com.laker.admin.module.sys.pojo.LoginDto;
import com.laker.admin.module.sys.service.ISysDeptService;
import com.laker.admin.module.sys.service.ISysRoleService;
import com.laker.admin.module.sys.service.ISysUserRoleService;
......@@ -75,7 +76,7 @@ public class LoginController {
}
StpUtil.login(sysUser.getUserId());
// 获取用户的数据权限
List<SysDataPower> userDataPowers = sysUserService.getUserDataPowers(sysUser.getUserId());
List<UserDataPower> userDataPowers = sysUserService.getUserDataPowers(sysUser.getUserId());
UserInfoAndPowers.UserInfoAndPowersBuilder userInfoAndPowersBuilder = UserInfoAndPowers.builder()
.deptId(sysUser.getDeptId())
.userId(sysUser.getUserId())
......
......@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.laker.admin.framework.model.Response;
import com.laker.admin.framework.aop.Metrics;
import com.laker.admin.module.sys.entity.SysMenu;
import com.laker.admin.module.sys.entity.SysPower;
import com.laker.admin.module.sys.pojo.MenuVo;
import com.laker.admin.module.sys.service.ISysMenuService;
import io.swagger.annotations.ApiOperation;
......@@ -36,7 +36,7 @@ public class SysMenuController {
public Response pageAll(@RequestParam(required = false, defaultValue = "1") long current,
@RequestParam(required = false, defaultValue = "10") long size) {
Page roadPage = new Page<>(current, size);
LambdaQueryWrapper<SysMenu> queryWrapper = new QueryWrapper().lambda();
LambdaQueryWrapper<SysPower> queryWrapper = new QueryWrapper().lambda();
Page pageList = sysMenuService.page(roadPage, queryWrapper);
return Response.ok(pageList);
}
......@@ -45,14 +45,14 @@ public class SysMenuController {
@GetMapping("/list")
@ApiOperation(value = "系统菜单表分页查询")
public Response list() {
List<SysMenu> list = sysMenuService.list(Wrappers.<SysMenu>lambdaQuery().orderByAsc(SysMenu::getSort));
List<SysPower> list = sysMenuService.list(Wrappers.<SysPower>lambdaQuery().orderByAsc(SysPower::getSort));
return Response.ok(list);
}
@PostMapping
@ApiOperation(value = "新增或者更新系统菜单表")
@SaCheckPermission("menu.update")
public Response saveOrUpdate(@RequestBody SysMenu param) {
public Response saveOrUpdate(@RequestBody SysPower param) {
return Response.ok(sysMenuService.saveOrUpdate(param));
}
......
......@@ -5,11 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.laker.admin.framework.aop.Metrics;
import com.laker.admin.framework.exception.BusinessException;
import com.laker.admin.framework.model.PageResponse;
import com.laker.admin.framework.model.Response;
import com.laker.admin.framework.model.ResultTree;
import com.laker.admin.framework.aop.Metrics;
import com.laker.admin.module.sys.entity.SysMenu;
import com.laker.admin.module.sys.entity.SysPower;
import com.laker.admin.module.sys.entity.SysRole;
import com.laker.admin.module.sys.entity.SysRolePower;
import com.laker.admin.module.sys.service.ISysMenuService;
......@@ -50,7 +51,7 @@ public class SysRoleController {
Integer roleType) {
Page roadPage = new Page<>(current, size);
LambdaQueryWrapper<SysRole> queryWrapper = new QueryWrapper().lambda();
queryWrapper.eq(SysRole::getRoleType, roleType);
queryWrapper.eq(roleType != null, SysRole::getRoleType, roleType);
Page pageList = sysRoleService.page(roadPage, queryWrapper);
return PageResponse.ok(pageList.getRecords(), pageList.getTotal());
}
......@@ -69,10 +70,29 @@ public class SysRoleController {
}
/**
* 根据角色id查询角色权限
* 如果角色是菜单角色 则剔除数据权限
* 如果角色是数据权限 则剔除非数据权限
*
* @param roleId
* @return
*/
@GetMapping("/getRolePower")
@ApiOperation(value = "根据角色id查询角色权限")
public ResultTree getRolePower(Long roleId) {
List<SysMenu> allPower = sysMenuService.list(null);
SysRole role = sysRoleService.getById(roleId);
if (role == null) {
throw new BusinessException("角色不存在");
}
List<SysPower> allPower = null;
// 菜单角色
if (role.getRoleType().equals(SysRole.ROLE_TYPE_MENU)) {
allPower = sysMenuService.list(Wrappers.<SysPower>lambdaQuery().ne(SysPower::getType, 3));
} else {
allPower = sysMenuService.list(Wrappers.<SysPower>lambdaQuery().ne(SysPower::getType, 2));
}
List<SysRolePower> myPower = sysRolePowerService.list(Wrappers.<SysRolePower>lambdaQuery().eq(SysRolePower::getRoleId, roleId));
allPower.forEach(sysPower -> {
myPower.forEach(sysRolePower -> {
......
package com.laker.admin.module.sys.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.laker.admin.module.enums.DataFilterTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 系统数据权限
* </p>
*
* @author laker
* @since 2021-10-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SysDataPower implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 数据权限id
*/
@TableId(value = "data_power_id", type = IdType.AUTO)
private Long dataPowerId;
/**
* mapper名称
*/
private String mapper;
/**
* 方法名称
*/
private String method;
/**
* 权限类型
*/
private DataFilterTypeEnum filterType;
private LocalDateTime createTime;
}
......@@ -3,6 +3,7 @@ package com.laker.admin.module.sys.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.laker.admin.module.enums.DataFilterTypeEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -11,7 +12,7 @@ import java.time.LocalDateTime;
/**
* <p>
* 系统菜单
* 系统权限
* </p>
*
* @author laker
......@@ -19,7 +20,7 @@ import java.time.LocalDateTime;
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SysMenu implements Serializable {
public class SysPower implements Serializable {
private static final long serialVersionUID = 1L;
......@@ -70,8 +71,15 @@ public class SysMenu implements Serializable {
private String remark;
private Integer type;
/**
* 如果是数据权限类型,则为数据权限标识 ExtLeaveMapper.selectPage Mapper名称+方法名称
*/
private String powerCode;
/**
* 权限类型
*/
private DataFilterTypeEnum dataFilterType;
/**
* 创建时间
*/
......
......@@ -56,12 +56,11 @@ public class SysRole implements Serializable {
private LocalDateTime createTime;
/**
* 1是菜单接口角色,2为数据角色
*/
private Integer roleType;
private DataFilterTypeEnum dataType;
private String dataSql;
/**
* 提供前端 显示
*/
......
package com.laker.admin.module.sys.mapper;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 系统数据权限 Mapper 接口
* </p>
*
* @author laker
* @since 2021-10-14
*/
public interface SysDataPowerMapper extends BaseMapper<SysDataPower> {
}
package com.laker.admin.module.sys.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.laker.admin.module.sys.entity.SysMenu;
import com.laker.admin.module.sys.entity.SysPower;
import org.apache.ibatis.annotations.Select;
import java.util.List;
......@@ -14,8 +14,8 @@ import java.util.List;
* @author laker
* @since 2021-08-04
*/
public interface SysMenuMapper extends BaseMapper<SysMenu> {
public interface SysMenuMapper extends BaseMapper<SysPower> {
@Select("select * from sys_menu where enable = #{enable} order by sort")
List<SysMenu> findAllByStatusOrderBySort(Boolean enable);
@Select("select * from sys_power where enable = #{enable} order by sort")
List<SysPower> findAllByStatusOrderBySort(Boolean enable);
}
package com.laker.admin.module.sys.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.laker.admin.framework.ext.mybatis.UserDataPower;
import com.laker.admin.module.sys.entity.SysUser;
import org.apache.ibatis.annotations.Select;
......@@ -23,10 +23,10 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
* @param userId
* @return
*/
@Select("select distinct dp.* from sys_data_power dp " +
" inner join sys_role_power rw on dp.data_power_id = rw.power_id" +
@Select("select p.* from sys_power p" +
" inner join sys_role_power rw on rw.power_id = p.menu_id" +
" inner join sys_user_role ur on rw.role_id = ur.role_id" +
" inner join sys_role r on r.role_id = ur.role_id" +
" where ur.user_id = #{userId} and r.role_type = 2")
List<SysDataPower> getUserDataPowers(Long userId);
List<UserDataPower> getUserDataPowers(Long userId);
}
package com.laker.admin.module.sys.controller;
package com.laker.admin.module.sys.pojo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
......
package com.laker.admin.module.sys.service;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 系统数据权限 服务类
* </p>
*
* @author laker
* @since 2021-10-14
*/
public interface ISysDataPowerService extends IService<SysDataPower> {
}
package com.laker.admin.module.sys.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.laker.admin.module.sys.entity.SysMenu;
import com.laker.admin.module.sys.entity.SysPower;
import com.laker.admin.module.sys.pojo.MenuVo;
import java.util.List;
......@@ -14,6 +14,6 @@ import java.util.List;
* @author laker
* @since 2021-08-04
*/
public interface ISysMenuService extends IService<SysMenu> {
public interface ISysMenuService extends IService<SysPower> {
List<MenuVo> menu();
}
package com.laker.admin.module.sys.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.laker.admin.framework.ext.mybatis.UserDataPower;
import com.laker.admin.module.sys.entity.SysUser;
import java.util.List;
......@@ -25,5 +25,5 @@ public interface ISysUserService extends IService<SysUser> {
* @param userId
* @return
*/
List<SysDataPower> getUserDataPowers(Long userId);
List<UserDataPower> getUserDataPowers(Long userId);
}
package com.laker.admin.module.sys.service.impl;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.laker.admin.module.sys.mapper.SysDataPowerMapper;
import com.laker.admin.module.sys.service.ISysDataPowerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 系统数据权限 服务实现类
* </p>
*
* @author laker
* @since 2021-10-14
*/
@Service
public class SysDataPowerServiceImpl extends ServiceImpl<SysDataPowerMapper, SysDataPower> implements ISysDataPowerService {
}
......@@ -3,7 +3,7 @@ package com.laker.admin.module.sys.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.laker.admin.module.sys.entity.SysMenu;
import com.laker.admin.module.sys.entity.SysPower;
import com.laker.admin.module.sys.entity.SysRolePower;
import com.laker.admin.module.sys.entity.SysUserRole;
import com.laker.admin.module.sys.mapper.SysMenuMapper;
......@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
* @since 2021-08-04
*/
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysPower> implements ISysMenuService {
@Autowired
ISysUserRoleService sysUserRoleService;
......@@ -43,15 +43,15 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
@Override
public List<MenuVo> menu() {
Long loginId = StpUtil.getLoginIdAsLong();
List<SysMenu> sysMenus = null;
List<SysPower> sysPowers = null;
// 超级管理员开玩笑
if (loginId.longValue() == 1L) {
sysMenus = sysMenuMapper.findAllByStatusOrderBySort(true);
sysPowers = sysMenuMapper.findAllByStatusOrderBySort(true);
} else {
sysMenus = getSysMenusPowerByLoginUser(loginId);
sysPowers = getSysMenusPowerByLoginUser(loginId);
}
List<MenuVo> menuInfo = new ArrayList<>();
for (SysMenu e : sysMenus) {
for (SysPower e : sysPowers) {
MenuVo menuVO = new MenuVo();
menuVO.setId(e.getMenuId());
menuVO.setPid(e.getPid());
......@@ -66,12 +66,12 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
return TreeUtil.toTree(menuInfo, 0L);
}
private List<SysMenu> getSysMenusPowerByLoginUser(Long loginId) {
private List<SysPower> getSysMenusPowerByLoginUser(Long loginId) {
List<SysUserRole> userRoles = sysUserRoleService.list(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, loginId));
List<Long> roleIds = userRoles.stream().map(sysUserRole -> sysUserRole.getRoleId()).collect(Collectors.toList());
List<SysRolePower> rolePowerLists = sysRolePowerService.list(Wrappers.<SysRolePower>lambdaQuery().in(SysRolePower::getRoleId, roleIds));
List<Long> powerIds = rolePowerLists.stream().map(sysRolePower -> sysRolePower.getPowerId()).collect(Collectors.toList());
return menuService.list(Wrappers.<SysMenu>lambdaQuery().in(SysMenu::getMenuId, powerIds).eq(SysMenu::getEnable, true).orderByAsc(SysMenu::getSort));
return menuService.list(Wrappers.<SysPower>lambdaQuery().in(SysPower::getMenuId, powerIds).eq(SysPower::getEnable, true).orderByAsc(SysPower::getSort));
}
}
package com.laker.admin.module.sys.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.laker.admin.module.sys.entity.SysDataPower;
import com.laker.admin.framework.ext.mybatis.UserDataPower;
import com.laker.admin.module.sys.entity.SysUser;
import com.laker.admin.module.sys.mapper.SysDeptMapper;
import com.laker.admin.module.sys.mapper.SysUserMapper;
......@@ -35,7 +35,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
}
@Override
public List<SysDataPower> getUserDataPowers(Long userId) {
public List<UserDataPower> getUserDataPowers(Long userId) {
return this.getBaseMapper().getUserDataPowers(userId);
}
}
<?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="com.laker.admin.module.sys.mapper.SysDataPowerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.laker.admin.module.sys.entity.SysDataPower">
<id column="data_power_id" property="dataPowerId" />
<result column="mapper" property="mapper" />
<result column="method" property="method" />
<result column="filter_type" property="filterType" />
<result column="create_time" property="createTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
data_power_id, mapper, method, filter_type, create_time
</sql>
</mapper>
<?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="com.laker.admin.module.sys.mapper.SysMenuMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.laker.admin.module.sys.entity.SysMenu">
<id column="id" property="id" />
<result column="pid" property="pid" />
<result column="title" property="title" />
<result column="icon" property="icon" />
<result column="href" property="href" />
<result column="target" property="target" />
<result column="sort" property="sort" />
<result column="status" property="status" />
<result column="remark" property="remark" />
<result column="create_at" property="createAt" />
<result column="update_at" property="updateAt" />
<result column="delete_at" property="deleteAt" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, pid, title, icon, href, target, sort, status, remark, create_at, update_at, delete_at
</sql>
</mapper>
......@@ -42,9 +42,11 @@
{{#if (d.type == '0') { }}
<span style="color: #2dc26b">目录</span>
{{# }else if(d.type == '1'){ }}
<span style="color: #1E9FFF">菜单</span>
<span style="color: #1E9FFF">&nbsp&nbsp菜单</span>
{{# }else if(d.type == '2'){ }}
<span style="color: red">按钮</span>
<span style="color: #eb7350">&nbsp&nbsp&nbsp&nbsp接口</span>
{{# }else if(d.type == '3'){ }}
<span style="color: red">&nbsp&nbsp&nbsp&nbsp数据</span>
{{# } }}
</script>
......@@ -86,13 +88,32 @@
cols: [
[
{type: 'checkbox'},
{field: 'title', minWidth: 200, title: '菜单名称'},
{field: 'icon', title: '图标', templet: '#icon'},
{field: 'title', minWidth: 100, title: '名称'},
{field: 'icon', width: 60, title: '图标', templet: '#icon'},
{field: 'type', title: '权限类型', templet: '#power-type'},
{field: 'powerCode', title: '权限标识'},
{field: 'enable', title: '是否可用', templet: '#power-enable'},
{field: 'sort', title: '排序'},
{title: '操作', templet: '#power-bar', width: 150, align: 'center'}
{field: 'href', title: '菜单路径', width: 380},
{field: 'powerCode', title: '权限标识', width: 200},
{
title: '数据权限', field: 'dataFilterType', align: 'center',width: 100
, templet: function (d) {
if (d.dataFilterType === 'ALL') {
return '<span style="color: red;">全部</span>'
}
if (d.dataFilterType === 'DEPT') {
return '<span style="color:red;">本部门</span>'
}
if (d.dataFilterType === 'SELF') {
return '<span style="color: red;">本人</span>'
}
return ''
}
},
{field: 'enable', title: '是否可用', templet: '#power-enable',width: 100},
{field: 'sort', title: '排序', width: 60},
{title: '操作', templet: '#power-bar', width: 150, align: 'center',width: 100}
]
]
});
......@@ -160,7 +181,7 @@
type: 2,
title: '修改',
shade: 0.1,
area: ['450px', '500px'],
area: ['500px', '600px'],
content: MODULE_PATH + 'edit.html?menuId=' + obj.data.menuId
});
}
......
......@@ -16,17 +16,11 @@
<ul id="selectParent" name="pid" class="dtree" data-id="-1"></ul>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="菜单名称"
class="layui-input">
</div>
</div>
<div class="layui-form-item" id="powerCodeItem">
<label class="layui-form-label">标识</label>
<div class="layui-input-block">
<input type="text" id="powerCode" name="powerCode" autocomplete="off" placeholder="权限标识"
<input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="名称"
class="layui-input">
</div>
</div>
......@@ -35,9 +29,18 @@
<div class="layui-input-block">
<input type="radio" lay-filter="powerType" name="type" value="0" title="目录">
<input type="radio" lay-filter="powerType" name="type" value="1" title="菜单" checked>
<input type="radio" lay-filter="powerType" name="type" value="2" title="按钮">
<input type="radio" lay-filter="powerType" name="type" value="2" title="接口">
<input type="radio" lay-filter="powerType" name="type" value="3" title="数据">
</div>
</div>
<div class="layui-form-item" id="powerCodeItem">
<label class="layui-form-label">标识</label>
<div class="layui-input-block">
<input type="text" id="powerCode" name="powerCode" autocomplete="off" placeholder="权限标识"
class="layui-input">
</div>
</div>
<div class="layui-form-item" id="powerUrlItem">
<label class="layui-form-label">路径</label>
<div class="layui-input-block">
......@@ -55,12 +58,26 @@
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item" id="iconItem">
<label class="layui-form-label">图标</label>
<div class="layui-input-block">
<input type="text" id="icon" name="icon" lay-filter="icon" class="layui-input">
</div>
</div>
<div class="layui-form-item" id="dataFilterType">
<label class="layui-form-label">数据权限</label>
<div class="layui-input-block">
<select name="dataFilterType" lay-filter="dataTypeFilter">
<option value="ALL" selected>全部</option>
<option value="DEPT">本人所在组织机构</option>
<option value="SELF">本人</option>
<!-- <option value="DEPT_SETS">自定义组织机构</option>-->
<!-- <option value="DIY">自定义sql过滤</option>-->
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
......@@ -96,6 +113,9 @@
$("#powerUrlItem").show();
$("#powerCodeItem").hide();
$("#openTypeItem").show();
$("#iconItem").hide();
$("#dataFilterType").hide();
$("#dataFilterType").val("ALL");
$("#powerCode").val("");
easyAdmin.httpGet("/sys/menu/selectTree", function (result) {
......@@ -117,7 +137,9 @@
if (this.value == '0') {
$("#powerUrlItem").hide();
$("#powerCodeItem").hide();
$("#iconItem").show();
$("#openTypeItem").hide();
$("#dataFilterType").hide();
$("#powerUrl").val("");
$("#powerCode").val("");
$("#openType").val("");
......@@ -125,11 +147,23 @@
$("#powerUrlItem").show();
$("#powerCodeItem").hide();
$("#openTypeItem").show();
$("#dataFilterType").hide();
$("#iconItem").hide();
$("#powerCode").val("");
} else if (this.value == '2') {
$("#powerUrlItem").hide();
$("#openTypeItem").hide();
$("#dataFilterType").hide();
$("#powerCodeItem").show();
$("#iconItem").hide();
$("#powerUrl").val("");
$("#openType").val("");
} else if (this.value == '3') {
$("#powerUrlItem").hide();
$("#openTypeItem").hide();
$("#powerCodeItem").show();
$("#dataFilterType").show();
$("#iconItem").hide();
$("#powerUrl").val("");
$("#openType").val("");
}
......
......@@ -19,14 +19,7 @@
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="菜单名称"
class="layui-input">
</div>
</div>
<div class="layui-form-item" id="powerCodeItem">
<label class="layui-form-label">标识</label>
<div class="layui-input-block">
<input type="text" id="powerCode" name="powerCode" autocomplete="off" placeholder="权限标识"
<input type="text" name="title" lay-verify="title" autocomplete="off" placeholder="名称"
class="layui-input">
</div>
</div>
......@@ -35,9 +28,18 @@
<div class="layui-input-block">
<input type="radio" lay-filter="powerType" name="type" value="0" title="目录">
<input type="radio" lay-filter="powerType" name="type" value="1" title="菜单" checked>
<input type="radio" lay-filter="powerType" name="type" value="2" title="按钮">
<input type="radio" lay-filter="powerType" name="type" value="2" title="接口">
<input type="radio" lay-filter="powerType" name="type" value="3" title="数据">
</div>
</div>
<div class="layui-form-item" id="powerCodeItem">
<label class="layui-form-label">标识</label>
<div class="layui-input-block">
<input type="text" id="powerCode" name="powerCode" autocomplete="off" placeholder="权限标识"
class="layui-input">
</div>
</div>
<div class="layui-form-item" id="powerUrlItem">
<label class="layui-form-label">路径</label>
<div class="layui-input-block">
......@@ -55,12 +57,26 @@
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item" id="iconItem">
<label class="layui-form-label">图标</label>
<div class="layui-input-block">
<input type="text" id="icon" name="icon" lay-filter="icon" class="layui-input">
</div>
</div>
<div class="layui-form-item" id="dataFilterType">
<label class="layui-form-label">数据权限</label>
<div class="layui-input-block">
<select name="dataFilterType" lay-filter="dataTypeFilter">
<option value="ALL" selected>全部</option>
<option value="DEPT">本人所在组织机构</option>
<option value="SELF">本人</option>
<!-- <option value="DEPT_SETS">自定义组织机构</option>-->
<!-- <option value="DIY">自定义sql过滤</option>-->
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
......@@ -161,18 +177,32 @@
$("#powerUrlItem").hide();
$("#powerCodeItem").hide();
$("#openTypeItem").hide();
$("#iconItem").show();
$("#dataFilterType").hide();
$("#powerUrl").val("");
$("#powerCode").val("");
$("#openType").val("");
} else if (this.value == '1') {
$("#powerUrlItem").show();
$("#powerCodeItem").hide();
$("#iconItem").hide();
$("#dataFilterType").hide();
$("#openTypeItem").show();
$("#powerCode").val("");
} else if (this.value == '2') {
$("#powerUrlItem").hide();
$("#openTypeItem").hide();
$("#iconItem").hide();
$("#dataFilterType").hide();
$("#powerCodeItem").show();
$("#powerUrl").val("");
$("#openType").val("");
} else if (this.value == '3') {
$("#powerUrlItem").hide();
$("#iconItem").hide();
$("#openTypeItem").hide();
$("#powerCodeItem").show();
$("#dataFilterType").show();
$("#powerUrl").val("");
$("#openType").val("");
}
......@@ -195,18 +225,32 @@
$("#powerUrlItem").hide();
$("#powerCodeItem").hide();
$("#openTypeItem").hide();
$("#dataFilterType").hide();
$("#iconItem").show();
$("#powerUrl").val("");
$("#powerCode").val("");
$("#openType").val("");
} else if (type == '1') {
$("#powerUrlItem").show();
$("#powerCodeItem").hide();
$("#iconItem").hide();
$("#dataFilterType").hide();
$("#openTypeItem").show();
$("#powerCode").val("");
} else if (type == '2') {
$("#powerUrlItem").hide();
$("#openTypeItem").hide();
$("#powerCodeItem").show();
$("#dataFilterType").hide();
$("#iconItem").hide();
$("#powerUrl").val("");
$("#openType").val("");
} else if (type == '3') {
$("#powerUrlItem").hide();
$("#openTypeItem").hide();
$("#powerCodeItem").show();
$("#dataFilterType").show();
$("#iconItem").hide();
$("#powerUrl").val("");
$("#openType").val("");
}
......
......@@ -11,15 +11,11 @@
<div class="layui-tab layui-tab-card" lay-filter="test">
<ul class="layui-tab-title">
<li class="layui-this">权限角色</li>
<li>数据角色</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<table id="role-table" lay-filter="role-table"></table>
</div>
<div class="layui-tab-item">
<table id="data-role-table" lay-filter="role-table"></table>
</div>
</div>
</div>
</div>
......@@ -45,13 +41,6 @@
</button>
</script>
<script type="text/html" id="data-role-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>
</button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i>
</button>
</script>
<script type="text/html" id="role-enable">
<input type="checkbox" name="enable" value="{{d.roleId}}" lay-skin="switch" lay-text="启用|禁用"
lay-filter="role-enable" {{d.enable? 'checked' : '' }} >
......@@ -80,7 +69,7 @@
let cols = [
[
{type: 'checkbox'},
{title: '角色名', field: 'roleName', align: 'center', width: 100},
{title: '角色名', field: 'roleName', align: 'center'},
{title: 'Key值', field: 'roleCode', align: 'center'},
{title: '角色类型', field: 'roleType', align: 'center', templet: '#role-type'},
{title: '描述', field: 'details', align: 'center'},
......@@ -91,7 +80,6 @@
easyAdmin.tableRender({
elem: '#role-table',
url: '/sys/role',
where: {roleType: 1},
page: true,
cols: cols,
skin: 'line',
......@@ -102,48 +90,6 @@
}, 'filter', 'print', 'exports']
});
easyAdmin.tableRender({
elem: '#data-role-table',
where: {roleType: 2},
url: '/sys/role',
page: true,
cols: [
[
{type: 'checkbox'},
{title: '角色名', field: 'roleName', align: 'center', width: 150},
{title: 'Key值', field: 'roleCode', align: 'center'},
{title: '角色类型', field: 'roleType', align: 'center', templet: '#role-type'},
{
title: '数据权限', field: 'dataType', align: 'center'
, templet: function (d) {
if (d.dataType === 'ALL') {
return '<span style="color: #9a6e3a;">全部</span>'
}
if (d.dataType === 'DEPT') {
return '<span style="color: #9a6e3a;">本部门</span>'
}
if (d.dataType === 'SELF') {
return '<span style="color: #9a6e3a;">本人</span>'
}
return '<span style="color: #9a6e3a;">未知</span>'
}
},
{title: '权限sql', field: 'dataSql', align: 'center'},
{title: '描述', field: 'details', align: 'center'},
{title: '操作', toolbar: '#data-role-bar', align: 'center', width: 195}
]
],
skin: 'line',
toolbar: '#role-toolbar',
defaultToolbar: [{
layEvent: 'refresh',
icon: 'layui-icon-refresh',
}, 'filter', 'print', 'exports']
});
table.on('tool(role-table)', function (obj) {
if (obj.event === 'remove') {
window.remove(obj);
......
......@@ -38,19 +38,6 @@
<input type="radio" name="roleType" lay-filter="roleType" value="2" title="数据">
</div>
</div>
<div class="layui-form-item" id="dataType">
<label class="layui-form-label">数据权限</label>
<div class="layui-input-block">
<select name="dataType" lay-filter="dataTypeFilter">
<option value="ALL" selected>全部</option>
<option value="DEPT">本人所在组织机构</option>
<option value="SELF">本人</option>
<!-- <option value="DEPT_SETS">自定义组织机构</option>-->
<!-- <option value="DIY">自定义sql过滤</option>-->
</select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">描述</label>
<div class="layui-input-block">
......@@ -78,18 +65,7 @@
<script>
layui.use(['form', 'jquery', 'easyAdmin'], function () {
let form = layui.form;
let $ = layui.jquery;
let easyAdmin = layui.easyAdmin;
$("#dataType").hide();
$("#dataType").val("ALL");
form.on("radio(roleType)", function (data) {
if (this.value == '1') {
$("#dataType").hide();
$("#dataType").val("");
} else if (this.value == '2') {
$("#dataType").show();
}
});
form.on('submit(role-save)', function (data) {
easyAdmin.http({
......
......@@ -46,19 +46,6 @@
</div>
</div>
<div class="layui-form-item" id="dataType">
<label class="layui-form-label">数据权限</label>
<div class="layui-input-block">
<select name="dataType" lay-filter="dataTypeFilter">
<option value="ALL" selected>全部</option>
<option value="DEPT">本人所在组织机构</option>
<option value="SELF">本人</option>
<!-- <option value="DEPT_SETS">自定义组织机构</option>-->
<!-- <option value="DIY">自定义sql过滤</option>-->
</select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">描述</label>
<div class="layui-input-block">
......@@ -122,25 +109,11 @@
if (result.success) {
// 表单数据回显
form.val("edit", result.data);
if (result.data.roleType == '1') {
$("#dataType").hide();
$("#dataType").val("ALL");
} else if (result.data.roleType == '2') {
$("#dataType").show();
}
} else {
layer.msg(result.msg, {icon: 2, time: 1000});
}
}
});
form.on("radio(roleType)", function (data) {
if (this.value == '1') {
$("#dataType").hide();
$("#dataType").val("ALL");
} else if (this.value == '2') {
$("#dataType").show();
}
});
})
</script>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册