From 66994b04c13870852b39e965d6b4996fff509833 Mon Sep 17 00:00:00 2001
From: jessica <3344538341@qq.com>
Date: Thu, 23 May 2024 16:48:07 +0800
Subject: [PATCH 1/4] =?UTF-8?q?feat:=E4=BA=A7=E5=93=81=E4=BB=8B=E7=BB=8D?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/help/productIntroduction/index.less | 30 +++
src/views/help/productIntroduction/index.tsx | 246 +++++++++++++++++-
2 files changed, 272 insertions(+), 4 deletions(-)
create mode 100644 src/views/help/productIntroduction/index.less
diff --git a/src/views/help/productIntroduction/index.less b/src/views/help/productIntroduction/index.less
new file mode 100644
index 0000000..4ec73ee
--- /dev/null
+++ b/src/views/help/productIntroduction/index.less
@@ -0,0 +1,30 @@
+.product {
+ .description {
+ font-size: 24px;
+ color: gray;
+ }
+
+ .quick-row {
+ margin-bottom: 15px;
+ }
+
+ .quick-card {
+ height: 400px;
+ }
+ .card4 {
+ margin-right: 15px;
+ }
+ .card2 {
+ margin-right: 15px;
+ }
+ p {
+ font-size: 14px;
+ color: gray;
+ }
+ .quick-button {
+ margin-left: 10px;
+ }
+ .card-header {
+ font-size: 16px;
+ }
+}
diff --git a/src/views/help/productIntroduction/index.tsx b/src/views/help/productIntroduction/index.tsx
index 5d36c99..e3e1722 100644
--- a/src/views/help/productIntroduction/index.tsx
+++ b/src/views/help/productIntroduction/index.tsx
@@ -1,7 +1,245 @@
+import React from "react";
+import { Button, Card, Col, Row } from "antd";
+import "./index.less";
const ProductIntroduction: React.FC = () => {
- return (
-
ProductIntroduction
- );
+ const yanshi = () => {
+ window.open("https://react.quick.ainiteam.com/");
+ };
+ const kaiyuan = () => {
+ window.open("https://gitee.com/zhanglp520/quick-react-admin.git");
+ };
+ return (
+ <>
+
+
+
+
+
+
+ 产品名称:quick中后台开发者系统平台
+
+
+
+ quick-react-admin
+ 是一款免费开源快速搭建中后台系统框架。本框架基于
+ vite5、react、antd、@reduxjs/toolkit 以及 react-router-dom
+ 等最新主流技术并封装了通用的组件方便开发者提高工作效率。后期也会通过版本升级的方式来维护并更新,使开发者拥有一款长期并且稳定的脚手架。本团队还提供了基于
+ quick 框架开发的各类业务项目,比如:
+ 订单管理系统、调度管理系统、聊天系统、音视系统
+ 、监控系统、商城系统、物联网平台、外卖系统、ERP 系统、CMR
+ 系统、OA 系统、物流管理系统、CRM
+ 管理系统等等常用的业务系统,如有相关需求联系管理员。
+
+
+ 开源地址:
+
+
+ 演示地址:
+
+
+ 账号密码:admin/123456
+
+ 如果对你有帮助,帮忙点个star吧!
+ 也可以fork项目并对项目做出贡献!
+
+ 如果想加入项目,请联系管理员!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.使用
+ vite5、react8、redux、@reduxjs/toolkit、react-router-dom、antd
+ 和 typescript 等前言技术
+
+ 2.封装了通用的组件
+
+ 3.提供了系统管理常用功能模块
+ 4.提供权限管理模块
+ 5.动态菜单技术
+
+ 6.动态路由技术
+ 7.使用 JWT 鉴权
+
+ 8.使用中间件异常处理
+
+ 9.前后端分离
+
+ 10.后端使用 nestjs 框架
+
+ 11.使用 restful 接口规范
+
+ 12.k8s 分布式
+
+
+
+
+
+ 13.模块化管理
+
+ 14.使用 mvc 架构及多层设计思想
+
+ 15.token 鉴权
+
+ 16.个人资料修改及密码修改功能
+
+ 17.支持支付功能
+
+ 18.docker 容器化
+
+ 19.jenkins 自动化部署技术
+
+ 20.使用 typeorm 框架,可活支持数据库及多种类型的数据库
+
+
+
+
+
+
+
+
+
+
+ 发布版本1.0.1
+
+ 1.菜单优化;
+
+ 2.路由缓存;
+
+ 3.修复bug
+
+
+ 发布版本1.1.0
+
+ 1.增加:资源管理模块
+
+ 2.增加:产品介绍页面
+
+ 3.优化:选项卡
+
+ 4.优化:面包屑
+
+ 5.优化:菜单滚动条;
+
+ 6.修复bug
+
+
+
+
+
+
+
+
+
+
+ 1.开发文档:
+
+
+ 2.接口文档:
+
+
+ 4.码云地址:
+
+
+ 5.github地址:
+
+
+ 6.gitlab地址:
+
+
+ 7.gitee中发起 Issue
+
+ 8.qq群帮助:558795174
+
+
+
+
+
+
+
+
+ 1.承接quick产品的定制化开发
+
+ 2.承接quick产品的业务项目
+
+ 3.组件定制化开发
+
+ 4.其他项目可以联系咨询
+
+ qq:1841031740
+
+
+
+
+
+
+ >
+ );
};
-export default ProductIntroduction;
\ No newline at end of file
+export default ProductIntroduction;
--
Gitee
From 2dea933cbf5f939b731a7c659f19f224f932a9a0 Mon Sep 17 00:00:00 2001
From: jessica <3344538341@qq.com>
Date: Thu, 23 May 2024 16:49:43 +0800
Subject: [PATCH 2/4] =?UTF-8?q?fix:=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?=
=?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=94=B9=E4=B8=8B=E6=8B=89=E6=A1=86trigger?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 2 +-
src/views/system/dept/index.tsx | 2 +-
src/views/system/menu/index.tsx | 2 +-
src/views/system/role/index.tsx | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package.json b/package.json
index 9b0d6c2..00311f5 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
- "@ainiteam/quick-react-ui": "0.0.0-alpha.5",
+ "@ainiteam/quick-react-ui": "0.0.0-alpha.6",
"@ant-design/icons": "^5.2.6",
"@reduxjs/toolkit": "^2.0.1",
"@types/crypto-js": "^4.2.1",
diff --git a/src/views/system/dept/index.tsx b/src/views/system/dept/index.tsx
index ba6b686..e29efa8 100644
--- a/src/views/system/dept/index.tsx
+++ b/src/views/system/dept/index.tsx
@@ -214,7 +214,7 @@ const Dept: React.FC = () => {
{
required: true,
message: "请选择父级部门",
- trigger: "change",
+ // trigger: "change",
},
],
},
diff --git a/src/views/system/menu/index.tsx b/src/views/system/menu/index.tsx
index 641a862..d3e0a7d 100644
--- a/src/views/system/menu/index.tsx
+++ b/src/views/system/menu/index.tsx
@@ -164,7 +164,7 @@ const Menu: React.FC = () => {
{
required: true,
message: "请选择菜单类型",
- trigger: "change",
+ // trigger: "change",
},
],
},
diff --git a/src/views/system/role/index.tsx b/src/views/system/role/index.tsx
index cd2f755..24628bd 100644
--- a/src/views/system/role/index.tsx
+++ b/src/views/system/role/index.tsx
@@ -109,7 +109,7 @@ const Role: React.FC = () => {
{
required: true,
message: "请选择所属部门",
- trigger: "change",
+ // trigger: "change",
},
],
},
--
Gitee
From 00ddda7c92152ad9d1d3be12c5e03b23fd63d237 Mon Sep 17 00:00:00 2001
From: jessica <3344538341@qq.com>
Date: Fri, 24 May 2024 10:33:10 +0800
Subject: [PATCH 3/4] =?UTF-8?q?feat:=E8=A7=92=E8=89=B2=E6=8E=88=E6=9D=83?=
=?UTF-8?q?=E5=88=97=E8=A1=A8=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/auth/role/index.tsx | 215 +++++++++++++++++++++++++++++++++-
1 file changed, 211 insertions(+), 4 deletions(-)
diff --git a/src/views/auth/role/index.tsx b/src/views/auth/role/index.tsx
index abd7e64..d1abde6 100644
--- a/src/views/auth/role/index.tsx
+++ b/src/views/auth/role/index.tsx
@@ -1,7 +1,214 @@
+import {
+ addRole,
+ deleteRole,
+ getRoleList,
+ updateRole,
+} from "@/api/system/role";
+import { AppDispatch, RootState } from "@/store";
+import { getPermissionBtns } from "@/store/modules/user";
+import { IRole, IRolePermissionButton } from "@/types";
+import { validatePermission } from "@/utils";
+import {
+ Crud,
+ IActionbar,
+ IColumn,
+ IFormItem,
+ // IPage,
+ IToolbar,
+} from "@ainiteam/quick-react-ui";
+import { ExclamationCircleFilled } from "@ant-design/icons";
+import { Modal, message } from "antd";
+import { useEffect, useState } from "react";
+import { useDispatch, useSelector } from "react-redux";
+
const Role: React.FC = () => {
- return (
- Role
- );
+ /**
+ * 属性
+ */
+ const { confirm } = Modal;
+
+ const [dataList, setDataList] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const dispatch: AppDispatch = useDispatch();
+ const { activeTab } = useSelector((state: RootState) => state.tab);
+ const { permissionBtn }: { permissionBtn: IRolePermissionButton } =
+ useSelector((state: RootState) => state.user);
+ const [dialogVisible, setDialogVisible] = useState(false);
+ const [role, setRole] = useState({});
+ const handleAuth = (item: IRole) => {
+ setDialogVisible(true);
+ setRole({ ...item });
+ };
+ /**
+ * 分页
+ */
+ // const [page] = useState({
+ // current: 1,
+ // size: 10,
+ // sizes: [10, 20, 30, 40, 50],
+ // total: 0,
+ // });
+ /**
+ * 工具栏
+ */
+ const tableToolbar: IToolbar = {
+ hiddenBatchDeleteButton: true,
+ hiddenImportButton: true,
+ hiddenExportButton: true,
+ hiddenPrintButton: true,
+ hiddenAddButton: !validatePermission(permissionBtn?.add),
+ };
+ /**
+ * 操作栏
+ */
+
+ const tableActionbar: IActionbar = {
+ width: 300,
+ hiddenEditButton: true,
+ hiddenDeleteButton: true,
+ hiddenDetailButton: true,
+ btns: [
+ {
+ name: "配置权限",
+ click(item: IRole) {
+ handleAuth(item);
+ },
+ render() {
+ return true;
+ },
+ },
+ ],
+ };
+ /**
+ * 表格
+ */
+ const tableColumns: IColumn[] = [
+ {
+ width: "50",
+ type: "selection",
+ },
+ {
+ label: "角色编号",
+ prop: "roleId",
+ width: "200",
+ },
+ {
+ label: "角色名称",
+ prop: "roleName",
+ },
+ ];
+ const handleDelete = (item: IRole, done: any) => {
+ confirm({
+ title: "警告",
+ icon: ,
+ content: `你真的删除【${item.roleName}】的字典吗?`,
+ onOk() {
+ if (!item.id) {
+ return;
+ }
+ deleteRole(item.id).then(() => {
+ message.success("角色删除成功");
+ done();
+ });
+ },
+ });
+ };
+ /**
+ * 加载数据
+ */
+ const load = () => {
+ setLoading(true);
+ getRoleList().then((res) => {
+ setLoading(false);
+
+ const { data: roleList } = res;
+ setDataList([...roleList]);
+ });
+ };
+ /**
+ * 表单
+ */
+ const dialogTitle = {
+ add: "新增角色",
+ edit: "编辑角色",
+ detail: "角色详情",
+ };
+ const formModel: IRole = {
+ id: undefined,
+ roleId: "",
+ roleName: "",
+ };
+ const formItems: IFormItem[] = [
+ {
+ label: "角色编号",
+ labelWidth: "80px",
+ vModel: "roleId",
+ placeholder: "角色编号",
+ editReadonly: true,
+ prop: "roleId",
+ rules: [
+ {
+ required: true,
+ message: "角色编号不能为空",
+ trigger: "blur",
+ },
+ ],
+ },
+ {
+ label: "角色名称",
+ labelWidth: "80px",
+ vModel: "roleName",
+ placeholder: "角色名称",
+ prop: "roleName",
+ rules: [
+ {
+ required: true,
+ message: "角色名称不能为空",
+ trigger: "blur",
+ },
+ ],
+ },
+ ];
+ const handleFormSubmit = (form: IRole, done: any) => {
+ const row = { ...form };
+ if (row.id) {
+ console.log("updateRole", row);
+ updateRole(row).then(() => {
+ message.success("角色修改成功");
+ done();
+ });
+ } else {
+ row.id = undefined;
+ console.log("addRole", row);
+ addRole(row).then(() => {
+ message.success("角色创建成功");
+ done();
+ });
+ }
+ };
+ useEffect(() => {
+ dispatch(getPermissionBtns(activeTab));
+ load();
+ }, []);
+
+ return (
+ <>
+
+ >
+ );
};
-export default Role;
\ No newline at end of file
+export default Role;
--
Gitee
From 6ef3a22c03b2d17e3b2963d794e71b27a8063279 Mon Sep 17 00:00:00 2001
From: jessica <3344538341@qq.com>
Date: Mon, 27 May 2024 09:42:44 +0800
Subject: [PATCH 4/4] =?UTF-8?q?feat:=E8=A7=92=E8=89=B2=E6=8E=88=E6=9D=83?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=9E=84=E5=BB=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../role/components/DialogProgress/index.tsx | 245 +++++++++++++++++-
src/views/auth/role/index.tsx | 56 +++-
src/views/system/dept/index.tsx | 1 +
3 files changed, 287 insertions(+), 15 deletions(-)
diff --git a/src/views/auth/role/components/DialogProgress/index.tsx b/src/views/auth/role/components/DialogProgress/index.tsx
index 6c9940d..43eff0f 100644
--- a/src/views/auth/role/components/DialogProgress/index.tsx
+++ b/src/views/auth/role/components/DialogProgress/index.tsx
@@ -1,7 +1,242 @@
-const DialogProgress: React.FC = () => {
- return (
- DialogProgress
- );
+import { getApiPermission, getMenuPermission } from "@/api/auth";
+import { getApiList } from "@/api/system/api";
+import { getMenuList } from "@/api/system/menu";
+import { IMenuTree } from "@/types";
+import { listToTableTree, listToTree } from "@/utils";
+import { Steps, Tree } from "antd";
+import { useEffect, useState } from "react";
+
+type RoleProp = {
+ role: any;
+};
+
+const DialogProgress: React.FC = (props: RoleProp) => {
+ const { role } = props;
+ const [current, setCurrent] = useState(0);
+ const [menuTreeData, setMenuTreeData] = useState([]);
+ const [menuTreeList, setMenuTreeList] = useState([]);
+ const [apiTreeList, setApiTreeList] = useState([]);
+ const [apiTreeData, setApiTreeData] = useState([]);
+
+ const treeData = [
+ {
+ title: "0-0",
+ key: "0-0",
+ children: [
+ {
+ title: "0-0-0",
+ key: "0-0-0",
+ children: [
+ {
+ title: "0-0-0-0",
+ key: "0-0-0-0",
+ },
+ {
+ title: "0-0-0-1",
+ key: "0-0-0-1",
+ },
+ {
+ title: "0-0-0-2",
+ key: "0-0-0-2",
+ },
+ ],
+ },
+ {
+ title: "0-0-1",
+ key: "0-0-1",
+ children: [
+ {
+ title: "0-0-1-0",
+ key: "0-0-1-0",
+ },
+ {
+ title: "0-0-1-1",
+ key: "0-0-1-1",
+ },
+ {
+ title: "0-0-1-2",
+ key: "0-0-1-2",
+ },
+ ],
+ },
+ {
+ title: "0-0-2",
+ key: "0-0-2",
+ },
+ ],
+ },
+ {
+ title: "0-1",
+ key: "0-1",
+ children: [
+ {
+ title: "0-1-0-0",
+ key: "0-1-0-0",
+ },
+ {
+ title: "0-1-0-1",
+ key: "0-1-0-1",
+ },
+ {
+ title: "0-1-0-2",
+ key: "0-1-0-2",
+ },
+ ],
+ },
+ {
+ title: "0-2",
+ key: "0-2",
+ },
+ ];
+ const [expandedKeys, setExpandedKeys] = useState(["0-0-0", "0-0-1"]);
+ const [checkedKeys, setCheckedKeys] = useState(["0-0-0"]);
+ const [selectedKeys, setSelectedKeys] = useState([]);
+ const [autoExpandParent, setAutoExpandParent] = useState(true);
+ const [currentTreeData, setCurrentTreeData] = useState({
+ key: "",
+ title: "",
+ children: [],
+ });
+
+ const onExpand = (expandedKeysValue: any) => {
+ setExpandedKeys(expandedKeysValue);
+ setAutoExpandParent(false);
+ };
+ const onCheck = (checkedKeysValue: any) => {
+ console.log("onCheck", checkedKeysValue);
+ setCheckedKeys(checkedKeysValue);
+ };
+ const onSelect = (selectedKeysValue: any, info: any) => {
+ console.log("onSelect", info);
+ setSelectedKeys(selectedKeysValue);
+ };
+
+ const onChange = (value: any) => {
+ setCurrent(value);
+ };
+ /**
+ * 加载接口数据
+ */
+ const apiLoad = () => {
+ getApiList().then((res) => {
+ const { data: apiList } = res;
+ setApiTreeList([...apiList]);
+ getApiPermission1(role.id!.toString());
+ });
+ };
+
+ const getApiPermission1 = (id: string) => {
+ getApiPermission(id).then((res) => {
+ const { data: keys } = res;
+ setSelectedKeys(keys);
+ setApiTreeData([...apiTreeList]);
+ // nextTick(() => {
+ // if (apiTreeRef.value) {
+ // apiTreeRef.value.setCheckedKeys(keys, false);
+ // }
+ // });
+ });
+ };
+ /**
+ * 加载菜单数据
+ */
+ const menuLoad = () => {
+ getMenuList().then((res) => {
+ const { data: menuList } = res;
+ const menuTree = listToTree(menuList, 0, {
+ pId: "pId",
+ label: "menuName",
+ });
+ console.log("menuTree", menuTree);
+ setMenuTreeList([...menuTree]);
+ getMenuPermission1(role.id!.toString());
+ });
+ };
+ const getMenuPermission1 = (id: string) => {
+ getMenuPermission(id).then((res) => {
+ const { data: keys } = res;
+ setSelectedKeys(keys);
+ setMenuTreeData([...menuTreeList]);
+ // nextTick(() => {
+ // if (menuTreeRef.value) {
+ // menuTreeRef.value.setCheckedKeys(keys, false);
+ // }
+ // });
+ });
+ };
+ const FirstTree = () => {
+ if (current == 0) {
+ return (
+
+ );
+ } else if (current == 1) {
+ return ;
+ } else if (current == 2) {
+ return 待开发
;
+ }
+ };
+ useEffect(() => {
+ menuLoad();
+ apiLoad();
+ }, []);
+ return (
+ <>
+
+
+
+ {/*
+
+
+
+
+
*/}
+ {/*
待开发
*/}
+
+ >
+ );
};
-export default DialogProgress;
\ No newline at end of file
+export default DialogProgress;
diff --git a/src/views/auth/role/index.tsx b/src/views/auth/role/index.tsx
index d1abde6..d458b7f 100644
--- a/src/views/auth/role/index.tsx
+++ b/src/views/auth/role/index.tsx
@@ -17,9 +17,10 @@ import {
IToolbar,
} from "@ainiteam/quick-react-ui";
import { ExclamationCircleFilled } from "@ant-design/icons";
-import { Modal, message } from "antd";
+import { Modal, message, Button } from "antd";
import { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
+import DialogProgress from "./components/DialogProgress";
const Role: React.FC = () => {
/**
@@ -39,15 +40,7 @@ const Role: React.FC = () => {
setDialogVisible(true);
setRole({ ...item });
};
- /**
- * 分页
- */
- // const [page] = useState({
- // current: 1,
- // size: 10,
- // sizes: [10, 20, 30, 40, 50],
- // total: 0,
- // });
+
/**
* 工具栏
*/
@@ -186,6 +179,27 @@ const Role: React.FC = () => {
});
}
};
+ /**
+ * 弹窗
+ */
+ const handleOk = () => {
+ setDialogVisible(false);
+ };
+
+ const handleCancel = () => {
+ setDialogVisible(false);
+ };
+ const prev = () => {
+ // dialogProgressRef?.prev();
+ };
+ const next = () => {
+ // dialogProgressRef?.next();
+ };
+ const save = () => {
+ // dialogProgressRef?.save(() => {
+ // setDialogVisible(false);
+ // });
+ };
useEffect(() => {
dispatch(getPermissionBtns(activeTab));
load();
@@ -207,6 +221,28 @@ const Role: React.FC = () => {
onFormSubmit={handleFormSubmit}
onDelete={handleDelete}
>
+
+ 上一步
+ ,
+ ,
+ ,
+ ]}
+ >
+
+
+
+
>
);
};
diff --git a/src/views/system/dept/index.tsx b/src/views/system/dept/index.tsx
index 9e8ac46..8f189eb 100644
--- a/src/views/system/dept/index.tsx
+++ b/src/views/system/dept/index.tsx
@@ -256,6 +256,7 @@ const Dept: React.FC = () => {
leftTree={leftTree}
leftTreeRefresh={true}
loading={loading}
+ displayNumber={false}
onTreeLoad={treeLoad}
onTreeClick={handleTreeClick}
onFormSubmit={handleFormSubmit}
--
Gitee