svnhooks--给用户提交权限,实现单次提交

news/2024/11/15 12:35:39/文章来源:https://www.cnblogs.com/a565810497/p/18392997

在上一篇文章说到,我们通过getuser的方法向服务器请求到svn配置文件有写权限的用户,下面我们需要把用户显示在前端文件中,简单列一下前端的核心显示代码,具体的css样式就不列出来了

        <div class="user-container" id="userList" {% if commitSwitch=='true' %}style="display: flex;" {% else%}style="display: none;" {% endif %}><div class="user-list" id="noPermission"><div class="header-container"><h4>无权限用户:</h4><input type="text" id="searchBox" class="form-control search-box" placeholder="搜索用户..."></div><div class="user-items"><!-- 用户项将动态添加到这里 --></div><div class="text-center"><nav aria-label="分页导航"><ul class="pagination" id="pagination"><!-- 分页按钮将动态添加到这里 --></ul></nav></div></div><div class="button-container"><button class="move-button right" id="moveToPermission"></button><button class="move-button left" id="moveToNoPermission"></button></div><div class="user-list" id="hasPermission"><div class="header-container"><h4>有权限用户:</h4></div><div class="user-items"style="max-height: 250px;  flex-direction: column;overflow-y: auto; display: flex; margin: 5px 0;"><!-- 初始为空,移动用户后动态添加 --></div></div></div>

这里就是页面的分页处理,还是数据初始化,以及移动用户后向服务器请求更改状态

$(document).ready(function () {const usersPerPage = 10; // 每页显示的用户数量let currentPage = 1;let users = {};let filteredUsers = {hasPermission: [],noPermission: []};// 定义一个函数来获取用户列表function fetchUsers(callback) {$.get('/api/users2', function (data) {users = data; // 假设返回的是用户对象filteredUsers.hasPermission = [];filteredUsers.noPermission = [];// 根据权限分配用户到不同的列表for (const [user, hasPermission] of Object.entries(users)) {if (hasPermission) {filteredUsers.hasPermission.push(user);} else {filteredUsers.noPermission.push(user);}}callback();});}// 初始获取用户列表fetchUsers(function () {displayUsers();setupPagination();});function displayUsers() {const start = (currentPage - 1) * usersPerPage;const end = start + usersPerPage;// 显示无权限用户$('#noPermission .user-items').empty();filteredUsers.noPermission.slice(start, end).forEach(function (user) {$('#noPermission .user-items').append(`<div><label><input type="checkbox" value="${user}"> ${user}</label></div>`);});// 显示有权限用户$('#hasPermission .user-items').empty();filteredUsers.hasPermission.forEach(function (user) {$('#hasPermission .user-items').append(`<div><label><input type="checkbox" value="${user}"> ${user}</label></div>`);});}function setupPagination() {const totalPages = Math.ceil(filteredUsers.noPermission.length / usersPerPage);$('#pagination').empty(); // 清空现有的分页按钮for (let i = 1; i <= totalPages; i++) {$('#pagination').append(`<li class="page-item ${i === currentPage ? 'active' : ''}"><a class="page-link" href="#" data-page="${i}">${i}</a></li>`);}// 添加点击事件$('.page-link').click(function (e) {e.preventDefault();currentPage = parseInt($(this).data('page'));displayUsers();setupPagination();});}$('#commitSwitch').change(function () {const isChecked = $('#commitSwitch').is(':checked');getCommitSwitchStatus(function (commitSwitch11) {if (commitSwitch11 === 'true') {$('#userList').css('display', 'flex'); // 切换用户列表的显示状态} else {$('#userList').toggle(false); // 切换用户列表的显示状态}});// 发送POST请求更新开关状态$.ajax({url: '/set_switch',type: 'POST',contentType: 'application/json', // 设置请求头为JSONdata: JSON.stringify({commit_switch: isChecked.toString()}), // 转换为字符串success: function (response) {console.log('成功更新:', response); // 处理成功响应},error: function (jqXHR, textStatus, errorThrown) {console.error('更新失败:', textStatus, errorThrown); // 处理错误}});});// 定义一个函数来通过 AJAX 请求获取实时的 commit_switch 状态function getCommitSwitchStatus(callback) {$.ajax({url: '/get_switch', // 替换为实际的 API 地址method: 'GET', // 使用 GET 方法请求数据success: function (data) {const commitSwitch11 = data.commit_switch;callback(commitSwitch11);},error: function () {alert('Failed to fetch commit switch status.');}});}// 定义一个函数来移动用户项function moveUsers(fromSelector, toSelector) {console.log('moveUsers 被调用');console.log('fromSelector:', fromSelector);console.log('toSelector:', toSelector);console.log('初始有权限用户列表:', filteredUsers.hasPermission);console.log('初始无权限用户列表:', filteredUsers.noPermission);$(fromSelector + ' .user-items input:checked').each(function () {const user = $(this).val();console.log('当前处理的用户:', user);console.log('检查用户是否在目标区域:', user, '目标区域:', toSelector);// 检查用户是否已经在目标区域if (toSelector === '#hasPermission' && filteredUsers.hasPermission.includes(user)) {console.log(user + ' 已经在有权限列表中!');alert(user + ' 已经在有权限列表中!');location.reload(); // 刷新页面以更新状态return; // 不执行移动操作} else if (toSelector === '#noPermission' && filteredUsers.noPermission.includes(user)) {console.log(user + ' 已经在无权限列表中!');alert(user + ' 已经在无权限列表中!');location.reload(); // 刷新页面以更新状态return; // 不执行移动操作}const userLabel = $(this).parent().detach();$(toSelector + ' .user-items').append(userLabel);$(this).prop('checked', false);// 更新用户权限值if (toSelector === '#hasPermission') {filteredUsers.hasPermission.push(user);filteredUsers.noPermission = filteredUsers.noPermission.filter(u => u !== user);users[user] = true; // 更新权限} else {filteredUsers.noPermission.push(user);filteredUsers.hasPermission = filteredUsers.hasPermission.filter(u => u !== user);users[user] = false; // 更新权限}// 打印更新后的状态console.log('移动用户后有权限用户列表:', filteredUsers.hasPermission);console.log('移动用户后无权限用户列表:', filteredUsers.noPermission);console.log('用户权限更新:', user, '新权限:', users[user]);// 发送 AJAX 请求到服务端$.ajax({url: '/api/updateUserPermissions',method: 'POST',contentType: 'application/json',data: JSON.stringify({user: user, permission: users[user]}),success: function (response) {console.log('权限更新成功:', response);},error: function (error) {console.error('权限更新失败:', error);}});});}// 为 “Move to Permission” 按钮绑定点击事件$('#moveToPermission').click(function () {getCommitSwitchStatus(function (commitSwitch11) {if (commitSwitch11 === 'true') {fetchUsers(function () {moveUsers('#noPermission', '#hasPermission');});} else {alert('SVN锁定已经被关闭,无需再授权');location.reload(); // 刷新页面以更新状态}});});// 为 “Move to No Permission” 按钮绑定点击事件$('#moveToNoPermission').click(function () {getCommitSwitchStatus(function (commitSwitch11) {if (commitSwitch11 === 'true') {fetchUsers(function () {moveUsers('#hasPermission', '#noPermission');});} else {alert('SVN锁定已经被关闭,无需再授权');location.reload(); // 刷新页面以更新状态}});});});

 

服务端一开始请求到的用户时一个list,我们需要把它改成一个字典,key是用户名,value是提交权限,一开始全部默认是false,如果svnhoos打开,所有用户都无法提交

# 向 svn 仓库的配置文件获取有写权限的用户
users1 = get_users_with_write_access(hostname, username, password, authz_path)
users2 = {user: False for user in users1}

这里是定义一个GET方法,客户端需要请求用户数据显示

#提供用户列表
@app.route('/api/users2', methods=['GET'])
def get_users2():users_permissions = users2return jsonify(users_permissions)

这个方法是接收客户端做了授予权限以后,服务端数据的改变

更新用户提交权限,用户在网页的操作
@app.route('/api/updateUserPermissions', methods=['POST'])
def update_user_permissions():try:data = request.get_json()user = data.get('user')permission = data.get('permission')if user in users2:users2[user] = permissionresponse = {'status': 'success','message': f'{user} 权限已更新为 {permission}'}else:response = {'status': 'error','message': f'用户 {user} 不存在'}# 通知所有连接的客户端刷新页面socketio.emit('refresh_page')return jsonify(response), 200except Exception as e:return jsonify({'status': 'error','message': str(e)}), 500

在每次修改了用户权限后,我会调用socker,刷新一次页面,避免有多个用户操作页面,数据更新不及时,导致权限变更后,其他用户显示的数据是滞后的

如果用使用socket,需要在html前端加一个socker的引用

  <script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script><script>var socket = io();socket.on('refresh_page', function() {location.reload(); // 刷新页面
        });</script>

大概的效果就是如下

 

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

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

相关文章

内蒙古巴彦淖尔市事业单位工作人员在线培训网刷课脚本-JavaScript编写

脚本 学习网站:byne.chinahrt.cn 脚本地址:内蒙古巴彦淖尔市事业单位工作人员在线培训网-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Tam…

标题

标题 二级标题 加粗更多交流,请加微信:itzixueba.请备注好友来自博客园<虫吧>

Apache DolphinScheduler大规模任务调度系统对大数据实时Flink任务支持

转载自神龙大侠 我是用olphinScheduler 3.2.1版本做源代码编译部署(部署方式参考我的另外一篇文档《源代码编译,Apache DolphinScheduler前后端分离部署解决方案》) 二进制文件部署本文也适用,只需要修改相对应的配置即可。 资源管理底层基座替换成hdfs Flink程序jar包是在…

JAVA-IO流之字节的输入输出流

一、IO流的分流按流的流向分为:输入流、输出流 根据处理的数据类型分为:字节流、字符流 在计算机中、将硬盘上的文件向内存中的流为输入流(读取)、将内存中的流输出到硬盘为输出流(写)二、java流-字节输入输出流概念:流可以理解为一个数据序列、输入流表示从一个源读取数…

郑州市专业技术人员继续教育刷课脚本-JavaScript编写

脚本 学习网站:zzzj.hnhhlearning.com, zzzj.jxjyedu.org.cn 脚本地址:郑州市专业技术人员继续教育-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩…

内网穿透:frp

由于需要做微信公众号开发,就用frp做了一个内网穿透。 1.环境说明 (1).一台云服务器,公网IP为:X.X.X.X(以阿里云为例,frp的服务端) (2).一个备案域名(可以是二级域名),并解析指向到上面的IP。 以test1.cn为例。 (3).一台客户机(frp客户端,可以上网) (4).frp软件,…

获得SSH秘钥和SSL环境的可见性和控制权

未经管理的密钥和证书如何损害分层安全防御系统 多年来,由于技术的不断发展和演变,网络威胁和安全漏洞也在不断变化。企业大多都在精心研究各种解决方案和战略,以加强其安全基础设施。但是,安全问题是没有灵丹妙药的。 目前,一种备受企业推崇并被广泛采用的一种技术是利用…

使用zig语言制作简单博客网站(七)右边栏分类点击和文章搜索

分类点击事件处理 后端代码sqlite数据库article表新增cate_name字段CREATE TABLE article (id INTEGER PRIMARY KEY AUTOINCREMENT,title VARCHAR (1024) NOT NULL,description VARCHAR (1024),content TEXT NOT NULL,istop INTEGER…

ECharts实现雷达图详解

ECharts 是一款由百度开源的数据可视化工具,它提供了丰富的图表类型,如折线图、柱状图、饼图、散点图、雷达图、地图、K线图、热力图、仪表盘等,以及丰富的交互功能。ECharts 组件的核心功能实现原理主要包括以下几个方面:数据驱动: ECharts 采用数据驱动的设计理念,图表…

HTB-Runner靶机笔记

HTB-Runner靶机笔记 概述 Runner是HTB上一个中等难度的Linux靶机,它包含以下teamcity漏洞(CVE-2023-42793)该漏洞允许用户绕过身份验证并提取API令牌。以及docker容器逃逸CVE-2024-21626,进行提权操作 Runner靶机地址:https://app.hackthebox.com/machines/Runner 一、nmap …

【新品8折】正点原子ZYNQ7035/7045/7100开发板发布、ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2!

【新品发布】正点原子FPGA新品ZYNQ7035/7045/7100开发板,ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2! 正点原子Z100 ZYNQ开发板,搭载Xilinx Zynq7000系列芯片,核心板支持Xilinx Zynq-7035、Zynq-7045和Zynq-7100三种型号。开发板由核心板+底板组成,外设资源丰富,板载2路千兆…

达梦存储过程性能问题定位

在达梦数据库中可以通过V$DMSQL_EXEC_TIME和debug方式来定位存储过程存在的性能问题,但V$DMSQL_EXEC_TIME往往定位比较粗糙,没法定位到存储过程中sql的执行时间,而debug可以点位具体某段sql,但如果存储过程里面有大量游标,参数变量值很多的情况下,debug调试也花费大量时间…