From e113af5378367265b7f2b9bbf4e57a15a01db72b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=82=A5=E7=BE=8A?= <1048382248@qq.com> Date: Mon, 11 Aug 2025 18:24:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E5=8A=A8=E6=80=81edit?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/hTable.ts | 9 +- src/api/menu.ts | 10 +- src/api/school.ts | 37 +++ src/components/hTable/hTable.ts | 18 +- src/components/hTable/hTableEdit.vue | 7 +- src/components/hTable/index.vue | 120 ++++----- src/router/modules/home.ts | 9 - src/views/admin/index.vue | 138 ++++++++++ src/views/menu/edit.vue | 371 +++++++++++++++++++++++++++ src/views/menu/index.vue | 142 +++++----- src/views/school/SchoolEdit.vue | 255 ++++++++++++++++++ src/views/school/index.vue | 32 +-- 12 files changed, 969 insertions(+), 179 deletions(-) create mode 100644 src/api/school.ts create mode 100644 src/views/admin/index.vue create mode 100644 src/views/menu/edit.vue create mode 100644 src/views/school/SchoolEdit.vue diff --git a/src/api/hTable.ts b/src/api/hTable.ts index 8839c3b..038394e 100644 --- a/src/api/hTable.ts +++ b/src/api/hTable.ts @@ -1,5 +1,6 @@ import { http } from "@/utils/http"; import type { Res } from "@/utils/http/types"; +import type { ComboModel } from "@/components/hTable/hTable"; export class hTableAPI { url = ""; @@ -10,8 +11,8 @@ export class hTableAPI { PageList(data = {}) { return http.request>("post", `${this.url}/PageList`, { data }); } - Info(id, tag = {}) { - const pUrl = `${this.url}/${id}`; + Info(tag = {}) { + const pUrl = `${this.url}/Info`; let getUrl = pUrl; for (const key in tag) { const el = tag[key]; @@ -26,6 +27,8 @@ export class hTableAPI { return http.request>("post", `${this.url}/Del`, { data }); } querycombo(data) { - return http.request>("post", `${this.url}/QueryCombo`, { data }); + return http.request>("post", `${this.url}/QueryCombo`, { + data + }); } } diff --git a/src/api/menu.ts b/src/api/menu.ts index dffe752..e6db80f 100644 --- a/src/api/menu.ts +++ b/src/api/menu.ts @@ -3,7 +3,7 @@ import type { Res } from "@/utils/http/types"; // 定义菜单项接口 export interface MenuItem { - id: number; + id?: number; name: string; path?: string; isButton: boolean; @@ -22,3 +22,11 @@ export interface MenuItem { export function MenuAll() { return http.request>("get", `Menu/All`); } + +/** + * @description 获取所有的菜单 + * @return {object} + */ +export function Edit(info: MenuItem) { + return http.request>("post", `Menu/Edit`, { data: info }); +} diff --git a/src/api/school.ts b/src/api/school.ts new file mode 100644 index 0000000..4891252 --- /dev/null +++ b/src/api/school.ts @@ -0,0 +1,37 @@ +import { http } from "@/utils/http"; +import type { Res } from "@/utils/http/types"; + +/** + * @description 获取枚举下拉 + * @param {string} type 枚举类型 type=StatusEnum + * @return {object} + */ +export function getenum(type) { + return http.request>("get", `public/enum/${type}`); +} +/** + * @description 获取枚举对象 + * @param {string} type 枚举类型 type=StatusEnum + * @return {object} + */ +export function getenumDic(type) { + return http.request>("get", `public/enum/${type}/Dic`); +} + +export function getProvince() { + return http.request>("get", `address/province`); +} +export function getcity(c) { + return http.request>("get", `address/${c}/city`); +} +export function getregion(r) { + return http.request>("get", `address/${r}/region`); +} + +/** + * @description 编辑学校 + * @return {void} + */ +export function EditSchool(data: any) { + return http.request>("post", `School/Edit`, { data }); +} diff --git a/src/components/hTable/hTable.ts b/src/components/hTable/hTable.ts index eb1a905..45fb491 100644 --- a/src/components/hTable/hTable.ts +++ b/src/components/hTable/hTable.ts @@ -78,14 +78,14 @@ export interface FieldSetting { */ imgUrl?: (value: any, row: any) => string; /* 数据源 */ - datasource?: Array<{ - Value: any; - Text: string; - }>; + datasource?: ComboModel[]; } ///* 表格列配置 */ //export interface TableEditColumn {} - +export interface ComboModel { + Value: any; + Text: string; +} /* 表格列配置 */ export interface TableColumn { /* 显示标签 */ @@ -103,7 +103,7 @@ export interface TableColumn { /* 是否允许添加 */ add: boolean; /* 是否允许修改 */ - edit: boolean; + edit?: boolean; /* 列宽度 */ width?: string; /* 字段类型 */ @@ -118,9 +118,9 @@ export interface TableColumn { /* 字段设置 */ setting?: FieldSetting; /* 修改时的编辑值 */ - valueE?: Array | string; + valueE?: Array | string | number | boolean | Date; /* 查询值 */ - value?: Array | string; + value?: Array | string | number | boolean | Date; /** textarea编辑时的行数 */ editRows?: number; /**编辑时值发生变化 */ @@ -179,4 +179,6 @@ export interface TableConfig { selectRows: any[]; /* 是否显示边框 */ border: boolean; + /**是否显示 */ + show?: boolean; } diff --git a/src/components/hTable/hTableEdit.vue b/src/components/hTable/hTableEdit.vue index f35ec13..8da9a3a 100644 --- a/src/components/hTable/hTableEdit.vue +++ b/src/components/hTable/hTableEdit.vue @@ -25,7 +25,7 @@ const props = defineProps({ }); const emit = defineEmits(["handlePagedCallback"]); const editFormRef = ref(); -const column: Record = {}; +const column = ref>({}); const editData = ref({ frorm: {}, isedit: props.id !== -1, @@ -118,7 +118,7 @@ function fetchFormData() { editData.value.loading = false; handleResetForm(); if (editData.value.isedit) { - Api.Info(props.id).then(res => { + Api.Info({ id: props.id }).then(res => { if (res.code === 200) { editData.value.frorm = res.data; for (const key in column.value) { @@ -141,7 +141,6 @@ function fetchFormData() { ref="editFormRef" :model="editData.table.column" :label-width="editData.formLabelWidth" - size="small" clearable >
(props.tableConfig); +const tableShowColumn = ref>(); onBeforeMount(() => { /* 初始化系统配置 */ nextTick(async () => { intdata(); + //过滤无法显示的列 + tableShowColumn.value = Object.fromEntries( + Object.entries(table.value.column).filter(([_, s]) => s.show) + ); + Api = new hTableAPI(table.value.apiUrl); init.value = true; tableShow.value = true; @@ -55,7 +61,6 @@ onUnmounted(() => {}); // }); const tableShow = ref(false); let Api: hTableAPI = null; -const instance = getCurrentInstance(); const init = ref(false); const tableHeight = ref(0); @@ -109,9 +114,9 @@ function intdata() { if (element.show === undefined) element.show = true; if (element.editShow === undefined) element.editShow = true; if (!element.setting) - element.setting = { datasource: [], mapValue: "Value", maplabel: "Text" }; - if (!element.setting.mapValue) element.setting.mapValue = "Value"; - if (!element.setting.maplabel) element.setting.maplabel = "Text"; + element.setting = { datasource: [], mapValue: "value", maplabel: "text" }; + if (!element.setting.mapValue) element.setting.mapValue = "value"; + if (!element.setting.maplabel) element.setting.maplabel = "text"; if (!element.change) element.change = () => {}; } @@ -171,7 +176,7 @@ function handleAdd() { dialog.value.width = "500px"; } function handleEdit(obj, row) { - dialog.value.edit.id = row[0].Id; + dialog.value.edit.id = row[0].id; dialog.value.edit.row = row[0]; dialog.value.edit.tagData = obj.tagData; dialog.value.title = obj.label || "修改"; @@ -185,7 +190,7 @@ function handleCustom(obj, row, custom) { dialog.value.custom.custom = custom || []; // 异步加载组件 dialog.value.custom.component = defineAsyncComponent({ - loader: () => import(/* @vite-ignore */ `../${custom.src}.vue`) + loader: () => import(/* @vite-ignore */ `../../views/${custom.src}.vue`) }); dialog.value.width = custom.width; dialog.value.title = custom.title; @@ -206,7 +211,7 @@ function handleDelete(obj, row) { } const ids: any[] = []; row.forEach(it => { - ids.push(it.Id); + ids.push(it.id); }); ElMessageBox.confirm("此操作将永久删除勾选记录, 是否继续?").then(() => { Api.delete(ids).then(res => { @@ -309,12 +314,16 @@ async function fetchInitData() { element.type === "string" || element.type === undefined) ) { - element.custom = row => { - let sc = element.setting.datasource.find( - s => s[element.setting.mapValue] + "" == row[key] + "" - ); - return !sc ? row[key] : sc[element.setting.maplabel]; - }; + if (element.type === "string" || element.type === undefined) + element.custom = row => row[key]; + else { + element.custom = row => { + let sc = element.setting.datasource.find( + s => s[element.setting.mapValue] + "" == row[key] + "" + ); + return !sc ? row[key] : sc[element.setting.maplabel]; + }; + } } else if (element.custom == undefined) { element.custom = row => row[key]; } @@ -370,7 +379,7 @@ function fetchPagedData() { > + +
+ + + + +
@@ -427,7 +469,8 @@ function fetchPagedData() { :key="i" :type="e.btnStyle || 'info'" @click="getbtnClick(e, null)" - >{{ e.label }} + >{{ e.label }}
{{ item.custom(scope.row) }} - - @@ -529,41 +564,6 @@ function fetchPagedData() { @current-change="pageIndexChange" /> -
- - - /> - - -
diff --git a/src/router/modules/home.ts b/src/router/modules/home.ts index a9172f9..ff03d20 100644 --- a/src/router/modules/home.ts +++ b/src/router/modules/home.ts @@ -29,15 +29,6 @@ export default { title: "学校", showLink: true } - }, - { - path: "/menu", - name: "Menu", - component: () => import("@/views/menu/index.vue"), - meta: { - title: "菜单", - showLink: true - } } ] } satisfies RouteConfigsTable; diff --git a/src/views/admin/index.vue b/src/views/admin/index.vue new file mode 100644 index 0000000..db4fa4f --- /dev/null +++ b/src/views/admin/index.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/views/menu/edit.vue b/src/views/menu/edit.vue new file mode 100644 index 0000000..fd383fb --- /dev/null +++ b/src/views/menu/edit.vue @@ -0,0 +1,371 @@ + + + + + diff --git a/src/views/menu/index.vue b/src/views/menu/index.vue index 07f3da1..91a83c7 100644 --- a/src/views/menu/index.vue +++ b/src/views/menu/index.vue @@ -1,6 +1,9 @@ + + + @@ -185,11 +172,16 @@ onMounted(async () => { margin-right: 10px; } +.menu-path-Rank { + font-size: 13px; + margin-right: 10px; + color: #909399; +} .menu-path { font-size: 12px; color: #909399; margin-right: 10px; - flex-grow: 1; + flex-grow: 0; } .menu-tree { padding: 20px; /* 增加内边距 */ diff --git a/src/views/school/SchoolEdit.vue b/src/views/school/SchoolEdit.vue new file mode 100644 index 0000000..a37f44d --- /dev/null +++ b/src/views/school/SchoolEdit.vue @@ -0,0 +1,255 @@ + + diff --git a/src/views/school/index.vue b/src/views/school/index.vue index 902ea25..c1d3d24 100644 --- a/src/views/school/index.vue +++ b/src/views/school/index.vue @@ -2,6 +2,7 @@ import ahTable from "@/components/hTable/index.vue"; import { TableConfig } from "@/components/hTable/hTable"; import { onMounted, ref } from "vue"; +import { fa } from "element-plus/es/locales.mjs"; defineOptions({ name: "School" }); @@ -42,24 +43,17 @@ const tableData: TableConfig = { }, { topBtn: true, // 头部按钮 - show: true, - label: "新增", - btnType: "add", // 按钮类型 add edit del custom - btnStyle: "success" // topBtn: true才生效 success danger + label: "新增学校", + btnType: "custom", // 按钮类型 add edit del custom + btnStyle: "success", // topBtn: true才生效 success danger + custom: { + // 按钮类型 custom 专用 + title: "新增学校", // 弹出框title + src: "school/SchoolEdit", // 组件路径 + width: "550px", // 弹框宽度 + height: "300px" // 弹框高度 + } }, - // { - // topBtn: true, // 头部按钮 - // label: "新增学校", - // btnType: "custom", // 按钮类型 add edit del custom - // btnStyle: "success", // topBtn: true才生效 success danger - // custom: { - // // 按钮类型 custom 专用 - // title: "新增学校", // 弹出框title - // src: "school/SchoolEdit", // 组件路径 - // width: "550px", // 弹框宽度 - // height: "300px" // 弹框高度 - // } - // }, { topBtn: false, // 头部按钮 show: true, @@ -73,8 +67,8 @@ const tableData: TableConfig = { id: { label: "编号", search: true, - add: true, // 字段允许添加 - edit: true, // 字段允许修改 + add: false, // 字段允许添加 + edit: false, // 字段允许修改 width: "150px" }, name: {