smart-admin-web 10.20.1 → 10.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +19 -1
- package/dist/api/index.js +85 -66
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +448 -1
- package/dist/assets/icons/ph-subset.json.js +1 -1
- package/dist/components/FormContainer/index.vue.js +87 -75
- package/dist/components/FormContainer/index.vue.js.map +1 -1
- package/dist/components/UserPicker/UserAvatar.vue.d.ts +8 -0
- package/dist/components/UserPicker/UserAvatar.vue.js +8 -0
- package/dist/components/UserPicker/UserAvatar.vue.js.map +1 -0
- package/dist/components/UserPicker/UserAvatar2.vue.js +38 -0
- package/dist/components/UserPicker/UserAvatar2.vue.js.map +1 -0
- package/dist/components/UserPicker/index.vue.js +1 -1
- package/dist/components/UserPicker/index2.vue.js +328 -186
- package/dist/components/UserPicker/index2.vue.js.map +1 -1
- package/dist/composables/authMenuRoute.d.ts +10 -0
- package/dist/composables/authMenuRoute.js +39 -23
- package/dist/composables/authMenuRoute.js.map +1 -1
- package/dist/composables/useModule.d.ts +3 -1
- package/dist/composables/useModule.js +44 -32
- package/dist/composables/useModule.js.map +1 -1
- package/dist/index.js +246 -242
- package/dist/layouts/components/SideNav.vue.js +2 -2
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/watermark.d.ts +1 -1
- package/dist/locales/en-US.d.ts +68 -3
- package/dist/locales/en-US.js +74 -8
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/kernelMenuTitles.js +1 -0
- package/dist/locales/kernelMenuTitles.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +68 -3
- package/dist/locales/zh-CN.js +74 -8
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/viewRegistry.js +6 -6
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/naive-theme.js +80 -77
- package/dist/theme/naive-theme.js.map +1 -1
- package/dist/types/api.d.ts +91 -0
- package/dist/types/api.js +17 -15
- package/dist/types/api.js.map +1 -1
- package/dist/utils/shake.d.ts +1 -0
- package/dist/utils/shake.js +30 -0
- package/dist/utils/shake.js.map +1 -0
- package/dist/utils/tree.d.ts +15 -0
- package/dist/utils/tree.js +43 -29
- package/dist/utils/tree.js.map +1 -1
- package/dist/utils/treeCard.d.ts +6 -0
- package/dist/utils/treeCard.js +9 -0
- package/dist/utils/treeCard.js.map +1 -0
- package/dist/views/error/404.vue.js +2 -2
- package/dist/views/error/4042.vue.js +81 -24
- package/dist/views/error/4042.vue.js.map +1 -1
- package/dist/views/login/LoginForm.vue.js +2 -2
- package/dist/views/login/LoginForm2.vue.js +135 -135
- package/dist/views/login/LoginForm2.vue.js.map +1 -1
- package/dist/views/login/components/LoginDesk.vue.js +2 -2
- package/dist/views/login/components/LoginDesk2.vue.js +59 -47
- package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
- package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
- package/dist/views/personal/notice2.vue.js +1 -1
- package/dist/views/personal/notice2.vue.js.map +1 -1
- package/dist/views/personal/sessions.vue.js +2 -2
- package/dist/views/personal/sessions2.vue.js +41 -40
- package/dist/views/personal/sessions2.vue.js.map +1 -1
- package/dist/views/system/ai-usage/index.vue.js +3 -3
- package/dist/views/system/ai-usage/index2.vue.js +13 -12
- package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection.vue.js +3 -3
- package/dist/views/system/config/components/AdvancedSection2.vue.js +2 -1
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
- package/dist/views/system/dict/index.vue.js +2 -2
- package/dist/views/system/dict/index2.vue.js +12 -1
- package/dist/views/system/dict/index2.vue.js.map +1 -1
- package/dist/views/system/file/index2.vue.js +1 -0
- package/dist/views/system/file/index2.vue.js.map +1 -1
- package/dist/views/system/job/index.vue.js +3 -3
- package/dist/views/system/job/index2.vue.js +182 -181
- package/dist/views/system/job/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/components/AttemptTable2.vue.js +8 -3
- package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -1
- package/dist/views/system/job-log/index.vue.js +1 -1
- package/dist/views/system/job-log/index2.vue.js +5 -5
- package/dist/views/system/job-log/index2.vue.js.map +1 -1
- package/dist/views/system/job-monitor/index.vue.js +2 -2
- package/dist/views/system/job-monitor/index2.vue.js +46 -46
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
- package/dist/views/system/log/exception/index.vue.js +2 -2
- package/dist/views/system/log/exception/index2.vue.js +8 -5
- package/dist/views/system/log/exception/index2.vue.js.map +1 -1
- package/dist/views/system/log/login/index2.vue.js +21 -12
- package/dist/views/system/log/login/index2.vue.js.map +1 -1
- package/dist/views/system/log/op/index.vue.js +2 -2
- package/dist/views/system/log/op/index2.vue.js +50 -40
- package/dist/views/system/log/op/index2.vue.js.map +1 -1
- package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
- package/dist/views/system/menu/components/ButtonManager2.vue.js +45 -36
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
- package/dist/views/system/menu/index.vue.js +1 -1
- package/dist/views/system/menu/index2.vue.js +162 -151
- package/dist/views/system/menu/index2.vue.js.map +1 -1
- package/dist/views/system/module/index.vue.js +1 -1
- package/dist/views/system/module/index2.vue.js +171 -117
- package/dist/views/system/module/index2.vue.js.map +1 -1
- package/dist/views/system/notice/index.vue.js +3 -3
- package/dist/views/system/notice/index2.vue.js +1 -0
- package/dist/views/system/notice/index2.vue.js.map +1 -1
- package/dist/views/system/org/index.vue.js +2 -2
- package/dist/views/system/org/index2.vue.js +204 -195
- package/dist/views/system/org/index2.vue.js.map +1 -1
- package/dist/views/system/position/index.vue.js +2 -2
- package/dist/views/system/position/index2.vue.js +57 -48
- package/dist/views/system/position/index2.vue.js.map +1 -1
- package/dist/views/system/recycle/index.vue.js +1 -1
- package/dist/views/system/recycle/index2.vue.js +3 -1
- package/dist/views/system/recycle/index2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +2 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js +2 -2
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js +54 -49
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuTable.vue.js +1 -1
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +159 -195
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
- package/dist/views/system/role/components/grantMenuGroups.d.ts +54 -0
- package/dist/views/system/role/components/grantMenuGroups.js +116 -76
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
- package/dist/views/system/role/index.vue.js +2 -2
- package/dist/views/system/role/index2.vue.js +152 -145
- package/dist/views/system/role/index2.vue.js.map +1 -1
- package/dist/views/system/session/index2.vue.js +39 -35
- package/dist/views/system/session/index2.vue.js.map +1 -1
- package/dist/views/system/user/components/UserGrantEffectiveTable.vue.d.ts +10 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js +5 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js +96 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuSheet.vue.d.ts +13 -0
- package/dist/views/system/user/components/UserGrantMenuSheet.vue.js +8 -0
- package/dist/views/system/user/components/UserGrantMenuSheet.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js +216 -0
- package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuTable.vue.d.ts +13 -0
- package/dist/views/system/user/components/UserGrantMenuTable.vue.js +8 -0
- package/dist/views/system/user/components/UserGrantMenuTable.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuTable2.vue.js +186 -0
- package/dist/views/system/user/components/UserGrantMenuTable2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantNodeRow.vue.d.ts +31 -0
- package/dist/views/system/user/components/UserGrantNodeRow.vue.js +8 -0
- package/dist/views/system/user/components/UserGrantNodeRow.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantNodeRow2.vue.js +171 -0
- package/dist/views/system/user/components/UserGrantNodeRow2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.d.ts +21 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js +5 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js +178 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js.map +1 -0
- package/dist/views/system/user/components/userGrantState.d.ts +64 -0
- package/dist/views/system/user/components/userGrantState.js +117 -0
- package/dist/views/system/user/components/userGrantState.js.map +1 -0
- package/dist/views/system/user/index.vue.js +2 -2
- package/dist/views/system/user/index2.vue.js +369 -295
- package/dist/views/system/user/index2.vue.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useMessage as
|
|
3
|
-
import { useMediaQuery as
|
|
4
|
-
import { SmartTable as
|
|
1
|
+
import { defineComponent as Q, computed as N, ref as p, onMounted as J, reactive as K, resolveDirective as X, openBlock as S, createElementBlock as Y, Fragment as Z, createVNode as o, unref as l, withCtx as d, withDirectives as ee, createBlock as le, createTextVNode as A, toDisplayString as h, mergeProps as te, createElementVNode as R, h as u } from "vue";
|
|
2
|
+
import { useMessage as ae, NButton as w, NForm as oe, NFormItem as r, NInput as f, NSpace as k, NInputNumber as ie, NSwitch as O, NTooltip as F, NTag as T, NPopconfirm as ne } from "naive-ui";
|
|
3
|
+
import { useMediaQuery as de } from "@vueuse/core";
|
|
4
|
+
import { SmartTable as ue } from "smart-naive-table";
|
|
5
5
|
import { useI18n as re } from "vue-i18n";
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
6
|
+
import D from "../../../components/AppIcon.vue.js";
|
|
7
|
+
import se from "../../../components/IconPicker/index.vue.js";
|
|
8
|
+
import me from "../../../components/FormContainer/index.vue.js";
|
|
9
9
|
/* empty css */
|
|
10
|
-
import
|
|
11
|
-
import { useConfirm as
|
|
12
|
-
import { useAuthStore as
|
|
13
|
-
import { moduleApi as
|
|
14
|
-
import { translateError as
|
|
15
|
-
import { TABLE_MIN_ROW_HEIGHT as
|
|
16
|
-
import { deriveHeaderFilters as
|
|
17
|
-
import { lineIcon as
|
|
18
|
-
const
|
|
10
|
+
import ce from "../../../components/StatusSwitch/index.vue.js";
|
|
11
|
+
import { useConfirm as pe } from "../../../composables/useConfirm.js";
|
|
12
|
+
import { useAuthStore as fe } from "../../../stores/auth.js";
|
|
13
|
+
import { moduleApi as b } from "../../../api/index.js";
|
|
14
|
+
import { translateError as H } from "../../../utils/error.js";
|
|
15
|
+
import { TABLE_MIN_ROW_HEIGHT as be, TABLE_TOOLBAR as ve } from "../../../utils/tableToolbar.js";
|
|
16
|
+
import { deriveHeaderFilters as ge } from "../../../utils/tableFilter.js";
|
|
17
|
+
import { lineIcon as ye } from "../../../utils/menuIcon.js";
|
|
18
|
+
const he = { class: "hint" }, we = { style: { display: "inline-flex" } }, ke = { class: "hint" }, He = /* @__PURE__ */ Q({
|
|
19
19
|
__name: "index",
|
|
20
|
-
setup(
|
|
21
|
-
const { t } = re(),
|
|
22
|
-
() =>
|
|
23
|
-
), v =
|
|
24
|
-
async function
|
|
20
|
+
setup(xe) {
|
|
21
|
+
const { t } = re(), x = ae(), { run: L } = pe(), _ = fe(), M = de("(max-width: 640px)"), V = N(
|
|
22
|
+
() => M.value ? { labelPlacement: "top", labelWidth: void 0 } : { labelPlacement: "left", labelWidth: 90 }
|
|
23
|
+
), v = p(!1), z = p([]), c = (e) => e.code === "system";
|
|
24
|
+
async function g() {
|
|
25
25
|
v.value = !0;
|
|
26
26
|
try {
|
|
27
|
-
|
|
27
|
+
z.value = await b.list();
|
|
28
28
|
} catch (e) {
|
|
29
|
-
|
|
29
|
+
x.error(H(e));
|
|
30
30
|
} finally {
|
|
31
31
|
v.value = !1;
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
-
|
|
35
|
-
const
|
|
34
|
+
J(g);
|
|
35
|
+
const y = p(!1), U = p(null), $ = {
|
|
36
36
|
// whitespace: 纯空白不算填写
|
|
37
37
|
code: {
|
|
38
38
|
required: !0,
|
|
@@ -46,7 +46,10 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
46
46
|
message: () => t("module.nameRequired"),
|
|
47
47
|
trigger: ["input", "blur"]
|
|
48
48
|
}
|
|
49
|
-
},
|
|
49
|
+
}, s = p(null), P = N(() => s.value !== null && i.code === "system"), I = N({
|
|
50
|
+
get: () => !P.value && i.isDelegatable === !0,
|
|
51
|
+
set: (e) => i.isDelegatable = e
|
|
52
|
+
}), E = () => ({
|
|
50
53
|
code: "",
|
|
51
54
|
title: "",
|
|
52
55
|
icon: "",
|
|
@@ -54,8 +57,9 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
54
57
|
apiPrefix: "",
|
|
55
58
|
sort: 0,
|
|
56
59
|
enabled: !0,
|
|
57
|
-
remark: ""
|
|
58
|
-
|
|
60
|
+
remark: "",
|
|
61
|
+
isDelegatable: !0
|
|
62
|
+
}), i = K(E()), q = (e) => ({
|
|
59
63
|
code: e.code,
|
|
60
64
|
title: e.title,
|
|
61
65
|
icon: e.icon ?? "",
|
|
@@ -63,53 +67,69 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
63
67
|
apiPrefix: e.apiPrefix ?? "",
|
|
64
68
|
sort: e.sort,
|
|
65
69
|
enabled: e.enabled,
|
|
66
|
-
remark: e.remark ?? ""
|
|
70
|
+
remark: e.remark ?? "",
|
|
71
|
+
// 内置模块恒为不可转授:编辑回填与行内改状态都提交 false,不把后端偶发的 true 带回去
|
|
72
|
+
isDelegatable: c(e) ? !1 : e.isDelegatable ?? !1
|
|
67
73
|
});
|
|
68
|
-
function
|
|
69
|
-
|
|
74
|
+
function j() {
|
|
75
|
+
s.value = null, Object.assign(i, E()), y.value = !0;
|
|
70
76
|
}
|
|
71
|
-
function
|
|
72
|
-
|
|
77
|
+
function W(e) {
|
|
78
|
+
s.value = e.id, Object.assign(i, q(e)), y.value = !0;
|
|
73
79
|
}
|
|
74
|
-
async function
|
|
80
|
+
async function G() {
|
|
75
81
|
var e;
|
|
76
|
-
await ((e =
|
|
82
|
+
await ((e = U.value) == null ? void 0 : e.validate());
|
|
77
83
|
try {
|
|
78
|
-
|
|
84
|
+
s.value === null ? await b.add({ ...i }) : await b.update(s.value, { ...i }), x.success(t("module.saved")), await g();
|
|
79
85
|
} catch (a) {
|
|
80
|
-
return
|
|
86
|
+
return x.error(H(a)), !1;
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
|
-
const
|
|
89
|
+
const B = (e) => e ? u("span", { class: "mono muted" }, e) : u("span", { class: "faint" }, "—"), C = [
|
|
84
90
|
{ type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
|
|
85
91
|
{
|
|
86
92
|
title: () => t("module.code"),
|
|
87
93
|
key: "code",
|
|
94
|
+
width: 160,
|
|
95
|
+
ellipsis: { tooltip: !0 },
|
|
88
96
|
search: {},
|
|
89
97
|
render: (e) => u("span", { class: "mono" }, e.code)
|
|
90
98
|
},
|
|
91
99
|
{
|
|
92
100
|
title: () => t("module.name"),
|
|
93
101
|
key: "title",
|
|
102
|
+
ellipsis: { tooltip: !0 },
|
|
94
103
|
// 窄档卡片以名称作标题(默认取第一个数据列 = 编码)
|
|
95
104
|
card: "title",
|
|
96
105
|
search: {},
|
|
97
|
-
render: (e) => u(
|
|
98
|
-
e.icon ? u(
|
|
106
|
+
render: (e) => u(k, { align: "center", size: 6, wrapItem: !1 }, () => [
|
|
107
|
+
e.icon ? u(D, { icon: ye(e.icon), size: 18 }) : null,
|
|
99
108
|
e.title,
|
|
100
|
-
|
|
109
|
+
c(e) ? u(T, { size: "small", type: "info", bordered: !1 }, () => t("module.builtin")) : null
|
|
101
110
|
])
|
|
102
111
|
},
|
|
103
112
|
{
|
|
104
113
|
title: () => t("module.defaultRoute"),
|
|
105
114
|
key: "defaultRoute",
|
|
106
|
-
|
|
115
|
+
ellipsis: { tooltip: !0 },
|
|
116
|
+
render: (e) => B(e.defaultRoute)
|
|
107
117
|
},
|
|
108
118
|
{
|
|
109
119
|
title: () => t("module.apiPrefix"),
|
|
110
120
|
key: "apiPrefix",
|
|
111
121
|
width: 120,
|
|
112
|
-
render: (e) =>
|
|
122
|
+
render: (e) => B(e.apiPrefix)
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
title: () => t("module.delegatable"),
|
|
126
|
+
key: "isDelegatable",
|
|
127
|
+
width: 100,
|
|
128
|
+
render: (e) => u(
|
|
129
|
+
T,
|
|
130
|
+
{ size: "small", bordered: !1, type: e.isDelegatable ? "success" : "default" },
|
|
131
|
+
() => t(e.isDelegatable ? "common.yes" : "common.no")
|
|
132
|
+
)
|
|
113
133
|
},
|
|
114
134
|
{
|
|
115
135
|
title: () => t("module.sort"),
|
|
@@ -123,25 +143,25 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
123
143
|
width: 90,
|
|
124
144
|
// 无启停(update)权限者不见开关,退化为只读状态标签,保留状态可见性。
|
|
125
145
|
render: (e) => {
|
|
126
|
-
if (!
|
|
146
|
+
if (!_.hasPerm("PUT:/api/v1/sys/module/{id}"))
|
|
127
147
|
return u(
|
|
128
|
-
|
|
148
|
+
T,
|
|
129
149
|
{ size: "small", bordered: !1, type: e.enabled ? "success" : "default" },
|
|
130
150
|
() => t(e.enabled ? "common.enabled" : "common.disabled")
|
|
131
151
|
);
|
|
132
|
-
const a = u(
|
|
152
|
+
const a = u(ce, {
|
|
133
153
|
value: e.enabled,
|
|
134
154
|
// 内置 system 应用停用会让门户失联(模块/菜单管理页都在它下面,停了就没法从 UI 恢复)——
|
|
135
155
|
// 与「禁删」同级的前端保护;后端停用与删除内置模块都拒绝(42013),这里只是不给点。
|
|
136
|
-
disabled:
|
|
156
|
+
disabled: c(e),
|
|
137
157
|
// 停用会把应用从门户隐藏,先确认;启用无副作用,跳过确认(返回 null)。
|
|
138
|
-
confirm: (
|
|
139
|
-
request: (
|
|
140
|
-
"onUpdate:value": (
|
|
141
|
-
e.enabled =
|
|
158
|
+
confirm: (m) => m ? null : t("module.disableConfirm", { title: e.title }),
|
|
159
|
+
request: (m) => b.update(e.id, { ...q(e), enabled: m }),
|
|
160
|
+
"onUpdate:value": (m) => {
|
|
161
|
+
e.enabled = m;
|
|
142
162
|
}
|
|
143
163
|
});
|
|
144
|
-
return
|
|
164
|
+
return c(e) ? u(F, null, {
|
|
145
165
|
trigger: () => u("span", { style: "display: inline-flex" }, [a]),
|
|
146
166
|
default: () => t("module.builtinNoDisable")
|
|
147
167
|
}) : a;
|
|
@@ -154,23 +174,23 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
154
174
|
align: "right",
|
|
155
175
|
fixed: "right",
|
|
156
176
|
hideInSetting: !0,
|
|
157
|
-
render: (e) => u(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
{ size: "small", quaternary: !0, type: "primary", onClick: () =>
|
|
177
|
+
render: (e) => u(k, { size: 2, justify: "end", wrapItem: !1 }, () => [
|
|
178
|
+
_.hasPerm("PUT:/api/v1/sys/module/{id}") ? u(
|
|
179
|
+
w,
|
|
180
|
+
{ size: "small", quaternary: !0, type: "primary", onClick: () => W(e) },
|
|
161
181
|
() => t("common.edit")
|
|
162
182
|
) : null,
|
|
163
|
-
|
|
164
|
-
|
|
183
|
+
c(e) || !_.hasPerm("DELETE:/api/v1/sys/module/{id}") ? null : u(
|
|
184
|
+
ne,
|
|
165
185
|
{
|
|
166
186
|
// popconfirm 留在模板层当触发器,「执行→toast」后半段交给 useConfirm().run。
|
|
167
|
-
onPositiveClick: () =>
|
|
168
|
-
a &&
|
|
187
|
+
onPositiveClick: () => L(() => b.remove(e.id), t("module.deleted")).then((a) => {
|
|
188
|
+
a && g();
|
|
169
189
|
})
|
|
170
190
|
},
|
|
171
191
|
{
|
|
172
192
|
trigger: () => u(
|
|
173
|
-
|
|
193
|
+
w,
|
|
174
194
|
{ size: "small", quaternary: !0, type: "error" },
|
|
175
195
|
() => t("common.delete")
|
|
176
196
|
),
|
|
@@ -180,49 +200,49 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
180
200
|
])
|
|
181
201
|
}
|
|
182
202
|
];
|
|
183
|
-
return
|
|
184
|
-
const
|
|
185
|
-
return
|
|
186
|
-
o(l(
|
|
187
|
-
columns:
|
|
188
|
-
data:
|
|
203
|
+
return ge(C), (e, a) => {
|
|
204
|
+
const m = X("auth");
|
|
205
|
+
return S(), Y(Z, null, [
|
|
206
|
+
o(l(ue), {
|
|
207
|
+
columns: C,
|
|
208
|
+
data: z.value,
|
|
189
209
|
loading: v.value,
|
|
190
210
|
"row-key": "id",
|
|
191
211
|
pagination: !1,
|
|
192
|
-
toolbar: l(
|
|
212
|
+
toolbar: l(ve),
|
|
193
213
|
search: { container: "table" },
|
|
194
214
|
"fill-height": "",
|
|
195
|
-
"min-row-height": l(
|
|
215
|
+
"min-row-height": l(be),
|
|
196
216
|
"card-on-narrow": "",
|
|
197
217
|
"storage-key": "sys-module"
|
|
198
218
|
}, {
|
|
199
|
-
"toolbar-right":
|
|
200
|
-
|
|
219
|
+
"toolbar-right": d(() => [
|
|
220
|
+
ee((S(), le(l(w), {
|
|
201
221
|
type: "primary",
|
|
202
|
-
onClick:
|
|
222
|
+
onClick: j
|
|
203
223
|
}, {
|
|
204
|
-
icon:
|
|
205
|
-
o(
|
|
224
|
+
icon: d(() => [
|
|
225
|
+
o(D, {
|
|
206
226
|
icon: "ph:plus",
|
|
207
227
|
size: 16
|
|
208
228
|
})
|
|
209
229
|
]),
|
|
210
|
-
default:
|
|
211
|
-
|
|
230
|
+
default: d(() => [
|
|
231
|
+
A(" " + h(l(t)("common.add")), 1)
|
|
212
232
|
]),
|
|
213
233
|
_: 1
|
|
214
234
|
})), [
|
|
215
|
-
[
|
|
235
|
+
[m, "POST:/api/v1/sys/module/add"]
|
|
216
236
|
]),
|
|
217
|
-
o(l(
|
|
237
|
+
o(l(w), {
|
|
218
238
|
quaternary: "",
|
|
219
239
|
circle: "",
|
|
220
240
|
loading: v.value,
|
|
221
241
|
"aria-label": l(t)("table.refresh"),
|
|
222
|
-
onClick:
|
|
242
|
+
onClick: g
|
|
223
243
|
}, {
|
|
224
|
-
icon:
|
|
225
|
-
o(
|
|
244
|
+
icon: d(() => [
|
|
245
|
+
o(D, {
|
|
226
246
|
icon: "ph:arrow-clockwise",
|
|
227
247
|
size: 16
|
|
228
248
|
})
|
|
@@ -232,43 +252,43 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
232
252
|
]),
|
|
233
253
|
_: 1
|
|
234
254
|
}, 8, ["data", "loading", "toolbar", "min-row-height"]),
|
|
235
|
-
o(
|
|
236
|
-
show:
|
|
237
|
-
"onUpdate:show": a[
|
|
238
|
-
title:
|
|
255
|
+
o(me, {
|
|
256
|
+
show: y.value,
|
|
257
|
+
"onUpdate:show": a[9] || (a[9] = (n) => y.value = n),
|
|
258
|
+
title: s.value === null ? l(t)("module.addTitle") : l(t)("module.editTitle"),
|
|
239
259
|
width: 520,
|
|
240
|
-
"on-confirm":
|
|
260
|
+
"on-confirm": G,
|
|
241
261
|
"confirm-text": l(t)("common.save")
|
|
242
262
|
}, {
|
|
243
|
-
default:
|
|
244
|
-
o(l(
|
|
263
|
+
default: d(() => [
|
|
264
|
+
o(l(oe), te({
|
|
245
265
|
ref_key: "formRef",
|
|
246
|
-
ref:
|
|
266
|
+
ref: U,
|
|
247
267
|
model: i,
|
|
248
|
-
rules:
|
|
268
|
+
rules: $,
|
|
249
269
|
"require-mark-placement": "left"
|
|
250
|
-
},
|
|
251
|
-
default:
|
|
252
|
-
o(l(
|
|
270
|
+
}, V.value), {
|
|
271
|
+
default: d(() => [
|
|
272
|
+
o(l(r), {
|
|
253
273
|
label: l(t)("module.code"),
|
|
254
274
|
path: "code"
|
|
255
275
|
}, {
|
|
256
|
-
default:
|
|
276
|
+
default: d(() => [
|
|
257
277
|
o(l(f), {
|
|
258
278
|
value: i.code,
|
|
259
279
|
"onUpdate:value": a[0] || (a[0] = (n) => i.code = n),
|
|
260
280
|
class: "mono",
|
|
261
281
|
placeholder: l(t)("module.code"),
|
|
262
|
-
disabled:
|
|
282
|
+
disabled: s.value !== null
|
|
263
283
|
}, null, 8, ["value", "placeholder", "disabled"])
|
|
264
284
|
]),
|
|
265
285
|
_: 1
|
|
266
286
|
}, 8, ["label"]),
|
|
267
|
-
o(l(
|
|
287
|
+
o(l(r), {
|
|
268
288
|
label: l(t)("module.name"),
|
|
269
289
|
path: "title"
|
|
270
290
|
}, {
|
|
271
|
-
default:
|
|
291
|
+
default: d(() => [
|
|
272
292
|
o(l(f), {
|
|
273
293
|
value: i.title,
|
|
274
294
|
"onUpdate:value": a[1] || (a[1] = (n) => i.title = n),
|
|
@@ -277,21 +297,21 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
277
297
|
]),
|
|
278
298
|
_: 1
|
|
279
299
|
}, 8, ["label"]),
|
|
280
|
-
o(l(
|
|
300
|
+
o(l(r), {
|
|
281
301
|
label: l(t)("module.icon")
|
|
282
302
|
}, {
|
|
283
|
-
default:
|
|
284
|
-
o(
|
|
303
|
+
default: d(() => [
|
|
304
|
+
o(se, {
|
|
285
305
|
"model-value": i.icon ?? "",
|
|
286
306
|
"onUpdate:modelValue": a[2] || (a[2] = (n) => i.icon = n)
|
|
287
307
|
}, null, 8, ["model-value"])
|
|
288
308
|
]),
|
|
289
309
|
_: 1
|
|
290
310
|
}, 8, ["label"]),
|
|
291
|
-
o(l(
|
|
311
|
+
o(l(r), {
|
|
292
312
|
label: l(t)("module.defaultRoute")
|
|
293
313
|
}, {
|
|
294
|
-
default:
|
|
314
|
+
default: d(() => [
|
|
295
315
|
o(l(f), {
|
|
296
316
|
value: i.defaultRoute,
|
|
297
317
|
"onUpdate:value": a[3] || (a[3] = (n) => i.defaultRoute = n),
|
|
@@ -301,34 +321,34 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
301
321
|
]),
|
|
302
322
|
_: 1
|
|
303
323
|
}, 8, ["label"]),
|
|
304
|
-
o(l(
|
|
324
|
+
o(l(r), {
|
|
305
325
|
label: l(t)("module.apiPrefix")
|
|
306
326
|
}, {
|
|
307
|
-
default:
|
|
308
|
-
o(l(
|
|
327
|
+
default: d(() => [
|
|
328
|
+
o(l(k), {
|
|
309
329
|
vertical: "",
|
|
310
330
|
size: 2,
|
|
311
331
|
style: { width: "100%" }
|
|
312
332
|
}, {
|
|
313
|
-
default:
|
|
333
|
+
default: d(() => [
|
|
314
334
|
o(l(f), {
|
|
315
335
|
value: i.apiPrefix,
|
|
316
336
|
"onUpdate:value": a[4] || (a[4] = (n) => i.apiPrefix = n),
|
|
317
337
|
class: "mono",
|
|
318
338
|
placeholder: "sys"
|
|
319
339
|
}, null, 8, ["value"]),
|
|
320
|
-
|
|
340
|
+
R("span", he, h(l(t)("module.apiPrefixHint")), 1)
|
|
321
341
|
]),
|
|
322
342
|
_: 1
|
|
323
343
|
})
|
|
324
344
|
]),
|
|
325
345
|
_: 1
|
|
326
346
|
}, 8, ["label"]),
|
|
327
|
-
o(l(
|
|
347
|
+
o(l(r), {
|
|
328
348
|
label: l(t)("module.sort")
|
|
329
349
|
}, {
|
|
330
|
-
default:
|
|
331
|
-
o(l(
|
|
350
|
+
default: d(() => [
|
|
351
|
+
o(l(ie), {
|
|
332
352
|
value: i.sort,
|
|
333
353
|
"onUpdate:value": a[5] || (a[5] = (n) => i.sort = n),
|
|
334
354
|
min: 0,
|
|
@@ -337,24 +357,58 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
337
357
|
]),
|
|
338
358
|
_: 1
|
|
339
359
|
}, 8, ["label"]),
|
|
340
|
-
o(l(
|
|
360
|
+
o(l(r), {
|
|
341
361
|
label: l(t)("common.status")
|
|
342
362
|
}, {
|
|
343
|
-
default:
|
|
344
|
-
o(l(
|
|
363
|
+
default: d(() => [
|
|
364
|
+
o(l(O), {
|
|
345
365
|
value: i.enabled,
|
|
346
366
|
"onUpdate:value": a[6] || (a[6] = (n) => i.enabled = n)
|
|
347
367
|
}, null, 8, ["value"])
|
|
348
368
|
]),
|
|
349
369
|
_: 1
|
|
350
370
|
}, 8, ["label"]),
|
|
351
|
-
o(l(
|
|
371
|
+
o(l(r), {
|
|
372
|
+
label: l(t)("module.delegatable")
|
|
373
|
+
}, {
|
|
374
|
+
default: d(() => [
|
|
375
|
+
o(l(k), {
|
|
376
|
+
vertical: "",
|
|
377
|
+
size: 2,
|
|
378
|
+
style: { width: "100%" }
|
|
379
|
+
}, {
|
|
380
|
+
default: d(() => [
|
|
381
|
+
o(l(F), {
|
|
382
|
+
disabled: !P.value
|
|
383
|
+
}, {
|
|
384
|
+
trigger: d(() => [
|
|
385
|
+
R("span", we, [
|
|
386
|
+
o(l(O), {
|
|
387
|
+
value: I.value,
|
|
388
|
+
"onUpdate:value": a[7] || (a[7] = (n) => I.value = n),
|
|
389
|
+
disabled: P.value
|
|
390
|
+
}, null, 8, ["value", "disabled"])
|
|
391
|
+
])
|
|
392
|
+
]),
|
|
393
|
+
default: d(() => [
|
|
394
|
+
A(" " + h(l(t)("module.builtinNotDelegatable")), 1)
|
|
395
|
+
]),
|
|
396
|
+
_: 1
|
|
397
|
+
}, 8, ["disabled"]),
|
|
398
|
+
R("span", ke, h(l(t)("module.delegatableHint")), 1)
|
|
399
|
+
]),
|
|
400
|
+
_: 1
|
|
401
|
+
})
|
|
402
|
+
]),
|
|
403
|
+
_: 1
|
|
404
|
+
}, 8, ["label"]),
|
|
405
|
+
o(l(r), {
|
|
352
406
|
label: l(t)("module.remark")
|
|
353
407
|
}, {
|
|
354
|
-
default:
|
|
408
|
+
default: d(() => [
|
|
355
409
|
o(l(f), {
|
|
356
410
|
value: i.remark,
|
|
357
|
-
"onUpdate:value": a[
|
|
411
|
+
"onUpdate:value": a[8] || (a[8] = (n) => i.remark = n),
|
|
358
412
|
type: "textarea",
|
|
359
413
|
autosize: { minRows: 2 }
|
|
360
414
|
}, null, 8, ["value"])
|
|
@@ -372,6 +426,6 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
|
|
|
372
426
|
}
|
|
373
427
|
});
|
|
374
428
|
export {
|
|
375
|
-
|
|
429
|
+
He as default
|
|
376
430
|
};
|
|
377
431
|
//# sourceMappingURL=index2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/module/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NTag,\n NTooltip,\n NForm,\n NFormItem,\n NInput,\n NInputNumber,\n NSwitch,\n NPopconfirm,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport IconPicker from '#/components/IconPicker/index.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { moduleApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport type { ModuleInput, ModuleRow } from '#/types/api'\n\nimport { deriveHeaderFilters } from '#/utils/tableFilter'\nimport { lineIcon } from '#/utils/menuIcon'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\n// 窄屏:表单标签放上方(底部抽屉里横排标签太挤);宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 90 },\n)\n\nconst loading = ref(false)\nconst rows = ref<ModuleRow[]>([])\n\n/** 内置 system 模块受保护(后端 42013),前端据 code 禁删,避免明知不可为的请求。 */\nconst isBuiltin = (r: ModuleRow) => r.code === 'system'\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await moduleApi.list()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\n// ── 新增/编辑弹窗(FormContainer:loading/底栏/关闭时机由容器按 onConfirm 协议接管)──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n // whitespace: 纯空白不算填写\n code: {\n required: true,\n whitespace: true,\n message: () => t('module.codeRequired'),\n trigger: ['input', 'blur'],\n },\n title: {\n required: true,\n whitespace: true,\n message: () => t('module.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst editingId = ref<number | null>(null)\nconst blank = (): ModuleInput => ({\n code: '',\n title: '',\n icon: '',\n defaultRoute: '',\n apiPrefix: '',\n sort: 0,\n enabled: true,\n remark: '',\n})\nconst form = reactive<ModuleInput>(blank())\n\n/** 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。 */\nconst toInput = (r: ModuleRow): ModuleInput => ({\n code: r.code,\n title: r.title,\n icon: r.icon ?? '',\n defaultRoute: r.defaultRoute ?? '',\n apiPrefix: r.apiPrefix ?? '',\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: ModuleRow) {\n editingId.value = r.id\n Object.assign(form, toInput(r))\n show.value = true\n}\n\n/** FormContainer onConfirm:校验失败 reject / API 失败 return false → 弹层不关;成功正常返回自动关。 */\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await moduleApi.add({ ...form })\n else await moduleApi.update(editingId.value, { ...form })\n message.success(t('module.saved'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n/** 默认路由 / 路由前缀单元格:有值用等宽次级色,空值画灰色的「—」。 */\nconst cellText = (v?: string | null) =>\n v ? h('span', { class: 'mono muted' }, v) : h('span', { class: 'faint' }, '—')\n\nconst columns: SmartTableColumn<ModuleRow>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n title: () => t('module.code'),\n key: 'code',\n search: {},\n render: r => h('span', { class: 'mono' }, r.code),\n },\n {\n title: () => t('module.name'),\n key: 'title',\n // 窄档卡片以名称作标题(默认取第一个数据列 = 编码)\n card: 'title',\n search: {},\n render: r =>\n h(NSpace, { align: 'center', size: 6, wrapItem: false }, () => [\n r.icon ? h(AppIcon, { icon: lineIcon(r.icon), size: 18 }) : null,\n r.title,\n isBuiltin(r)\n ? h(NTag, { size: 'small', type: 'info', bordered: false }, () => t('module.builtin'))\n : null,\n ]),\n },\n {\n title: () => t('module.defaultRoute'),\n key: 'defaultRoute',\n render: r => cellText(r.defaultRoute),\n },\n {\n title: () => t('module.apiPrefix'),\n key: 'apiPrefix',\n width: 120,\n render: r => cellText(r.apiPrefix),\n },\n {\n title: () => t('module.sort'),\n key: 'sort',\n width: 80,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 90,\n // 无启停(update)权限者不见开关,退化为只读状态标签,保留状态可见性。\n render: r => {\n if (!authStore.hasPerm('PUT:/api/v1/sys/module/{id}'))\n return h(\n NTag,\n { size: 'small', bordered: false, type: r.enabled ? 'success' : 'default' },\n () => t(r.enabled ? 'common.enabled' : 'common.disabled'),\n )\n const sw = h(StatusSwitch, {\n value: r.enabled,\n // 内置 system 应用停用会让门户失联(模块/菜单管理页都在它下面,停了就没法从 UI 恢复)——\n // 与「禁删」同级的前端保护;后端停用与删除内置模块都拒绝(42013),这里只是不给点。\n disabled: isBuiltin(r),\n // 停用会把应用从门户隐藏,先确认;启用无副作用,跳过确认(返回 null)。\n confirm: (next: boolean) => (next ? null : t('module.disableConfirm', { title: r.title })),\n request: (next: boolean) => moduleApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n })\n // 灰掉的开关悬停说明原因(包一层 span:禁用的开关自己收不到鼠标事件)\n return isBuiltin(r)\n ? h(NTooltip, null, {\n trigger: () => h('span', { style: 'display: inline-flex' }, [sw]),\n default: () => t('module.builtinNoDisable'),\n })\n : sw\n },\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/module/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n isBuiltin(r) || !authStore.hasPerm('DELETE:/api/v1/sys/module/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n // popconfirm 留在模板层当触发器,「执行→toast」后半段交给 useConfirm().run。\n onPositiveClick: () =>\n run(() => moduleApi.remove(r.id), t('module.deleted')).then(ok => {\n if (ok) load()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('module.deleteConfirm', { title: r.title }),\n },\n ),\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 静态数据模式:module 只有全量 list 端点,没有分页端点 —— 条件搜索由表格在前端求值;\n 3.0 对静态数据会自己隐藏内置刷新,所以右侧自带一个刷新按钮重新拉取。 -->\n <SmartTable\n :columns=\"columns\"\n :data=\"rows\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-module\"\n >\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/module/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <!-- 静态数据没有内置刷新:这里补一个,形态与内置图标按钮一致(圆形、无底),紧跟在业务按钮后 -->\n <n-button quaternary circle :loading=\"loading\" :aria-label=\"t('table.refresh')\" @click=\"load\">\n <template #icon><AppIcon icon=\"ph:arrow-clockwise\" :size=\"16\" /></template>\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('module.addTitle') : t('module.editTitle')\"\n :width=\"520\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"formRef\"\n :model=\"form\"\n :rules=\"rules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('module.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n class=\"mono\"\n :placeholder=\"t('module.code')\"\n :disabled=\"editingId !== null\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.name')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('module.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('module.icon')\">\n <IconPicker\n :model-value=\"form.icon ?? ''\"\n @update:model-value=\"(v: string) => (form.icon = v)\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.defaultRoute')\">\n <n-input\n v-model:value=\"form.defaultRoute as string\"\n class=\"mono\"\n placeholder=\"/system/user\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.apiPrefix')\">\n <n-space vertical :size=\"2\" style=\"width: 100%\">\n <n-input v-model:value=\"form.apiPrefix as string\" class=\"mono\" placeholder=\"sys\" />\n <span class=\"hint\">{{ t('module.apiPrefixHint') }}</span>\n </n-space>\n </n-form-item>\n <n-form-item :label=\"t('module.sort')\">\n <n-input-number v-model:value=\"form.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item>\n <n-form-item :label=\"t('module.remark')\">\n <n-input v-model:value=\"form.remark as string\" type=\"textarea\" :autosize=\"{ minRows: 2 }\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n.hint {\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-3);\n}\n\n/* 辅助字样(表格单元格由库渲染,用 :deep;表单里的输入框是自己的元素,直接命中) */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","narrowForm","useMediaQuery","formLayout","computed","loading","ref","rows","isBuiltin","r","load","moduleApi","translateError","onMounted","show","formRef","rules","editingId","blank","form","reactive","toInput","openAdd","openEdit","save","_a","e","cellText","v","h","columns","NSpace","AppIcon","lineIcon","NTag","sw","StatusSwitch","next","NTooltip","NButton","NPopconfirm","ok","deriveHeaderFilters","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_createBlock","_createTextVNode","FormContainer","$event","_mergeProps","NFormItem","NInput","_cache","IconPicker","_createElementVNode","_hoisted_1","_toDisplayString","NInputNumber","NSwitch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/module/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NTag,\n NTooltip,\n NForm,\n NFormItem,\n NInput,\n NInputNumber,\n NSwitch,\n NPopconfirm,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport IconPicker from '#/components/IconPicker/index.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { moduleApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport type { ModuleInput, ModuleRow } from '#/types/api'\n\nimport { deriveHeaderFilters } from '#/utils/tableFilter'\nimport { lineIcon } from '#/utils/menuIcon'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\n// 窄屏:表单标签放上方(底部抽屉里横排标签太挤);宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 90 },\n)\n\nconst loading = ref(false)\nconst rows = ref<ModuleRow[]>([])\n\n/** 内置 system 模块受保护(后端 42013),前端据 code 禁删,避免明知不可为的请求。 */\nconst isBuiltin = (r: ModuleRow) => r.code === 'system'\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await moduleApi.list()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\n// ── 新增/编辑弹窗(FormContainer:loading/底栏/关闭时机由容器按 onConfirm 协议接管)──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n // whitespace: 纯空白不算填写\n code: {\n required: true,\n whitespace: true,\n message: () => t('module.codeRequired'),\n trigger: ['input', 'blur'],\n },\n title: {\n required: true,\n whitespace: true,\n message: () => t('module.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst editingId = ref<number | null>(null)\n/** 正在编辑内置 system 模块:可转授开关固定关、置灰(后端读写都按 false)。 */\nconst editingBuiltin = computed(() => editingId.value !== null && form.code === 'system')\n/** NSwitch 只收布尔,null(存量模块)按关显示;内置模块恒显示为关,不论后端返回什么。 */\nconst delegatable = computed({\n get: () => !editingBuiltin.value && form.isDelegatable === true,\n set: (v: boolean) => (form.isDelegatable = v),\n})\nconst blank = (): ModuleInput => ({\n code: '',\n title: '',\n icon: '',\n defaultRoute: '',\n apiPrefix: '',\n sort: 0,\n enabled: true,\n remark: '',\n isDelegatable: true,\n})\nconst form = reactive<ModuleInput>(blank())\n\n/** 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。 */\nconst toInput = (r: ModuleRow): ModuleInput => ({\n code: r.code,\n title: r.title,\n icon: r.icon ?? '',\n defaultRoute: r.defaultRoute ?? '',\n apiPrefix: r.apiPrefix ?? '',\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n // 内置模块恒为不可转授:编辑回填与行内改状态都提交 false,不把后端偶发的 true 带回去\n isDelegatable: isBuiltin(r) ? false : (r.isDelegatable ?? false),\n})\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: ModuleRow) {\n editingId.value = r.id\n Object.assign(form, toInput(r))\n show.value = true\n}\n\n/** FormContainer onConfirm:校验失败 reject / API 失败 return false → 弹层不关;成功正常返回自动关。 */\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await moduleApi.add({ ...form })\n else await moduleApi.update(editingId.value, { ...form })\n message.success(t('module.saved'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n/** 默认路由 / 路由前缀单元格:有值用等宽次级色,空值画灰色的「—」。 */\nconst cellText = (v?: string | null) =>\n v ? h('span', { class: 'mono muted' }, v) : h('span', { class: 'faint' }, '—')\n\nconst columns: SmartTableColumn<ModuleRow>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n title: () => t('module.code'),\n key: 'code',\n width: 160,\n ellipsis: { tooltip: true },\n search: {},\n render: r => h('span', { class: 'mono' }, r.code),\n },\n {\n title: () => t('module.name'),\n key: 'title',\n ellipsis: { tooltip: true },\n // 窄档卡片以名称作标题(默认取第一个数据列 = 编码)\n card: 'title',\n search: {},\n render: r =>\n h(NSpace, { align: 'center', size: 6, wrapItem: false }, () => [\n r.icon ? h(AppIcon, { icon: lineIcon(r.icon), size: 18 }) : null,\n r.title,\n isBuiltin(r)\n ? h(NTag, { size: 'small', type: 'info', bordered: false }, () => t('module.builtin'))\n : null,\n ]),\n },\n {\n title: () => t('module.defaultRoute'),\n key: 'defaultRoute',\n ellipsis: { tooltip: true },\n render: r => cellText(r.defaultRoute),\n },\n {\n title: () => t('module.apiPrefix'),\n key: 'apiPrefix',\n width: 120,\n render: r => cellText(r.apiPrefix),\n },\n {\n title: () => t('module.delegatable'),\n key: 'isDelegatable',\n width: 100,\n render: r =>\n h(\n NTag,\n { size: 'small', bordered: false, type: r.isDelegatable ? 'success' : 'default' },\n () => t(r.isDelegatable ? 'common.yes' : 'common.no'),\n ),\n },\n {\n title: () => t('module.sort'),\n key: 'sort',\n width: 80,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 90,\n // 无启停(update)权限者不见开关,退化为只读状态标签,保留状态可见性。\n render: r => {\n if (!authStore.hasPerm('PUT:/api/v1/sys/module/{id}'))\n return h(\n NTag,\n { size: 'small', bordered: false, type: r.enabled ? 'success' : 'default' },\n () => t(r.enabled ? 'common.enabled' : 'common.disabled'),\n )\n const sw = h(StatusSwitch, {\n value: r.enabled,\n // 内置 system 应用停用会让门户失联(模块/菜单管理页都在它下面,停了就没法从 UI 恢复)——\n // 与「禁删」同级的前端保护;后端停用与删除内置模块都拒绝(42013),这里只是不给点。\n disabled: isBuiltin(r),\n // 停用会把应用从门户隐藏,先确认;启用无副作用,跳过确认(返回 null)。\n confirm: (next: boolean) => (next ? null : t('module.disableConfirm', { title: r.title })),\n request: (next: boolean) => moduleApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n })\n // 灰掉的开关悬停说明原因(包一层 span:禁用的开关自己收不到鼠标事件)\n return isBuiltin(r)\n ? h(NTooltip, null, {\n trigger: () => h('span', { style: 'display: inline-flex' }, [sw]),\n default: () => t('module.builtinNoDisable'),\n })\n : sw\n },\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/module/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n isBuiltin(r) || !authStore.hasPerm('DELETE:/api/v1/sys/module/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n // popconfirm 留在模板层当触发器,「执行→toast」后半段交给 useConfirm().run。\n onPositiveClick: () =>\n run(() => moduleApi.remove(r.id), t('module.deleted')).then(ok => {\n if (ok) load()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('module.deleteConfirm', { title: r.title }),\n },\n ),\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 静态数据模式:module 只有全量 list 端点,没有分页端点 —— 条件搜索由表格在前端求值;\n 3.0 对静态数据会自己隐藏内置刷新,所以右侧自带一个刷新按钮重新拉取。 -->\n <SmartTable\n :columns=\"columns\"\n :data=\"rows\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-module\"\n >\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/module/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <!-- 静态数据没有内置刷新:这里补一个,形态与内置图标按钮一致(圆形、无底),紧跟在业务按钮后 -->\n <n-button quaternary circle :loading=\"loading\" :aria-label=\"t('table.refresh')\" @click=\"load\">\n <template #icon><AppIcon icon=\"ph:arrow-clockwise\" :size=\"16\" /></template>\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('module.addTitle') : t('module.editTitle')\"\n :width=\"520\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"formRef\"\n :model=\"form\"\n :rules=\"rules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('module.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n class=\"mono\"\n :placeholder=\"t('module.code')\"\n :disabled=\"editingId !== null\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.name')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('module.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('module.icon')\">\n <IconPicker\n :model-value=\"form.icon ?? ''\"\n @update:model-value=\"(v: string) => (form.icon = v)\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.defaultRoute')\">\n <n-input\n v-model:value=\"form.defaultRoute as string\"\n class=\"mono\"\n placeholder=\"/system/user\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.apiPrefix')\">\n <n-space vertical :size=\"2\" style=\"width: 100%\">\n <n-input v-model:value=\"form.apiPrefix as string\" class=\"mono\" placeholder=\"sys\" />\n <span class=\"hint\">{{ t('module.apiPrefixHint') }}</span>\n </n-space>\n </n-form-item>\n <n-form-item :label=\"t('module.sort')\">\n <n-input-number v-model:value=\"form.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item>\n <n-form-item :label=\"t('module.delegatable')\">\n <n-space vertical :size=\"2\" style=\"width: 100%\">\n <n-tooltip :disabled=\"!editingBuiltin\">\n <template #trigger>\n <span style=\"display: inline-flex\">\n <n-switch v-model:value=\"delegatable\" :disabled=\"editingBuiltin\" />\n </span>\n </template>\n {{ t('module.builtinNotDelegatable') }}\n </n-tooltip>\n <span class=\"hint\">{{ t('module.delegatableHint') }}</span>\n </n-space>\n </n-form-item>\n <n-form-item :label=\"t('module.remark')\">\n <n-input v-model:value=\"form.remark as string\" type=\"textarea\" :autosize=\"{ minRows: 2 }\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n.hint {\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-3);\n}\n\n/* 辅助字样(表格单元格由库渲染,用 :deep;表单里的输入框是自己的元素,直接命中) */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","narrowForm","useMediaQuery","formLayout","computed","loading","ref","rows","isBuiltin","r","load","moduleApi","translateError","onMounted","show","formRef","rules","editingId","editingBuiltin","form","delegatable","v","blank","reactive","toInput","openAdd","openEdit","save","_a","e","cellText","h","columns","NSpace","AppIcon","lineIcon","NTag","sw","StatusSwitch","next","NTooltip","NButton","NPopconfirm","ok","deriveHeaderFilters","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_createBlock","_createTextVNode","FormContainer","$event","_mergeProps","NFormItem","NInput","_cache","IconPicker","_createElementVNode","_hoisted_1","_toDisplayString","NInputNumber","NSwitch","_hoisted_2","_hoisted_3"],"mappings":"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"}
|