diff --git a/src/router/staticRouter.tsx b/src/router/staticRouter.tsx
index 3a842c46b0259f31e97ac864cebde8485272982d..ffa01ea9e79bf70c9a17e6f595cb463e3cbd82c8 100644
--- a/src/router/staticRouter.tsx
+++ b/src/router/staticRouter.tsx
@@ -22,6 +22,9 @@ const staticRouter: RouteObject[] = [
},{
path: "/system/role",
Component: lazy(() => import("@/views/system/role"))
+ },{
+ path: "/system/menu",
+ Component: lazy(() => import("@/views/system/menu"))
}]
},
diff --git a/src/views/system/menu/index.tsx b/src/views/system/menu/index.tsx
index 3aa36c40924c6231b286b6d736bbd913d9e28058..f6f7d4c084e2ba275aebe3e55e8e7fe198a99f6a 100644
--- a/src/views/system/menu/index.tsx
+++ b/src/views/system/menu/index.tsx
@@ -1,7 +1,449 @@
+import { useState } from "react";
+import { Modal, message } from "antd";
+// import "@/assets/iconfont/quickIconFont.js";
+// import quickIconFont from "@/config/quickIconFont.json";
+import { ExclamationCircleFilled } from "@ant-design/icons";
+import {
+ IColumn,
+ IFormItem,
+ IPage,
+ QuickCrud,
+ IDialogTitle,
+ IOptions,
+} from "@ainiteam/quick-react-ui";
+// import "./index.less";
+import { ISearchUser, IMenu } from "@/types";
+import {
+ addUser,
+ updateUser,
+ deleteUser,
+ batchDeleteUser,
+} from "@/api/system/user";
+import {
+ getMenuList,
+ addMenu,
+ updateMenu,
+ deleteMenu,
+} from "@/api/system/menu";
+import { AppDispatch, RootState } from "@/store";
+/**导入项目文件 */
+import {
+ listToSelectTree,
+ listToTableTree,
+ validatePermission,
+} from "@/utils/index";
const Menu: React.FC = () => {
- return (
-
Menu
- );
+ const { confirm } = Modal;
+
+ /**
+ * 属性
+ */
+ const [loading, setLoading] = useState(false);
+ const [tableDataList, setTableDataList] = useState([]);
+ const [parentTreeData, setParentTreeData] = useState>([]);
+ /**
+ * 分页
+ */
+ const page: IPage = {
+ current: 1,
+ size: 10,
+ sizes: [10, 20, 30, 40, 50],
+ total: 0,
+ };
+
+ /**
+ * 搜索
+ */
+ const searchForm: ISearchUser = {
+ keyword: "",
+ };
+ const searchFormItems: IFormItem[] = [
+ {
+ label: "菜单名称",
+ vModel: "keyword",
+ placeholder: "请输入菜单名称",
+ },
+ ];
+
+ const handleBatchDelete = (data: any, done: any) => {
+ const { ids } = data;
+ confirm({
+ title: "警告",
+ icon: ,
+ content: "你真的删除选择的菜单吗?",
+ onOk() {
+ batchDeleteUser(ids).then(() => {
+ message.success("菜单删除成功");
+ done();
+ });
+ },
+ });
+ };
+
+ /**
+ * 表单
+ */
+ const dialogTitle: IDialogTitle = {
+ add: "创建菜单",
+ edit: "编辑菜单",
+ detail: "菜单详情",
+ };
+ const formModel: IMenu = {
+ id: undefined,
+ menuId: "",
+ menuName: "",
+ path: "",
+ viewPath: "",
+ menuType: 0,
+ icon: "",
+ sort: 0,
+ pId: undefined,
+ link: 0,
+ linkUrl: "",
+ enabled: true,
+ status: true,
+ cache: true,
+ };
+ const formItems: IFormItem[] = [
+ {
+ label: "菜单编号",
+ labelWidth: "80px",
+ vModel: "menuId",
+ placeholder: "请输入菜单编号",
+ editReadonly: true,
+ prop: "menuId",
+ width: "400px",
+ rules: [
+ {
+ required: true,
+ message: "请输入菜单编号",
+ trigger: "blur",
+ },
+ ],
+ },
+ {
+ label: "菜单名称",
+ labelWidth: "80px",
+ vModel: "menuName",
+ placeholder: "请输入菜单名称",
+ prop: "menuName",
+ width: "400px",
+ rules: [
+ {
+ required: true,
+ message: "请输入菜单名称",
+ trigger: "blur",
+ },
+ ],
+ },
+ {
+ label: "菜单类型",
+ labelWidth: "80px",
+ vModel: "menuType",
+ placeholder: "请选择菜单类型",
+ prop: "menuType",
+ type: "select",
+ width: "400px",
+ options: [
+ {
+ label: "目录",
+ value: 0,
+ },
+ {
+ label: "菜单",
+ value: 1,
+ },
+ {
+ label: "按钮",
+ value: 2,
+ },
+ ],
+ rules: [
+ {
+ required: true,
+ message: "请选择菜单类型",
+ trigger: "change",
+ },
+ ],
+ },
+ {
+ label: "菜单图标",
+ labelWidth: "80px",
+ vModel: "icon",
+ placeholder: "请选择菜单图标",
+ prop: "icon",
+ type: "icon",
+ // iconOptions: [
+ // {
+ // label: "quick官网",
+ // data: quickIconFont,
+ // },
+ // ],
+ width: "400px",
+ select: (val) => {
+ formModel.icon = val;
+ },
+ },
+ {
+ label: "路由地址",
+ labelWidth: "80px",
+ vModel: "path",
+ placeholder: "请输入路由地址",
+ width: "400px",
+ prop: "path",
+ },
+ {
+ label: "视图路径",
+ labelWidth: "80px",
+ vModel: "viewPath",
+ placeholder: "请输入视图路径",
+ width: "400px",
+ prop: "viewPath",
+ },
+ {
+ label: "排序",
+ labelWidth: "80px",
+ vModel: "sort",
+ placeholder: "请输入排序",
+ prop: "sort",
+ width: "400px",
+ },
+ {
+ label: "父级菜单",
+ labelWidth: "80px",
+ vModel: "pId",
+ placeholder: "请选择父级菜单",
+ type: "treeselect",
+ options: parentTreeData,
+ width: "400px",
+ prop: "pId",
+ },
+ {
+ label: "缓存",
+ labelWidth: "80px",
+ vModel: "cache",
+ prop: "cache",
+ type: "switch",
+ width: "400px",
+ },
+ {
+ label: "启用",
+ labelWidth: "80px",
+ vModel: "enabled",
+ prop: "enabled",
+ type: "switch",
+ width: "400px",
+ },
+ {
+ label: "显示",
+ labelWidth: "80px",
+ vModel: "status",
+ prop: "status",
+ type: "switch",
+ width: "400px",
+ },
+ {
+ label: "外链",
+ labelWidth: "80px",
+ vModel: "link",
+ placeholder: "外链",
+ prop: "link",
+ type: "switch",
+ width: "400px",
+ },
+ {
+ label: "链接地址",
+ labelWidth: "80px",
+ vModel: "linkUrl",
+ placeholder: "链接地址",
+ width: "400px",
+ prop: "linkUrl",
+ },
+ ];
+ const handleFormSubmit = (form: IMenu, done: any) => {
+ const row = { ...form };
+ if (row.id) {
+ console.log("updateUser", row);
+ updateUser(row).then(() => {
+ message.success("菜单修改成功");
+ done();
+ });
+ } else {
+ row.id = undefined;
+ console.log("addUser", row);
+ addUser(row).then(() => {
+ message.success("菜单创建成功");
+ done();
+ });
+ }
+ };
+
+ /**
+ * 操作栏
+ */
+ const handleDelete = (item: IMenu, done: any) => {
+ confirm({
+ title: "警告",
+ icon: ,
+ content: `你真的删除【${item.userName}】的菜单吗?`,
+ onOk() {
+ if (!item.id) {
+ return;
+ }
+ deleteUser(item.id).then(() => {
+ message.success("菜单删除成功");
+ done();
+ });
+ },
+ });
+ };
+
+ /**
+ * 表格
+ */
+ const tableColumns: IColumn[] = [
+ {
+ width: "50",
+ type: "selection",
+ },
+ {
+ label: "菜单编号",
+ prop: "menuId",
+ width: "200",
+ },
+ {
+ label: "菜单名称",
+ prop: "menuName",
+ width: "200",
+ fixed: true,
+ },
+ {
+ label: "路由地址",
+ prop: "path",
+ width: "200",
+ },
+ {
+ label: "视图路径",
+ prop: "viewPath",
+ width: "200",
+ },
+ {
+ label: "菜单类型",
+ prop: "menuType",
+ width: "200",
+ format: (row: IMenu) => {
+ console.log("菜单类型", row);
+
+ if (row.menuType === 0) {
+ return "目录";
+ }
+ if (row.menuType === 1) {
+ return "菜单";
+ }
+ if (row.menuType === 2) {
+ return "按钮";
+ }
+ return "";
+ },
+ },
+ {
+ label: "菜单图标",
+ prop: "icon",
+ width: "200",
+ },
+ {
+ label: "菜单排序",
+ prop: "sort",
+ width: "200",
+ },
+ {
+ label: "缓存",
+ prop: "cache",
+ width: "200",
+ format: (row: IMenu) => {
+ return row.cache ? "缓存" : "不缓存";
+ },
+ },
+ {
+ label: "显示",
+ prop: "status",
+ width: "200",
+ format: (row: IMenu) => {
+ return row.status ? "显示" : "不显示";
+ },
+ },
+ {
+ label: "启用",
+ prop: "enabled",
+ width: "200",
+ format: (row: IMenu) => {
+ return !row.enabled ? "启用" : "禁用";
+ },
+ },
+ {
+ label: "是否外链",
+ prop: "link",
+ width: "200",
+ format: (row: IMenu) => {
+ return row.link === 1 ? "外链" : "非外链";
+ },
+ },
+ ];
+
+ /**
+ * 加载父级菜单下拉框
+ * @param data 菜单数据
+ */
+ const loadParentMenuData = (data: IMenu[]) => {
+ const parentMenuList = data.filter((x: IMenu) => x.menuType !== 2);
+ const parentTree = listToSelectTree(parentMenuList, 0, {
+ value: "id",
+ label: "menuName",
+ });
+
+ // useState(parentTreeData)
+ // parentTreeData.length = 0;
+ setParentTreeData([...parentTree]);
+ console.log("父级菜单", parentTree);
+ };
+
+ /**
+ * 加载数据
+ */
+ const loadData = () => {
+ setLoading(true);
+ getMenuList().then((res) => {
+ setLoading(false);
+ const { data: menuList } = res;
+ console.log("menuList", menuList);
+ loadParentMenuData(menuList);
+ const menuTree = listToTableTree(menuList, 0, {
+ pId: "pId",
+ });
+
+ setTableDataList([...menuTree]);
+ });
+ };
+ return (
+
+
+
+ );
};
-export default Menu;
\ No newline at end of file
+export default Menu;