smart-admin-web 10.13.0 → 10.14.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.
Files changed (34) hide show
  1. package/dist/api/index.d.ts +1 -16
  2. package/dist/api/index.js +33 -48
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +0 -409
  5. package/dist/assets/icons/ph-subset.json.js +1 -1
  6. package/dist/composables/useModule.js +27 -35
  7. package/dist/composables/useModule.js.map +1 -1
  8. package/dist/index.js +249 -250
  9. package/dist/layouts/AppHeader.vue.js +1 -1
  10. package/dist/layouts/AppHeader2.vue.js +292 -306
  11. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  12. package/dist/lib/runtime.js +1 -1
  13. package/dist/locales/en-US.d.ts +8 -37
  14. package/dist/locales/en-US.js +9 -37
  15. package/dist/locales/en-US.js.map +1 -1
  16. package/dist/locales/zh-CN.d.ts +8 -37
  17. package/dist/locales/zh-CN.js +9 -37
  18. package/dist/locales/zh-CN.js.map +1 -1
  19. package/dist/router/viewRegistry.js +1 -1
  20. package/dist/router/viewRegistry.js.map +1 -1
  21. package/dist/stores/user.d.ts +1 -6
  22. package/dist/stores/user.js.map +1 -1
  23. package/dist/style.css +1 -1
  24. package/dist/types/api.d.ts +0 -33
  25. package/dist/types/api.js.map +1 -1
  26. package/dist/views/system/api-docs/index.vue.js +5 -0
  27. package/dist/views/system/{tenant → api-docs}/index.vue.js.map +1 -1
  28. package/dist/views/system/api-docs/index2.vue.js +64 -0
  29. package/dist/views/system/api-docs/index2.vue.js.map +1 -0
  30. package/package.json +3 -3
  31. package/dist/views/system/tenant/index.vue.js +0 -8
  32. package/dist/views/system/tenant/index2.vue.js +0 -366
  33. package/dist/views/system/tenant/index2.vue.js.map +0 -1
  34. /package/dist/views/system/{tenant → api-docs}/index.vue.d.ts +0 -0
@@ -0,0 +1,64 @@
1
+ import { defineComponent as D, onMounted as C, onActivated as N, openBlock as l, createBlock as y, unref as e, withCtx as o, createVNode as a, createElementVNode as p, toDisplayString as n, createTextVNode as s, createElementBlock as g, createCommentVNode as h } from "vue";
2
+ import { NCard as x, NSpace as u, NButton as d } from "naive-ui";
3
+ import { useClipboard as B } from "@vueuse/core";
4
+ import { useI18n as T } from "vue-i18n";
5
+ import { runtime as b } from "../../../lib/runtime.js";
6
+ import { useUserStore as v } from "../../../stores/user.js";
7
+ const S = { key: 0 }, L = /* @__PURE__ */ D({
8
+ __name: "index",
9
+ setup(V) {
10
+ const { t } = T(), f = v(), { copy: m, copied: _ } = B(), c = `${b.apiBase}/scalar`;
11
+ function k() {
12
+ m(f.accessToken);
13
+ }
14
+ let r = !1;
15
+ function i() {
16
+ r || (r = !0, window.open(c, "_blank"), Promise.resolve().then(() => {
17
+ r = !1;
18
+ }));
19
+ }
20
+ return C(i), N(i), (w, A) => (l(), y(e(x), {
21
+ title: e(t)("apiDocs.title")
22
+ }, {
23
+ default: o(() => [
24
+ a(e(u), {
25
+ vertical: "",
26
+ size: "large"
27
+ }, {
28
+ default: o(() => [
29
+ p("p", null, n(e(t)("apiDocs.openedHint")), 1),
30
+ a(e(d), {
31
+ tag: "a",
32
+ href: c,
33
+ target: "_blank"
34
+ }, {
35
+ default: o(() => [
36
+ s(n(e(t)("apiDocs.fallbackLink")), 1)
37
+ ]),
38
+ _: 1
39
+ }),
40
+ a(e(u), { align: "center" }, {
41
+ default: o(() => [
42
+ a(e(d), { onClick: k }, {
43
+ default: o(() => [
44
+ s(n(e(t)("apiDocs.copyToken")), 1)
45
+ ]),
46
+ _: 1
47
+ }),
48
+ e(_) ? (l(), g("span", S, n(e(t)("apiDocs.tokenCopied")), 1)) : h("", !0)
49
+ ]),
50
+ _: 1
51
+ }),
52
+ p("p", null, n(e(t)("apiDocs.copyTokenHint")), 1)
53
+ ]),
54
+ _: 1
55
+ })
56
+ ]),
57
+ _: 1
58
+ }, 8, ["title"]));
59
+ }
60
+ });
61
+ export {
62
+ L as default
63
+ };
64
+ //# sourceMappingURL=index2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/api-docs/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onActivated, onMounted } from 'vue'\nimport { NButton, NCard, NSpace } from 'naive-ui'\nimport { useClipboard } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { runtime } from '#/lib/runtime'\nimport { useUserStore } from '#/stores/user'\n\nconst { t } = useI18n()\nconst userStore = useUserStore()\nconst { copy, copied } = useClipboard()\n\nconst scalarUrl = `${runtime.apiBase}/scalar`\n\nfunction copyToken() {\n copy(userStore.accessToken)\n}\n\n// 门闩要保的不变量:不管这是本次会话里第几次挂载,一次全新挂载只应该开一个标签页。页面经\n// defineAsyncComponent 包装挂进 <keep-alive> 时,onMounted 和 onActivated 有可能在同一个 tick\n// 里各调用一次 openDocs(不是只有\"某一次特定的挂载\"才会撞;不能假设第一次挂载就天然安全)。\n// 用一个同步置位、下一个微任务清除的门闩吸收这种\"同 tick 双触发\":两次同步调用只开一次;\n// 而真正的重新激活(用户切走再切回)发生在别的 tick,门闩早已清空,照样正常重开——这正是\n// I7 修复本身要保的行为,不能被这里的去重顺带拿掉。\nlet openGuardActive = false\n\nfunction openDocs() {\n if (openGuardActive) return\n openGuardActive = true\n window.open(scalarUrl, '_blank')\n Promise.resolve().then(() => {\n openGuardActive = false\n })\n}\n\nonMounted(openDocs)\nonActivated(openDocs)\n</script>\n\n<template>\n <NCard :title=\"t('apiDocs.title')\">\n <NSpace vertical size=\"large\">\n <p>{{ t('apiDocs.openedHint') }}</p>\n <NButton tag=\"a\" :href=\"scalarUrl\" target=\"_blank\">{{ t('apiDocs.fallbackLink') }}</NButton>\n <NSpace align=\"center\">\n <NButton @click=\"copyToken\">{{ t('apiDocs.copyToken') }}</NButton>\n <span v-if=\"copied\">{{ t('apiDocs.tokenCopied') }}</span>\n </NSpace>\n <p>{{ t('apiDocs.copyTokenHint') }}</p>\n </NSpace>\n </NCard>\n</template>\n"],"names":["useI18n","userStore","useUserStore","copy","copied","useClipboard","scalarUrl","runtime","copyToken","openGuardActive","openDocs","onMounted","onActivated","_createBlock","_unref","NCard","_createVNode","NSpace","_createElementVNode","NButton","_openBlock","_createElementBlock"],"mappings":";;;;;;;;;AAQA,UAAM,EAAE,EAAA,IAAMA,EAAA,GACRC,IAAYC,EAAA,GACZ,EAAE,MAAAC,GAAM,QAAAC,EAAA,IAAWC,EAAA,GAEnBC,IAAY,GAAGC,EAAQ,OAAO;AAEpC,aAASC,IAAY;AACnB,MAAAL,EAAKF,EAAU,WAAW;AAAA,IAC5B;AAQA,QAAIQ,IAAkB;AAEtB,aAASC,IAAW;AAClB,MAAID,MACJA,IAAkB,IAClB,OAAO,KAAKH,GAAW,QAAQ,GAC/B,QAAQ,UAAU,KAAK,MAAM;AAC3B,QAAAG,IAAkB;AAAA,MACpB,CAAC;AAAA,IACH;AAEA,WAAAE,EAAUD,CAAQ,GAClBE,EAAYF,CAAQ,mBAIlBG,EAUQC,EAAAC,CAAA,GAAA;AAAA,MAVA,OAAOD,EAAA,CAAA,EAAC,eAAA;AAAA,IAAA;iBACd,MAQS;AAAA,QARTE,EAQSF,EAAAG,CAAA,GAAA;AAAA,UARD,UAAA;AAAA,UAAS,MAAK;AAAA,QAAA;qBACpB,MAAoC;AAAA,YAApCC,EAAoC,aAA9BJ,EAAA,CAAA,EAAC,oBAAA,CAAA,GAAA,CAAA;AAAA,YACPE,EAA4FF,EAAAK,CAAA,GAAA;AAAA,cAAnF,KAAI;AAAA,cAAK,MAAMb;AAAA,cAAW,QAAO;AAAA,YAAA;yBAAS,MAA+B;AAAA,oBAA5BQ,EAAA,CAAA,EAAC,sBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YACvDE,EAGSF,EAAAG,CAAA,GAAA,EAHD,OAAM,YAAQ;AAAA,yBACpB,MAAkE;AAAA,gBAAlED,EAAkEF,EAAAK,CAAA,GAAA,EAAxD,SAAOX,KAAS;AAAA,6BAAE,MAA4B;AAAA,wBAAzBM,EAAA,CAAA,EAAC,mBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACpBA,EAAAV,CAAA,KAAZgB,KAAAC,EAAyD,aAAlCP,EAAA,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;;;;YAE1BI,EAAuC,aAAjCJ,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-admin-web",
3
- "version": "10.13.0",
3
+ "version": "10.14.0",
4
4
  "description": "SmartAdmin 前端内核:布局、路由、鉴权、内置系统页与共享组件,配合 SmartAdmin NuGet 包使用",
5
5
  "keywords": [
6
6
  "smartadmin",
@@ -59,7 +59,7 @@
59
59
  "naive-ui": "^2.45.3",
60
60
  "pinia": "^4.0.3",
61
61
  "smart-naive-icon": "^2.0.0",
62
- "smart-naive-table": "^2.0.0",
62
+ "smart-naive-table": "^2.1.1",
63
63
  "vue": "^3.5.42",
64
64
  "vue-i18n": "^11.4.10",
65
65
  "vue-router": "^4.5.0"
@@ -90,7 +90,7 @@
90
90
  "openapi-typescript": "^7.6.1",
91
91
  "pinia": "^4.0.3",
92
92
  "smart-naive-icon": "^2.0.0",
93
- "smart-naive-table": "^2.0.0",
93
+ "smart-naive-table": "^2.1.1",
94
94
  "typescript": "^5.7.3",
95
95
  "vite": "^6.0.11",
96
96
  "vite-plugin-dts": "^5.1.0",
@@ -1,8 +0,0 @@
1
- import o from "./index2.vue.js";
2
- /* empty css */
3
- import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-95f59a57"]]);
5
- export {
6
- m as default
7
- };
8
- //# sourceMappingURL=index.vue.js.map
@@ -1,366 +0,0 @@
1
- import { defineComponent as V, ref as b, reactive as B, resolveDirective as $, openBlock as P, createElementBlock as T, Fragment as S, createVNode as l, unref as e, withCtx as d, withDirectives as F, createBlock as O, createTextVNode as k, toDisplayString as m, createElementVNode as s, normalizeClass as j, createCommentVNode as L, h as f } from "vue";
2
- import { useMessage as G, NButton as _, NForm as H, NFormItem as r, NInput as c, NSpace as A, NTag as U, NDatePicker as J, NSwitch as K, NPopconfirm as Q } from "naive-ui";
3
- import { useI18n as W } from "vue-i18n";
4
- import { SmartTable as X } from "smart-naive-table";
5
- import Y from "../../../components/AppIcon.vue.js";
6
- import Z from "../../../components/FormContainer/index.vue.js";
7
- /* empty css */
8
- import ee from "../../../components/StatusSwitch/index.vue.js";
9
- import { useConfirm as te } from "../../../composables/useConfirm.js";
10
- import { tenantApi as v } from "../../../api/index.js";
11
- import { useAuthStore as ae } from "../../../stores/auth.js";
12
- import { translateError as q } from "../../../utils/error.js";
13
- const ne = { class: "iso-title" }, oe = { class: "iso-desc" }, le = ["title"], ie = { class: "iso-title" }, de = { class: "iso-desc" }, re = { class: "form-section" }, se = { class: "form-section__title" }, _e = /* @__PURE__ */ V({
14
- __name: "index",
15
- setup(ue) {
16
- const { t } = W(), y = G(), { run: C } = te(), w = ae(), g = b(), N = (n) => ({
17
- code: n.code,
18
- name: n.name,
19
- contactName: n.contactName ?? "",
20
- contactPhone: n.contactPhone ?? "",
21
- expireTime: n.expireTime,
22
- isolationMode: n.isolationMode,
23
- enabled: n.enabled,
24
- remark: n.remark ?? ""
25
- }), z = [
26
- { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
27
- // 编码列不开搜索:后端 TenantPageInput 只支持按 Name 过滤,开了也是个不生效的搜索框。
28
- { key: "code", title: () => t("tenant.code") },
29
- { key: "name", title: () => t("tenant.name"), search: !0 },
30
- {
31
- key: "isolationMode",
32
- title: () => t("tenant.isolationMode"),
33
- width: 100,
34
- render: (n) => f(
35
- U,
36
- { size: "small", type: n.isolationMode === 1 ? "info" : "default" },
37
- () => n.isolationMode === 1 ? t("tenant.isolationModeShared") : t("tenant.isolationModeStandalone")
38
- )
39
- },
40
- { key: "contactName", title: () => t("tenant.contactName") },
41
- { key: "contactPhone", title: () => t("tenant.contactPhone") },
42
- { key: "expireTime", title: () => t("tenant.expireTime"), format: "date" },
43
- {
44
- key: "enabled",
45
- title: () => t("common.status"),
46
- width: 90,
47
- render: (n) => f(ee, {
48
- value: n.enabled,
49
- disabled: !w.hasPerm("PUT:/api/v1/sys/tenant/{id}"),
50
- request: (a) => v.update(n.id, { ...N(n), enabled: a }),
51
- "onUpdate:value": (a) => {
52
- n.enabled = a;
53
- }
54
- })
55
- },
56
- { key: "createTime", title: () => t("common.createTime"), format: "datetime" },
57
- {
58
- key: "op",
59
- title: () => t("common.operation"),
60
- width: 120,
61
- fixed: "right",
62
- hideInSetting: !0,
63
- render: (n) => f(A, { size: 4, wrapItem: !1 }, () => [
64
- w.hasPerm("PUT:/api/v1/sys/tenant/{id}") ? f(
65
- _,
66
- { size: "small", quaternary: !0, type: "primary", onClick: () => D(n) },
67
- () => t("common.edit")
68
- ) : null,
69
- w.hasPerm("DELETE:/api/v1/sys/tenant/{id}") ? f(
70
- Q,
71
- {
72
- onPositiveClick: () => C(() => v.remove(n.id), t("tenant.deleted")).then((a) => {
73
- var p;
74
- a && ((p = g.value) == null || p.refresh());
75
- })
76
- },
77
- {
78
- trigger: () => f(
79
- _,
80
- { size: "small", quaternary: !0, type: "error" },
81
- () => t("common.delete")
82
- ),
83
- default: () => t("tenant.deleteConfirm", { name: n.name })
84
- }
85
- ) : null
86
- ])
87
- }
88
- ], h = b(!1), M = b(null), u = b(null), E = {
89
- code: {
90
- required: !0,
91
- whitespace: !0,
92
- message: () => t("tenant.codeRequired"),
93
- trigger: ["input", "blur"]
94
- },
95
- name: {
96
- required: !0,
97
- whitespace: !0,
98
- message: () => t("tenant.nameRequired"),
99
- trigger: ["input", "blur"]
100
- },
101
- adminAccount: {
102
- required: !0,
103
- whitespace: !0,
104
- message: () => t("tenant.adminAccountRequired"),
105
- trigger: ["input", "blur"]
106
- },
107
- adminPassword: {
108
- required: !0,
109
- whitespace: !0,
110
- message: () => t("tenant.adminPasswordRequired"),
111
- trigger: ["input", "blur"]
112
- }
113
- }, x = () => ({
114
- code: "",
115
- name: "",
116
- contactName: "",
117
- contactPhone: "",
118
- isolationMode: 1,
119
- enabled: !0,
120
- remark: "",
121
- adminAccount: "",
122
- adminPassword: ""
123
- }), o = B(x());
124
- function R() {
125
- u.value = null, Object.assign(o, x()), h.value = !0;
126
- }
127
- function D(n) {
128
- u.value = n.id, Object.assign(o, N(n), { adminAccount: "", adminPassword: "" }), h.value = !0;
129
- }
130
- async function I() {
131
- var n, a;
132
- await ((n = M.value) == null ? void 0 : n.validate());
133
- try {
134
- u.value === null ? await v.add({ ...o }) : await v.update(u.value, { ...o }), y.success(t("tenant.saved")), await ((a = g.value) == null ? void 0 : a.refresh());
135
- } catch (p) {
136
- return y.error(q(p)), !1;
137
- }
138
- }
139
- return (n, a) => {
140
- const p = $("auth");
141
- return P(), T(S, null, [
142
- l(e(X), {
143
- ref_key: "tableRef",
144
- ref: g,
145
- "default-page-size": 100,
146
- columns: z,
147
- fetcher: e(v).page,
148
- "flex-height": "",
149
- "virtual-scroll": "",
150
- "storage-key": "sys-tenant",
151
- onError: a[0] || (a[0] = (i) => e(y).error(e(q)(i)))
152
- }, {
153
- toolbar: d(() => [
154
- F((P(), O(e(_), {
155
- type: "primary",
156
- onClick: R
157
- }, {
158
- icon: d(() => [
159
- l(Y, {
160
- icon: "ph:plus",
161
- size: 16
162
- })
163
- ]),
164
- default: d(() => [
165
- k(" " + m(e(t)("common.add")), 1)
166
- ]),
167
- _: 1
168
- })), [
169
- [p, "POST:/api/v1/sys/tenant/add"]
170
- ])
171
- ]),
172
- _: 1
173
- }, 8, ["fetcher"]),
174
- l(Z, {
175
- show: h.value,
176
- "onUpdate:show": a[11] || (a[11] = (i) => h.value = i),
177
- title: u.value === null ? e(t)("tenant.addTitle") : e(t)("tenant.editTitle"),
178
- width: 480,
179
- "on-confirm": I,
180
- "confirm-text": e(t)("common.save")
181
- }, {
182
- default: d(() => [
183
- l(e(H), {
184
- ref_key: "formRef",
185
- ref: M,
186
- model: o,
187
- rules: E,
188
- "label-placement": "left",
189
- "label-width": 90
190
- }, {
191
- default: d(() => [
192
- l(e(r), {
193
- label: e(t)("tenant.code"),
194
- path: "code"
195
- }, {
196
- default: d(() => [
197
- l(e(c), {
198
- value: o.code,
199
- "onUpdate:value": a[1] || (a[1] = (i) => o.code = i),
200
- disabled: u.value !== null,
201
- placeholder: e(t)("tenant.codePlaceholder")
202
- }, null, 8, ["value", "disabled", "placeholder"])
203
- ]),
204
- _: 1
205
- }, 8, ["label"]),
206
- l(e(r), {
207
- label: e(t)("tenant.name"),
208
- path: "name"
209
- }, {
210
- default: d(() => [
211
- l(e(c), {
212
- value: o.name,
213
- "onUpdate:value": a[2] || (a[2] = (i) => o.name = i),
214
- placeholder: e(t)("tenant.name")
215
- }, null, 8, ["value", "placeholder"])
216
- ]),
217
- _: 1
218
- }, 8, ["label"]),
219
- l(e(r), {
220
- label: e(t)("tenant.isolationMode")
221
- }, {
222
- default: d(() => [
223
- l(e(A), {
224
- vertical: "",
225
- style: { width: "100%" }
226
- }, {
227
- default: d(() => [
228
- s("div", {
229
- class: j(["iso-option", { selected: o.isolationMode === 1 }]),
230
- onClick: a[3] || (a[3] = (i) => o.isolationMode = 1)
231
- }, [
232
- s("div", ne, m(e(t)("tenant.isolationModeShared")), 1),
233
- s("div", oe, m(e(t)("tenant.isolationModeSharedDesc")), 1)
234
- ], 2),
235
- s("div", {
236
- class: "iso-option disabled",
237
- title: e(t)("tenant.isolationModePhase2")
238
- }, [
239
- s("div", ie, [
240
- k(m(e(t)("tenant.isolationModeStandalone")) + " ", 1),
241
- l(e(U), {
242
- size: "tiny",
243
- type: "warning",
244
- style: { "margin-left": "6px" }
245
- }, {
246
- default: d(() => [
247
- k(m(e(t)("tenant.isolationModePhase2")), 1)
248
- ]),
249
- _: 1
250
- })
251
- ]),
252
- s("div", de, m(e(t)("tenant.isolationModeStandaloneDesc")), 1)
253
- ], 8, le)
254
- ]),
255
- _: 1
256
- })
257
- ]),
258
- _: 1
259
- }, 8, ["label"]),
260
- l(e(r), {
261
- label: e(t)("tenant.contactName")
262
- }, {
263
- default: d(() => [
264
- l(e(c), {
265
- value: o.contactName,
266
- "onUpdate:value": a[4] || (a[4] = (i) => o.contactName = i)
267
- }, null, 8, ["value"])
268
- ]),
269
- _: 1
270
- }, 8, ["label"]),
271
- l(e(r), {
272
- label: e(t)("tenant.contactPhone")
273
- }, {
274
- default: d(() => [
275
- l(e(c), {
276
- value: o.contactPhone,
277
- "onUpdate:value": a[5] || (a[5] = (i) => o.contactPhone = i)
278
- }, null, 8, ["value"])
279
- ]),
280
- _: 1
281
- }, 8, ["label"]),
282
- l(e(r), {
283
- label: e(t)("tenant.expireTime")
284
- }, {
285
- default: d(() => [
286
- l(e(J), {
287
- "formatted-value": o.expireTime,
288
- "onUpdate:formattedValue": a[6] || (a[6] = (i) => o.expireTime = i),
289
- "value-format": "yyyy-MM-dd",
290
- type: "date",
291
- style: { width: "100%" }
292
- }, null, 8, ["formatted-value"])
293
- ]),
294
- _: 1
295
- }, 8, ["label"]),
296
- l(e(r), {
297
- label: e(t)("common.status")
298
- }, {
299
- default: d(() => [
300
- l(e(K), {
301
- value: o.enabled,
302
- "onUpdate:value": a[7] || (a[7] = (i) => o.enabled = i)
303
- }, null, 8, ["value"])
304
- ]),
305
- _: 1
306
- }, 8, ["label"]),
307
- u.value === null ? (P(), T(S, { key: 0 }, [
308
- s("div", re, [
309
- s("div", se, m(e(t)("tenant.initialAdmin")), 1)
310
- ]),
311
- l(e(r), {
312
- label: e(t)("tenant.adminAccount"),
313
- path: "adminAccount"
314
- }, {
315
- default: d(() => [
316
- l(e(c), {
317
- value: o.adminAccount,
318
- "onUpdate:value": a[8] || (a[8] = (i) => o.adminAccount = i),
319
- placeholder: e(t)("tenant.adminAccountPlaceholder")
320
- }, null, 8, ["value", "placeholder"])
321
- ]),
322
- _: 1
323
- }, 8, ["label"]),
324
- l(e(r), {
325
- label: e(t)("tenant.adminPassword"),
326
- path: "adminPassword"
327
- }, {
328
- default: d(() => [
329
- l(e(c), {
330
- value: o.adminPassword,
331
- "onUpdate:value": a[9] || (a[9] = (i) => o.adminPassword = i),
332
- type: "password",
333
- "show-password-on": "click",
334
- placeholder: e(t)("tenant.adminPasswordPlaceholder")
335
- }, null, 8, ["value", "placeholder"])
336
- ]),
337
- _: 1
338
- }, 8, ["label"])
339
- ], 64)) : L("", !0),
340
- l(e(r), {
341
- label: e(t)("tenant.remark")
342
- }, {
343
- default: d(() => [
344
- l(e(c), {
345
- value: o.remark,
346
- "onUpdate:value": a[10] || (a[10] = (i) => o.remark = i),
347
- type: "textarea",
348
- rows: 2
349
- }, null, 8, ["value"])
350
- ]),
351
- _: 1
352
- }, 8, ["label"])
353
- ]),
354
- _: 1
355
- }, 8, ["model"])
356
- ]),
357
- _: 1
358
- }, 8, ["show", "title", "confirm-text"])
359
- ], 64);
360
- };
361
- }
362
- });
363
- export {
364
- _e as default
365
- };
366
- //# sourceMappingURL=index2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/tenant/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 租户管理:标准 SmartTable CRUD + 行内启停,多一个\"隔离模式\"分段控件(一期只有共享库可选)\n// + 创建态才出现的初始管理员两个字段(编辑不改已有租户的管理员)。\nimport { h, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NInput,\n NDatePicker,\n NPopconfirm,\n NTag,\n NForm,\n NFormItem,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\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 { tenantApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport type { TenantCreateInput, TenantInput, SysTenant } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysTenant>>()\n\n// 可空字段落到 '' 而不是 null/undefined:n-input 的 v-model 才能直接绑,不用逐处 as string(同 role.vue 惯例)。\nconst toInput = (r: SysTenant): TenantInput => ({\n code: r.code,\n name: r.name,\n contactName: r.contactName ?? '',\n contactPhone: r.contactPhone ?? '',\n expireTime: r.expireTime,\n isolationMode: r.isolationMode,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\n\nconst columns: SmartTableColumn<SysTenant>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n // 编码列不开搜索:后端 TenantPageInput 只支持按 Name 过滤,开了也是个不生效的搜索框。\n { key: 'code', title: () => t('tenant.code') },\n { key: 'name', title: () => t('tenant.name'), search: true },\n {\n key: 'isolationMode',\n title: () => t('tenant.isolationMode'),\n width: 100,\n render: r =>\n h(NTag, { size: 'small', type: r.isolationMode === 1 ? 'info' : 'default' }, () =>\n r.isolationMode === 1\n ? t('tenant.isolationModeShared')\n : t('tenant.isolationModeStandalone'),\n ),\n },\n { key: 'contactName', title: () => t('tenant.contactName') },\n { key: 'contactPhone', title: () => t('tenant.contactPhone') },\n { key: 'expireTime', title: () => t('tenant.expireTime'), format: 'date' },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !authStore.hasPerm('PUT:/api/v1/sys/tenant/{id}'),\n request: (next: boolean) => tenantApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n { key: 'createTime', title: () => t('common.createTime'), format: 'datetime' },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 120,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/tenant/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/tenant/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => tenantApi.remove(r.id), t('tenant.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('tenant.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\n\n// ── 新增/编辑弹窗 ──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst editingId = ref<number | null>(null)\nconst rules: FormRules = {\n code: {\n required: true,\n whitespace: true,\n message: () => t('tenant.codeRequired'),\n trigger: ['input', 'blur'],\n },\n name: {\n required: true,\n whitespace: true,\n message: () => t('tenant.nameRequired'),\n trigger: ['input', 'blur'],\n },\n adminAccount: {\n required: true,\n whitespace: true,\n message: () => t('tenant.adminAccountRequired'),\n trigger: ['input', 'blur'],\n },\n adminPassword: {\n required: true,\n whitespace: true,\n message: () => t('tenant.adminPasswordRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): TenantCreateInput => ({\n code: '',\n name: '',\n contactName: '',\n contactPhone: '',\n isolationMode: 1,\n enabled: true,\n remark: '',\n adminAccount: '',\n adminPassword: '',\n})\nconst form = reactive<TenantCreateInput>(blank())\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: SysTenant) {\n editingId.value = r.id\n Object.assign(form, toInput(r), { adminAccount: '', adminPassword: '' })\n show.value = true\n}\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await tenantApi.add({ ...form })\n else await tenantApi.update(editingId.value, { ...form })\n message.success(t('tenant.saved'))\n await tableRef.value?.refresh()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <SmartTable\n ref=\"tableRef\"\n :default-page-size=\"100\"\n :columns=\"columns\"\n :fetcher=\"tenantApi.page\"\n flex-height\n virtual-scroll\n storage-key=\"sys-tenant\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/tenant/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('tenant.addTitle') : t('tenant.editTitle')\"\n :width=\"480\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-placement=\"left\" :label-width=\"90\">\n <n-form-item :label=\"t('tenant.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n :disabled=\"editingId !== null\"\n :placeholder=\"t('tenant.codePlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('tenant.name')\" path=\"name\">\n <n-input v-model:value=\"form.name\" :placeholder=\"t('tenant.name')\" />\n </n-form-item>\n\n <!-- 隔离模式:一期只有\"共享库\"可选,\"独立库\"置灰并标\"二期开放\"——见设计稿的路线图展示 -->\n <n-form-item :label=\"t('tenant.isolationMode')\">\n <n-space vertical style=\"width: 100%\">\n <div\n class=\"iso-option\"\n :class=\"{ selected: form.isolationMode === 1 }\"\n @click=\"form.isolationMode = 1\"\n >\n <div class=\"iso-title\">{{ t('tenant.isolationModeShared') }}</div>\n <div class=\"iso-desc\">{{ t('tenant.isolationModeSharedDesc') }}</div>\n </div>\n <div class=\"iso-option disabled\" :title=\"t('tenant.isolationModePhase2')\">\n <div class=\"iso-title\">\n {{ t('tenant.isolationModeStandalone') }}\n <n-tag size=\"tiny\" type=\"warning\" style=\"margin-left: 6px\">\n {{ t('tenant.isolationModePhase2') }}\n </n-tag>\n </div>\n <div class=\"iso-desc\">{{ t('tenant.isolationModeStandaloneDesc') }}</div>\n </div>\n </n-space>\n </n-form-item>\n\n <n-form-item :label=\"t('tenant.contactName')\">\n <n-input v-model:value=\"form.contactName as string\" />\n </n-form-item>\n <n-form-item :label=\"t('tenant.contactPhone')\">\n <n-input v-model:value=\"form.contactPhone as string\" />\n </n-form-item>\n <n-form-item :label=\"t('tenant.expireTime')\">\n <n-date-picker\n v-model:formatted-value=\"form.expireTime\"\n value-format=\"yyyy-MM-dd\"\n type=\"date\"\n style=\"width: 100%\"\n />\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 <!-- 初始管理员账号:只在新增时出现,编辑已有租户不改其管理员 -->\n <template v-if=\"editingId === null\">\n <div class=\"form-section\">\n <div class=\"form-section__title\">{{ t('tenant.initialAdmin') }}</div>\n </div>\n <n-form-item :label=\"t('tenant.adminAccount')\" path=\"adminAccount\">\n <n-input\n v-model:value=\"form.adminAccount\"\n :placeholder=\"t('tenant.adminAccountPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('tenant.adminPassword')\" path=\"adminPassword\">\n <n-input\n v-model:value=\"form.adminPassword\"\n type=\"password\"\n show-password-on=\"click\"\n :placeholder=\"t('tenant.adminPasswordPlaceholder')\"\n />\n </n-form-item>\n </template>\n\n <n-form-item :label=\"t('tenant.remark')\">\n <n-input v-model:value=\"form.remark as string\" type=\"textarea\" :rows=\"2\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n.iso-option {\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md, 10px);\n padding: 10px 12px;\n cursor: pointer;\n}\n.iso-option.selected {\n border-color: var(--color-primary);\n background: var(--color-primary-light);\n}\n.iso-option.disabled {\n cursor: not-allowed;\n opacity: 0.6;\n background: var(--color-fill);\n}\n.iso-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--color-text-primary);\n display: flex;\n align-items: center;\n}\n.iso-desc {\n font-size: 11.5px;\n color: var(--color-text-tertiary);\n margin-top: 3px;\n line-height: 1.5;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","toInput","r","columns","h","NTag","StatusSwitch","next","tenantApi","v","NSpace","NButton","openEdit","NPopconfirm","ok","_a","show","formRef","editingId","rules","blank","form","reactive","openAdd","save","_b","e","translateError","_createVNode","_unref","SmartTable","_cache","_createBlock","AppIcon","_createTextVNode","FormContainer","$event","NForm","NFormItem","NInput","_createElementVNode","_normalizeClass","_hoisted_1","_toDisplayString","_hoisted_2","_hoisted_4","_hoisted_5","NDatePicker","NSwitch","_createElementBlock","_Fragment","_hoisted_6","_hoisted_7"],"mappings":"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"}