引言

在现代前端开发中,数据表格的应用极为广泛,而分权限管理在许多业务场景下是必不可少的功能。例如在表格类填报需求中,不同等级的登录用户能填报的区域有所不同。SpreadJS 作为一款强大的前端表格控件,为实现这样的分权限管理提供了有效的解决方案。本文将详细介绍如何借助前端技术栈,利用 SpreadJS 实现表格的分权限管理。

正文

SpreadJS 简介

SpreadJS 是一款类 Excel 的前端表格控件,它的操作及功能与 Excel 高度类似,但又完全脱离对 Office 的依赖。将 SpreadJS 集成到前端项目并部署发布后,用户只需在 PC 上安装满足 H5 标准的浏览器(如 Chrome、Firefox、Edge 等),即可在浏览器端打开使用,这为前端开发提供了极大的便利 ^^。

选择 SpreadJS 实现分权限管理的原因

选择 SpreadJS 来做权限编辑的底层表格组件,主要是受到 Excel 中表单保护机制的启发。在 Excel 里,结合单元格锁定状态和工作表的保护状态,可以控制单元格是否可以编辑,这种可编辑控制的最小粒度能达到单元格级别。而 SpreadJS 具备类似的表单保护功能,为实现分权限管理提供了基础。

借助 SpreadJS 实现分权限管理的具体方案

编辑权限控制分类

SpreadJS 实现编辑控制的核心 API 主要有单元格锁定及表单保护。编辑权限控制整体可分为以下三类:

  1. 整个工作表不可编辑

    一个 Excel 文件称为一个工作簿,一个工作簿包含多个工作表。默认状态下,工作表的锁定状态为 true。若要设置整个工作表不可编辑,只需执行工作表保护相关代码。示例代码如下:
let designer = GC.Spread.Sheets.Designer.findControl(document.getElementById('gc-designer-container'));
let spread = designer.getWorkbook();
let sheet = spread.getActiveSheet();
sheet.options.isProtected = true;

执行上述代码后,Sheet1 中所有单元格将不能再编辑。若设置后单元格仍可编辑,可能是原 Excel 文件中默认单元格的锁定状态被修改成 false,此时可通过代码或右键设置单元格格式→保护来查看单元格的锁定状态。若需要整个工作簿都不可编辑,只需循环设置工作簿中每个工作表的保护状态即可。

  1. 部分单元格可以编辑

    不可编辑的原则是单元格锁定和表单保护同时生效。若要让部分单元格可编辑,只需将对应单元格的锁定状态设置为 false。示例代码如下:
let sheet = spread.getActiveSheet();
sheet.getRange(0, 0, 6, 3).locked(false);
sheet.options.isProtected = true;

通过上述代码,可实现设置 A1:C6 单元格可以编辑,其他单元格不能编辑的需求。若不生效,需检查其他单元格的锁定状态是否被修改为 false,若是则需将其锁定状态变为 true。

  1. 部分单元格不能编辑

    默认单元格锁定状态为 true,若只需少量单元格不能编辑,建议先将工作表的默认单元格锁定状态改为 false,之后设置部分不能编辑的单元格锁定状态为 true。示例代码如下:
let sheet = spread.getActiveSheet();
let defaultStyle = sheet.getDefaultStyle();
defaultStyle.locked = false;
sheet.setDefaultStyle(defaultStyle);
let range = sheet.getRange(0, 0, 5, 5);
range.locked(true);
sheet.options.isProtected = true;

通过上述代码,可实现橙色区域可以编辑,其他区域不能编辑的需求。若需要设置多个区域可以编辑,可继续调用区域锁定(locked)相关的 API。更详细的 UI 实现设置及代码可参考 SpreadJS 官方论坛相关教程链接。

将用户权限与单元格打通

在了解单元格编辑控制后,接下来要将用户权限与单元格打通,实现基于登录用户权限的编辑控制。SpreadJS 支持单元格标签(Tag)属性,可用于记录一些和单元格相关的额外不需要展示的信息,我们可以将单元格编辑权限的相关信息记录在单元格 Tag 中。整体实现思路如下:

  1. 预先设置权限信息:将可以编辑的用户以字符串的形式写入单元格的 Tag 中。例如,单元格 tag 为 'user1',代表当前单元格一级用户可以编辑;若单元格 tag 为 'user1,user2',则代表当前单元格一级用户与二级用户均可编辑。
  2. 遍历查询权限信息:遍历查询当前单元格 Tag 中是否包含用户等级标记信息,若包含,表明当前用户可以编辑此单元格,将单元格对应的锁定状态变为 false。

结论

借助前端技术栈和 SpreadJS,我们可以有效地实现表格的分权限管理。SpreadJS 的表单保护功能和单元格标签属性为分权限管理提供了强大的支持,通过合理运用这些功能和属性,能够满足不同业务场景下的分权限管理需求。本文提供了权限编辑的一种参考实现思路,开发者可根据实际情况进行调整和优化。同时,随着前端技术的不断发展,SpreadJS 也将在更多的场景中发挥重要作用,为前端开发带来更多的可能性。

SpreadJS

前端技术栈加持:用 SpreadJS 实现分权限管理的更多相关文章

  1. 20151028整理罗列某种开发所包括对技术(技术栈),“较为全面”地表述各种技术大系的图表:系统开发技术栈图、Web前端技术栈图、数据库技术栈图、.NET技术栈图

    ———————————— 我的软件开发生涯 (10年开发经验总结和爆栈人生) 爆栈人生 现在流行说全栈.每种开发都有其相关的技术.您是否觉得难以罗列某种开发所包括对技术(技术栈)呢?   您是否想过: ...

  2. 2019年一半已过,这些大前端技术你都GET了吗?- 下篇

    在上一篇文章中已经介绍了大前端关于状态管理.UI组件.小程序.跨平台和框架层的内容.在本文中,我会继续介绍编程语言.工程化.监控.测试和服务端,同时也会对下半年大前端可以关注的部分进行展望. 结合个人 ...

  3. 使用前端技术和MySQL+PHP制作自己的一个个人博客网站

    源代码地址:https://github.com/YauCheun/BlogCode 我的博客网站地址:http://www.yublog.fun/ 制作前景: 想拥有一个自己独自开发的一个小型博客网 ...

  4. jhipster技术栈研究

    背景: 公司新的微服务项目都用jhipster脚手架来开发,这篇博客是jhipster里面涉及到技术的汇总目录 一.官方文档中涉及到的技术栈 前端技术栈 Angular / React / Vue R ...

  5. SaaS技术栈有多复杂?

    [特别声明:本文基于Tools and Services I Use to Run My SaaS进行修改.] 软件SaaS化由于需要考量架构的各个方面,所以需要的技术栈非常全面. 以一个客户管理Sa ...

  6. SimpleNVR安防监控RTSP/FLV/HLS直播流服务如何分权限添加用户指定通道观看

    背景分析 随着SimpleNVR的用户越来越多,很多客户反馈给了我们很宝贵的简易以及用户体验.在此非常感谢大家对我们的支持.其中很多客户不想把所有的视频直播展现出来,想分权限添加新用户,指定通道让其观 ...

  7. 用“MEAN”技术栈开发web应用(一)AngularJs前端架构

    前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...

  8. Web前端开发大系概览 (前端开发技术栈)

    前言 互联网建立50多年了,网站开发技术日新月异,但web前端始终离不开浏览器,最终还是HTML+JavaScript+CSS这3个核心,围绕这3个核心而开发出来大量技术框架/解决方案. 我从2000 ...

  9. 基于.Net进行前端开发的技术栈发展路线(二)

    前言 上一篇<我的技能树>文章分享了我的技能成长过程,还未完成,今天继续跟大家分享. 01 我的技能树 我的当前的技能树: 其中,标注为黄色旗帜的是基本掌握,标注为红色旗帜的为使用熟练.未 ...

  10. 基于.Net进行前端开发的技术栈发展路线(一)

    前言 今天想讲讲的是我的技术树.我最初是做CS开发的,第一阶段的技术经历是以Powerbuilder来做CS开发,第二阶段开始基于C#做winform开发,眼看前端开发越来越流行,需要更广泛的技术栈势 ...

随机推荐

  1. B@se-还原错误字母表转码的base64编码

    题目: 密文:MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD== JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOe ...

  2. 字符串成员方法:截取、替换、切割 及String成员方法小结

    1.截取 subString() subString()方法有两种使用方式: 1.第一种是在括号里只放入一个索引,这时将会从放入的索引为起点,一直截取到末尾 2.第二种是在括号里放入两个索引,分别对应 ...

  3. Oracle return exit continue

    常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then ...

  4. javascript for...in

    在JS中我们最常见的循环语句是for循环语句,一个简单的for循环语句如下: for(var i = 0, n = 100; i < n; i++){ // to do somethings . ...

  5. 实现Android键盘自适应

    实现Android键盘自适应 unit Unit13; interface uses System.SysUtils, System.Types, System.UITypes, System.Cla ...

  6. 张高兴的大模型开发实战:(四)使用 LangGraph 实现多智能体应用

    目录 环境搭建与配置 定义智能体 加载模型 提取关键词 生成回答 连接智能体 定义图的状态 定义节点方法 根据指令路由 生成回答 文件处理 提取关键词 网络搜索 定义图的结构 运行图 运行指南 在控制 ...

  7. 基于Spring Boot的HTTP请求签名验证实现解析

    概述 在分布式系统交互中,API接口的安全性至关重要.本文将深入解析基于Spring Boot实现的HTTP请求签名验证机制,该方案支持GET/POST等多种请求方式,提供时效性验证和数据完整性保障. ...

  8. Python读取CSV文件并存储到MySQL

    在项目中对后台进行测试时,经常会遇到要在数据库新增数据,那么如何快速新增数据来提高工作效率呢? 现整理如下: 代码内容(csv_to_mysql.py): # coding=utf-8import p ...

  9. 【杂谈】死锁?NO,时间跳跃!

    在日常开发或线上运维中,我们经常会遇到各种数据库异常,例如超时.死锁等.但有些问题,表面看似平常,背后却藏着意想不到的原因. 今天就分享一次由服务器时间跳跃引发的 MySQL 获取锁超时问题的排查过程 ...

  10. tomcat-shell脚本

    自动部署项目脚本参考: #!/bin/bash#自动部署脚本source /etc/profileexport LANG=zh_CN.UTF-8#tomcat路径tomcatBinPath=/usr/ ...