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
|
@@ -22,15 +22,15 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
22
22
|
appPrefix: {}
|
|
23
23
|
},
|
|
24
24
|
emits: ["changed"],
|
|
25
|
-
setup(
|
|
26
|
-
const f =
|
|
25
|
+
setup(ie, { expose: se, emit: re }) {
|
|
26
|
+
const f = ie, T = re, { t: o } = je(), U = Se(), { run: de } = Fe(), $ = Ve(), G = r(() => $.hasPerm("POST:/api/v1/sys/menu/add")), me = r(() => $.hasPerm("PUT:/api/v1/sys/menu/{id}")), ce = r(() => $.hasPerm("DELETE:/api/v1/sys/menu/{id}")), pe = Ee("(max-width: 640px)"), fe = r(
|
|
27
27
|
() => pe.value ? { labelPlacement: "top", labelWidth: void 0 } : { labelPlacement: "left", labelWidth: 80 }
|
|
28
28
|
), _ = d(!1), y = d(null), W = d("");
|
|
29
29
|
function H(e, t) {
|
|
30
30
|
for (const n of e) {
|
|
31
31
|
if (n.id === t) return n;
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
32
|
+
const i = H(n.children, t);
|
|
33
|
+
if (i) return i;
|
|
34
34
|
}
|
|
35
35
|
return null;
|
|
36
36
|
}
|
|
@@ -45,27 +45,27 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
45
45
|
() => B.value !== "" && f.routes.some((e) => !A(e.path))
|
|
46
46
|
), c = d(!1), E = (e) => ({ label: `${e.method} ${e.path}`, value: e.code }), he = r(() => {
|
|
47
47
|
if (!B.value) return f.routes.map(E);
|
|
48
|
-
const t = f.routes.filter((
|
|
48
|
+
const t = f.routes.filter((i) => A(i.path));
|
|
49
49
|
if (!c.value) return t.map(E);
|
|
50
|
-
const n = f.routes.filter((
|
|
50
|
+
const n = f.routes.filter((i) => !A(i.path));
|
|
51
51
|
return [
|
|
52
52
|
{ type: "group", key: "__inApp", label: o("menu.routesInApp"), children: t.map(E) },
|
|
53
53
|
{ type: "group", key: "__other", label: o("menu.routesOther"), children: n.map(E) }
|
|
54
54
|
];
|
|
55
55
|
}), be = r(() => {
|
|
56
|
-
const e = [], t = (n,
|
|
57
|
-
for (const
|
|
58
|
-
|
|
59
|
-
label: `${" ".repeat(
|
|
60
|
-
value:
|
|
61
|
-
}), t(
|
|
56
|
+
const e = [], t = (n, i) => {
|
|
57
|
+
for (const k of n)
|
|
58
|
+
k.type !== P.Button && (e.push({
|
|
59
|
+
label: `${" ".repeat(i)}${ae(k.title, k.path || void 0)}`,
|
|
60
|
+
value: k.id
|
|
61
|
+
}), t(k.children, i + 1));
|
|
62
62
|
};
|
|
63
63
|
return t(f.tree, 0), e;
|
|
64
64
|
});
|
|
65
65
|
function ye(e) {
|
|
66
66
|
y.value = e.id, W.value = ae(e.title), _.value = !0;
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
se({ open: ye });
|
|
69
69
|
const S = d(!1), g = d(null), J = d(null), ge = {
|
|
70
70
|
title: {
|
|
71
71
|
required: !0,
|
|
@@ -85,7 +85,7 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
85
85
|
component: "",
|
|
86
86
|
icon: "",
|
|
87
87
|
visible: !0
|
|
88
|
-
}),
|
|
88
|
+
}), s = _e(X()), w = d([]), Y = (e) => ({
|
|
89
89
|
parentId: e.parentId,
|
|
90
90
|
type: e.type,
|
|
91
91
|
title: e.title,
|
|
@@ -98,19 +98,19 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
98
98
|
icon: e.icon ?? "",
|
|
99
99
|
visible: e.visible
|
|
100
100
|
});
|
|
101
|
-
function
|
|
102
|
-
g.value = null, c.value = !1, Object.assign(
|
|
101
|
+
function we() {
|
|
102
|
+
g.value = null, c.value = !1, Object.assign(s, X()), w.value = [], S.value = !0;
|
|
103
103
|
}
|
|
104
|
-
function
|
|
105
|
-
g.value = e.id, c.value = !0, Object.assign(
|
|
104
|
+
function ke(e) {
|
|
105
|
+
g.value = e.id, c.value = !0, Object.assign(s, Y(e)), w.value = V(e.permission), S.value = !0;
|
|
106
106
|
}
|
|
107
107
|
async function xe() {
|
|
108
108
|
var e;
|
|
109
109
|
await ((e = J.value) == null ? void 0 : e.validate());
|
|
110
110
|
try {
|
|
111
111
|
const t = {
|
|
112
|
-
...
|
|
113
|
-
permission: We(
|
|
112
|
+
...s,
|
|
113
|
+
permission: We(w.value),
|
|
114
114
|
type: P.Button,
|
|
115
115
|
moduleId: null
|
|
116
116
|
};
|
|
@@ -165,10 +165,19 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
165
165
|
}
|
|
166
166
|
const Te = [
|
|
167
167
|
{ type: "index", title: () => o("common.rowNo"), width: 64, align: "center" },
|
|
168
|
-
{
|
|
168
|
+
{
|
|
169
|
+
title: () => o("menu.title"),
|
|
170
|
+
key: "title",
|
|
171
|
+
ellipsis: { tooltip: !0 },
|
|
172
|
+
align: "left",
|
|
173
|
+
search: {}
|
|
174
|
+
},
|
|
169
175
|
{
|
|
170
176
|
title: () => o("menu.permission"),
|
|
171
177
|
key: "permission",
|
|
178
|
+
// 权限码是 `METHOD:/api/...` 的整条路由,单个 tag 就比默认列宽长,所以给足宽度,放不下的一律省略 + 悬浮提示
|
|
179
|
+
width: 360,
|
|
180
|
+
ellipsis: { tooltip: !0 },
|
|
172
181
|
// 多码按钮逐条成 tag,一眼看出「查询」挂了哪几条路由
|
|
173
182
|
render: (e) => {
|
|
174
183
|
const t = V(e.permission);
|
|
@@ -204,7 +213,7 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
204
213
|
render: (e) => p(b, { size: 2, justify: "end", wrapItem: !1 }, () => [
|
|
205
214
|
me.value ? p(
|
|
206
215
|
C,
|
|
207
|
-
{ size: "small", quaternary: !0, type: "primary", onClick: () =>
|
|
216
|
+
{ size: "small", quaternary: !0, type: "primary", onClick: () => ke(e) },
|
|
208
217
|
() => o("common.edit")
|
|
209
218
|
) : null,
|
|
210
219
|
ce.value ? p(
|
|
@@ -279,7 +288,7 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
279
288
|
G.value ? (m(), v(l(C), {
|
|
280
289
|
key: 1,
|
|
281
290
|
type: "primary",
|
|
282
|
-
onClick:
|
|
291
|
+
onClick: we
|
|
283
292
|
}, {
|
|
284
293
|
icon: u(() => [
|
|
285
294
|
a(D, {
|
|
@@ -310,7 +319,7 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
310
319
|
a(l(ze), Be({
|
|
311
320
|
ref_key: "formRef",
|
|
312
321
|
ref: J,
|
|
313
|
-
model:
|
|
322
|
+
model: s,
|
|
314
323
|
rules: ge,
|
|
315
324
|
"require-mark-placement": "left"
|
|
316
325
|
}, fe.value), {
|
|
@@ -326,8 +335,8 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
326
335
|
}, {
|
|
327
336
|
default: u(() => [
|
|
328
337
|
a(l(q), {
|
|
329
|
-
value:
|
|
330
|
-
"onUpdate:value": t[2] || (t[2] = (n) =>
|
|
338
|
+
value: s.title,
|
|
339
|
+
"onUpdate:value": t[2] || (t[2] = (n) => s.title = n),
|
|
331
340
|
placeholder: l(o)("menu.title")
|
|
332
341
|
}, null, 8, ["value", "placeholder"])
|
|
333
342
|
]),
|
|
@@ -338,8 +347,8 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
338
347
|
}, {
|
|
339
348
|
default: u(() => [
|
|
340
349
|
a(l(ne), {
|
|
341
|
-
value:
|
|
342
|
-
"onUpdate:value": t[3] || (t[3] = (n) =>
|
|
350
|
+
value: s.parentId,
|
|
351
|
+
"onUpdate:value": t[3] || (t[3] = (n) => s.parentId = n),
|
|
343
352
|
options: be.value,
|
|
344
353
|
filterable: ""
|
|
345
354
|
}, null, 8, ["value", "options"])
|
|
@@ -357,8 +366,8 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
357
366
|
}, {
|
|
358
367
|
default: u(() => [
|
|
359
368
|
a(l(ne), {
|
|
360
|
-
value:
|
|
361
|
-
"onUpdate:value": t[4] || (t[4] = (n) =>
|
|
369
|
+
value: w.value,
|
|
370
|
+
"onUpdate:value": t[4] || (t[4] = (n) => w.value = n),
|
|
362
371
|
options: he.value,
|
|
363
372
|
multiple: "",
|
|
364
373
|
filterable: "",
|
|
@@ -389,8 +398,8 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
389
398
|
}, {
|
|
390
399
|
default: u(() => [
|
|
391
400
|
a(l(Le), {
|
|
392
|
-
value:
|
|
393
|
-
"onUpdate:value": t[6] || (t[6] = (n) =>
|
|
401
|
+
value: s.sort,
|
|
402
|
+
"onUpdate:value": t[6] || (t[6] = (n) => s.sort = n),
|
|
394
403
|
min: 0,
|
|
395
404
|
style: { width: "100%" }
|
|
396
405
|
}, null, 8, ["value"])
|
|
@@ -402,8 +411,8 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
402
411
|
}, {
|
|
403
412
|
default: u(() => [
|
|
404
413
|
a(l(Oe), {
|
|
405
|
-
value:
|
|
406
|
-
"onUpdate:value": t[7] || (t[7] = (n) =>
|
|
414
|
+
value: s.enabled,
|
|
415
|
+
"onUpdate:value": t[7] || (t[7] = (n) => s.enabled = n)
|
|
407
416
|
}, null, 8, ["value"])
|
|
408
417
|
]),
|
|
409
418
|
_: 1
|
|
@@ -478,12 +487,12 @@ const He = { class: "perm-hint" }, Qe = { class: "batch-route mono muted" }, mt
|
|
|
478
487
|
}, [
|
|
479
488
|
a(l(j), {
|
|
480
489
|
checked: n.checked,
|
|
481
|
-
"onUpdate:checked": (
|
|
490
|
+
"onUpdate:checked": (i) => n.checked = i
|
|
482
491
|
}, null, 8, ["checked", "onUpdate:checked"]),
|
|
483
492
|
le("span", Qe, h(n.method) + " " + h(n.path), 1),
|
|
484
493
|
a(l(q), {
|
|
485
494
|
value: n.title,
|
|
486
|
-
"onUpdate:value": (
|
|
495
|
+
"onUpdate:value": (i) => n.title = i,
|
|
487
496
|
disabled: !n.checked,
|
|
488
497
|
class: "batch-title"
|
|
489
498
|
}, null, 8, ["value", "onUpdate:value", "disabled"])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ButtonManager2.vue.js","sources":["../../../../../src/views/system/menu/components/ButtonManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 某个菜单/目录下「权限按钮」的专属管理弹窗 —— 按钮不进主菜单树、在这里单独管理,\n// 树里只放目录/菜单,不被几十个按钮撑长。按钮就是 type=Button 的 SysMenu 行,\n// 增删改复用 menuApi.add/update/remove(parentId=当前菜单),没有专用端点。\nimport { computed, h, reactive, ref } from 'vue'\nimport { useMediaQuery } from '@vueuse/core'\nimport {\n NButton,\n NSpace,\n NForm,\n NFormItemGi,\n NGrid,\n NInput,\n NInputNumber,\n NSelect,\n NSwitch,\n NPopconfirm,\n NCheckbox,\n NEmpty,\n NTag,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateMenuTitle } from '#/locales/menuTitle'\nimport { useAuthStore } from '#/stores/auth'\nimport { menuApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport {\n MenuType,\n type MenuInput,\n type MenuTreeNode,\n joinPermission,\n splitPermission,\n} from '#/types/menu'\nimport type { PermissionRouteItem } from '#/types/api'\n\n// tree/routes 由父页传入并保持响应:父页 CRUD 后 load() 刷新 tree,本弹窗的 buttons 计算属性随之更新,\n// 无需自己再发一次整树请求。\nconst props = defineProps<{\n tree: MenuTreeNode[]\n routes: PermissionRouteItem[]\n /** 当前所属应用的路由匹配前缀(sys/biz…);空=不按应用过滤,全量显示。 */\n appPrefix?: string\n}>()\nconst emit = defineEmits<{ (e: 'changed'): void }>()\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst auth = useAuthStore()\n\n// 客户端权限门,与主表 menu/index.vue 对齐(按钮就是 type=Button 的 SysMenu 行,复用菜单 CRUD 路由权限码);\n// 服务端 [RolePermission] 始终兜底,这里只为不给无权用户显示写入口。\nconst canAdd = computed(() => auth.hasPerm('POST:/api/v1/sys/menu/add'))\nconst canEdit = computed(() => auth.hasPerm('PUT:/api/v1/sys/menu/{id}'))\nconst canDelete = computed(() => auth.hasPerm('DELETE:/api/v1/sys/menu/{id}'))\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: 80 },\n)\n\nconst show = ref(false)\nconst menuId = ref<number | null>(null)\nconst menuTitle = ref('')\n\n/** 在整棵树里按 id 找节点(父页传的 tree 含按钮 children)。 */\nfunction findNode(nodes: MenuTreeNode[], id: number): MenuTreeNode | null {\n for (const n of nodes) {\n if (n.id === id) return n\n const hit = findNode(n.children, id)\n if (hit) return hit\n }\n return null\n}\n\n/** 当前菜单下的按钮子节点(随父页 tree 响应更新)。 */\nconst buttons = computed<MenuTreeNode[]>(() => {\n if (menuId.value == null) return []\n const node = findNode(props.tree, menuId.value)\n return (node?.children ?? []).filter(c => c.type === MenuType.Button)\n})\n\n/** 已占用的权限码(多码按钮展开成单条),用于批量添加去重。 */\nconst usedCodes = computed(() => new Set(buttons.value.flatMap(b => splitPermission(b.permission))))\n\n// ── 路由按应用软过滤 ────────────────────────────────────────────\n// route.path 形如 /api/v1/sys/...;appPrefix 是该应用的路由段(sys/biz)。空前缀=不过滤。\n// 软过滤:默认只列本应用路由,一键「显示全部」放开(业务页正当需要 /api/v1/sys/file 上传、/sys/dict 等共享系统路由)。\nconst routeSeg = computed(() => (props.appPrefix ?? '').trim().replace(/^\\/+|\\/+$/g, ''))\nconst belongsToApp = (path: string) => {\n const seg = routeSeg.value\n if (!seg) return true\n return path.includes(`/${seg}/`) || path.endsWith(`/${seg}`)\n}\n/** 是否存在「非本应用」的路由 —— 决定要不要展示「显示全部」开关。 */\nconst hasOtherRoutes = computed(\n () => routeSeg.value !== '' && props.routes.some(r => !belongsToApp(r.path)),\n)\nconst showAllRoutes = ref(false)\n\n// 权限码下拉(多选):label 展示「METHOD /路径」便于辨认,value 就是要写进 permission 的码本身。\n// 无前缀→平铺全量;有前缀且不显示全部→仅本应用;显示全部→按「本应用/其他应用」分组。\nconst toOpt = (r: PermissionRouteItem) => ({ label: `${r.method} ${r.path}`, value: r.code })\nconst permissionOptions = computed(() => {\n const seg = routeSeg.value\n if (!seg) return props.routes.map(toOpt)\n const inApp = props.routes.filter(r => belongsToApp(r.path))\n if (!showAllRoutes.value) return inApp.map(toOpt)\n const other = props.routes.filter(r => !belongsToApp(r.path))\n return [\n { type: 'group', key: '__inApp', label: t('menu.routesInApp'), children: inApp.map(toOpt) },\n { type: 'group', key: '__other', label: t('menu.routesOther'), children: other.map(toOpt) },\n ]\n})\n\n/**\n * 「所属页面」下拉:全部非按钮节点(目录 + 页面),缩进体现层级。\n * 不排除目录 —— 无对应页面的权限码锚点(如 ping)就该挂目录。\n * 按钮是叶子、不可能成环,故无需像主页 parentOptions 那样排除自身子树。\n */\nconst parentOptions = computed(() => {\n const opts: { label: string; value: number }[] = []\n const walk = (nodes: MenuTreeNode[], depth: number) => {\n for (const n of nodes) {\n if (n.type === MenuType.Button) continue\n opts.push({\n label: `${' '.repeat(depth)}${translateMenuTitle(n.title, n.path || undefined)}`,\n value: n.id,\n })\n walk(n.children, depth + 1)\n }\n }\n walk(props.tree, 0)\n return opts\n})\n\nfunction open(menu: { id: number; title: string }) {\n menuId.value = menu.id\n menuTitle.value = translateMenuTitle(menu.title)\n show.value = true\n}\ndefineExpose({ open })\n\n// ── 单个新增/编辑 ────────────────────────────────────────────────\nconst editShow = ref(false)\nconst editingId = ref<number | null>(null)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n title: {\n required: true,\n whitespace: true,\n message: () => t('menu.titleRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): MenuInput => ({\n parentId: menuId.value ?? 0,\n type: MenuType.Button,\n title: '',\n permission: '',\n sort: 0,\n enabled: true,\n moduleId: null,\n path: '',\n component: '',\n icon: '',\n visible: true,\n})\nconst form = reactive<MenuInput>(blank())\n// 权限码在表单里按数组编辑(一颗按钮可挂多条路由),保存时拼回 form.permission 的 ; 串。\nconst permissionCodes = ref<string[]>([])\n\n/** 行 → 全量入参:回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。 */\nconst toInput = (r: MenuTreeNode): MenuInput => ({\n parentId: r.parentId,\n type: r.type,\n title: r.title,\n permission: r.permission,\n sort: r.sort,\n enabled: r.enabled,\n moduleId: null,\n path: r.path ?? '',\n component: r.component ?? '',\n icon: r.icon ?? '',\n visible: r.visible,\n})\n\nfunction openAdd() {\n editingId.value = null\n showAllRoutes.value = false // 新增默认只看本应用路由\n Object.assign(form, blank())\n permissionCodes.value = []\n editShow.value = true\n}\nfunction openEdit(r: MenuTreeNode) {\n editingId.value = r.id\n showAllRoutes.value = true // 编辑时展开全部,保证已选的(可能跨应用的)权限码在下拉里可见\n Object.assign(form, toInput(r))\n permissionCodes.value = splitPermission(r.permission)\n editShow.value = true\n}\nasync function save() {\n await formRef.value?.validate()\n try {\n // parentId 取表单值(而非当前弹窗的 menuId)——「所属页面」改了就是移动:\n // 保存后本列表少一条、目标页面徽标 +1,由父页重拉树自然反映。\n const payload: MenuInput = {\n ...form,\n permission: joinPermission(permissionCodes.value),\n type: MenuType.Button,\n moduleId: null,\n }\n if (editingId.value === null) await menuApi.add(payload)\n else await menuApi.update(editingId.value, payload)\n message.success(t('menu.saved'))\n emit('changed')\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 从路由批量添加 ──────────────────────────────────────────────\ntype BatchRow = { code: string; method: string; path: string; title: string; checked: boolean }\nconst batchShow = ref(false)\nconst batchRows = ref<BatchRow[]>([])\nconst batchSaving = ref(false)\nconst batchKeyword = ref('')\n\n/** 搜索过滤:返回 batchRows 里命中的同一批对象引用,勾选/改标题的状态跨搜索保留;\n * saveBatch 仍以全量 batchRows 的 checked 为准,不会漏掉被过滤隐藏的已勾选行。 */\nconst filteredBatchRows = computed(() => {\n const kw = batchKeyword.value.trim().toLowerCase()\n const seg = routeSeg.value\n return batchRows.value.filter(r => {\n if (seg && !showAllRoutes.value && !belongsToApp(r.path)) return false // 按应用软过滤(可一键放开)\n if (!kw) return true\n return (\n r.method.toLowerCase().includes(kw) ||\n r.path.toLowerCase().includes(kw) ||\n r.title.toLowerCase().includes(kw)\n )\n })\n})\n\n/** HTTP 方法 → 默认标题(可就地改)。 */\nfunction defaultTitle(method: string): string {\n const m = method.toUpperCase()\n if (m === 'GET') return t('menu.btnQuery')\n if (m === 'POST') return t('menu.btnCreate')\n if (m === 'PUT' || m === 'PATCH') return t('menu.btnUpdate')\n if (m === 'DELETE') return t('menu.btnDelete')\n return method\n}\nfunction openBatch() {\n batchKeyword.value = ''\n showAllRoutes.value = false // 批量默认只列本应用路由\n // 只列当前菜单还没建过的路由,避免重复。\n batchRows.value = props.routes\n .filter(r => !usedCodes.value.has(r.code))\n .map(r => ({\n code: r.code,\n method: r.method,\n path: r.path,\n title: defaultTitle(r.method),\n checked: false,\n }))\n batchShow.value = true\n}\nconst batchChecked = computed(() => batchRows.value.filter(r => r.checked))\nasync function saveBatch() {\n const picked = batchChecked.value\n if (!picked.length) return false // 未选任何路由,别关弹窗\n batchSaving.value = true\n try {\n // ponytail: 逐个 add,量级大到卡顿再考虑后端批量端点\n for (const r of picked) {\n await menuApi.add({\n parentId: menuId.value ?? 0,\n type: MenuType.Button,\n title: r.title.trim() || r.method,\n permission: r.code,\n sort: 0,\n enabled: true,\n moduleId: null,\n path: '',\n component: '',\n icon: '',\n visible: true,\n })\n }\n message.success(t('menu.saved'))\n emit('changed')\n batchShow.value = false\n } catch (e) {\n message.error(translateError(e))\n return false\n } finally {\n batchSaving.value = false\n }\n}\n\nconst columns: SmartTableColumn<MenuTreeNode>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { title: () => t('menu.title'), key: 'title', align: 'left', search: {} },\n {\n title: () => t('menu.permission'),\n key: 'permission',\n // 多码按钮逐条成 tag,一眼看出「查询」挂了哪几条路由\n render: r => {\n const codes = splitPermission(r.permission)\n if (!codes.length) return h('span', { class: 'faint' }, '—')\n return h(NSpace, { size: 4, wrapItem: false }, () =>\n codes.map(c => h(NTag, { size: 'small', bordered: false, key: c }, () => c)),\n )\n },\n },\n {\n title: () => t('menu.sort'),\n key: 'sort',\n width: 70,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 84,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) => menuApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': () => emit('changed'),\n }),\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 130,\n align: 'right',\n fixed: 'right',\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n canEdit.value\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n canDelete.value\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => menuApi.remove(r.id), t('menu.deleted')).then(ok => {\n if (ok) emit('changed')\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('menu.deleteConfirm', { title: r.title }),\n },\n )\n : null,\n ]),\n },\n]\n</script>\n\n<template>\n <!-- 列表弹窗:只有一个「关闭」底栏(不走 onConfirm 提交协议) -->\n <FormContainer\n v-model:show=\"show\"\n :title=\"t('menu.buttonManagerTitle', { title: menuTitle })\"\n :width=\"960\"\n >\n <!-- 业务按钮在表格工具栏右半(次按钮在前、主按钮在后),不单独占一行放在表格上方 -->\n <SmartTable\n :columns=\"columns\"\n :data=\"buttons\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :pagination=\"false\"\n row-key=\"id\"\n card-on-narrow\n storage-key=\"sys-menu-buttons\"\n >\n <template #toolbar-right>\n <n-button v-if=\"canAdd\" secondary @click=\"openBatch\">\n <template #icon><AppIcon icon=\"ph:list-plus\" :size=\"16\" /></template>\n {{ t('menu.batchFromRoutes') }}\n </n-button>\n <n-button v-if=\"canAdd\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('menu.addButton') }}\n </n-button>\n </template>\n </SmartTable>\n <template #footer>\n <n-space justify=\"end\">\n <n-button @click=\"show = false\">{{ t('common.close') }}</n-button>\n </n-space>\n </template>\n </FormContainer>\n\n <!-- 单个新增/编辑按钮 -->\n <FormContainer\n v-model:show=\"editShow\"\n :title=\"editingId === null ? t('menu.addButton') : t('common.edit')\"\n :width=\"600\"\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-grid :cols=\"1\" :y-gap=\"4\">\n <n-form-item-gi :label=\"t('menu.title')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('menu.title')\" />\n </n-form-item-gi>\n <!-- 改这里 = 把按钮移到别的页面(按钮不在主树里,这是唯一能改归属的入口)。 -->\n <n-form-item-gi :label=\"t('menu.buttonParent')\">\n <n-select v-model:value=\"form.parentId\" :options=\"parentOptions\" filterable />\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('menu.permission')\">\n <n-space vertical :size=\"4\" style=\"width: 100%\">\n <n-select\n v-model:value=\"permissionCodes\"\n :options=\"permissionOptions\"\n multiple\n filterable\n tag\n clearable\n :placeholder=\"t('menu.permissionPlaceholder')\"\n />\n <span class=\"perm-hint\">{{ t('menu.permissionHint') }}</span>\n <n-checkbox v-if=\"hasOtherRoutes\" v-model:checked=\"showAllRoutes\" size=\"small\">\n {{ t('menu.showAllRoutes') }}\n </n-checkbox>\n </n-space>\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('menu.sort')\">\n <n-input-number v-model:value=\"form.sort\" :min=\"0\" style=\"width: 100%\" />\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item-gi>\n </n-grid>\n </n-form>\n </FormContainer>\n\n <!-- 从路由批量添加 -->\n <FormContainer\n v-model:show=\"batchShow\"\n :title=\"t('menu.batchTitle')\"\n :width=\"640\"\n :on-confirm=\"saveBatch\"\n :confirm-text=\"t('common.save')\"\n >\n <n-empty\n v-if=\"!batchRows.length\"\n :description=\"t('menu.noRoutesLeft')\"\n style=\"padding: 24px 0\"\n />\n <n-space v-else vertical :size=\"10\">\n <n-space align=\"center\" :size=\"12\">\n <n-input\n v-model:value=\"batchKeyword\"\n clearable\n :placeholder=\"t('menu.batchSearchPlaceholder')\"\n style=\"flex: 1\"\n >\n <template #prefix><AppIcon icon=\"ph:magnifying-glass\" :size=\"16\" /></template>\n </n-input>\n <n-checkbox v-if=\"hasOtherRoutes\" v-model:checked=\"showAllRoutes\">\n {{ t('menu.showAllRoutes') }}\n </n-checkbox>\n </n-space>\n <n-empty\n v-if=\"!filteredBatchRows.length\"\n :description=\"t('menu.noRoutesLeft')\"\n style=\"padding: 16px 0\"\n />\n <n-space v-else vertical :size=\"6\" style=\"max-height: 55vh; overflow: auto\">\n <div v-for=\"r in filteredBatchRows\" :key=\"r.code\" class=\"batch-row\">\n <n-checkbox v-model:checked=\"r.checked\" />\n <span class=\"batch-route mono muted\">{{ r.method }} {{ r.path }}</span>\n <n-input v-model:value=\"r.title\" :disabled=\"!r.checked\" class=\"batch-title\" />\n </div>\n </n-space>\n </n-space>\n </FormContainer>\n</template>\n\n<style scoped>\n.perm-hint {\n font-size: 13px;\n color: var(--text-3);\n line-height: 1.5;\n}\n\n/* 批量添加:复选框 + 「METHOD 路径」+ 标题输入;窄屏路由文字独占一行,标题输入落到下一行 */\n.batch-row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px 10px;\n}\n.batch-route {\n flex: 1 1 210px;\n min-width: 0;\n font-size: 13px;\n word-break: break-all;\n}\n.batch-title {\n width: 160px;\n}\n@media (max-width: 640px) {\n .batch-title {\n width: calc(100% - 34px);\n margin-left: 34px;\n }\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.muted,\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":["props","__props","emit","__emit","t","useI18n","message","useMessage","run","useConfirm","auth","useAuthStore","canAdd","computed","canEdit","canDelete","narrowForm","useMediaQuery","formLayout","show","ref","menuId","menuTitle","findNode","nodes","id","hit","buttons","node","c","MenuType","usedCodes","b","splitPermission","routeSeg","belongsToApp","path","seg","hasOtherRoutes","r","showAllRoutes","toOpt","permissionOptions","inApp","other","parentOptions","opts","walk","depth","n","translateMenuTitle","open","menu","__expose","editShow","editingId","formRef","rules","blank","form","reactive","permissionCodes","toInput","openAdd","openEdit","save","_a","payload","joinPermission","menuApi","e","translateError","batchShow","batchRows","batchSaving","batchKeyword","filteredBatchRows","kw","defaultTitle","method","m","openBatch","batchChecked","saveBatch","picked","columns","codes","h","NSpace","NTag","StatusSwitch","next","NButton","NPopconfirm","ok","_createVNode","FormContainer","$event","_unref","SmartTable","TABLE_TOOLBAR","_createBlock","AppIcon","_createTextVNode","_mergeProps","NGrid","NFormItemGi","NInput","_cache","NSelect","_createElementVNode","_hoisted_1","_toDisplayString","NCheckbox","NInputNumber","NSwitch","_createElementBlock","_Fragment","_renderList","_hoisted_2","NEmpty"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ButtonManager2.vue.js","sources":["../../../../../src/views/system/menu/components/ButtonManager.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 某个菜单/目录下「权限按钮」的专属管理弹窗 —— 按钮不进主菜单树、在这里单独管理,\n// 树里只放目录/菜单,不被几十个按钮撑长。按钮就是 type=Button 的 SysMenu 行,\n// 增删改复用 menuApi.add/update/remove(parentId=当前菜单),没有专用端点。\nimport { computed, h, reactive, ref } from 'vue'\nimport { useMediaQuery } from '@vueuse/core'\nimport {\n NButton,\n NSpace,\n NForm,\n NFormItemGi,\n NGrid,\n NInput,\n NInputNumber,\n NSelect,\n NSwitch,\n NPopconfirm,\n NCheckbox,\n NEmpty,\n NTag,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { translateMenuTitle } from '#/locales/menuTitle'\nimport { useAuthStore } from '#/stores/auth'\nimport { menuApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport {\n MenuType,\n type MenuInput,\n type MenuTreeNode,\n joinPermission,\n splitPermission,\n} from '#/types/menu'\nimport type { PermissionRouteItem } from '#/types/api'\n\n// tree/routes 由父页传入并保持响应:父页 CRUD 后 load() 刷新 tree,本弹窗的 buttons 计算属性随之更新,\n// 无需自己再发一次整树请求。\nconst props = defineProps<{\n tree: MenuTreeNode[]\n routes: PermissionRouteItem[]\n /** 当前所属应用的路由匹配前缀(sys/biz…);空=不按应用过滤,全量显示。 */\n appPrefix?: string\n}>()\nconst emit = defineEmits<{ (e: 'changed'): void }>()\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst auth = useAuthStore()\n\n// 客户端权限门,与主表 menu/index.vue 对齐(按钮就是 type=Button 的 SysMenu 行,复用菜单 CRUD 路由权限码);\n// 服务端 [RolePermission] 始终兜底,这里只为不给无权用户显示写入口。\nconst canAdd = computed(() => auth.hasPerm('POST:/api/v1/sys/menu/add'))\nconst canEdit = computed(() => auth.hasPerm('PUT:/api/v1/sys/menu/{id}'))\nconst canDelete = computed(() => auth.hasPerm('DELETE:/api/v1/sys/menu/{id}'))\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: 80 },\n)\n\nconst show = ref(false)\nconst menuId = ref<number | null>(null)\nconst menuTitle = ref('')\n\n/** 在整棵树里按 id 找节点(父页传的 tree 含按钮 children)。 */\nfunction findNode(nodes: MenuTreeNode[], id: number): MenuTreeNode | null {\n for (const n of nodes) {\n if (n.id === id) return n\n const hit = findNode(n.children, id)\n if (hit) return hit\n }\n return null\n}\n\n/** 当前菜单下的按钮子节点(随父页 tree 响应更新)。 */\nconst buttons = computed<MenuTreeNode[]>(() => {\n if (menuId.value == null) return []\n const node = findNode(props.tree, menuId.value)\n return (node?.children ?? []).filter(c => c.type === MenuType.Button)\n})\n\n/** 已占用的权限码(多码按钮展开成单条),用于批量添加去重。 */\nconst usedCodes = computed(() => new Set(buttons.value.flatMap(b => splitPermission(b.permission))))\n\n// ── 路由按应用软过滤 ────────────────────────────────────────────\n// route.path 形如 /api/v1/sys/...;appPrefix 是该应用的路由段(sys/biz)。空前缀=不过滤。\n// 软过滤:默认只列本应用路由,一键「显示全部」放开(业务页正当需要 /api/v1/sys/file 上传、/sys/dict 等共享系统路由)。\nconst routeSeg = computed(() => (props.appPrefix ?? '').trim().replace(/^\\/+|\\/+$/g, ''))\nconst belongsToApp = (path: string) => {\n const seg = routeSeg.value\n if (!seg) return true\n return path.includes(`/${seg}/`) || path.endsWith(`/${seg}`)\n}\n/** 是否存在「非本应用」的路由 —— 决定要不要展示「显示全部」开关。 */\nconst hasOtherRoutes = computed(\n () => routeSeg.value !== '' && props.routes.some(r => !belongsToApp(r.path)),\n)\nconst showAllRoutes = ref(false)\n\n// 权限码下拉(多选):label 展示「METHOD /路径」便于辨认,value 就是要写进 permission 的码本身。\n// 无前缀→平铺全量;有前缀且不显示全部→仅本应用;显示全部→按「本应用/其他应用」分组。\nconst toOpt = (r: PermissionRouteItem) => ({ label: `${r.method} ${r.path}`, value: r.code })\nconst permissionOptions = computed(() => {\n const seg = routeSeg.value\n if (!seg) return props.routes.map(toOpt)\n const inApp = props.routes.filter(r => belongsToApp(r.path))\n if (!showAllRoutes.value) return inApp.map(toOpt)\n const other = props.routes.filter(r => !belongsToApp(r.path))\n return [\n { type: 'group', key: '__inApp', label: t('menu.routesInApp'), children: inApp.map(toOpt) },\n { type: 'group', key: '__other', label: t('menu.routesOther'), children: other.map(toOpt) },\n ]\n})\n\n/**\n * 「所属页面」下拉:全部非按钮节点(目录 + 页面),缩进体现层级。\n * 不排除目录 —— 无对应页面的权限码锚点(如 ping)就该挂目录。\n * 按钮是叶子、不可能成环,故无需像主页 parentOptions 那样排除自身子树。\n */\nconst parentOptions = computed(() => {\n const opts: { label: string; value: number }[] = []\n const walk = (nodes: MenuTreeNode[], depth: number) => {\n for (const n of nodes) {\n if (n.type === MenuType.Button) continue\n opts.push({\n label: `${' '.repeat(depth)}${translateMenuTitle(n.title, n.path || undefined)}`,\n value: n.id,\n })\n walk(n.children, depth + 1)\n }\n }\n walk(props.tree, 0)\n return opts\n})\n\nfunction open(menu: { id: number; title: string }) {\n menuId.value = menu.id\n menuTitle.value = translateMenuTitle(menu.title)\n show.value = true\n}\ndefineExpose({ open })\n\n// ── 单个新增/编辑 ────────────────────────────────────────────────\nconst editShow = ref(false)\nconst editingId = ref<number | null>(null)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n title: {\n required: true,\n whitespace: true,\n message: () => t('menu.titleRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): MenuInput => ({\n parentId: menuId.value ?? 0,\n type: MenuType.Button,\n title: '',\n permission: '',\n sort: 0,\n enabled: true,\n moduleId: null,\n path: '',\n component: '',\n icon: '',\n visible: true,\n})\nconst form = reactive<MenuInput>(blank())\n// 权限码在表单里按数组编辑(一颗按钮可挂多条路由),保存时拼回 form.permission 的 ; 串。\nconst permissionCodes = ref<string[]>([])\n\n/** 行 → 全量入参:回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。 */\nconst toInput = (r: MenuTreeNode): MenuInput => ({\n parentId: r.parentId,\n type: r.type,\n title: r.title,\n permission: r.permission,\n sort: r.sort,\n enabled: r.enabled,\n moduleId: null,\n path: r.path ?? '',\n component: r.component ?? '',\n icon: r.icon ?? '',\n visible: r.visible,\n})\n\nfunction openAdd() {\n editingId.value = null\n showAllRoutes.value = false // 新增默认只看本应用路由\n Object.assign(form, blank())\n permissionCodes.value = []\n editShow.value = true\n}\nfunction openEdit(r: MenuTreeNode) {\n editingId.value = r.id\n showAllRoutes.value = true // 编辑时展开全部,保证已选的(可能跨应用的)权限码在下拉里可见\n Object.assign(form, toInput(r))\n permissionCodes.value = splitPermission(r.permission)\n editShow.value = true\n}\nasync function save() {\n await formRef.value?.validate()\n try {\n // parentId 取表单值(而非当前弹窗的 menuId)——「所属页面」改了就是移动:\n // 保存后本列表少一条、目标页面徽标 +1,由父页重拉树自然反映。\n const payload: MenuInput = {\n ...form,\n permission: joinPermission(permissionCodes.value),\n type: MenuType.Button,\n moduleId: null,\n }\n if (editingId.value === null) await menuApi.add(payload)\n else await menuApi.update(editingId.value, payload)\n message.success(t('menu.saved'))\n emit('changed')\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 从路由批量添加 ──────────────────────────────────────────────\ntype BatchRow = { code: string; method: string; path: string; title: string; checked: boolean }\nconst batchShow = ref(false)\nconst batchRows = ref<BatchRow[]>([])\nconst batchSaving = ref(false)\nconst batchKeyword = ref('')\n\n/** 搜索过滤:返回 batchRows 里命中的同一批对象引用,勾选/改标题的状态跨搜索保留;\n * saveBatch 仍以全量 batchRows 的 checked 为准,不会漏掉被过滤隐藏的已勾选行。 */\nconst filteredBatchRows = computed(() => {\n const kw = batchKeyword.value.trim().toLowerCase()\n const seg = routeSeg.value\n return batchRows.value.filter(r => {\n if (seg && !showAllRoutes.value && !belongsToApp(r.path)) return false // 按应用软过滤(可一键放开)\n if (!kw) return true\n return (\n r.method.toLowerCase().includes(kw) ||\n r.path.toLowerCase().includes(kw) ||\n r.title.toLowerCase().includes(kw)\n )\n })\n})\n\n/** HTTP 方法 → 默认标题(可就地改)。 */\nfunction defaultTitle(method: string): string {\n const m = method.toUpperCase()\n if (m === 'GET') return t('menu.btnQuery')\n if (m === 'POST') return t('menu.btnCreate')\n if (m === 'PUT' || m === 'PATCH') return t('menu.btnUpdate')\n if (m === 'DELETE') return t('menu.btnDelete')\n return method\n}\nfunction openBatch() {\n batchKeyword.value = ''\n showAllRoutes.value = false // 批量默认只列本应用路由\n // 只列当前菜单还没建过的路由,避免重复。\n batchRows.value = props.routes\n .filter(r => !usedCodes.value.has(r.code))\n .map(r => ({\n code: r.code,\n method: r.method,\n path: r.path,\n title: defaultTitle(r.method),\n checked: false,\n }))\n batchShow.value = true\n}\nconst batchChecked = computed(() => batchRows.value.filter(r => r.checked))\nasync function saveBatch() {\n const picked = batchChecked.value\n if (!picked.length) return false // 未选任何路由,别关弹窗\n batchSaving.value = true\n try {\n // ponytail: 逐个 add,量级大到卡顿再考虑后端批量端点\n for (const r of picked) {\n await menuApi.add({\n parentId: menuId.value ?? 0,\n type: MenuType.Button,\n title: r.title.trim() || r.method,\n permission: r.code,\n sort: 0,\n enabled: true,\n moduleId: null,\n path: '',\n component: '',\n icon: '',\n visible: true,\n })\n }\n message.success(t('menu.saved'))\n emit('changed')\n batchShow.value = false\n } catch (e) {\n message.error(translateError(e))\n return false\n } finally {\n batchSaving.value = false\n }\n}\n\nconst columns: SmartTableColumn<MenuTreeNode>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n title: () => t('menu.title'),\n key: 'title',\n ellipsis: { tooltip: true },\n align: 'left',\n search: {},\n },\n {\n title: () => t('menu.permission'),\n key: 'permission',\n // 权限码是 `METHOD:/api/...` 的整条路由,单个 tag 就比默认列宽长,所以给足宽度,放不下的一律省略 + 悬浮提示\n width: 360,\n ellipsis: { tooltip: true },\n // 多码按钮逐条成 tag,一眼看出「查询」挂了哪几条路由\n render: r => {\n const codes = splitPermission(r.permission)\n if (!codes.length) return h('span', { class: 'faint' }, '—')\n return h(NSpace, { size: 4, wrapItem: false }, () =>\n codes.map(c => h(NTag, { size: 'small', bordered: false, key: c }, () => c)),\n )\n },\n },\n {\n title: () => t('menu.sort'),\n key: 'sort',\n width: 70,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 84,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) => menuApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': () => emit('changed'),\n }),\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 130,\n align: 'right',\n fixed: 'right',\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n canEdit.value\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n canDelete.value\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => menuApi.remove(r.id), t('menu.deleted')).then(ok => {\n if (ok) emit('changed')\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('menu.deleteConfirm', { title: r.title }),\n },\n )\n : null,\n ]),\n },\n]\n</script>\n\n<template>\n <!-- 列表弹窗:只有一个「关闭」底栏(不走 onConfirm 提交协议) -->\n <FormContainer\n v-model:show=\"show\"\n :title=\"t('menu.buttonManagerTitle', { title: menuTitle })\"\n :width=\"960\"\n >\n <!-- 业务按钮在表格工具栏右半(次按钮在前、主按钮在后),不单独占一行放在表格上方 -->\n <SmartTable\n :columns=\"columns\"\n :data=\"buttons\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :pagination=\"false\"\n row-key=\"id\"\n card-on-narrow\n storage-key=\"sys-menu-buttons\"\n >\n <template #toolbar-right>\n <n-button v-if=\"canAdd\" secondary @click=\"openBatch\">\n <template #icon><AppIcon icon=\"ph:list-plus\" :size=\"16\" /></template>\n {{ t('menu.batchFromRoutes') }}\n </n-button>\n <n-button v-if=\"canAdd\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('menu.addButton') }}\n </n-button>\n </template>\n </SmartTable>\n <template #footer>\n <n-space justify=\"end\">\n <n-button @click=\"show = false\">{{ t('common.close') }}</n-button>\n </n-space>\n </template>\n </FormContainer>\n\n <!-- 单个新增/编辑按钮 -->\n <FormContainer\n v-model:show=\"editShow\"\n :title=\"editingId === null ? t('menu.addButton') : t('common.edit')\"\n :width=\"600\"\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-grid :cols=\"1\" :y-gap=\"4\">\n <n-form-item-gi :label=\"t('menu.title')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('menu.title')\" />\n </n-form-item-gi>\n <!-- 改这里 = 把按钮移到别的页面(按钮不在主树里,这是唯一能改归属的入口)。 -->\n <n-form-item-gi :label=\"t('menu.buttonParent')\">\n <n-select v-model:value=\"form.parentId\" :options=\"parentOptions\" filterable />\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('menu.permission')\">\n <n-space vertical :size=\"4\" style=\"width: 100%\">\n <n-select\n v-model:value=\"permissionCodes\"\n :options=\"permissionOptions\"\n multiple\n filterable\n tag\n clearable\n :placeholder=\"t('menu.permissionPlaceholder')\"\n />\n <span class=\"perm-hint\">{{ t('menu.permissionHint') }}</span>\n <n-checkbox v-if=\"hasOtherRoutes\" v-model:checked=\"showAllRoutes\" size=\"small\">\n {{ t('menu.showAllRoutes') }}\n </n-checkbox>\n </n-space>\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('menu.sort')\">\n <n-input-number v-model:value=\"form.sort\" :min=\"0\" style=\"width: 100%\" />\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item-gi>\n </n-grid>\n </n-form>\n </FormContainer>\n\n <!-- 从路由批量添加 -->\n <FormContainer\n v-model:show=\"batchShow\"\n :title=\"t('menu.batchTitle')\"\n :width=\"640\"\n :on-confirm=\"saveBatch\"\n :confirm-text=\"t('common.save')\"\n >\n <n-empty\n v-if=\"!batchRows.length\"\n :description=\"t('menu.noRoutesLeft')\"\n style=\"padding: 24px 0\"\n />\n <n-space v-else vertical :size=\"10\">\n <n-space align=\"center\" :size=\"12\">\n <n-input\n v-model:value=\"batchKeyword\"\n clearable\n :placeholder=\"t('menu.batchSearchPlaceholder')\"\n style=\"flex: 1\"\n >\n <template #prefix><AppIcon icon=\"ph:magnifying-glass\" :size=\"16\" /></template>\n </n-input>\n <n-checkbox v-if=\"hasOtherRoutes\" v-model:checked=\"showAllRoutes\">\n {{ t('menu.showAllRoutes') }}\n </n-checkbox>\n </n-space>\n <n-empty\n v-if=\"!filteredBatchRows.length\"\n :description=\"t('menu.noRoutesLeft')\"\n style=\"padding: 16px 0\"\n />\n <n-space v-else vertical :size=\"6\" style=\"max-height: 55vh; overflow: auto\">\n <div v-for=\"r in filteredBatchRows\" :key=\"r.code\" class=\"batch-row\">\n <n-checkbox v-model:checked=\"r.checked\" />\n <span class=\"batch-route mono muted\">{{ r.method }} {{ r.path }}</span>\n <n-input v-model:value=\"r.title\" :disabled=\"!r.checked\" class=\"batch-title\" />\n </div>\n </n-space>\n </n-space>\n </FormContainer>\n</template>\n\n<style scoped>\n.perm-hint {\n font-size: 13px;\n color: var(--text-3);\n line-height: 1.5;\n}\n\n/* 批量添加:复选框 + 「METHOD 路径」+ 标题输入;窄屏路由文字独占一行,标题输入落到下一行 */\n.batch-row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px 10px;\n}\n.batch-route {\n flex: 1 1 210px;\n min-width: 0;\n font-size: 13px;\n word-break: break-all;\n}\n.batch-title {\n width: 160px;\n}\n@media (max-width: 640px) {\n .batch-title {\n width: calc(100% - 34px);\n margin-left: 34px;\n }\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.muted,\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":["props","__props","emit","__emit","t","useI18n","message","useMessage","run","useConfirm","auth","useAuthStore","canAdd","computed","canEdit","canDelete","narrowForm","useMediaQuery","formLayout","show","ref","menuId","menuTitle","findNode","nodes","id","hit","buttons","node","c","MenuType","usedCodes","b","splitPermission","routeSeg","belongsToApp","path","seg","hasOtherRoutes","r","showAllRoutes","toOpt","permissionOptions","inApp","other","parentOptions","opts","walk","depth","n","translateMenuTitle","open","menu","__expose","editShow","editingId","formRef","rules","blank","form","reactive","permissionCodes","toInput","openAdd","openEdit","save","_a","payload","joinPermission","menuApi","e","translateError","batchShow","batchRows","batchSaving","batchKeyword","filteredBatchRows","kw","defaultTitle","method","m","openBatch","batchChecked","saveBatch","picked","columns","codes","h","NSpace","NTag","StatusSwitch","next","NButton","NPopconfirm","ok","_createVNode","FormContainer","$event","_unref","SmartTable","TABLE_TOOLBAR","_createBlock","AppIcon","_createTextVNode","_mergeProps","NGrid","NFormItemGi","NInput","_cache","NSelect","_createElementVNode","_hoisted_1","_toDisplayString","NCheckbox","NInputNumber","NSwitch","_createElementBlock","_Fragment","_renderList","_hoisted_2","NEmpty"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./index2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-
|
|
4
|
+
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-61aa809c"]]);
|
|
5
5
|
export {
|
|
6
6
|
p as default
|
|
7
7
|
};
|