项目实战--权限列表

后端数据:

用表格实现权限列表

const dataSource = [{key: '1',name: '胡彦斌',age: 32,address: '西湖区湖底公园1号',},{key: '2',name: '胡彦祖',age: 42,address: '西湖区湖底公园1号',},
];const columns = [{title: '姓名',dataIndex: 'name',key: 'name',},{title: '年龄',dataIndex: 'age',key: 'age',},{title: '住址',dataIndex: 'address',key: 'address',},
];<Table dataSource={dataSource} columns={columns} />;

可以通过dataIndex这个值决定将来要将哪一项显示在table列中

设置好看的圆角按钮:

<Button type="primary" shape="circle" icon={<SearchOutlined />} />
import React,{useState,useEffect} from 'react';
import { Button,Table, Tag } from 'antd';
import { EditOutlined,DeleteOutlined } from '@ant-design/icons';
import axios from 'axios';function RightList() {const [dataSource,setdataSource]=useState([])useEffect(()=>{axios.get("http://localhost:3000/rights").then(res=>{setdataSource(res.data)})},[])const columns = [{title: 'ID',dataIndex: 'id',render:(id)=>{return <b>{id}</b>}},{title: '权限名称',dataIndex: 'title',},{title: '权限路径',dataIndex: 'key',render:(key)=>{return <Tag color='orange'>{key}</Tag>}},{title: '操作',render:(key)=>{return <div><Button type="primary" shape="circle" icon={<EditOutlined />} /><Button danger type="primary" shape="circle" icon={<DeleteOutlined />} /></div>}},];return (<div><Table dataSource={dataSource} columns={columns} /></div>);
}export default RightList;

这个实现的看分页器或者滚动条

如果不用滚动条的话还可以使用分页器

Table表格数据实现树形结构

表格是支持树形数据的展示的,当数据中有children字段的时候会自动的展示为树形表格,如果不需要或者配置为其他字段则可以用childrenColumnName进行配置

可以通过设置indentSize以控制每一层的缩进宽度

import React,{useState,useEffect} from 'react';
import { Button,Table, Tag } from 'antd';
import { EditOutlined,DeleteOutlined } from '@ant-design/icons';
import axios from 'axios';function RightList() {const [dataSource,setdataSource]=useState([])useEffect(()=>{axios.get("http://localhost:3000/rights?_embed=children").then(res=>{const list = res.datalist[0].children = ""setdataSource(res.data)})},[])const columns = [{title: 'ID',dataIndex: 'id',render:(id)=>{return <b>{id}</b>}},{title: '权限名称',dataIndex: 'title',},{title: '权限路径',dataIndex: 'key',render:(key)=>{return <Tag color='orange'>{key}</Tag>}},{title: '操作',render:(key)=>{return <div><Button type="primary" shape="circle" icon={<EditOutlined />} /><Button danger type="primary" shape="circle" icon={<DeleteOutlined />} /></div>}},];return (<div><Table dataSource={dataSource} columns={columns} pagination={{//一页显示几条数据pageSize:5}}/></div>);
}export default RightList;

 

把children字段改一下首页就不会展开了

 添加气泡框

使用对话框和气泡框都可以实现想要的效果

import React,{useState,useEffect} from 'react';
import { Button,Table, Tag,Modal } from 'antd';
import { EditOutlined,DeleteOutlined,ExclamationCircleOutlined } from '@ant-design/icons';
import axios from 'axios';
const { confirm } = Modal;function RightList() {const [dataSource,setdataSource]=useState([])useEffect(()=>{axios.get("http://localhost:3000/rights?_embed=children").then(res=>{const list = res.datalist[0].children = ""setdataSource(res.data)})},[])const columns = [{title: 'ID',dataIndex: 'id',render:(id)=>{return <b>{id}</b>}},{title: '权限名称',dataIndex: 'title',},{title: '权限路径',dataIndex: 'key',render:(key)=>{return <Tag color='orange'>{key}</Tag>}},{title: '操作',render:(record)=>{return <div><Button type="primary" shape="circle" icon={<EditOutlined />}/><Button danger type="primary" shape="circle" icon={<DeleteOutlined />} onClick={()=>confirmMethod(record)}/></div>}},];const confirmMethod = (record) => {confirm({title: 'Do you Want to delete these items?',icon: <ExclamationCircleOutlined />,onOk() {console.log('OK',record);},onCancel() {console.log('Cancel');},});console.log('确认删除')};return (<div><Table dataSource={dataSource} columns={columns} pagination={{//一页显示几条数据pageSize:5}}/></div>);
}export default RightList;

删除还要同步一下后端的数据,以及之前的一种写死的写法要做出改进,否则删除完一个之后其他的不支持展开了:

import React,{useState,useEffect} from 'react';
import { Button,Table, Tag,Modal } from 'antd';
import { EditOutlined,DeleteOutlined,ExclamationCircleOutlined } from '@ant-design/icons';
import axios from 'axios';
const { confirm } = Modal;function RightList() {const [dataSource,setdataSource]=useState([])useEffect(()=>{axios.get("http://localhost:3000/rights?_embed=children").then(res=>{const list = res.data// list[0].children = ""  不建议写死list.forEach(item=>{if(item.children.length===0){item.children = ""}})setdataSource(list)})},[])const columns = [{title: 'ID',dataIndex: 'id',render:(id)=>{return <b>{id}</b>}},{title: '权限名称',dataIndex: 'title',},{title: '权限路径',dataIndex: 'key',render:(key)=>{return <Tag color='orange'>{key}</Tag>}},{title: '操作',render:(record)=>{return <div><Button type="primary" shape="circle" icon={<EditOutlined />}/><Button danger type="primary" shape="circle" icon={<DeleteOutlined />} onClick={()=>confirmMethod(record)}/></div>}},];const confirmMethod = (record) => {confirm({title: 'Do you Want to delete these items?',icon: <ExclamationCircleOutlined />,onOk() {deleteMethod(record)},onCancel() {console.log('Cancel');},});console.log('确认删除')};const deleteMethod = (record) => {console.log(record)//同步状态  页面setdataSource(dataSource.filter(item=>item.id!==record.id))//同步状态  后端axios.delete(`http://localhost:3000/rights/${record.id}`)}return (<div><Table dataSource={dataSource} columns={columns} pagination={{//一页显示几条数据pageSize:5}}/></div>);
}export default RightList;

但是现在的代码删除children会出现问题

删除孩子就是根据id这个属性向后端发请求

import React,{useState,useEffect} from 'react';
import { Button,Table, Tag,Modal } from 'antd';
import { EditOutlined,DeleteOutlined,ExclamationCircleOutlined } from '@ant-design/icons';
import axios from 'axios';
import { data } from 'react-router-dom';
const { confirm } = Modal;function RightList() {const [dataSource,setdataSource]=useState([])useEffect(()=>{axios.get("http://localhost:3000/rights?_embed=children").then(res=>{const list = res.data// list[0].children = ""  不建议写死list.forEach(item=>{if(item.children.length===0){item.children = ""}})setdataSource(list)})},[])const columns = [{title: 'ID',dataIndex: 'id',render:(id)=>{return <b>{id}</b>}},{title: '权限名称',dataIndex: 'title',},{title: '权限路径',dataIndex: 'key',render:(key)=>{return <Tag color='orange'>{key}</Tag>}},{title: '操作',render:(record)=>{return <div><Button type="primary" shape="circle" icon={<EditOutlined />}/><Button danger type="primary" shape="circle" icon={<DeleteOutlined />} onClick={()=>confirmMethod(record)}/></div>}},];const confirmMethod = (record) => {confirm({title: 'Do you Want to delete these items?',icon: <ExclamationCircleOutlined />,onOk() {deleteMethod(record)},onCancel() {console.log('Cancel');},});console.log('确认删除')};const deleteMethod = (record) => {console.log(record);if (record.grade === 1) {// 删除一级权限//同步状态  页面setdataSource(dataSource.filter(item => item.id !== record.id));//同步状态  后端axios.delete(`http://localhost:3000/rights/${record.id}`);} else {// 找到对应的父级权限//用maplet list = dataSource.map(item => {if (item.id === record.rightId) {//修正children为数组return {...item,children: Array.isArray(item.children) ? item.children.filter(child => child.id !== record.id) : []};}return item;});//同步状态setdataSource(list);axios.delete(`http://localhost:3000/children/${record.id}`);}};return (<div><Table dataSource={dataSource} columns={columns} pagination={{//一页显示几条数据pageSize:5}}/></div>);
}export default RightList;

需要注意的是要修改children为数组,避免filter方法出错

点击气泡框:

 

有些没有权限的就禁用:

import React,{useState,useEffect} from 'react';
import { Button,Table, Tag,Modal,Popover, Switch } from 'antd';
import { EditOutlined,DeleteOutlined,ExclamationCircleOutlined } from '@ant-design/icons';
import axios from 'axios';
import { data } from 'react-router-dom';
const { confirm } = Modal;function RightList() {const [dataSource,setdataSource]=useState([])useEffect(()=>{axios.get("http://localhost:3000/rights?_embed=children").then(res=>{const list = res.data// list[0].children = ""  不建议写死list.forEach(item=>{if(item.children.length===0){item.children = ""}})setdataSource(list)})},[])const columns = [{title: 'ID',dataIndex: 'id',render:(id)=>{return <b>{id}</b>}},{title: '权限名称',dataIndex: 'title',},{title: '权限路径',dataIndex: 'key',render:(key)=>{return <Tag color='orange'>{key}</Tag>}},{title: '操作',render:(record)=>{return <div><Popover content={<div style={{textAlign:"center"}}><Switch checked= {record.pagepermisson} onChange={()=>SwitchMethod(record)}></Switch>{/* pagepermission是否存在,不存在的话就禁用 */}</div>} title="配置项" trigger={record.pagepermisson === undefined?'':'click'}><Button type="primary" shape="circle" icon={<EditOutlined />} disabled={record.pagepermisson === undefined }/>{/* 如果没有配置权限,就不显示 */}</Popover><Button danger type="primary" shape="circle" icon={<DeleteOutlined />} onClick={()=>confirmMethod(record)}/></div>}},];const SwitchMethod = (record) => {record.pagepermisson = record.pagepermisson===1?0:1//同步状态  页面setdataSource([...dataSource])if(record.grade===1){// 同步状态  后端 axios.patch(`http://localhost:3000/rights/${record.id}`,{pagepermisson:record.pagepermisson})}else{axios.patch(`http://localhost:3000/children/${record.id}`,{pagepermisson:record.pagepermisson})}}const confirmMethod = (record) => {confirm({title: 'Do you Want to delete these items?',icon: <ExclamationCircleOutlined />,onOk() {deleteMethod(record)},onCancel() {console.log('Cancel');},});console.log('确认删除')};const deleteMethod = (record) => {console.log(record);if (record.grade === 1) {// 删除一级权限//同步状态  页面setdataSource(dataSource.filter(item => item.id !== record.id));//同步状态  后端axios.delete(`http://localhost:3000/rights/${record.id}`);} else {// 找到对应的父级权限//用maplet list = dataSource.map(item => {if (item.id === record.rightId) {//修正children为数组return {...item,children: Array.isArray(item.children) ? item.children.filter(child => child.id !== record.id) : []};}return item;});//同步状态setdataSource(list);axios.delete(`http://localhost:3000/children/${record.id}`);}};return (<div><Table dataSource={dataSource} columns={columns} pagination={{//一页显示几条数据pageSize:5}}/></div>);
}export default RightList;

弹出气泡框的展示,配置成为可选项,同步后端数据, 更改状态,页面刷新

重视配置

上面的那个对话框因为antd只支持react 15 ~ 18,但是我的拉下来的项目的依赖是react19,所以需要改一下

以及如果json-server的版本不对也会出现莫名其妙的bug(数据拉取不过来)

划重点

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

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

相关文章

私有知识库 Coco AI 实战(一):Linux 平台部署

Coco AI 是一个完全开源、跨平台的统一搜索和生产力工具&#xff0c;能够连接各种数据源&#xff0c;包括应用程序、文件、Google Drive、Notion、Yuque、Hugo 等&#xff0c;帮助用户快速智能地访问他们的信息。通过集成 DeepSeek 等大型模型&#xff0c;Coco AI 实现了智能个…

【大模型】微调一个大模型需要多少 GPU 显存?

视频链接&#xff1a;微调一个模型需要多少GPU显存&#xff1f; up 主页&#xff1a;AI老兵tags&#xff1a; #GPU显存 #模型微调 #LoRA #QLoRA #参数计算 本集视频详细介绍了在模型微调过程中 GPU显存需求的计算方法&#xff0c;包括全量微调和高效微调&#xff08;如 LoRA&am…

Lambda 表达式是什么以及如何使用

目录 &#x1f4cc; Kotlin 的 Lambda 表达式详解 &#x1f3af; 什么是 Lambda 表达式&#xff1f; &#x1f525; 1. Lambda 表达式的基本语法 ✅ 示例 1&#xff1a;Lambda 基本写法 ✅ 示例 2&#xff1a;使用 it 关键字&#xff08;单参数简化&#xff09; ✅ 示例 3…

全文 MLIR TOY -- Chapter2: 发出基本的 MLIR——把AST变成SSA的 MLIR Dialect IR

现在我们已经熟悉 Toy 语言和它的AST表示&#xff0c;现在让我们看看 MLIR 是怎样帮助编译 Toy 源程序的。 简介&#xff1a;多层中间表示 其他的编译器&#xff0c;像 LLVM&#xff0c;是提供一个固定的预定义类型和指令&#xff08;通常是底层的像 RISC的指令&#xff09;。对…

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…

LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版

LLaMA Factory微调后的大模型Chat对话效果&#xff0c;与该模型使用vLLM推理架构中的对话效果&#xff0c;可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定&#xff1a;有一半是对的&#xff0c;有一半是无关的。 1、未…

004 健身房个性化训练计划——金丹期(体态改善)

个人笔记使用。 01 肱骨前移 1.放松肩前束 2.放松肩后束 2.5kg哑铃侧展 泡沫轴上下滚 招财猫 肱二头 02 溜肩 宽距的坐姿划船 上顶

【已开源】UniApp+vue3跨端应用从0到1开发指南、uniapp+vue3模板应用

在跨端开发日益成为主流的今天&#xff0c;如何高效构建规范、可维护的企业级应用&#xff1f;本文以UniAppVue3* *TypeScript**为核心技术栈&#xff0c;手把手带你从零搭建高标准的跨平台项目。 通过本文&#xff0c;你将系统掌握&#xff1a; ✅ 环境配置&#xff1a;Node…

线程池设计

线程池实际上也是一个生产者消费者模型&#xff0c;线程池可以让多个线程去任务队列中取任务&#xff0c;执行任务&#xff0c;适用于需要大量的线程来完成任务且完成任务的时间较短。 #include "log.hpp" #include <mutex> #include <condition_variable&…

黑盒测试的正交实验法

背景: 利用因果图法、判定表法可以帮助我们对于输入数据的组合情况进行用例设计&#xff0c;但当输入数据的组合数量巨大时&#xff0c;由于不太可能覆盖到每个输入组合的测试情况&#xff0c;因果图法或判定表法可能就不太适用了&#xff0c;可以采用正交实验法、来合理地减少…

Linux内核编程

linux 系 统 在 2 4 4 0 上 的 启 动 过 程 分 三个 阶 段 u-boot的启动 1.先分清寄存器的分类 RAM的分类 ROM的分类 Mini2440开发板的存 储器配置 Mini2440开发板板载: 1. 64MB sdram; 2. 256MB nand-flash; 3. 2MB nor-flash; 4. s3c2440内部还有4KB iram; Mini2440的启…

黑盒测试的判定表法(能对多条件依赖关系进行设计测试点)

定义: 判定表是分析和表达多逻辑条件下执行不同操作的工具。就是指把所有的输入条件、所有可能采取的动作按表格列出来&#xff0c;每一种条件和动作的组合构成一条规则&#xff0c;也即一条用例。 1.判定表法的引用 等价类边界值分析法主要关注单个输入类条件的测试并未考虑…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.1.2ONNX格式转换与TensorRT部署

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第四部分:工程实践与部署4.1.2 ONNX格式转换与TensorRT部署1. 模型部署的核心挑战与价值2. ONNX格式转换技术详解2.1 ONNX技术栈组成2.2 转换流程与关键技术2.3 转换常…

免费下载 | 2025年网络安全报告

报告总结了2024年的网络安全态势&#xff0c;并对2025年的安全趋势进行了预测和分析。报告涵盖了勒索软件、信息窃取软件、云安全、物联网设备安全等多个领域的安全事件和趋势&#xff0c;并提供了安全建议和最佳实践。 一、报告背景与目的 主题&#xff1a;2024企业信息安全峰…

基于Real-Sim-Real循环框架的机器人策略迁移方法

编辑&#xff1a;陈萍萍的公主一点人工一点智能 基于Real-Sim-Real循环框架的机器人策略迁移方法本文通过严谨的理论推导和系统的实验验证&#xff0c;构建了一个具有普适性的sim-to-real迁移框架。https://mp.weixin.qq.com/s/cRRI2VYHYQUUhHhP3bw4lA 01 摘要 本文提出的Rea…

语义分析(编译原理)

1.什么是语义分析: 前两个阶段&#xff0c;词法分析是从字符到单词的一级识别&#xff0c;保证了每个单词的形式是正确的&#xff0c; 语法分析是由单词到语法树的一级识别&#xff0c;如果不符合语法规则就不能建树&#xff0c;因此保证了各个语法成分的构成是正确的 词法分…

蓝桥杯备考---》贪心算法之矩阵消除游戏

我们第一次想到的贪心策略一定是找出和最大的行或者列来删除&#xff0c;每次都更新行和列 比如如图这种情况&#xff0c;这种情况就不如直接删除两行的多&#xff0c;所以本贪心策略有误 so我们可以枚举选的行的情况&#xff0c;然后再贪心的选择列和最大的列来做 #include …

LeetCode hot 100—二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1示例 2&#xff1a; …

【Java SE】Arrays类

参考笔记&#xff1a; Java中Arrays类(操作数组的工具)_java arrays-CSDN博客 Java——Arrays 类详解_java arrays类-CSDN博客 目录 1.Arrays类简介 2.Arrays.toString 2.1 使用示例 2.2 源码 3. Arrays.copyOf 3.1 使用示例 3.2 源码 4.Arrays.sort 4.1 默认排序使…

git命令简陋版本

git push git pull 临时仓库暂存区 ##############创建提交################ git init #创建git地址 git config --global user.name "***YQ1007" git config --global user.email "***gmail.com" git remote…