From 22cf2a2f826269b38cdaafc473f550f5c83c3373 Mon Sep 17 00:00:00 2001 From: zhangjianjun Date: Mon, 30 Mar 2026 18:51:44 +0800 Subject: [PATCH] ud --- beforeMount.ts | 2 +- routes.ts | 1 - views/admin/role.tsx | 77 ++++++++++++++++++++++++++++----- views/config/source.tsx | 95 ++++++++++++++++++++++++++++++++++++----- 4 files changed, 152 insertions(+), 23 deletions(-) diff --git a/beforeMount.ts b/beforeMount.ts index d6a2e32..27fea18 100644 --- a/beforeMount.ts +++ b/beforeMount.ts @@ -2,7 +2,7 @@ import type { App } from 'vue' import routes from 'src/routes' import { indexStore } from 'lib/stores' const store = indexStore(); -const resource = store.$state.kwargs.resource; +const resource = store.$state.kwargs.resource || []; export default function BeforeMount(app: App) { const resourcePaths = resource.map((item: any) => item.path); diff --git a/routes.ts b/routes.ts index 0dd4c23..9ba3c3f 100644 --- a/routes.ts +++ b/routes.ts @@ -1,7 +1,6 @@ import type { RouteRecordRaw } from "vue-router"; import TableLayout from "lib/layout/TableLayout.vue"; import MainLayout from "lib/layout/MainLayout.vue"; -import { indexStore } from "lib/stores"; const routes: Array = [ { diff --git a/views/admin/role.tsx b/views/admin/role.tsx index 8a9f3cd..19d39d7 100644 --- a/views/admin/role.tsx +++ b/views/admin/role.tsx @@ -1,6 +1,8 @@ import type { TableData } from 'lib/type/TableData' const data: TableData = { + rowKey: "id", + defaultExpandAll: true, async fetchFun(self, data) { const res = await self.api?.getDataList(data) return res @@ -20,20 +22,67 @@ const data: TableData = { } }) return data - } + }, + getTree(arr: any) { + // 构建一个map来存储所有节点 + const map: any = {} + const roots: any[] = [] + + // 先创建所有节点的映射 + arr.forEach((item: any) => { + map[item.key] = { ...item, children: [] } + }) + + // 构建树结构 + arr.forEach((item: any) => { + const node = map[item.key] + if (item.pid === 0 || item.pid === '0') { + // 如果是根节点,添加到roots数组 + roots.push(node) + } else { + // 如果有父节点,添加到父节点的children中 + if (map[item.pid]) { + map[item.pid].children.push(node) + } else { + // 如果找不到父节点,也作为根节点处理 + roots.push(node) + } + } + }) + return roots + }, }, launchTask: [ async (self: any) => { if (self.bean) { const res = await self.api?.getResources({ type: "", page: 1, size: 1000 }) - const resources = res.data.items?.map((item: any) => { - const type = item.type === 'page' ? '页面' : '接口' + const items = res.data.items || [] + const data = items.map((item: any) => { return { - key: item.id, - name: `【${type}】${item.name}` + name: item.name, + key: String(item.id), + id: item.id, + pid: item.pid ? String(item.pid) : item.type, + type: item.type, } }) - self.bean.resources = resources + data.unshift(...[ + { + name: '页面', + key: 'page', + id: 'page', + pid: '0', + type: 'page' + }, + { + name: '接口', + key: 'api', + id: 'api', + pid: '0', + type: 'api' + } + ]) + self.bean.resources = self.methods?.getTree(data) } } ], @@ -63,11 +112,14 @@ const data: TableData = { { key: 'resource', name: '权限', - type: 'select', + type: 'cascader', getItems: (self: any) => { return self.bean ? self.bean.resources : [] }, - multiple: true, + cascaderProps: { + multiple: true, + checkStrictly: false + }, must: true }, ], @@ -114,7 +166,7 @@ const data: TableData = { primary: 'id', beforeShow: async (self: any, form: any, row: any) => { const res = await self.api?.getDataDetail(row.id) - const resources = res.data.map((item: any) => item.id) + const resources = res.data.map((item: any) => String(item.id)) const findItem = form.data.find((i: any) => i.key === 'resource') findItem.values[form.show] = resources }, @@ -128,11 +180,14 @@ const data: TableData = { { key: 'resource', name: '权限', - type: 'select', + type: 'cascader', + cascaderProps: { + multiple: true, + checkStrictly: false + }, getItems: (self: any) => { return self.bean ? self.bean.resources : [] }, - multiple: true, must: false }, ], diff --git a/views/config/source.tsx b/views/config/source.tsx index cc618d1..24812fe 100644 --- a/views/config/source.tsx +++ b/views/config/source.tsx @@ -1,8 +1,29 @@ import type { TableData } from 'lib/type/TableData' - +import "./index.less" const data: TableData = { + rowKey: "id", + defaultExpandAll: true, async fetchFun(self, data) { const res = await self.api?.getDataList(data) + if (self.bean) { + const items = res.data.items || [] + const data = items.map((item: any) => { + return { + name: item.name, + key: String(item.id), + id: item.id, + pid: String(item.pid), + color: 'category', + create_time: item.create_time, + method: item.method, + type: item.type, + path: item.path, + } + }) + self.bean.categoryList = self.methods?.getTree(data) + res.data.items = self.bean.categoryList + self.bean.allList = data + } return res }, addNods: [ @@ -10,6 +31,36 @@ const data: TableData = { ], launchTask: [ ], + methods: { + getTree(arr: any) { + // 构建一个map来存储所有节点 + const map: any = {} + const roots: any[] = [] + + // 先创建所有节点的映射 + arr.forEach((item: any) => { + map[item.key] = { ...item, children: [] } + }) + + // 构建树结构 + arr.forEach((item: any) => { + const node = map[item.key] + if (item.pid === 0 || item.pid === '0') { + // 如果是根节点,添加到roots数组 + roots.push(node) + } else { + // 如果有父节点,添加到父节点的children中 + if (map[item.pid]) { + map[item.pid].children.push(node) + } else { + // 如果找不到父节点,也作为根节点处理 + roots.push(node) + } + } + }) + return roots + }, + }, fliter: [ { key: 'id', @@ -26,8 +77,8 @@ const data: TableData = { name: '类型', type: 'select', items: [ - { key: 'page',name: '页面' }, - { key: 'api',name: 'API' }, + { key: 'page', name: '页面' }, + { key: 'api', name: 'API' }, ], value: 'page' }, @@ -42,6 +93,15 @@ const data: TableData = { form: { title: '新建', data: [ + { + key: 'pid', + name: '父级', + type: 'cascader', + must: false, + getItems(self: TableData) { + return self.bean ? self.bean.categoryList : [] + } + }, { key: 'name', name: '名称', @@ -53,8 +113,8 @@ const data: TableData = { name: '类型', type: 'select', items: [ - { key: 'page',name: '页面' }, - { key: 'api',name: 'API' }, + { key: 'page', name: '页面' }, + { key: 'api', name: 'API' }, ], must: true, value: 'page' @@ -63,7 +123,7 @@ const data: TableData = { key: 'path', name: '路径', type: 'input', - must: true + must: false }, { key: 'method', @@ -84,6 +144,12 @@ const data: TableData = { width: '80px', showJson: '*' }, + { + key: 'pid', + name: 'PID', + width: '80px', + showJson: '*' + }, { key: 'name', name: '名称', @@ -117,6 +183,15 @@ const data: TableData = { type: 'warning', primary: 'id', data: [ + { + key: 'pid', + name: '父级', + type: 'cascader', + must: false, + getItems(self: TableData) { + return self.bean ? self.bean.categoryList : [] + } + }, { key: 'name', name: '名称', @@ -129,8 +204,8 @@ const data: TableData = { type: 'select', must: true, items: [ - { key: 'page',name: '页面' }, - { key: 'api',name: 'API' }, + { key: 'page', name: '页面' }, + { key: 'api', name: 'API' }, ], value: 'page' }, @@ -138,7 +213,7 @@ const data: TableData = { key: 'path', name: '路径', type: 'input', - must: true + must: false }, { key: 'method', @@ -147,7 +222,7 @@ const data: TableData = { }, ], subFun(self, data) { - return self.api?.updateData({...data, id: String(data.id)}) + return self.api?.updateData({ ...data, id: String(data.id) }) } } },