若依添加字段权限功能

news2024/11/15 4:12:51

页面长这样

/*
 Navicat Premium Data Transfer

 Source Server         : 本地
 Source Server Type    : MySQL
 Source Server Version : 80038
 Source Host           : 127.0.0.1:3306
 Source Schema         : health

 Target Server Type    : MySQL
 Target Server Version : 80038
 File Encoding         : 65001

 Date: 27/08/2024 15:11:35
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_role_field
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_field`;
CREATE TABLE `sys_role_field`  (
  `role_id` bigint NOT NULL COMMENT '角色ID',
  `field_id` bigint NOT NULL COMMENT '字段ID',
  PRIMARY KEY (`role_id`, `field_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和字段关联表' ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

/*
 Navicat Premium Data Transfer

 Source Server         : 本地
 Source Server Type    : MySQL
 Source Server Version : 80038
 Source Host           : 127.0.0.1:3306
 Source Schema         : health

 Target Server Type    : MySQL
 Target Server Version : 80038
 File Encoding         : 65001

 Date: 28/08/2024 10:54:38
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_field
-- ----------------------------
DROP TABLE IF EXISTS `sys_field`;
CREATE TABLE `sys_field`  (
  `field_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字段ID',
  `field_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字段英文名',
  `entity_class` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '实体类名',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注信息',
  PRIMARY KEY (`field_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字段表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

    /**
     * 通过角色查询字段列表
     */
    @PreAuthorize("@ss.hasPermi('system:field:list')")
    @GetMapping(value = "/listByRoleId/{roleId}")
    public AjaxResult listByRoleId(@PathVariable("roleId") Long roleId) {

        AjaxResult ajax = AjaxResult.success();
        List<Long> list = sysFieldService.selectSysFieldListByRoleId(roleId);
        ajax.put("roleId", roleId);
        ajax.put("fieldIds", list);
        ajax.put("rows", sysFieldService.selectSysFieldList(null));
        return ajax;
    }


    /**
     * 字段分配给角色
     */
    @PreAuthorize("@ss.hasPermi('system:field:add')")
    @Log(title = "字段", businessType = BusinessType.GRANT)
    @PutMapping("/addAuthFields")
    public AjaxResult addFieldRole(Long roleId, Long[] fieldIds) {
        return toAjax(sysFieldService.insertAuthFields(roleId, fieldIds));
    }

SysFieldMapper.xml

    <select id="selectSysFieldListByUserId" parameterType="Long" resultMap="SysFieldResult">
        SELECT DISTINCT f.field_id,
                        f.entity_class,
                        f.field_name
        FROM sys_field f
                 LEFT JOIN sys_role_field rf ON f.field_id = rf.field_id
                 LEFT JOIN sys_user_role ur ON ur.role_id = rf.role_id
                 LEFT JOIN sys_role ro ON ur.role_id = ro.role_id
                 LEFT JOIN sys_user u ON ur.user_id = u.user_id
        WHERE u.user_id = #{userId}
    </select>

    <select id="selectSysFieldListByRoleId" parameterType="Long" resultType="Long">
        SELECT rf.field_id
        FROM sys_role_field rf
        WHERE rf.role_id = #{roleId}
    </select>
FieldScopeAspect.java
package com.ruoyi.framework.aspectj;


import com.github.pagehelper.Page;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysField;
import com.ruoyi.system.mapper.SysFieldMapper;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.List;

/**
 * 字段权限处理
 */
@Aspect
@Component
public class FieldScopeAspect {
    private static final Logger log = LoggerFactory.getLogger(FieldScopeAspect.class);

    @Autowired
    private SysFieldMapper fieldMapper;

    @Pointcut("@annotation(com.ruoyi.common.annotation.FieldScope)")
    public void serviceMethods() {
    }


    // 后置通知,在方法执行后执行
    @AfterReturning(pointcut = "serviceMethods()", returning = "result")
    public void afterReturning(Object result) throws IllegalAccessException {


        // 获取当前的用户
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (StringUtils.isNotNull(loginUser)) {
            SysUser currentUser = loginUser.getUser();
            // 如果是超级管理员,则不过滤数据
            if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) {
                List<SysField> fieldList = fieldMapper.selectSysFieldListByUserId(loginUser.getUserId());

                //如果有查询到的字段权限,则往下继续
                if (fieldList != null) {
                    Page<?> page = (Page<?>) result;
                    List<?> list = page.getResult();

                    for (Object object : list) {
                        String simpleEntityClassName = object.getClass().getSimpleName();//方法返回的实体类名称
                        Field[] fields = object.getClass().getDeclaredFields();

                        for (Field field : fields) {

                            for (SysField sysField : fieldList) {

                                String entityClass = sysField.getEntityClass();//查询到的实体类名称
                                String fieldName = sysField.getFieldName();

                                if (simpleEntityClassName.equals(entityClass)) {
                                    String[] fieldNameArray = fieldName.split("\\.");
                                    //含有二级对象属性的情况
                                    if (fieldNameArray.length > 1) {

                                        if (field.getName().equals(fieldNameArray[0])) {
                                            field.setAccessible(true);
                                            Object subObject = field.get(object);


                                            try {

                                                Field subField = subObject.getClass().getDeclaredField(fieldNameArray[1]);

                                                subField.setAccessible(true);
                                                subField.set(subObject, null);
                                            } catch (NoSuchFieldException e) {
                                                throw new RuntimeException(fieldNameArray[1] + "字段不存在");
                                            }


                                        }


                                    } else {

                                        if (field.getName().equals(fieldName)) {
                                            field.setAccessible(true);
                                            field.set(object, null);
                                        }

                                    }
                                }


                            }


                        }
                    }
                }


            }
        }


    }

}

package com.ruoyi.common.annotation;

import java.lang.annotation.*;

/**
 * 字段权限过滤注解
 *
 * @author wufei
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FieldScope {

    String value();
}

使用时在对应的service层加入@FieldScope("")注解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货满满!五大调光方式让你全面了解LED照明

LED的发光原理同传统照明不同&#xff0c;是靠P&#xff0d;N结发光&#xff0c;同功率的LED光源&#xff0c;因其采用的芯片不同&#xff0c;电流电压参数则不同&#xff0c;故其内部布线结构和电路分布也不同&#xff0c;导致了各生产厂商的光源对调光驱动的要求也不尽相同&a…

PHP付费心理测评小程序源码心理测试抑郁症性格测试H5变现系统源码

揭秘付费心理测试新宠&#xff1a;郁郁症性格测试小程序&#xff0c;如何变现又贴心&#xff1f; &#x1f308; 引言&#xff1a;心理健康的数字化探索 在这个快节奏、高压力的时代&#xff0c;越来越多的人开始关注自己的心理健康。付费心理测试&#xff0c;尤其是针对郁郁…

【JAVA入门】Day26 - Lambda表达式

【JAVA入门】Day26 - Lambda表达式 文章目录 【JAVA入门】Day26 - Lambda表达式一、函数式编程二、Lambda表达式的省略写法 Lambda表达式在代码中最常用的功能就是简化匿名内部类的书写。 Ingeger[] arr {2, 3, 1, 5, 6, 7, 8, 4, 9};Arrays.sort(arr, new Comparator<Int…

【深度学习与NLP】——深度卷积神经网络AlexNet

目录 一、卷积神经网络的发展历程 二、简要介绍 三、代码实现 四、缺点和过时的地方 一、卷积神经网络的发展历程 早期理论基础阶段&#xff08;20 世纪 60 年代 - 80 年代&#xff09;&#xff1a; 1968 年&#xff0c;Hubel 和 Wiesel 通过对猫视觉神经的研究&#xff0…

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型&#xff0c;快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程&#xff0c;将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。 亚马逊云科技开发者社区为开发者们提供全球的…

C++笔记12•面向对象之继承•

继承 1.继承的概念及定义 &#xff08;1&#xff09;概念&#xff1a; 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称…

【Linux】进程|进程的查看与管理|创建进程

目录 1️⃣ 进程的概念&#xff08;Process&#xff09; 1.什么是进程&#xff1f; 2.多进程管理 3. 描述进程-PCB 2️⃣ 进程的查看与管理 1.使用指令查看进程 2.通过系统调用函数查看pid 3.杀掉进程 4.ppid&#xff08;父进程id&#xff09; 3️⃣ 创建进程 fork(…

大模型面试:LLM+向量库的文档对话系统

面试题 1.1 为什么大模型需要外挂(向量)知识库&#xff1f;如何将外部知识注入大模型&#xff0c;最直接的方法&#xff1a;利用外部知识对大模型进行微调 回答 大模型需要外挂(向量)知识库的原因&#xff1a; 知识更新频率&#xff1a;大模型在训练时使用的知识是静态的&a…

关于喷墨打印:液滴喷射及基材影响的那些事儿

大家好&#xff0c;今天我们来探讨一篇关于液滴喷射在生物应用中相关知识的文章——《Understanding droplet jetting on varying substrate for biological applications》是发表于《International Journal of Bioprinting》。在生物打印领域&#xff0c;了解液滴在不同基材上…

做每日计划记录,有什么好的软件推荐2channel茅盾先生《春蚕》苏四嫂的过劳死茅盾的《秋收》主题和象征文学风格

目录 做每日计划记录&#xff0c;有什么好的软件推荐 2channel 茅盾先生《春蚕》 苏四嫂的过劳死 茅盾的《秋收》 主题和象征 文学风格 做每日计划记录&#xff0c;有什么好的软件推荐 做每日计划记录的软件有很多&#xff0c;下面是几款非常实用的推荐&#xff0c;适合…

基于yolov8的人员溺水检测告警监控系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的人员溺水检测告警监控系统是一种高效、智能的安全监控解决方案。该系统利用YOLOv8目标检测算法的先进性能&#xff0c;实现了对水域中人员溺水行为的精准识别与快速响应。 YOLOv8继承了YOLO系列算法的优点&#xff0c;如单次预测、速度快、精度高&a…

牛客周赛 Round 57(A,B,C,D,E,F,G)

比赛链接 官方题解 这场的题还不错&#xff0c;D是一个计算几何&#xff0c;考察到了一些线性代数里叉积的知识&#xff0c;E是爆搜打表&#xff0c;不太常规&#xff0c;所以做起来感觉还不错&#xff1f;FG偏简单&#xff0c;F是multiset线段树&#xff0c;G是很简单的构造…

C语言 | Leetcode C语言题解之第376题摆动序列

题目&#xff1a; 题解&#xff1a; int wiggleMaxLength(int* nums, int numsSize) {if (numsSize < 2) {return numsSize;}int prevdiff nums[1] - nums[0];int ret prevdiff ! 0 ? 2 : 1;for (int i 2; i < numsSize; i) {int diff nums[i] - nums[i - 1];if ((…

maxwell读取mysql binlog到kafka

下载地址 https://maxwells-daemon.io/解压压缩包 tar -zxvf maxwell-1.29.0.tar.gz -C /opt/module/初始化maxwell元数据库 在mysql中为maxwell创建一个数据库 复制 config.properties.example 文件 cp config.properties.example config.properties修改config.propertie…

分享一个基于node.js的宠物医院预约挂号系统vue宠物医院管理系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

JS基础之【各种运算符与运算符的优先级】

&#x1f680; 个人简介&#xff1a;某大型国企高级前端开发工程师&#xff0c;7年研发经验&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码…

Nvidia财报前夕:市场预期股价波动创纪录,AI芯片巨头引领市场热潮

引言&#xff1a;Nvidia财报前市场躁动&#xff0c;股价波动预期创新高 随着Nvidia&#xff08;英伟达&#xff09;即将发布其最新财报&#xff0c;全球投资者和交易员们正屏息以待。作为全球人工智能芯片市场的领军者&#xff0c;Nvidia的每一次财报都牵动着市场的神经。据分析…

基于SpringBoot的校园二手交易平台

1.项目介绍 基于SpringBoot实现的校园二手交易平台。 技术框架&#xff1a;SpringBoot2.0.0 MyBatis1.3.2 Mysql5.7 Bootstrap 运行环境&#xff1a;jdk8 IntelliJ IDEA maven3 后台首页、菜单管理、角色管理、用户管理、日志管理、数据备份、分类管理、物品管理、 求…

BMC解决方案丨服务器故障诊断与预测平台方案设计与实现

近日&#xff0c;OurBMC社区理事成员单位浪潮计算机科技有限公司基于开放原子开源大赛的成果梳理了一份成熟的可落地方案——《基于BMC技术的服务器故障诊断与预测平台方案设计与实现》。该方案为开放原子开源大赛的冠军之作&#xff0c;极大推动了社区产业化落地的发展和工作。…

怎么用AI做赚钱的表情包?我来教你!真能轻松变现?我们试了试。

最近看到一则新闻&#xff0c;一个小哥靠做微信表情包赚了几十万&#xff0c;这引起了我的兴趣。 这让我想到&#xff0c;无论是传统的利他思维&#xff0c;还是投资自己的头脑&#xff0c;或者是表情包这样的新兴赚钱方式&#xff0c;成功的路径从未改变。 利他思维&#xff…