当前位置: 首页 > news >正文

ant design pro v6 如何做好角色管理

先上图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
整个角色管理是如何做的吗?

首先你要处理后端,要先把角色存到用户那。

在这里插入图片描述
这是用户管理部分的内容:

可以看到一个用户是有多个角色的。

在这里插入图片描述
看到没有,存的是数组

数组的是一个 role 对象

role 对象是这样:

在这里插入图片描述
主要是存一个 name 就好。permissions 是权限列表。

import { Request, Response } from 'express';
import Role from '../models/role';
import handleAsync from '../utils/handleAsync';// Build query based on query parameters
const buildQuery = (queryParams: any): any => {const query: any = {};if (queryParams.name) {query.name = { $regex: queryParams.name, $options: 'i' };}return query;
};// 获取所有角色
const getRoles = handleAsync(async (req: Request, res: Response) => {const { current = '1', pageSize = '10' } = req.query;const query = buildQuery(req.query);const roles = await Role.find(query).populate('permissions').sort('-createdAt') // Sort by creation time in descending order.skip((+current - 1) * +pageSize).limit(+pageSize).exec();res.json({success: true,data: roles,});
});// 根据 ID 获取角色
const getRoleById = handleAsync(async (req: Request, res: Response) => {const role = await Role.findById(req.params.id).exec();if (!role) {res.status(404);throw new Error('Role not found');}res.json({success: true,data: role,});
});// 添加新角色
const addRole = handleAsync(async (req: Request, res: Response) => {const newRole = new Role({...req.body,});const savedRole = await newRole.save();res.json({success: true,data: savedRole,});
});// 更新角色
const updateRole = handleAsync(async (req: Request, res: Response) => {const { id } = req.params;const updatedRole = await Role.findByIdAndUpdate(id,{ ...req.body },{ new: true },).exec();if (!updatedRole) {res.status(404);throw new Error('Role not found');}res.json({success: true,data: updatedRole,});
});// 删除角色
const deleteRole = handleAsync(async (req: Request, res: Response) => {const { id } = req.params;const role = await Role.findByIdAndDelete(id).exec();if (!role) {res.status(404);throw new Error('Role not found');}res.json({success: true,data: { message: 'Role deleted successfully' },});
});// 批量删除角色
const deleteMultipleRoles = handleAsync(async (req: Request, res: Response) => {const { ids } = req.body;await Role.deleteMany({_id: { $in: ids },}).exec();res.json({success: true,message: `${ids.length} roles deleted successfully`,});
});export {getRoles,getRoleById,addRole,updateRole,deleteRole,deleteMultipleRoles,
};

这是后端代码,就是增删改查。比较容易理解。

前端:

import { useIntl } from '@umijs/max';
import React, { Key, useState } from 'react';
import { ProForm, ProFormText } from '@ant-design/pro-components';
import { Form, Input, Spin, Tree } from 'antd';
import useQueryList from '@/hooks/useQueryList';
import { FormInstance } from 'antd/es/form';
import { Permission } from '@/apiDataStructures/ApiDataStructure';interface Props {form?: FormInstance<any>;newRecord?: boolean;onFinish: (formData: any) => Promise<void>;values?: any;
}const BasicForm: React.FC<Props> = ({ newRecord, onFinish, values }) => {const intl = useIntl();const { items: permissionGroups, loading } = useQueryList('/permission-groups/list');const [expandedKeys, setExpandedKeys] = useState<Key[]>([]);const [autoExpandParent, setAutoExpandParent] = useState<boolean>(true);const [checkedKeys, setCheckedKeys] = useState<Key[] | { checked: Key[]; halfChecked: Key[] }>(values.permissions?.map((permission: Permission) => `${permission._id}`) ?? [],);const [selectedKeys, setSelectedKeys] = useState<Key[]>([]);const onExpand = (expandedKeysValue: Key[]) => {setExpandedKeys(expandedKeysValue);setAutoExpandParent(false);};const onCheck = (checkedKeysValue: Key[] | { checked: Key[]; halfChecked: Key[] }) => {setCheckedKeys(checkedKeysValue);console.log('checkedKeysValue', checkedKeysValue);};const onSelect = (selectedKeysValue: Key[]) => {setSelectedKeys(selectedKeysValue);};return (<ProForminitialValues={{...values,permissions: values?.permissions?.map((permission: Permission) => permission._id),}}onFinish={async (values) => {await onFinish({...values,permissions: checkedKeys,});}}><ProForm.Group><ProFormTextrules={[{ required: true, message: intl.formatMessage({ id: 'enter_name' }) }]}width="md"label={intl.formatMessage({ id: 'name' })}name="name"/><ProForm.Item name="permissions" label={intl.formatMessage({ id: 'permission_choose' })}><Spin spinning={loading}><TreecheckableonExpand={onExpand}expandedKeys={expandedKeys}autoExpandParent={autoExpandParent}onCheck={onCheck}checkedKeys={checkedKeys}onSelect={onSelect}selectedKeys={selectedKeys}treeData={permissionGroups} // Use filtered top-level groupsfieldNames={{ title: 'name', key: '_id', children: 'children' }}/></Spin></ProForm.Item></ProForm.Group>{!newRecord && (<Form.Item name="_id" label={false}><Input type="hidden" /></Form.Item>)}</ProForm>);
};export default BasicForm;

https://www.qiuzhi99.com/playlists/antdpromakemoney.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • FastAPI部署大模型Llama 3.1
  • STM32标准库学习笔记-6.定时器-输入捕获
  • final
  • Redis5优化-Redis
  • Burp Suite、Wireshark与Fiddler:三款网络工具深度解析与比较
  • 【C++篇】迈入新世界的大门——初识C++(上篇)
  • JavaEE篇:多线程(1)
  • 计算机网络中用于远程访问和文件传输的不同方式
  • 数据结构入门——07堆
  • Spring Boot自动配置原理
  • 乌龟对对碰在线版
  • 第七十四:前端实现点击页面某个菜单跳转到对应的锚点功能
  • 微信怎么恢复聊天记录?轻松4招,恢复消失的聊天记录
  • OpenCv图像处理: 时域滤波与频域滤波
  • flink车联网项目:维表离线同步(第69天)
  • Centos6.8 使用rpm安装mysql5.7
  • const let
  • FastReport在线报表设计器工作原理
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Joomla 2.x, 3.x useful code cheatsheet
  • Map集合、散列表、红黑树介绍
  • python 学习笔记 - Queue Pipes,进程间通讯
  • tab.js分享及浏览器兼容性问题汇总
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端知识点整理(待续)
  • 使用权重正则化较少模型过拟合
  • 异常机制详解
  • 转载:[译] 内容加速黑科技趣谈
  • puppet连载22:define用法
  • #pragma once与条件编译
  • (12)Hive调优——count distinct去重优化
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (HAL库版)freeRTOS移植STMF103
  • (多级缓存)缓存同步
  • (二)丶RabbitMQ的六大核心
  • (规划)24届春招和25届暑假实习路线准备规划
  • (回溯) LeetCode 131. 分割回文串
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)C#调用WebService 基础
  • (转)fock函数详解
  • (转)jQuery 基础
  • .apk 成为历史!
  • .gitignore文件---让git自动忽略指定文件
  • .htaccess配置重写url引擎
  • .NET Core 中的路径问题
  • @DataRedisTest测试redis从未如此丝滑
  • [000-002-01].数据库调优相关学习
  • [AI StoryDiffusion] 创造神奇故事,AI漫画大乱斗!
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [CCIE历程]CCIE # 20604
  • [GHCTF 2024 新生赛]ezzz_unserialize
  • [GN] Vue3.2 快速上手 ---- 核心语法2