Java 后端 + JavaScript 前端 实现按钮级别权限控制的解决方案

Java + JavaScript 前后端协同实现按钮权限控制

在后台管理系统中,不同用户根据角色和数据状态应展示不同的操作按钮,比如编辑、删除、审批、提交等操作。本文将介绍一种通过 Java 后端生成按钮权限 JSON,前端通过 jQuery 解析控制按钮显示的通用方案。

一、功能场景说明

用户访问列表页时,每条记录根据:
当前登录用户角色(省/市/区县)
数据的审核状态(未提交、已提交、审核通过等)
是否本人创建数据
来判断是否显示 编辑 / 删除 / 提交 / 审批 / 撤销 / 变更 / 不同意审批 / 查看详情 等按钮。

二、后端实现步骤(Java)

  1. 定义按钮权限字段
    在实体类中新增字段用于存储按钮权限的 JSON 串:
/** 按钮权限 JSON */
private String buttonJson;
  1. 按照角色和状态生成按钮权限 Map
public static Map<String, Boolean> getChangeButtonMap(Admin user, int checkStatus, boolean isMyData) {Map<String, Boolean> buttons = new HashMap<>();Integer cityId = user.getCityId();boolean isProvince = cityId == null || cityId == 130000 || cityId == 139901;boolean isCity = false;boolean isDistrict = false;if (!isProvince && cityId != null) {if (cityId % 100 == 0) {isCity = true;} else {isDistrict = true;}}// 默认所有按钮为 falsebuttons.put("btn-edit", false);buttons.put("btn-submit", false);buttons.put("btn-delete", false);buttons.put("btn-revoke", false);buttons.put("btn-approve", false);buttons.put("btn-reject", false);buttons.put("btn-change", false);buttons.put("btn-detail", true); // 详情始终可见// 按角色分配权限if (cityId == 130000) { // 超级管理员全部权限buttons.replaceAll((k, v) -> true);} else if (isProvince || isCity) {buttons.put("btn-approve", true);} else if (isDistrict) {if (checkStatus == 0) {buttons.put("btn-delete", true);}}return buttons;
}
  1. 在列表处理逻辑中注入权限 JSON
ObjectMapper objectMapper = new ObjectMapper();for (UnitChange reg : list) {boolean isMyData = reg.getCreateBy() != null && reg.getCreateBy().equals(adminId);Map<String, Boolean> buttons = getChangeButtonMap(admin, reg.getCheckStatus(), isMyData);try {String buttonJson = objectMapper.writeValueAsString(buttons);reg.setButtonJson(buttonJson);} catch (JsonProcessingException e) {e.printStackTrace();}
}

三、前端实现步骤(JavaScript + HTML)

  1. HTML 渲染模板绑定权限数据
    每一行记录的操作按钮区域(假设是一个 )绑定 data-buttons 属性,并将权限 JSON 输出:
    td 上面要加 属性 , a标签中也要加上属性
<td class="td-manage" data-buttons='${revoke.buttonJson}'><a class="btn-submit" title="提交" href="javascript:;" onclick="changeStatusSingle(${revoke.id}, 1)" class="ml-5" style="text-decoration:none"><input  class="btn btn-primary radius" type="button"  value="提交"></a><a class="btn-approve" title="审批" href="javascript:;" onclick="changeStatusSingle(${revoke.id}, 2)" class="ml-5" style="text-decoration:none"><input  class="btn btn-warning radius" type="button"  value="审批"></a><a class="btn-delete" title="删除" href="javascript:;" onclick="del(${revoke.id})" class="ml-5" style="text-decoration:none"><input  class="	btn btn-danger radius" type="button"  value="删除"></a>
</td>

注意: class 必须以 btn-xxx 命名,和后端 JSON 的 key 保持一致!

  1. jQuery 处理按钮显示隐藏逻辑
    javascript
$(function () {$('.td-manage').each(function () {var $td = $(this);var buttons = {};try {buttons = JSON.parse($td.attr('data-buttons'));} catch (e) {console.error("按钮权限 JSON 解析失败", e);}// 遍历每一个按钮权限,根据布尔值决定是否隐藏$.each(buttons, function (key, value) {if (!value) {$td.find('.' + key).hide();}});});
});

四、效果与优势

✅ 不同用户登录看到的按钮不同

✅ 审核状态改变后页面按钮自动更新(需刷新)

✅ 权限计算逻辑集中在后端,前端只负责渲染

✅ 可扩展性强:只需添加按钮标识即可扩展新功能

五、注意事项

项目 要求
JSON Key 命名 必须与按钮类名一致,如 “btn-submit” 对应
JSON 输出格式 推荐使用 Jackson 的 ObjectMapper.writeValueAsString()
前端 class 使用 每个按钮用独立 class 包装,不能共用 class
安全性 前端控制仅作展示限制,后端仍需权限校验

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

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

相关文章

RAG面试内容整理-18. 向量量化与索引压缩技术(PQ, HNSW 等)

当知识库规模达到百万甚至数亿级文档时,向量索引的存储和查询效率成为关键瓶颈。向量量化是一类用较低比特表示近似向量的方法,大幅压缩内存占用并加速相似度计算。PQ(Product Quantization)是其中最著名的方法之一,被Faiss等库广泛实现。PQ的思想是将高维向量划分为多个子…

如何显示一个 Elasticsearch 索引的字段

作者&#xff1a;来自 Elastic JD Armada 学习如何使用 _mapping 和 _search API、子字段、合成 _source 和运行时字段来显示 Elasticsearch 索引的字段。 更多阅读&#xff1a; Elasticsearch&#xff1a;从搜索中获取选定的字段 fields Elasticsearch&#xff1a;inverted …

vue3父组件把一个对象整体传入子组件,还是把一个对象的多个属性分成多个参数传入

以一个对象整体传入时&#xff0c;对象的定义&#xff1a;<template><div><p>姓名: {{ userInfo.name }}</p><p>年龄: {{ userInfo.age }}</p><p>邮箱: {{ userInfo.email }}</p></div> </template> <script s…

【unitrix数间混合计算】2.1 数间混合计算模块(src/number/mod.rs)

一、源码 这段代码是一个Rust模块的声明和导出配置&#xff0c;主要用于实现"类型级数与基本类型混合计算"的功能。 //! 类型级数与基本类型混合计算// 模块声明 // -------------------------------- mod types; // 结构体定义 mod normalize; …

脱机部署k3s

离线部署 K3s 文档 1. 准备工作 操作系统准备&#xff1a;确保服务器已安装好基础操作系统&#xff08;Ubuntu、CentOS 等&#xff09;。关闭防火墙或放通端口&#xff1a;建议关闭防火墙或确保 6443、10250 等端口已开放。准备离线资源文件&#xff1a; 下载地址 k3s-airga…

[失败记录] 使用HBuilderX创建的uniapp vue3项目添加tailwindcss3的完整过程

写在前面 放弃了。。。 1&#xff09;方案1 - 参考下面的“完整步骤” - 安装成功&#xff0c;运行成功&#xff0c;但是&#xff01;好多class不生效&#xff01; 2&#xff09;方案2 - 不安装tailwindcss&#xff0c;直接使用独立的编译好的完整css文件&#xff01; …

使用Idea去git项目,发现拉取和推送都很慢的问题

在大多数情况下&#xff0c;用Idea去对项目进行拉取和推送是很方便的&#xff0c;对于新手来说也是非常友好的但是最近博主遇到了一个问题&#xff0c;就是我feat一个简单的类&#xff0c;去提交推送都需要很长的时间&#xff0c;甚至是20分钟&#xff0c;博主去找了很多方法。…

无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用

前言在无人机作业中&#xff0c;图传系统是连接空中与地面的关键纽带&#xff0c;而 5G 便携式多卡高清视频融合终端虽不直接搭载于无人机&#xff0c;却能通过地面协同突破传统微波图传的局限&#xff0c;为无人机远程监控、应急指挥提供稳定高效的传输支撑。型号&#xff1a;…

【博客系统UI自动化测试报告】

博客系统UI自动化测试报告一、项目背景二、测试内容(一)测试用例(二)测试账号(三&#xff09;使用Selenium进行Web自动化测试1.环境搭建2.创建浏览器驱动3.编写博客登陆模块的测试用例代码4.编写博客主页展示模块的测试用例代码5.编写博客创作模块的测试用例代码6.编写博客查看…

简单手写Transformer:原理与代码详解

Transformer 作为 NLP 领域的里程碑模型&#xff0c;彻底改变了序列建模的方式。它基于自注意力机制&#xff0c;摆脱了 RNN 的序列依赖&#xff0c;实现了并行计算&#xff0c;在机器翻译、文本生成等任务中表现卓越。本文将从零开始&#xff0c;手写一个简化版 Transformer&a…

Numpy科学计算与数据分析:Numpy入门之数组操作与科学计算基础

Numpy入门实践&#xff1a;从零开始掌握科学计算利器 学习目标 通过本课程的学习&#xff0c;学员将了解Numpy的历史背景、核心特点及其在科学计算中的重要性。学员将掌握如何使用Numpy进行数组操作&#xff0c;包括数组的创建、索引、切片以及基本的数学运算&#xff0c;为后…

python:讲懂决策树,为理解随机森林算法做准备,以示例带学习,通俗易懂,容易理解和掌握

为什么要讲和学习决策树呢?主要是决策树(包括随机森林算法)不需要数据的预处理。现实世界的数据往往“脏乱差”,决策树让你在数据准备上可以少花很多功夫,快速上手,用起来非常的“省心”。总之,决策树是机器学习领域里最直观易懂、解释性最强、应用最广泛的基础模型之一…

C语言:单链表学习

文件&#xff1a;main.c #include "linkedList.h"int main(int argc, char *argv[]) {// 创建头结点NODE *head NULL;// 创建链表if (llist_create(&head, 666) < 0){perror("链表创建失败&#xff01;");return -1;}// 向链表插入数据llist_addTa…

使用 decimal 包解决 go float 浮点数运算失真

文章目录问题解决注意问题 go float 在运算的时候会出现精度问题 package mainimport ("fmt" )func main() {var a float64 0.3var b float64 0.6fmt.Println("ab", ab) // 你以为是 0.9 但是结果是&#xff1a;0.8999999999999999 }你观察到的 0.3 …

MongoDB学习专题(六)复制集和分片集群

1、概念MongoDB复制集的主要意义在于实现服务高可用&#xff0c;类似于Redis中的哨兵模式2、功能1. 数据写入主节点时将数据复制到另一个副本节点上2. 主节点发生故障时自动选举出一个新的替代节点在实现高可用的同时&#xff0c;复制集实现了其他几个作用数据分发&#xff1a;…

vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2

1.性能提升 1.1.响应式系统的改进: 从 Object.defineProperty 到 Proxy Vue2:Vue 2 的响应式系统基于 Object.defineProperty,它为每个属性单独设置 getter 和 setter。虽然能够满足基本需求,但它在以下方面存在性能瓶颈: Vue2 中数组监听的局限性:Vue2 通过Object.defi…

进程生命周期管理:从创建到终止的完整逻辑

前言 在操作系统的世界里&#xff0c;进程就像一个个忙碌的 “工作单元”&#xff0c;从被创建到完成任务后终止&#xff0c;始终遵循着一套严谨的生命周期规则。理解进程的生命周期管理&#xff0c;是揭开操作系统多任务调度神秘面纱的关键 —— 而这其中&#xff0c;进程的创…

【显示器】背光板的结构和工作原理

背光板是LCD&#xff08;液晶显示器&#xff09;中的一个重要组件&#xff0c;它负责提供屏幕所需的光源。下面我们详细解释背光板的结构和工作原理。背光板的基本结构一个典型的背光板由以下几个主要部分组成&#xff1a;LED灯条&#xff1a;通常使用白色LED作为光源。导光板&…

hadoop HDFS 重置详细步骤

有时候我们需要对hdfs重置&#xff0c;步骤如下&#xff1a; 1、停止服务 2. 清除日志节点ssh dmp-hdfs-ns1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-ns2 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt1 rm -rf /disk1/dfs/jn/meta/*ssh dmp-hdfs-dt2 rm -rf /disk1/dfs/jn/me…

前端性能优化:从请求到资源的精细调控

在用户体验为王的时代&#xff0c;前端性能直接决定产品的留存率。本文聚焦 “减少不必要的传输与加载损耗”&#xff0c;从 合并HTTP请求、启用压缩、减少Cookie、资源加载顺序 四个维度&#xff0c;拆解优化思路与落地方法。 一、合并HTTP请求&#xff1a;突破浏览器并发瓶颈…