從0開始的中后臺管理系統-5(userList動態展示以及上傳圖片和彈出創建用戶表單)

? ? ? ? 項目用的都是antd組件,這里的userList組件展示的表單組件的數據直接get請求拿過來展示的,這里隨機生成了50個用戶只是為了展示表單的api設置。首先就是表單展示需要兩個參數current和pageSize兩個屬性控制表單的最大分頁和當前頁面。那么我們就設置初始值然后通過訪問服務器返回來一些數據,這里我們不用服務器返回的,只是用自己設置的一些數據去展示效果,還有onChange自帶的api監聽page和pageSize去獲取變化后的然后更新就好了,.直接上代碼。

1.userList動態展示

? ? ? ? 效果圖

import React, { useState, useEffect, useRef } from 'react'
import type { PageParams, User } from '@/types/api'
import type { TableColumnsType } from 'antd'
import { Button, Table, Form, Input, Select, Space } from 'antd'
import api from '@/api/index'
import { toLocalDate } from '@/utils'
import CreateUser from './CreateUser'
import type { IAction } from '@/types/modal'
export default function UserList() {const userRef = useRef<{open: (type: IAction, data?: User.UserItem) => void | undefined}>(null)//獲取表單對象 用里面的方法 getFieldsValue獲取表單中填寫的內容const [form] = Form.useForm()const [data, setData] = useState<User.UserItem[]>([])const [total, setTotal] = useState(0)const [pagination, setPagination] = useState({current: 1,pageSize: 10})// 獲取用戶列表const getUserList = async (params: PageParams) => {const values = form.getFieldsValue()const data = await api.getUserList({...values,pageNum: params.pageNum,pageSize: params.pageSize})const list = Array.from({ length: 51 }).fill({}).map((item: any) => {item = { ...data.list[0] }item.userId = Math.random()return item})setData(list) // 注意:接口返回結構要和這里匹配setTotal(list.length)setPagination({current: params.pageNum,pageSize: params.pageSize})}//創建const handleCreate = () => {userRef.current?.open('create')}//搜索const handleSearch = () => {getUserList({pageNum: 1,pageSize: pagination.pageSize})}//重置 表單const handleReset = () => {form.resetFields()}// 組件掛載時調用useEffect(() => {getUserList({pageNum: pagination.current,pageSize: pagination.pageSize})}, [pagination.current, pagination.pageSize])const columns: TableColumnsType<User.UserItem> = [{title: '用戶ID',dataIndex: 'userId',key: 'userId'},{title: '用戶名稱',dataIndex: 'userName',key: 'userName'},{title: '用戶郵箱',dataIndex: 'userEmail',key: 'userEmail'},{title: '用戶角色',dataIndex: 'role',key: 'role',render(role: number) {return {0: '超級管理員',1: '管理員',2: '體驗管理員',3: '普通用戶'}[role]}},{title: '用戶狀態',dataIndex: 'state',key: 'state',render(state: number) {return {1: '在職',2: '離職',3: '試用期'}[state]}},{title: '注冊時間',dataIndex: 'create', // 你的字段是 create,不是 createTimekey: 'create',render(createTime: string) {return toLocalDate(createTime)}},{title: '操作',key: 'action',render(_, record) {return (<Space><Button type='text'>編輯</Button><Button type='text' danger>刪除</Button></Space>)}}]return (<div className='user-list'><Formform={form}className='search-form'layout='inline'initialValues={{ state: 0 }}><Form.Item name='userId' label='用戶ID'><Input placeholder='請輸入用戶ID' /></Form.Item><Form.Item name='userName' label='用戶名稱'><Input placeholder='請輸入用戶名稱' /></Form.Item><Form.Item name='state' label='狀態'><Select style={{ width: 120 }}><Select.Option value={0}>所有</Select.Option><Select.Option value={1}>在職</Select.Option><Select.Option value={2}>試用</Select.Option><Select.Option value={3}>離職</Select.Option></Select></Form.Item><Form.Item><Space><Button onClick={handleSearch} type='primary' className='mr10'>搜索</Button><Button onClick={handleReset} type='default'>重置</Button></Space></Form.Item></Form><div className='base-table'><div className='header-wrapper'><div className='title'>用戶列表</div><div className='action'><Button type='primary' onClick={handleCreate}>新增</Button><Button type='primary' danger>批量刪除</Button></div></div><TablerowKey='userId' // 保證每行有唯一 keypagination={{position: ['bottomRight'],current: pagination.current,pageSize: pagination.pageSize,total: total,showQuickJumper: true,showSizeChanger: true,showTotal: function (total) {return 總共:${total}條},onChange: (page, pageSize) => {setPagination({current: page,pageSize: pageSize})}}}borderedrowSelection={{ type: 'checkbox' }}dataSource={data}columns={columns}/></div><CreateUsermRef={userRef}updata={() => {getUserList({pageNum: 1,pageSize: 10})}}/></div>)
}

2.創建表單以及上傳頭像功能(點擊新增彈出取消關閉以及發送成功關閉)

? ? ? ? 效果圖

????????

? ? ? ?靜態的展示就不說了,用戶頭像我們在上傳之前,

????????

? ? ? ? ? ? ? ? 無非就是上傳之后服務器發送回來url然后去替換展示,然后三元表達式就實現了。主要是怎么可以實現點擊新增跳出來子組件也就是創建表單。

? ? ? ? 首先我們可以設置子組件默認不展示的,也就是open我們設置為關閉,我們希望父組件可以操作子組件的屬性,而且我們還希望添加成功后立馬重新加載獲取新列表,那么我們就給子組件傳遞參數,一個我們設置的ref扔過去,以及一個更新方法。

? ? ? ? 然后子組件mRef綁定父組件設置的ref那么就拿到了子組件的DOM元素了,但是方法還是拿不到,也就是我們沒辦法去操作子組件設置的vibale狀態去控制子組件的展示和關閉,那么子組件用useImperativehandle暴露一個open方法,然后open方法可以接收一個類型,因為這個表單我們要在增加更新都需要用到,然后更新vision,這樣就實現了完整了邏輯。上代碼。

import React, { useState, useEffect, useRef } from 'react'
import type { PageParams, User } from '@/types/api'
import type { TableColumnsType } from 'antd'
import { Button, Table, Form, Input, Select, Space } from 'antd'
import api from '@/api/index'
import { toLocalDate } from '@/utils'
import CreateUser from './CreateUser'
import type { IAction } from '@/types/modal'
export default function UserList() {const userRef = useRef<{open: (type: IAction, data?: User.UserItem) => void | undefined}>(null)//獲取表單對象 用里面的方法 getFieldsValue獲取表單中填寫的內容const [form] = Form.useForm()const [data, setData] = useState<User.UserItem[]>([])const [total, setTotal] = useState(0)const [pagination, setPagination] = useState({current: 1,pageSize: 10})// 獲取用戶列表const getUserList = async (params: PageParams) => {const values = form.getFieldsValue()const data = await api.getUserList({...values,pageNum: params.pageNum,pageSize: params.pageSize})const list = Array.from({ length: 51 }).fill({}).map((item: any) => {item = { ...data.list[0] }item.userId = Math.random()return item})setData(list) // 注意:接口返回結構要和這里匹配setTotal(list.length)setPagination({current: params.pageNum,pageSize: params.pageSize})}//創建const handleCreate = () => {userRef.current?.open('create')}//搜索const handleSearch = () => {getUserList({pageNum: 1,pageSize: pagination.pageSize})}//重置 表單const handleReset = () => {form.resetFields()}// 組件掛載時調用useEffect(() => {getUserList({pageNum: pagination.current,pageSize: pagination.pageSize})}, [pagination.current, pagination.pageSize])const columns: TableColumnsType<User.UserItem> = [{title: '用戶ID',dataIndex: 'userId',key: 'userId'},{title: '用戶名稱',dataIndex: 'userName',key: 'userName'},{title: '用戶郵箱',dataIndex: 'userEmail',key: 'userEmail'},{title: '用戶角色',dataIndex: 'role',key: 'role',render(role: number) {return {0: '超級管理員',1: '管理員',2: '體驗管理員',3: '普通用戶'}[role]}},{title: '用戶狀態',dataIndex: 'state',key: 'state',render(state: number) {return {1: '在職',2: '離職',3: '試用期'}[state]}},{title: '注冊時間',dataIndex: 'create', // 你的字段是 create,不是 createTimekey: 'create',render(createTime: string) {return toLocalDate(createTime)}},{title: '操作',key: 'action',render(_, record) {return (<Space><Button type='text'>編輯</Button><Button type='text' danger>刪除</Button></Space>)}}]return (<div className='user-list'><Formform={form}className='search-form'layout='inline'initialValues={{ state: 0 }}><Form.Item name='userId' label='用戶ID'><Input placeholder='請輸入用戶ID' /></Form.Item><Form.Item name='userName' label='用戶名稱'><Input placeholder='請輸入用戶名稱' /></Form.Item><Form.Item name='state' label='狀態'><Select style={{ width: 120 }}><Select.Option value={0}>所有</Select.Option><Select.Option value={1}>在職</Select.Option><Select.Option value={2}>試用</Select.Option><Select.Option value={3}>離職</Select.Option></Select></Form.Item><Form.Item><Space><Button onClick={handleSearch} type='primary' className='mr10'>搜索</Button><Button onClick={handleReset} type='default'>重置</Button></Space></Form.Item></Form><div className='base-table'><div className='header-wrapper'><div className='title'>用戶列表</div><div className='action'><Button type='primary' onClick={handleCreate}>新增</Button><Button type='primary' danger>批量刪除</Button></div></div><TablerowKey='userId' // 保證每行有唯一 keypagination={{position: ['bottomRight'],current: pagination.current,pageSize: pagination.pageSize,total: total,showQuickJumper: true,showSizeChanger: true,showTotal: function (total) {return 總共:${total}條},onChange: (page, pageSize) => {setPagination({current: page,pageSize: pageSize})}}}borderedrowSelection={{ type: 'checkbox' }}dataSource={data}columns={columns}/></div><CreateUsermRef={userRef}updata={() => {getUserList({pageNum: 1,pageSize: 10})}}/></div>)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92508.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring MVC REST API設計詳解:從零構建高效接口

1. Spring MVC與REST API基礎1.1 RESTful架構的六大約束詳解RESTful架構是Roy Thomas Fielding在2000年博士論文中提出的軟件架構風格&#xff0c;它包含六個核心約束&#xff0c;這些約束共同構成了RESTful API的設計原則。客戶端-服務器約束&#xff08;Client-Server&#x…

基于STM32F030C8T6單片機實現與CH224Q誘騙芯片的I2C通信和電壓輸出配置

基于項目的需要,對STM32F030的IIC研究了幾天,終于完成了通信,接下來具體實現如下: 本單片機使用的是PB8和PB9管腳進行實現,采用的是模擬的IIC進行 void MyI2C_W_SCL(uint8_t BitValue)//這三個函數將讀寫io口封裝起來,增強可讀性 { GPIO_WriteBit(GPIOB, GPIO_Pin_8…

TSMaster-C小程序使用

打開同星的TSMaster&#xff0c;推薦用32版本的&#xff0c;比64更穩定。同星的TSMaster的C小程序支持用戶嵌入代碼來控制CAN報文的收發邏輯。便于開發。點擊設計里面的C小程序。 比如我現在想用小程序來實現繼電器0先開后關開1s關1s&#xff0c;然后繼電器1開1s關1s…如此往復…

XSS滲透測試原理/步驟/攻擊方法/防御/常用語法

**核心概念回顧&#xff1a;**XSS漏洞一直被評估為web漏洞中危害較大的漏洞&#xff0c;在OWASP TOP10的排名中一直屬于前三的江湖地位。XSS是一種發生在前端瀏覽器端的漏洞&#xff0c;所以其危害的對象也是前端用戶。 形成XSS漏洞的主要原因是程序對輸入和輸出沒有做合適的處…

目標檢測數據集 - 自動駕駛場景道路異常檢測數據集下載「包含VOC、COCO、YOLO三種格式」

數據集介紹&#xff1a;自動駕駛場景道路異常檢測數據集&#xff0c;真實場景高質量道路圖片數據&#xff0c;涉及場景豐富&#xff0c;且類別豐富&#xff0c;劃分為 "LMVs 輕型機動車&#xff08;汽車、摩托車、小型卡車、小型貨車"、"HMVs 公交車、卡車、拖拉…

多模態新方向|從數據融合到場景落地,解鎖視覺感知新范式

來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;多模態學習&#xff08;Multimodal Learning&#xff09;是通過整合多種數據模態來提升模型對復雜場景感知與理解能力的技術&#xff0c;其核心是利用不同模態的互補性突破…

機器學習之隨機森林

目錄 一、什么是隨機森林&#xff1f; 1. 從決策樹到集成學習&#xff1a;為什么需要 "森林"&#xff1f; 2.什么是集成學習 二、隨機森林的工作原理 三、隨機森林構造過程 四、隨機森林api介紹 五、隨機森林的優缺點 六、垃圾郵件判斷案例 1.數據集介紹 ?…

云平臺運維工具 —— 阿里云原生工具

一、簡介阿里云作為國內領先的云服務提供商&#xff0c;擁有一套完整的原生運維工具體系&#xff0c;這些工具與阿里云的各類服務深度融合&#xff0c;能夠滿足用戶在資源部署、監控告警、權限管理、自動化運維等方面的需求。無論是簡單的應用托管還是復雜的企業級架構&#xf…

Linux-Day10.系統安全保護web服務管理

今日目標&#xff1a;- 日志管理- 系統安全保護 SELinux&#xff08;重點&#xff09;- 構建基本web服務&#xff08;重點&#xff09;環境準備還原快照網絡配置完成&#xff0c;開啟虛擬機A與虛擬機B用真機連通虛擬機去操作&#xff0c;準本好Xshell一、常用的網絡工具ip命令1…

解決:開啟魔法后vscode pip命令不能安裝中科大python鏡像問題

閑言少敘&#xff0c;最終實現效果就是在開啟魔法情況下&#xff0c;vscode命令行任何能通過中科大python鏡像安裝第三方庫&#xff0c;又快又不消耗魔法流量。簡單來說就兩步&#x1f447;&#xff1a; 第一步&#xff1a;配置 pip.ini 中的代理 找到或創建 pip.ini 文件&…

優化Google Pubsub到GCS的文件整合策略

引言 在使用Google Cloud Platform (GCP) 的Pubsub服務時,我們常常會遇到將消息存儲到Google Cloud Storage (GCS) 作為Avro文件的問題。本文將深入探討如何優化Google Pubsub到GCS的文件整合策略,以避免每個消息都單獨生成一個Avro文件,達到將多個消息整合到一個文件的目的…

基于鐵頭山羊STM32的平衡車電機轉速開環閉環matlab仿真

基于鐵頭山羊STM32的平衡車電機轉速開環閉環matlab仿真前言一、電機開環傳遞函數1.1 電機開環傳遞函數的零極點1.2 求系統的參數和繪制波特圖二、增加PI控制器后系統開環傳遞函數三、電機系統閉環傳遞函數四、simulink仿真五、幅值裕度、相位裕度、相位穿越頻率和截止頻率&…

P1044 [NOIP 2003 普及組] 棧

P1044 [NOIP 2003 普及組] 棧 - 洛谷 題解來自洛谷題解&#xff0c;做筆記用 假設用一個函數來表示&#xff1a; x表示當前還未入棧的數字個數 y表示當前棧中的數字個數 orz&#xff0c;大佬們真的是很厲害&#xff0c;想著遞推但是只拿了60分 #include <bits/stdc.h&g…

linux mysql 8.X主從復制

準備兩臺linux服務器,注意要鎖ip我這里如上圖 主庫 192.168.5.5/24 從庫 192.168.5.10/24 接下來確定mysql是否啟動成功并且能從外部連接 主庫從庫主服務器配置 vim編輯主服務器配置 vim /etc/my.cnf注意是下面那個添加配置代碼 log-binmysql-bin # 配置二進制日志 server-id1…

豆包新模型矩陣+PromptPilot:AI開發效率革命的終極方案

> **一套讓AI開發者告別“調參煉獄”的黃金組合,效率提升300%的實戰指南** ## 一、AI開發的范式轉移:從通用模型到**場景化矩陣** 2025年,AI應用開發面臨核心矛盾:**業務場景高度細分**與**模型能力同質化**的沖突。火山引擎的破局之道是推出**豆包1.6模型矩陣**——三…

瑞利雜波背景下不同環境的虛警概率與目標檢測概率仿真

仿真方案&#xff0c;研究在瑞利雜波背景下&#xff0c;均勻環境、多目標環境和雜波墻環境中的虛警概率(Pfa)和目標檢測概率(Pd)。 理論基礎 瑞利分布 瑞利分布常用于描述雷達雜波的幅度分布&#xff1a; p(x) (x/σ) * exp(-x/(2σ)), x ≥ 0其中σ是尺度參數&#xff0c;決定…

Spring Boot + Tesseract異步處理框架深度解析,OCR發票識別流水線

Spring Boot Tesseract異步處理框架深度解析&#xff0c;OCR發票識別流水線一、系統架構設計1.1 分布式流水線架構1.2 核心組件職責1.3 數據流設計二、Spring Boot異步框架實現2.1 線程池優化配置2.2 異步服務層設計2.3 異步流水線編排三、Tesseract深度優化3.1 發票專用訓練模…

Arm Qt編譯Qt例程出錯 GLES3/gl3.h: No such file or directory

解決方法 PC&#xff1a;Ubuntu22.04.1 QtCreator&#xff1a; 4.11.1 交叉編譯環境&#xff1a;YC6254 開發板提供的 5-編譯工具鏈->qt交叉編譯工具 在之前博客配置成功的交叉編譯環境&#xff0c;編譯Qt5.14.8自帶部分Example時&#xff0c;出現 GLES3/gl3.h: No such …

HydroOJ:開源在線判題系統的創新與實踐

HydroOJ&#xff1a;開源在線判題系統的創新與實踐 在數字化與信息化深度融合的今天&#xff0c;編程教育已成為全球教育改革的重要方向&#xff0c;而在線判題系統&#xff08;Online Judge&#xff0c;簡稱 OJ&#xff09;作為編程學習、算法訓練和競賽組織的核心工具&#…

tcpdump問題記錄

問題一: scapy發送vlan報文&#xff0c;tcpdump過濾抓包未抓到包的問題 發包 sendp([Ether(src"11:22:33:44:55:00")/Dot1Q(vlan1001)/IP()/UDP()/"Hello, VLAN!"], iface"ens9")vlan過濾抓包&#xff0c;不OK。 # tcpdump -i ens9 -nnvve -Q ou…