ant design 的 tree 如何作为角色中的权限选择之二

news2024/9/27 9:23:07

在这里插入图片描述
还是接着上一节来 ant design 的 tree 如何作为角色中的权限选择之一

这里先放一下全部代码:

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 (
    <ProForm
      initialValues={{
        ...values,
        permissions: values?.permissions?.map((permission: Permission) => permission._id),
      }}
      onFinish={async (values) => {
        await onFinish({
          ...values,
          permissions: checkedKeys,
        });
      }}
    >
      <ProForm.Group>
        <ProFormText
          rules={[{ 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}>
            <Tree
              checkable
              onExpand={onExpand}
              expandedKeys={expandedKeys}
              autoExpandParent={autoExpandParent}
              onCheck={onCheck}
              checkedKeys={checkedKeys}
              onSelect={onSelect}
              selectedKeys={selectedKeys}
              treeData={permissionGroups} // Use filtered top-level groups
              fieldNames={{ 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;

  const { items: permissionGroups, loading } = useQueryList('/permission-groups/list');

这一部分的源码也放出来:

import { useEffect, useState } from 'react';
import { queryList } from '@/services/ant-design-pro/api';

const useQueryList = (url: string, hasPermission = true) => {
  const [items, setItems] = useState([]);
  const [loading, setLoading] = useState(false);

  const query = async () => {
    setLoading(true);
    // Only proceed with the API call if the user has permission
    if (hasPermission) {
      const response = (await queryList(url, { pageSize: 10000 })) as any;
      if (response.success) {
        setItems(response.data);
      }
    }
    setLoading(false);
  };

  useEffect(() => {
    query().catch(console.error);
  }, [hasPermission]); // Adding `hasPermission` to the dependency array to re-run the effect if it changes

  return { items, setItems, loading };
};

export default useQueryList;

为什么编辑的时候会填充上选中的状态?

 <ProForm
      initialValues={{
        ...values,
        permissions: values?.permissions?.map((permission: Permission) => permission._id),
      }}
      onFinish={async (values) => {
        await onFinish({
          ...values,
          permissions: checkedKeys,
        });
      }}
    >

主要是这个 initialValues ,permissions 是 那个 name ,对上了就好。

但是提交的时候要把 permissions 带上。

后端的话可以参考我的设计,

我是权限组是有层级的,然后权限组下面有权限

import mongoose, { Document } from 'mongoose';

export interface IPermissionGroup extends Document {
  name: string;
  parent?: IPermissionGroup;
  children?: IPermissionGroup[];
  createdAt?: Date;
  updatedAt?: Date;
}

const permissionGroupSchema = new mongoose.Schema(
  {
    name: { type: String, required: true, unique: true },
    parent: { type: mongoose.Schema.Types.ObjectId, ref: 'PermissionGroup' },
  },
  { timestamps: true },
);

const PermissionGroup = mongoose.model<IPermissionGroup>(
  'PermissionGroup',
  permissionGroupSchema,
);

export default PermissionGroup;

import mongoose, { Document } from 'mongoose';
import { IPermissionGroup } from './permissionGroup';


export interface IPermission extends Document {
  name: string;
  path: string;
  action: string;
  permissionGroup: IPermissionGroup;
  createdAt?: Date;
  updatedAt?: Date;
}

const permissionSchema = new mongoose.Schema({
  name: { type: String, required: true },
  path: { type: String, required: true },
  action: { type: String, required: true },
  permissionGroup: { type: mongoose.Schema.Types.ObjectId, ref: 'PermissionGroup' },
}, { timestamps: true });

const Permission = mongoose.model<IPermission>('Permission', permissionSchema);

export default Permission;

大约是这样的情况,希望对大家有所帮助

我的网站

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

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

相关文章

Python爬虫案例一:获取古诗文并按用户输入的作者名进行数据保存

前言&#xff1a; 1、什么是爬虫&#xff1f;也称为网页蜘蛛&#xff08;Web Spider&#xff09;&#xff0c;通俗来说&#xff0c;解放人的双手, 去互联网获取数据, 以数据库, txt, excel, csv, pdf, 压缩文件, image, video, music保存数据。本质: 模拟浏览器, 向服务器发送…

【书生大模型实战】InternVL 微调实践闯关任务

一、关卡任务 基础任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图.尝试使用LoRA&#xff0c;或调整xtuner的config&#xff0c;如LoRA rank&#xff0c;学习率。看模型Loss会如何变化&#xff0c;并记录调整后效果(选…

消防隐患在线小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;消防隐患举报管理&#xff0c;消防隐患分类管理&#xff0c;统计分类管理&#xff0c;处理结果管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我…

vue+elmentui 定义狂拽黑金配色的按钮+消息框

1 修改效果 通过自定义样式的方式可以修改elmentui的配色&#xff0c;例如下面我们修改掉了button的primary配色为黑金色&#xff1a; 修改前&#xff1a; 修改后 修改了elementui 的$message(success类型&#xff09;颜色为黑金色、图标也修改为金色了&#xff1a; 修改前…

WPF 手撸插件 三 插件文件热加载

1、在程序运行的同时将插件文件复制到指定的插件目录下&#xff0c;插件自动被加载。不废话了直接上代码吧。需要的可以帮我贡献点积分&#xff0c;谢谢各位大佬了。 示例文件下载https://download.csdn.net/download/xingchengaiwei/896388912、主要功能代码如下。注意初学者…

阿里云搜索专家实操:如何高效构建企业级 AI 搜索?

作者&#xff1a;来自阿里云搜索产品专家牛俊 本文由阿里云搜索产品专家牛俊在【AI 搜索 TechDay】上的分享【阿里云 AI 搜索 Demo 展示和动手实践】整理而成。 阿里云 AI 搜索的产品能力与业务价值 阿里云 AI 搜索的方案&#xff0c;基于阿里云 Elasticsearch Inference API…

什么是国债期货?怎么玩?

国债期货&#xff0c;也就是利率期货&#xff0c;是一种在交易所里买卖未来国债价格的金融工具。它允许投资者在今天定下价格&#xff0c;然后在将来的某个时间点进行交易。在中国&#xff0c;国债期货在金融期货交易所上市&#xff0c;有几种不同的期限&#xff0c;比如30年期…

CDGA|数据治理核心能力框架与数据治理体系规划

随着数字化转型的加速和大数据技术的广泛应用&#xff0c;数据已成为企业核心资产之一。如何高效、安全地管理和利用数据&#xff0c;成为企业提升竞争力和创新能力的重要课题。本文将从数据治理核心能力框架和数据治理体系规划两个方面进行探讨&#xff0c;以期为企业的数据治…

Controller中接收数组参数 post请求中在body中传+post请求中通过表单形式传(x-www-form-urlencoded)

1、场景 需要根据用户id集合批量删除用户数据&#xff0c;前端使用post请求&#xff0c;controller中参数接收数组参数并根据用户id删除用户基本信息 2、分析处理&#xff1a; 2.1、前端请求类型contentType:application/json 请求体中为json字符串&#xff0c;后端新建一个Us…

【GH】【EXCEL】bumblebee简介:GH↔EXCEL

文章目录 bumblebeeaddressComponentAnalysisAppCellChartingDataGraphicsRangeShapesWorkbooksWorksheets Sample: Accessing_ExcelExcel ApplicationWorkbookSave Workbook (Create)Get All Workbooks from AppGet Workbook by Name Get WorkbookGet Active Workbook from Ap…

python 阴暗图像 亮度增强 对比度增强 去雾

背景说明 最近在处理图像&#xff0c;发现一些样本由于逆光原因过于阴暗&#xff0c;影响图像识别。解决时&#xff0c;可以在训练样本中加入类似的图像&#xff0c;或者手动把相关图像进行颜色变化。这里主要介绍手工颜色变化。 原始图像如下&#xff0c;假设你需要判断裤子…

使用 Elasticsearch-DSL Python 客户端简化向量嵌入

作者&#xff1a;来自 Elastic Miguel Grinberg 在本文中&#xff0c;我们将介绍 Python 版 Elasticsearch-DSL 客户端&#xff0c;重点介绍它如何简化构建向量搜索解决方案的任务。 本文附带的代码实现了一个名言数据库。它包括一个使用 FastAPI Web 框架用 Python 编写的后端…

利用http获取文件升级

1.搭建模拟环境 1.电脑端开启Telnet客户端 2.下载HFS文件服务器 Download HFS_2024电脑最新版_HFS官方免费下载_华军软件园 (onlinedown.net) 将要升级的文件放到HFS文件系统中&#xff0c;这里我用了一个test.txt来作为实验 2.通过telnet敲http报文获取HFS服务器中的文件…

拼车系统功能案例分析

拼车系统功能案例分析可以从多个维度进行&#xff0c;以下是一个综合性的分析 一、用户注册与登录 功能描述&#xff1a;用户可以通过手机号、微信、QQ等多种方式轻松注册登录&#xff0c;并支持实名认证以增强身份真实性。案例分析&#xff1a;以T5出行拼车平台为例&#xff…

珂艾泰克拧紧控制器维修方法多样化

珂艾泰克拧紧控制器作为精密工业设备的关键组件&#xff0c;其稳定运行对于保证生产效率和产品质量至关重要。然而&#xff0c;在实际应用中&#xff0c;可能会因各种原因出现CORETEC拧紧控制器故障&#xff0c;影响生产线的正常运行。 【常见CORETEC拧紧控制器故障及原因分析】…

借助帕累托图减少设备停机时间:将非生产时间最小化

虽然全球通胀趋于稳定&#xff0c;但各行业仍能感受到2022年和2023年价格快速上涨的残余影响。对于石油和天然气公司来说&#xff0c;运营成本(包括设备、材料和劳动力)的上升加剧了财务压力。在这个竞争激烈的市场中&#xff0c;减少非生产时间(NPT)对于保持盈利能力至关重要。…

分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法

在Windows操作系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;文件扮演着至关重要的角色&#xff0c;它们为应用程序提供了共享的函数和资源。其中&#xff0c;mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;对于许多使用Microso…

会话管理

目录 一、为什么使用会话 二、cookie 1.概述 2.使用 &#xff08;1&#xff09; servletA向响应中增加Cookie &#xff08;2&#xff09;浏览器访问ServletA响应回来的响应报文携带cookie &#xff08;3&#xff09;浏览器访问ServletB&#xff0c;将携带cookie的请求报…

探索ORM宇宙:MyBatis-Plus的力量

**技术派项目源码地址 : ** **Gitee : 技术派 - https://gitee.com/itwanger/paicoding**Github : 技术派 - https://github.com/itwanger/paicoding **Mybatis-Plus 官网 : **MyBatis-Plus &#x1f680; 为简化开发而生 (baomidou.com) 整合Mybatis-Plus 引入依赖 <…

Flink之SQL client使用案例

Flink的执行模式有以下三种: 前提是我们已经开启了yarnsession的进程&#xff0c;在下图中可以看到启动的id也就是后续任务需要通过此id进行认证&#xff0c;以及任务分配的master主机。 这里启动时候会报错一个ERROR&#xff1a;org.apache.flink.shaded.curator.org.apache…