From 6270ec712fcae4999ebd8c95b4af1ec30e835466 Mon Sep 17 00:00:00 2001 From: xiaoming <1923740402@qq.com> Date: Sat, 16 Mar 2024 22:32:42 +0800 Subject: [PATCH 01/26] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=AE=A1=E7=90=86-=E8=8F=9C=E5=8D=95=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=96=B0=E9=A2=96=E7=9A=84?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C=20(#984)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 完善角色管理-菜单权限功能,新颖的交互体验 --- mock/system.ts | 228 ++++++++++++++++++++++ src/api/system.ts | 10 + src/views/system/role/index.vue | 280 +++++++++++++++++++-------- src/views/system/role/utils/hook.tsx | 110 +++++++++-- 4 files changed, 534 insertions(+), 94 deletions(-) diff --git a/mock/system.ts b/mock/system.ts index f1ea4718e..0b4486582 100644 --- a/mock/system.ts +++ b/mock/system.ts @@ -140,6 +140,234 @@ export default defineFakeRoute([ }; } }, + // 角色管理-权限-菜单权限 + { + url: "/role-menu", + method: "post", + response: () => { + return { + success: true, + data: [ + // 外部页面 + { + parentId: 0, + id: 100, + menuType: 0, // 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮) + title: "menus.hsExternalPage" + }, + { + parentId: 100, + id: 101, + menuType: 0, + title: "menus.hsExternalDoc" + }, + { + parentId: 101, + id: 102, + menuType: 2, + title: "menus.externalLink" + }, + { + parentId: 101, + id: 103, + menuType: 2, + title: "menus.pureutilsLink" + }, + { + parentId: 100, + id: 104, + menuType: 1, + title: "menus.hsEmbeddedDoc" + }, + { + parentId: 104, + id: 105, + menuType: 1, + title: "menus.hsEpDocument" + }, + { + parentId: 104, + id: 106, + menuType: 1, + title: "menus.hsTailwindcssDocument" + }, + { + parentId: 104, + id: 107, + menuType: 1, + title: "menus.hsVueDocument" + }, + { + parentId: 104, + id: 108, + menuType: 1, + title: "menus.hsViteDocument" + }, + { + parentId: 104, + id: 109, + menuType: 1, + title: "menus.hsPiniaDocument" + }, + { + parentId: 104, + id: 110, + menuType: 1, + title: "menus.hsRouterDocument" + }, + // 权限管理 + { + parentId: 0, + id: 200, + menuType: 0, + title: "menus.permission" + }, + { + parentId: 200, + id: 201, + menuType: 0, + title: "menus.permissionPage" + }, + { + parentId: 200, + id: 202, + menuType: 0, + title: "menus.permissionButton" + }, + { + parentId: 202, + id: 203, + menuType: 3, + title: "添加" + }, + { + parentId: 202, + id: 204, + menuType: 3, + title: "修改" + }, + { + parentId: 202, + id: 205, + menuType: 3, + title: "删除" + }, + // 系统管理 + { + parentId: 0, + id: 300, + menuType: 0, + title: "menus.hssysManagement" + }, + { + parentId: 300, + id: 301, + menuType: 0, + title: "menus.hsUser" + }, + { + parentId: 300, + id: 302, + menuType: 0, + title: "menus.hsRole" + }, + { + parentId: 300, + id: 303, + menuType: 0, + title: "menus.hsSystemMenu" + }, + { + parentId: 300, + id: 304, + menuType: 0, + title: "menus.hsDept" + }, + // 系统监控 + { + parentId: 0, + id: 400, + menuType: 0, + title: "menus.hssysMonitor" + }, + { + parentId: 400, + id: 401, + menuType: 0, + title: "menus.hsOnlineUser" + }, + { + parentId: 400, + id: 402, + menuType: 0, + title: "menus.hsLoginLog" + }, + { + parentId: 400, + id: 403, + menuType: 0, + title: "menus.hsOperationLog" + }, + { + parentId: 400, + id: 404, + menuType: 0, + title: "menus.hsSystemLog" + }, + // 标签页操作 + { + parentId: 0, + id: 500, + menuType: 0, + title: "menus.hstabs" + }, + { + parentId: 500, + id: 501, + menuType: 0, + title: "menus.hstabs" + }, + { + parentId: 500, + id: 502, + menuType: 0, + title: "query传参模式" + }, + { + parentId: 500, + id: 503, + menuType: 0, + title: "params传参模式" + } + ] + }; + } + }, + // 角色管理-权限-菜单权限-根据角色 id 查对应菜单 + { + url: "/role-menu-ids", + method: "post", + response: ({ body }) => { + if (body.id == 1) { + return { + success: true, + data: [ + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 200, 201, + 202, 203, 204, 205, 300, 301, 302, 303, 304, 400, 401, 402, 403, + 404, 500, 501, 502, 503 + ] + }; + } else if (body.id == 2) { + return { + success: true, + data: [ + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 404, 500, + 501, 502, 503 + ] + }; + } + } + }, // 菜单管理 { url: "/menu", diff --git a/src/api/system.ts b/src/api/system.ts index 015854b69..e4db23811 100644 --- a/src/api/system.ts +++ b/src/api/system.ts @@ -73,3 +73,13 @@ export const getSystemLogsList = (data?: object) => { export const getSystemLogsDetail = (data?: object) => { return http.request("post", "/system-logs-detail", { data }); }; + +/** 获取角色管理-权限-菜单权限 */ +export const getRoleMenu = (data?: object) => { + return http.request("post", "/role-menu", { data }); +}; + +/** 获取角色管理-权限-菜单权限-根据角色 id 查对应菜单 */ +export const getRoleMenuIds = (data?: object) => { + return http.request("post", "/role-menu-ids", { data }); +}; diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index c5926d194..540070246 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -1,8 +1,14 @@ - + + + diff --git a/src/views/system/role/utils/hook.tsx b/src/views/system/role/utils/hook.tsx index f4591b936..eb627b41a 100644 --- a/src/views/system/role/utils/hook.tsx +++ b/src/views/system/role/utils/hook.tsx @@ -1,25 +1,41 @@ import dayjs from "dayjs"; import editForm from "../form.vue"; +import { handleTree } from "@/utils/tree"; import { message } from "@/utils/message"; -import { getRoleList } from "@/api/system"; import { ElMessageBox } from "element-plus"; import { usePublicHooks } from "../../hooks"; +import { getKeyList } from "@pureadmin/utils"; +import { transformI18n } from "@/plugins/i18n"; import { addDialog } from "@/components/ReDialog"; import type { FormItemProps } from "../utils/types"; import type { PaginationProps } from "@pureadmin/table"; -import { reactive, ref, onMounted, h, toRaw } from "vue"; +import { getRoleList, getRoleMenu, getRoleMenuIds } from "@/api/system"; +import { type Ref, reactive, ref, onMounted, h, toRaw, watch } from "vue"; -export function useRole() { +export function useRole(treeRef: Ref) { const form = reactive({ name: "", code: "", status: "" }); + const curRow = ref(); const formRef = ref(); const dataList = ref([]); + const treeIds = ref([]); + const treeData = ref([]); + const isShow = ref(false); const loading = ref(true); + const isLinkage = ref(false); + const treeSearchValue = ref(); const switchLoadMap = ref({}); + const isExpandAll = ref(false); + const isSelectAll = ref(false); const { switchStyle } = usePublicHooks(); + const treeProps = { + value: "id", + label: "title", + children: "children" + }; const pagination = reactive({ total: 0, pageSize: 10, @@ -29,22 +45,18 @@ export function useRole() { const columns: TableColumnList = [ { label: "角色编号", - prop: "id", - minWidth: 100 + prop: "id" }, { label: "角色名称", - prop: "name", - minWidth: 120 + prop: "name" }, { label: "角色标识", - prop: "code", - minWidth: 150 + prop: "code" }, { label: "状态", - minWidth: 130, cellRenderer: scope => ( onChange(scope as any)} /> - ) + ), + minWidth: 90 }, { label: "备注", prop: "remark", - minWidth: 150 + minWidth: 160 }, { label: "创建时间", - minWidth: 180, prop: "createTime", + minWidth: 160, formatter: ({ createTime }) => dayjs(createTime).format("YYYY-MM-DD HH:mm:ss") }, { label: "操作", fixed: "right", - width: 240, + width: 210, slot: "operation" } ]; @@ -210,29 +223,92 @@ export function useRole() { } /** 菜单权限 */ - function handleMenu() { - message("等菜单管理页面开发后完善"); + async function handleMenu(row?: any) { + const { id } = row; + if (id) { + curRow.value = row; + isShow.value = true; + const { data } = await getRoleMenuIds({ id }); + treeRef.value.setCheckedKeys(data); + } else { + curRow.value = null; + isShow.value = false; + } + } + + /** 高亮当前权限选中行 */ + function rowStyle({ row: { id } }) { + return { + cursor: "pointer", + background: id === curRow.value?.id ? "var(--el-fill-color-light)" : "" + }; + } + + /** 菜单权限-保存 */ + function handleSave() { + const { id, name } = curRow.value; + // 根据用户 id 调用实际项目中菜单权限修改接口 + console.log(id, treeRef.value.getCheckedKeys()); + message(`角色名称为${name}的菜单权限修改成功`, { + type: "success" + }); } /** 数据权限 可自行开发 */ // function handleDatabase() {} - onMounted(() => { + const onQueryChanged = (query: string) => { + treeRef.value!.filter(query); + }; + + const filterMethod = (query: string, node) => { + return transformI18n(node.title)!.includes(query); + }; + + onMounted(async () => { onSearch(); + const { data } = await getRoleMenu(); + treeIds.value = getKeyList(data, "id"); + treeData.value = handleTree(data); + }); + + watch(isExpandAll, val => { + val + ? treeRef.value.setExpandedKeys(treeIds.value) + : treeRef.value.setExpandedKeys([]); + }); + + watch(isSelectAll, val => { + val + ? treeRef.value.setCheckedKeys(treeIds.value) + : treeRef.value.setCheckedKeys([]); }); return { form, + isShow, + curRow, loading, columns, + rowStyle, dataList, + treeData, + treeProps, + isLinkage, pagination, + isExpandAll, + isSelectAll, + treeSearchValue, // buttonClass, onSearch, resetForm, openDialog, handleMenu, + handleSave, handleDelete, + filterMethod, + transformI18n, + onQueryChanged, // handleDatabase, handleSizeChange, handleCurrentChange, From c0005b4bc9dcc5deb153c1662786b0ffd7ef5b2c Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Sat, 16 Mar 2024 23:20:04 +0800 Subject: [PATCH 02/26] =?UTF-8?q?perf:=20=E7=B3=BB=E7=BB=9F=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E3=80=81=E7=B3=BB=E7=BB=9F=E7=9B=91=E6=8E=A7=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E7=A7=BB=E5=8A=A8=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/monitor/logs/login/index.vue | 2 +- src/views/monitor/logs/operation/index.vue | 2 +- src/views/monitor/logs/system/index.vue | 2 +- src/views/monitor/online/index.vue | 2 +- src/views/system/dept/index.vue | 2 +- src/views/system/dept/utils/hook.tsx | 3 ++- src/views/system/menu/index.vue | 2 +- src/views/system/menu/utils/hook.tsx | 3 ++- src/views/system/role/index.vue | 2 +- src/views/system/role/utils/hook.tsx | 3 ++- src/views/system/user/index.vue | 11 +++++++---- src/views/system/user/tree.vue | 5 +++-- src/views/system/user/utils/hook.tsx | 12 +++++++++++- 13 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/views/monitor/logs/login/index.vue b/src/views/monitor/logs/login/index.vue index 729957026..c65e6dbff 100644 --- a/src/views/monitor/logs/login/index.vue +++ b/src/views/monitor/logs/login/index.vue @@ -39,7 +39,7 @@ const { ref="formRef" :inline="true" :model="form" - class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px]" + class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px] overflow-auto" > h(editForm, { ref: formRef }), diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index fe40f7038..ebd0d1c40 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -35,7 +35,7 @@ const { ref="formRef" :inline="true" :model="form" - class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px]" + class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px] overflow-auto" > h(editForm, { ref: formRef }), diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index 540070246..6037ff079 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -96,7 +96,7 @@ onMounted(() => { ref="formRef" :inline="true" :model="form" - class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px]" + class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px] overflow-auto" > h(editForm, { ref: formRef }), diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 8b97a28c1..0cfc100e7 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -32,6 +32,7 @@ const { selectedNum, pagination, buttonClass, + deviceDetection, onSearch, resetForm, onbatchDel, @@ -50,20 +51,22 @@ const { + + diff --git a/src/views/pure-table/edit/demo2/columns.tsx b/src/views/pure-table/edit/demo2/columns.tsx new file mode 100644 index 000000000..4d955f6aa --- /dev/null +++ b/src/views/pure-table/edit/demo2/columns.tsx @@ -0,0 +1,116 @@ +import { ref } from "vue"; +import { tableData, options } from "../data"; +import { clone, delObjectProperty } from "@pureadmin/utils"; + +export function useColumns() { + const editMap = ref({}); + const dataList = ref(clone(tableData, true)); + + const columns: TableColumnList = [ + { + label: "姓名", + prop: "name", + cellRenderer: ({ row, index }) => ( + <> + {editMap.value[index]?.editable ? ( + + ) : ( +

{row.name}

+ )} + + ) + }, + { + label: "性别", + prop: "sex", + cellRenderer: ({ row, index }) => ( + <> + {editMap.value[index]?.editable ? ( + + ) : ( +

{row.sex === 0 ? "男" : "女"}

+ )} + + ) + }, + { + label: "爱好", + prop: "hobby", + cellRenderer: ({ row, index }) => ( + <> + {editMap.value[index]?.editable ? ( + + {options.map(item => { + return ( + + ); + })} + + ) : ( + + {options.filter(opt => opt.value == row.hobby)[0]?.label} + + )} + + ) + }, + { + label: "日期", + prop: "date", + cellRenderer: ({ row, index }) => ( + <> + {editMap.value[index]?.editable ? ( + + ) : ( +

{row.date}

+ )} + + ), + minWidth: 110 + }, + { + label: "操作", + fixed: "right", + slot: "operation" + } + ]; + + function onEdit(row, index) { + editMap.value[index] = Object.assign({ ...row, editable: true }); + } + + function onSave(index) { + editMap.value[index].editable = false; + } + + function onCancel(index) { + editMap.value[index].editable = false; + dataList.value[index] = delObjectProperty(editMap.value[index], "editable"); + } + + return { + editMap, + columns, + dataList, + onEdit, + onSave, + onCancel + }; +} diff --git a/src/views/pure-table/edit/demo2/index.vue b/src/views/pure-table/edit/demo2/index.vue new file mode 100644 index 000000000..792827fc9 --- /dev/null +++ b/src/views/pure-table/edit/demo2/index.vue @@ -0,0 +1,51 @@ + + + diff --git a/src/views/pure-table/edit/list.tsx b/src/views/pure-table/edit/list.tsx index eecc45adb..7c2e70ab8 100644 --- a/src/views/pure-table/edit/list.tsx +++ b/src/views/pure-table/edit/list.tsx @@ -1,4 +1,5 @@ import Demo1 from "./demo1/index.vue"; +import Demo2 from "./demo2/index.vue"; const rendContent = (val: string) => `代码位置:src/views/pure-table/edit/${val}/index.vue`; @@ -7,7 +8,13 @@ export const list = [ { key: "demo1", content: rendContent("demo1"), - title: "示例一", + title: "整体编辑", component: Demo1 + }, + { + key: "demo2", + content: rendContent("demo2"), + title: "单行编辑", + component: Demo2 } ]; From dbfd014209a358b7633720b6f4e710327027dcaa Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Mon, 18 Mar 2024 12:42:05 +0800 Subject: [PATCH 05/26] =?UTF-8?q?feat:=20`ReDialog`=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=A8=E5=B1=8F=E5=9B=9E=E8=B0=83=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ReDialog/index.vue | 17 ++++++++++++++--- src/components/ReDialog/type.ts | 15 ++++++++++++++- src/views/components/dialog/index.vue | 8 +++++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/components/ReDialog/index.vue b/src/components/ReDialog/index.vue index aa9ad3834..15b6c1073 100644 --- a/src/components/ReDialog/index.vue +++ b/src/components/ReDialog/index.vue @@ -64,9 +64,10 @@ const fullscreenClass = computed(() => { function eventsCallBack( event: EventType, options: DialogOptions, - index: number + index: number, + isClickFullScreen = false ) { - fullscreen.value = options?.fullscreen ?? false; + if (!isClickFullScreen) fullscreen.value = options?.fullscreen ?? false; if (options?.[event] && isFunction(options?.[event])) { return options?.[event]({ options, index }); } @@ -108,7 +109,17 @@ function handleClose( void; -type EventType = "open" | "close" | "openAutoFocus" | "closeAutoFocus"; +type EventType = + | "open" + | "close" + | "openAutoFocus" + | "closeAutoFocus" + | "fullscreenCallBack"; type ArgsType = { /** `cancel` 点击取消按钮、`sure` 点击确定按钮、`close` 点击右上角关闭按钮或空白页或按下了esc键 */ command: "cancel" | "sure" | "close"; @@ -175,6 +180,14 @@ interface DialogOptions extends DialogProps { index: number; args: any; }) => void; + /** 点击全屏按钮时的回调 */ + fullscreenCallBack?: ({ + options, + index + }: { + options: DialogOptions; + index: number; + }) => void; /** 输入焦点聚焦在 `Dialog` 内容时的回调 */ openAutoFocus?: ({ options, diff --git a/src/views/components/dialog/index.vue b/src/views/components/dialog/index.vue index 0df0df694..5a8f59e04 100644 --- a/src/views/components/dialog/index.vue +++ b/src/views/components/dialog/index.vue @@ -43,9 +43,11 @@ function onFullscreenClick() { function onFullscreenIconClick() { addDialog({ - title: "全屏按钮", + title: "全屏按钮和全屏事件", fullscreenIcon: true, - contentRenderer: () =>

弹框内容-全屏按钮

+ fullscreenCallBack: ({ options, index }) => + message(options.fullscreen ? "全屏" : "非全屏"), + contentRenderer: () =>

弹框内容-全屏按钮和全屏事件

}); } @@ -468,7 +470,7 @@ function onBeforeSureClick() { 基础用法 可拖拽 全屏 - 全屏按钮 + 全屏按钮和全屏事件 无背景遮罩层 自定义弹出位置 延时2秒打开弹框 From e46d3e57fed4806fb842ffc185e057d774f77678 Mon Sep 17 00:00:00 2001 From: xiaoming <1923740402@qq.com> Date: Mon, 18 Mar 2024 16:13:26 +0800 Subject: [PATCH 06/26] =?UTF-8?q?feat:=20`pure-admin-table`=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8D=95=E5=85=83=E6=A0=BC=E7=BC=96=E8=BE=91=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E7=9A=84=E7=AE=80=E6=98=93=E7=94=A8=E6=B3=95=20(#992)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: `pure-admin-table`添加单元格编辑表格的简易用法 --- locales/zh-CN.yaml | 4 +- src/views/pure-table/edit/data.ts | 29 ++++- src/views/pure-table/edit/demo1/index.vue | 4 +- src/views/pure-table/edit/demo2/index.vue | 5 +- src/views/pure-table/edit/demo3/columns.tsx | 87 +++++++++++++ src/views/pure-table/edit/demo3/index.vue | 22 ++++ src/views/pure-table/edit/list.tsx | 7 ++ src/views/pure-table/high/edit/columns.tsx | 133 -------------------- src/views/pure-table/high/edit/index.vue | 9 -- src/views/pure-table/high/list.tsx | 7 -- 10 files changed, 150 insertions(+), 157 deletions(-) create mode 100644 src/views/pure-table/edit/demo3/columns.tsx create mode 100644 src/views/pure-table/edit/demo3/index.vue delete mode 100644 src/views/pure-table/high/edit/columns.tsx delete mode 100644 src/views/pure-table/high/edit/index.vue diff --git a/locales/zh-CN.yaml b/locales/zh-CN.yaml index cc6281b21..882ed3241 100644 --- a/locales/zh-CN.yaml +++ b/locales/zh-CN.yaml @@ -128,8 +128,8 @@ menus: hsSensitive: 敏感词过滤 hsPinyin: 汉语拼音 hsdanmaku: 弹幕 - hsPureTableBase: 基础用法(23个示例) - hsPureTableHigh: 高级用法(11个示例) + hsPureTableBase: 基础用法 + hsPureTableHigh: 高级用法 hsPureTableEdit: 可编辑用法 hsboard: 艺术画板 hsMenuoverflow: 目录超出显示 Tooltip 文字提示 diff --git a/src/views/pure-table/edit/data.ts b/src/views/pure-table/edit/data.ts index 9ce85d053..1fbeaf340 100644 --- a/src/views/pure-table/edit/data.ts +++ b/src/views/pure-table/edit/data.ts @@ -1,23 +1,27 @@ const tableData = [ { + id: 1, name: "Tom", sex: 0, // 0代表男 1代表女 hobby: 2, date: "2024-03-17" }, { + id: 2, name: "Jack", sex: 0, hobby: 1, date: "2024-03-18" }, { + id: 3, name: "Lily", sex: 1, hobby: 1, date: "2024-03-19" }, { + id: 4, name: "Mia", sex: 1, hobby: 3, @@ -44,4 +48,27 @@ const options = [ } ]; -export { tableData, options }; +const tableDataEdit = [ + { + id: 1, + name: "Tom", + address: "home" + }, + { + id: 2, + name: "Jack", + address: "office" + }, + { + id: 3, + name: "Lily", + address: "library" + }, + { + id: 4, + name: "Mia", + address: "playground" + } +]; + +export { tableData, tableDataEdit, options }; diff --git a/src/views/pure-table/edit/demo1/index.vue b/src/views/pure-table/edit/demo1/index.vue index 208bfd065..6beea0cd3 100644 --- a/src/views/pure-table/edit/demo1/index.vue +++ b/src/views/pure-table/edit/demo1/index.vue @@ -10,9 +10,9 @@ const { columns, dataList, onAdd, onDel } = useColumns();