項目實戰--權限列表

后端數據:

用表格實現權限列表

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.pswp.cn/diannao/76216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76216.shtml
英文地址,請注明出處:http://en.pswp.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…