smart-admin-web 10.13.1 → 10.15.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 (199) hide show
  1. package/README.md +5 -5
  2. package/dist/api/index.d.ts +37 -0
  3. package/dist/api/index.js +35 -14
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +381 -3
  6. package/dist/assets/icons/ph-subset.json.js +3 -3
  7. package/dist/assets/smart-logo.svg.js +5 -0
  8. package/dist/assets/smart-logo.svg.js.map +1 -0
  9. package/dist/components/SmartLogo.vue.d.ts +3 -0
  10. package/dist/components/SmartLogo.vue.js +1 -1
  11. package/dist/components/SmartLogo2.vue.js +22 -64
  12. package/dist/components/SmartLogo2.vue.js.map +1 -1
  13. package/dist/composables/useLoginHero.d.ts +2 -0
  14. package/dist/composables/useLoginHero.js +22 -0
  15. package/dist/composables/useLoginHero.js.map +1 -0
  16. package/dist/composables/usePageTitle.js +16 -14
  17. package/dist/composables/usePageTitle.js.map +1 -1
  18. package/dist/composables/useSite.d.ts +5 -0
  19. package/dist/composables/useSite.js +16 -13
  20. package/dist/composables/useSite.js.map +1 -1
  21. package/dist/index.js +92 -91
  22. package/dist/lib/favicon.d.ts +1 -0
  23. package/dist/lib/favicon.js +12 -0
  24. package/dist/lib/favicon.js.map +1 -0
  25. package/dist/lib/loginHero.d.ts +16 -0
  26. package/dist/lib/loginHero.js +33 -0
  27. package/dist/lib/loginHero.js.map +1 -0
  28. package/dist/lib/logoCrop.d.ts +25 -0
  29. package/dist/lib/logoCrop.js +22 -0
  30. package/dist/lib/logoCrop.js.map +1 -0
  31. package/dist/lib/runtime.d.ts +2 -0
  32. package/dist/lib/runtime.js +1 -1
  33. package/dist/lib/runtime.js.map +1 -1
  34. package/dist/lib/securityRules.d.ts +26 -0
  35. package/dist/lib/securityRules.js +86 -0
  36. package/dist/lib/securityRules.js.map +1 -0
  37. package/dist/locales/en-US.d.ts +250 -28
  38. package/dist/locales/en-US.js +271 -58
  39. package/dist/locales/en-US.js.map +1 -1
  40. package/dist/locales/zh-CN.d.ts +250 -28
  41. package/dist/locales/zh-CN.js +266 -58
  42. package/dist/locales/zh-CN.js.map +1 -1
  43. package/dist/router/viewRegistry.js +10 -10
  44. package/dist/router/viewRegistry.js.map +1 -1
  45. package/dist/style.css +1 -1
  46. package/dist/utils/oauthBrand.d.ts +34 -9
  47. package/dist/utils/oauthBrand.js +70 -74
  48. package/dist/utils/oauthBrand.js.map +1 -1
  49. package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
  50. package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
  51. package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
  52. package/dist/views/login/components/LoginHeroPanel2.vue.js +66 -0
  53. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
  54. package/dist/views/login/skins/SplitPanel.vue.js +1 -1
  55. package/dist/views/login/skins/SplitPanel2.vue.js +39 -59
  56. package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -1
  57. package/dist/views/system/api-docs/index.vue.js +5 -0
  58. package/dist/views/system/api-docs/index.vue.js.map +1 -0
  59. package/dist/views/system/api-docs/index2.vue.js +64 -0
  60. package/dist/views/system/api-docs/index2.vue.js.map +1 -0
  61. package/dist/views/system/config/components/AdminMock.vue.js +8 -0
  62. package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
  63. package/dist/views/system/config/components/AdminMock2.vue.js +76 -0
  64. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
  65. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -0
  66. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
  67. package/dist/views/system/config/components/AdvancedSection2.vue.js +135 -0
  68. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
  69. package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
  70. package/dist/views/system/config/components/BrandSection.vue.js +8 -0
  71. package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
  72. package/dist/views/system/config/components/BrandSection2.vue.js +264 -0
  73. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
  74. package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
  75. package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
  76. package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
  77. package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
  78. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
  79. package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
  80. package/dist/views/system/config/components/CfgRow.vue.js +9 -0
  81. package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
  82. package/dist/views/system/config/components/CfgRow2.vue.js +53 -0
  83. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
  84. package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
  85. package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
  86. package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
  87. package/dist/views/system/config/components/CfgSegment2.vue.js +44 -0
  88. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
  89. package/dist/views/system/config/components/ConfigFormModal.vue.js +5 -2
  90. package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
  91. package/dist/views/system/config/components/ConfigFormModal2.vue.js +66 -56
  92. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  93. package/dist/views/system/config/components/JobSection.vue.js +8 -0
  94. package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
  95. package/dist/views/system/config/components/JobSection2.vue.js +138 -0
  96. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
  97. package/dist/views/system/config/components/{GroupExtraConfig.vue.d.ts → LoginMock.vue.d.ts} +3 -4
  98. package/dist/views/system/config/components/LoginMock.vue.js +8 -0
  99. package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
  100. package/dist/views/system/config/components/LoginMock2.vue.js +121 -0
  101. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
  102. package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
  103. package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
  104. package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
  105. package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
  106. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
  107. package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
  108. package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
  109. package/dist/views/system/config/components/LogoEditor2.vue.js +163 -0
  110. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
  111. package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
  112. package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
  113. package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
  114. package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
  115. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
  116. package/dist/views/system/config/components/ScaleToFit.vue.d.ts +17 -0
  117. package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
  118. package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
  119. package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
  120. package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
  121. package/dist/views/system/config/components/SectionLayout.vue.d.ts +28 -0
  122. package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
  123. package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
  124. package/dist/views/system/config/components/SectionLayout2.vue.js +45 -0
  125. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
  126. package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
  127. package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
  128. package/dist/views/system/config/components/SecuritySection2.vue.js +416 -0
  129. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
  130. package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
  131. package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
  132. package/dist/views/system/config/components/SensitiveSection2.vue.js +209 -0
  133. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
  134. package/dist/views/system/config/components/SigninSection.vue.d.ts +3 -0
  135. package/dist/views/system/config/components/SigninSection.vue.js +8 -0
  136. package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
  137. package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
  138. package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
  139. package/dist/views/system/config/components/UploadSection.vue.d.ts +3 -0
  140. package/dist/views/system/config/components/UploadSection.vue.js +8 -0
  141. package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
  142. package/dist/views/system/config/components/UploadSection2.vue.js +167 -0
  143. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
  144. package/dist/views/system/config/draft.d.ts +148 -0
  145. package/dist/views/system/config/draft.js +170 -0
  146. package/dist/views/system/config/draft.js.map +1 -0
  147. package/dist/views/system/config/flash.d.ts +2 -0
  148. package/dist/views/system/config/flash.js +9 -0
  149. package/dist/views/system/config/flash.js.map +1 -0
  150. package/dist/views/system/config/groups.d.ts +35 -7
  151. package/dist/views/system/config/groups.js +99 -14
  152. package/dist/views/system/config/groups.js.map +1 -1
  153. package/dist/views/system/config/index.vue.js +4 -1
  154. package/dist/views/system/config/index.vue.js.map +1 -1
  155. package/dist/views/system/config/index2.vue.js +180 -115
  156. package/dist/views/system/config/index2.vue.js.map +1 -1
  157. package/dist/views/system/config/providerForm.d.ts +33 -0
  158. package/dist/views/system/config/providerForm.js +63 -0
  159. package/dist/views/system/config/providerForm.js.map +1 -0
  160. package/package.json +4 -4
  161. package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
  162. package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
  163. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
  164. package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
  165. package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
  166. package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
  167. package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
  168. package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
  169. package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
  170. package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
  171. package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
  172. package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
  173. package/dist/views/system/config/components/JobConfig.vue.js +0 -5
  174. package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
  175. package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
  176. package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
  177. package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
  178. package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
  179. package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
  180. package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
  181. package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
  182. package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
  183. package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
  184. package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
  185. package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
  186. package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
  187. package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
  188. package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
  189. package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
  190. package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
  191. package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
  192. package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
  193. /package/dist/views/system/{config/components/ExternalAuthConfig.vue.d.ts → api-docs/index.vue.d.ts} +0 -0
  194. /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → AdminMock.vue.d.ts} +0 -0
  195. /package/dist/views/system/config/components/{JobConfig.vue.d.ts → AdvancedSection.vue.d.ts} +0 -0
  196. /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → JobSection.vue.d.ts} +0 -0
  197. /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
  198. /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
  199. /package/dist/views/system/config/components/{UploadConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
@@ -1,456 +0,0 @@
1
- import { defineComponent as H, reactive as F, ref as h, computed as R, onMounted as $, resolveDirective as z, openBlock as S, createElementBlock as I, Fragment as A, createVNode as s, unref as e, withCtx as i, createTextVNode as m, toDisplayString as p, renderList as j, createElementVNode as U, withDirectives as J, createBlock as Q } from "vue";
2
- import { useMessage as X, NSpin as Z, NForm as ee, NDivider as f, NGrid as v, NFormItemGi as u, NInputNumber as d, NSwitch as g, NSelect as se, NButton as te } from "naive-ui";
3
- import { useI18n as le } from "vue-i18n";
4
- import ie from "../../../../components/AppIcon.vue.js";
5
- import { configApi as W } from "../../../../api/index.js";
6
- import { translateError as Y } from "../../../../utils/error.js";
7
- import ae from "./HighSensConfig2.vue.js";
8
- import ne from "./GroupExtraConfig.vue.js";
9
- const ue = { class: "sms-hint" }, oe = { class: "sms-hint" }, re = { style: { "margin-top": "16px" } }, C = "sys.security.captcha.enabled", E = "sys.security.captcha.type", w = "sys.security.totp.enabled", M = "sys.security.totp.requireForSuperAdmin", P = "sys.security.mfa.enabled", N = "sys.security.smsLogin.enabled", T = "sys.security.rateLimit.enabled", we = /* @__PURE__ */ H({
10
- __name: "SecurityConfig",
11
- setup(ye) {
12
- const { t: y } = le(), L = X(), _ = [
13
- { key: "sys.security.loginLock.maxFailCount", min: 0 },
14
- { key: "sys.security.loginLock.lockMinutes", min: 1 },
15
- { key: "sys.security.password.minLength", min: 1 },
16
- { key: "sys.security.password.expireDays", min: 0 },
17
- // 0 = 永不过期(合法值,不同于其余 min:1 项)
18
- { key: "sys.security.password.historyCount", min: 0 },
19
- // 0 = 关闭防重用
20
- { key: "sys.security.session.accessMinutes", min: 1 },
21
- { key: "sys.security.session.refreshMinutes", min: 1 },
22
- { key: "sys.security.rateLimit.windowSeconds", min: 1 },
23
- { key: "sys.security.rateLimit.permitPerWindow", min: 0 },
24
- { key: "sys.security.rateLimit.authPermitPerWindow", min: 0 }
25
- ], K = [
26
- "sys.security.password.requireUpper",
27
- "sys.security.password.requireLower",
28
- "sys.security.password.requireDigit",
29
- "sys.security.password.requireSpecial"
30
- ], B = [
31
- C,
32
- w,
33
- M,
34
- P,
35
- N,
36
- T
37
- ], x = [...K, ...B], O = [..._.map((n) => n.key), ...x, E], a = F({}), o = F({}), b = h("char"), V = R(
38
- () => ["char", "path", "math"].map((n) => ({ label: y("config.security.captcha.types." + n), value: n }))
39
- ), D = h(!0), k = h(!1), r = (n) => y("config.security." + n.replace("sys.security.", ""));
40
- $(async () => {
41
- try {
42
- const n = await W.listByGroup("security"), t = new Map(n.map((c) => [c.configKey, c.configValue ?? ""]));
43
- for (const c of _) a[c.key] = Number(t.get(c.key)) || c.min;
44
- for (const c of x) o[c] = t.get(c) === "true";
45
- b.value = t.get(E) || "char";
46
- } catch (n) {
47
- L.error(Y(n));
48
- } finally {
49
- D.value = !1;
50
- }
51
- });
52
- async function q() {
53
- k.value = !0;
54
- try {
55
- await W.saveBatch([
56
- ..._.map((n) => ({ configKey: n.key, configValue: String(a[n.key]) })),
57
- ...x.map((n) => ({ configKey: n, configValue: String(o[n]) })),
58
- { configKey: E, configValue: b.value }
59
- ]), L.success(y("config.saved"));
60
- } catch (n) {
61
- L.error(Y(n));
62
- } finally {
63
- k.value = !1;
64
- }
65
- }
66
- return (n, t) => {
67
- const c = z("auth");
68
- return S(), I(A, null, [
69
- s(e(Z), { show: D.value }, {
70
- default: i(() => [
71
- s(e(ee), {
72
- "label-placement": "top",
73
- style: { "max-width": "960px" }
74
- }, {
75
- default: i(() => [
76
- s(e(f), { "title-placement": "left" }, {
77
- default: i(() => [
78
- m(p(e(y)("config.security.loginLock.title")), 1)
79
- ]),
80
- _: 1
81
- }),
82
- s(e(v), {
83
- cols: "1 s:2",
84
- responsive: "screen",
85
- "x-gap": 32,
86
- "y-gap": 0
87
- }, {
88
- default: i(() => [
89
- s(e(u), {
90
- label: r("sys.security.loginLock.maxFailCount")
91
- }, {
92
- default: i(() => [
93
- s(e(d), {
94
- value: a["sys.security.loginLock.maxFailCount"],
95
- "onUpdate:value": t[0] || (t[0] = (l) => a["sys.security.loginLock.maxFailCount"] = l),
96
- min: 0,
97
- style: { width: "160px" }
98
- }, null, 8, ["value"])
99
- ]),
100
- _: 1
101
- }, 8, ["label"]),
102
- s(e(u), {
103
- label: r("sys.security.loginLock.lockMinutes")
104
- }, {
105
- default: i(() => [
106
- s(e(d), {
107
- value: a["sys.security.loginLock.lockMinutes"],
108
- "onUpdate:value": t[1] || (t[1] = (l) => a["sys.security.loginLock.lockMinutes"] = l),
109
- min: 1,
110
- style: { width: "160px" }
111
- }, null, 8, ["value"])
112
- ]),
113
- _: 1
114
- }, 8, ["label"])
115
- ]),
116
- _: 1
117
- }),
118
- s(e(f), { "title-placement": "left" }, {
119
- default: i(() => [
120
- m(p(e(y)("config.security.password.title")), 1)
121
- ]),
122
- _: 1
123
- }),
124
- s(e(v), {
125
- cols: "1 s:2",
126
- responsive: "screen",
127
- "x-gap": 32,
128
- "y-gap": 0
129
- }, {
130
- default: i(() => [
131
- s(e(u), {
132
- label: r("sys.security.password.minLength")
133
- }, {
134
- default: i(() => [
135
- s(e(d), {
136
- value: a["sys.security.password.minLength"],
137
- "onUpdate:value": t[2] || (t[2] = (l) => a["sys.security.password.minLength"] = l),
138
- min: 1,
139
- style: { width: "160px" }
140
- }, null, 8, ["value"])
141
- ]),
142
- _: 1
143
- }, 8, ["label"]),
144
- s(e(u), {
145
- label: r("sys.security.password.expireDays")
146
- }, {
147
- default: i(() => [
148
- s(e(d), {
149
- value: a["sys.security.password.expireDays"],
150
- "onUpdate:value": t[3] || (t[3] = (l) => a["sys.security.password.expireDays"] = l),
151
- min: 0,
152
- style: { width: "160px" }
153
- }, null, 8, ["value"])
154
- ]),
155
- _: 1
156
- }, 8, ["label"]),
157
- s(e(u), {
158
- label: r("sys.security.password.historyCount")
159
- }, {
160
- default: i(() => [
161
- s(e(d), {
162
- value: a["sys.security.password.historyCount"],
163
- "onUpdate:value": t[4] || (t[4] = (l) => a["sys.security.password.historyCount"] = l),
164
- min: 0,
165
- style: { width: "160px" }
166
- }, null, 8, ["value"])
167
- ]),
168
- _: 1
169
- }, 8, ["label"]),
170
- (S(), I(A, null, j(K, (l) => s(e(u), {
171
- key: l,
172
- label: r(l)
173
- }, {
174
- default: i(() => [
175
- s(e(g), {
176
- value: o[l],
177
- "onUpdate:value": (G) => o[l] = G
178
- }, null, 8, ["value", "onUpdate:value"])
179
- ]),
180
- _: 2
181
- }, 1032, ["label"])), 64))
182
- ]),
183
- _: 1
184
- }),
185
- s(e(f), { "title-placement": "left" }, {
186
- default: i(() => [
187
- m(p(e(y)("config.security.session.title")), 1)
188
- ]),
189
- _: 1
190
- }),
191
- s(e(v), {
192
- cols: "1 s:2",
193
- responsive: "screen",
194
- "x-gap": 32,
195
- "y-gap": 0
196
- }, {
197
- default: i(() => [
198
- s(e(u), {
199
- label: r("sys.security.session.accessMinutes")
200
- }, {
201
- default: i(() => [
202
- s(e(d), {
203
- value: a["sys.security.session.accessMinutes"],
204
- "onUpdate:value": t[5] || (t[5] = (l) => a["sys.security.session.accessMinutes"] = l),
205
- min: 1,
206
- style: { width: "160px" }
207
- }, null, 8, ["value"])
208
- ]),
209
- _: 1
210
- }, 8, ["label"]),
211
- s(e(u), {
212
- label: r("sys.security.session.refreshMinutes")
213
- }, {
214
- default: i(() => [
215
- s(e(d), {
216
- value: a["sys.security.session.refreshMinutes"],
217
- "onUpdate:value": t[6] || (t[6] = (l) => a["sys.security.session.refreshMinutes"] = l),
218
- min: 1,
219
- style: { width: "160px" }
220
- }, null, 8, ["value"])
221
- ]),
222
- _: 1
223
- }, 8, ["label"])
224
- ]),
225
- _: 1
226
- }),
227
- s(e(f), { "title-placement": "left" }, {
228
- default: i(() => [
229
- m(p(e(y)("config.security.captcha.title")), 1)
230
- ]),
231
- _: 1
232
- }),
233
- s(e(v), {
234
- cols: "1 s:2",
235
- responsive: "screen",
236
- "x-gap": 32,
237
- "y-gap": 0
238
- }, {
239
- default: i(() => [
240
- s(e(u), {
241
- label: r("sys.security.captcha.enabled")
242
- }, {
243
- default: i(() => [
244
- s(e(g), {
245
- value: o[C],
246
- "onUpdate:value": t[7] || (t[7] = (l) => o[C] = l)
247
- }, null, 8, ["value"])
248
- ]),
249
- _: 1
250
- }, 8, ["label"]),
251
- s(e(u), {
252
- label: e(y)("config.security.captcha.type")
253
- }, {
254
- default: i(() => [
255
- s(e(se), {
256
- value: b.value,
257
- "onUpdate:value": t[8] || (t[8] = (l) => b.value = l),
258
- options: V.value,
259
- style: { width: "220px" }
260
- }, null, 8, ["value", "options"])
261
- ]),
262
- _: 1
263
- }, 8, ["label"])
264
- ]),
265
- _: 1
266
- }),
267
- s(e(f), { "title-placement": "left" }, {
268
- default: i(() => [
269
- m(p(e(y)("config.security.totp.title")), 1)
270
- ]),
271
- _: 1
272
- }),
273
- s(e(v), {
274
- cols: "1 s:2",
275
- responsive: "screen",
276
- "x-gap": 32,
277
- "y-gap": 0
278
- }, {
279
- default: i(() => [
280
- s(e(u), {
281
- label: r("sys.security.totp.enabled")
282
- }, {
283
- default: i(() => [
284
- s(e(g), {
285
- value: o[w],
286
- "onUpdate:value": t[9] || (t[9] = (l) => o[w] = l)
287
- }, null, 8, ["value"])
288
- ]),
289
- _: 1
290
- }, 8, ["label"]),
291
- s(e(u), {
292
- label: r("sys.security.totp.requireForSuperAdmin")
293
- }, {
294
- default: i(() => [
295
- s(e(g), {
296
- value: o[M],
297
- "onUpdate:value": t[10] || (t[10] = (l) => o[M] = l),
298
- disabled: !o[w]
299
- }, null, 8, ["value", "disabled"])
300
- ]),
301
- _: 1
302
- }, 8, ["label"])
303
- ]),
304
- _: 1
305
- }),
306
- U("p", ue, p(e(y)("config.security.totp.hint")), 1),
307
- s(e(f), { "title-placement": "left" }, {
308
- default: i(() => [
309
- m(p(e(y)("config.security.sms.title")), 1)
310
- ]),
311
- _: 1
312
- }),
313
- s(e(v), {
314
- cols: "1 s:2",
315
- responsive: "screen",
316
- "x-gap": 32,
317
- "y-gap": 0
318
- }, {
319
- default: i(() => [
320
- s(e(u), {
321
- label: r("sys.security.mfa.enabled")
322
- }, {
323
- default: i(() => [
324
- s(e(g), {
325
- value: o[P],
326
- "onUpdate:value": t[11] || (t[11] = (l) => o[P] = l)
327
- }, null, 8, ["value"])
328
- ]),
329
- _: 1
330
- }, 8, ["label"]),
331
- s(e(u), {
332
- label: r("sys.security.smsLogin.enabled")
333
- }, {
334
- default: i(() => [
335
- s(e(g), {
336
- value: o[N],
337
- "onUpdate:value": t[12] || (t[12] = (l) => o[N] = l)
338
- }, null, 8, ["value"])
339
- ]),
340
- _: 1
341
- }, 8, ["label"])
342
- ]),
343
- _: 1
344
- }),
345
- U("p", oe, p(e(y)("config.security.sms.hint")), 1),
346
- s(e(f), { "title-placement": "left" }, {
347
- default: i(() => [
348
- m(p(e(y)("config.security.rateLimit.title")), 1)
349
- ]),
350
- _: 1
351
- }),
352
- s(e(v), {
353
- cols: "1 s:2",
354
- responsive: "screen",
355
- "x-gap": 32,
356
- "y-gap": 0
357
- }, {
358
- default: i(() => [
359
- s(e(u), {
360
- label: r("sys.security.rateLimit.enabled")
361
- }, {
362
- default: i(() => [
363
- s(e(g), {
364
- value: o[T],
365
- "onUpdate:value": t[13] || (t[13] = (l) => o[T] = l)
366
- }, null, 8, ["value"])
367
- ]),
368
- _: 1
369
- }, 8, ["label"]),
370
- s(e(u), {
371
- label: r("sys.security.rateLimit.windowSeconds")
372
- }, {
373
- default: i(() => [
374
- s(e(d), {
375
- value: a["sys.security.rateLimit.windowSeconds"],
376
- "onUpdate:value": t[14] || (t[14] = (l) => a["sys.security.rateLimit.windowSeconds"] = l),
377
- min: 1,
378
- style: { width: "160px" }
379
- }, null, 8, ["value"])
380
- ]),
381
- _: 1
382
- }, 8, ["label"]),
383
- s(e(u), {
384
- label: r("sys.security.rateLimit.permitPerWindow")
385
- }, {
386
- default: i(() => [
387
- s(e(d), {
388
- value: a["sys.security.rateLimit.permitPerWindow"],
389
- "onUpdate:value": t[15] || (t[15] = (l) => a["sys.security.rateLimit.permitPerWindow"] = l),
390
- min: 0,
391
- style: { width: "160px" }
392
- }, null, 8, ["value"])
393
- ]),
394
- _: 1
395
- }, 8, ["label"]),
396
- s(e(u), {
397
- label: r("sys.security.rateLimit.authPermitPerWindow")
398
- }, {
399
- default: i(() => [
400
- s(e(d), {
401
- value: a["sys.security.rateLimit.authPermitPerWindow"],
402
- "onUpdate:value": t[16] || (t[16] = (l) => a["sys.security.rateLimit.authPermitPerWindow"] = l),
403
- min: 0,
404
- style: { width: "160px" }
405
- }, null, 8, ["value"])
406
- ]),
407
- _: 1
408
- }, 8, ["label"])
409
- ]),
410
- _: 1
411
- }),
412
- s(e(f), { "title-placement": "left" }, {
413
- default: i(() => [
414
- m(p(e(y)("config.security.highSens.title")), 1)
415
- ]),
416
- _: 1
417
- }),
418
- s(ae),
419
- U("div", re, [
420
- J((S(), Q(e(te), {
421
- type: "primary",
422
- loading: k.value,
423
- onClick: q
424
- }, {
425
- icon: i(() => [
426
- s(ie, {
427
- icon: "ph:floppy-disk",
428
- size: 16
429
- })
430
- ]),
431
- default: i(() => [
432
- m(" " + p(e(y)("common.save")), 1)
433
- ]),
434
- _: 1
435
- }, 8, ["loading"])), [
436
- [c, "PUT:/api/v1/sys/config/batch"]
437
- ])
438
- ])
439
- ]),
440
- _: 1
441
- })
442
- ]),
443
- _: 1
444
- }, 8, ["show"]),
445
- s(ne, {
446
- group: "security",
447
- claimed: O
448
- })
449
- ], 64);
450
- };
451
- }
452
- });
453
- export {
454
- we as default
455
- };
456
- //# sourceMappingURL=SecurityConfig2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SecurityConfig2.vue.js","sources":["../../../../../src/views/system/config/components/SecurityConfig.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 安全策略 = 结构化表单范式(同 SysBaseConfig):字段绑定固定 config key(GroupCode='security')。\n// 后端经 ISecurityPolicyProvider 读这些键强制执行(登录锁定/密码复杂度/会话令牌时长),改值即时生效、无需重发。\nimport { computed, onMounted, reactive, ref } from 'vue'\nimport {\n NForm,\n NFormItemGi,\n NGrid,\n NInputNumber,\n NSwitch,\n NSelect,\n NDivider,\n NButton,\n NSpin,\n useMessage,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { configApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport HighSensConfig from './HighSensConfig.vue'\nimport GroupExtraConfig from './GroupExtraConfig.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\n\n// 数值项(min 兜底:锁死阈值不为负、时长至少 1 分钟,避免存 0 导致永不过期/永久锁定)\nconst NUM_FIELDS = [\n { key: 'sys.security.loginLock.maxFailCount', min: 0 },\n { key: 'sys.security.loginLock.lockMinutes', min: 1 },\n { key: 'sys.security.password.minLength', min: 1 },\n { key: 'sys.security.password.expireDays', min: 0 }, // 0 = 永不过期(合法值,不同于其余 min:1 项)\n { key: 'sys.security.password.historyCount', min: 0 }, // 0 = 关闭防重用\n\n { key: 'sys.security.session.accessMinutes', min: 1 },\n { key: 'sys.security.session.refreshMinutes', min: 1 },\n { key: 'sys.security.rateLimit.windowSeconds', min: 1 },\n { key: 'sys.security.rateLimit.permitPerWindow', min: 0 },\n { key: 'sys.security.rateLimit.authPermitPerWindow', min: 0 },\n] as const\n\nconst BOOL_FIELDS = [\n 'sys.security.password.requireUpper',\n 'sys.security.password.requireLower',\n 'sys.security.password.requireDigit',\n 'sys.security.password.requireSpecial',\n] as const\n\n// 验证码开关单独成节(与密码开关分区展示,故不并入 BOOL_FIELDS 的密码循环)\nconst CAPTCHA_KEY = 'sys.security.captcha.enabled'\n// 验证码类型(字符串枚举:char 字符 / path 描边更抗爬 / math 算术)\nconst CAPTCHA_TYPE_KEY = 'sys.security.captcha.type'\n// TOTP 动态口令(与验证码同款运行时总闸;用户 ForceTotp 仅在此开启后生效)\nconst TOTP_KEY = 'sys.security.totp.enabled'\nconst TOTP_SUPER_KEY = 'sys.security.totp.requireForSuperAdmin'\n// 短信验证两开关(登录加固):二次验证(密码后再验短信码)/ 免密登录(手机号+码)。\n// 发送经 ISmsSender,内核默认只写日志——生产须由消费方注册真实短信通道。\nconst SMS_MFA_KEY = 'sys.security.mfa.enabled'\nconst SMS_LOGIN_KEY = 'sys.security.smsLogin.enabled'\n// 限流开关(单独成节;阈值走 NUM_FIELDS)\nconst RATELIMIT_KEY = 'sys.security.rateLimit.enabled'\n// 分节单独渲染的开关,载入/保存与 BOOL_FIELDS 同一套布尔处理\nconst SECTION_SWITCHES = [\n CAPTCHA_KEY,\n TOTP_KEY,\n TOTP_SUPER_KEY,\n SMS_MFA_KEY,\n SMS_LOGIN_KEY,\n RATELIMIT_KEY,\n] as const\nconst SWITCH_KEYS = [...BOOL_FIELDS, ...SECTION_SWITCHES]\n// 本 Tab 绑定的全部键:保存按它们回写,「本组其它配置」按它们排除\nconst CLAIMED_KEYS = [...NUM_FIELDS.map(f => f.key), ...SWITCH_KEYS, CAPTCHA_TYPE_KEY]\n\nconst nums = reactive<Record<string, number>>({})\nconst bools = reactive<Record<string, boolean>>({})\nconst captchaType = ref('char')\nconst captchaTypeOptions = computed(() =>\n ['char', 'path', 'math'].map(v => ({ label: t('config.security.captcha.types.' + v), value: v })),\n)\nconst loading = ref(true)\nconst saving = ref(false)\n\n// 'sys.security.loginLock.maxFailCount' → t('config.security.loginLock.maxFailCount')\nconst label = (key: string) => t('config.security.' + key.replace('sys.security.', ''))\n\nonMounted(async () => {\n try {\n const rows = await configApi.listByGroup('security')\n const map = new Map(rows.map(r => [r.configKey, r.configValue ?? '']))\n for (const f of NUM_FIELDS) nums[f.key] = Number(map.get(f.key)) || f.min\n for (const k of SWITCH_KEYS) bools[k] = map.get(k) === 'true'\n captchaType.value = map.get(CAPTCHA_TYPE_KEY) || 'char'\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n})\n\nasync function save() {\n saving.value = true\n try {\n // 配置值统一以字符串落库;数值/布尔序列化为字符串\n await configApi.saveBatch([\n ...NUM_FIELDS.map(f => ({ configKey: f.key, configValue: String(nums[f.key]) })),\n ...SWITCH_KEYS.map(k => ({ configKey: k, configValue: String(bools[k]) })),\n { configKey: CAPTCHA_TYPE_KEY, configValue: captchaType.value },\n ])\n message.success(t('config.saved'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-spin :show=\"loading\">\n <n-form label-placement=\"top\" style=\"max-width: 960px\">\n <n-divider title-placement=\"left\">{{ t('config.security.loginLock.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.loginLock.maxFailCount')\">\n <n-input-number\n v-model:value=\"nums['sys.security.loginLock.maxFailCount']\"\n :min=\"0\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.loginLock.lockMinutes')\">\n <n-input-number\n v-model:value=\"nums['sys.security.loginLock.lockMinutes']\"\n :min=\"1\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n </n-grid>\n\n <n-divider title-placement=\"left\">{{ t('config.security.password.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.password.minLength')\">\n <n-input-number\n v-model:value=\"nums['sys.security.password.minLength']\"\n :min=\"1\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.password.expireDays')\">\n <n-input-number\n v-model:value=\"nums['sys.security.password.expireDays']\"\n :min=\"0\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.password.historyCount')\">\n <n-input-number\n v-model:value=\"nums['sys.security.password.historyCount']\"\n :min=\"0\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi v-for=\"k in BOOL_FIELDS\" :key=\"k\" :label=\"label(k)\">\n <n-switch v-model:value=\"bools[k]\" />\n </n-form-item-gi>\n </n-grid>\n\n <n-divider title-placement=\"left\">{{ t('config.security.session.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.session.accessMinutes')\">\n <n-input-number\n v-model:value=\"nums['sys.security.session.accessMinutes']\"\n :min=\"1\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.session.refreshMinutes')\">\n <n-input-number\n v-model:value=\"nums['sys.security.session.refreshMinutes']\"\n :min=\"1\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n </n-grid>\n\n <n-divider title-placement=\"left\">{{ t('config.security.captcha.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.captcha.enabled')\">\n <n-switch v-model:value=\"bools[CAPTCHA_KEY]\" />\n </n-form-item-gi>\n <n-form-item-gi :label=\"t('config.security.captcha.type')\">\n <n-select\n v-model:value=\"captchaType\"\n :options=\"captchaTypeOptions\"\n style=\"width: 220px\"\n />\n </n-form-item-gi>\n </n-grid>\n\n <n-divider title-placement=\"left\">{{ t('config.security.totp.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.totp.enabled')\">\n <n-switch v-model:value=\"bools[TOTP_KEY]\" />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.totp.requireForSuperAdmin')\">\n <n-switch v-model:value=\"bools[TOTP_SUPER_KEY]\" :disabled=\"!bools[TOTP_KEY]\" />\n </n-form-item-gi>\n </n-grid>\n <p class=\"sms-hint\">{{ t('config.security.totp.hint') }}</p>\n\n <n-divider title-placement=\"left\">{{ t('config.security.sms.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.mfa.enabled')\">\n <n-switch v-model:value=\"bools[SMS_MFA_KEY]\" />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.smsLogin.enabled')\">\n <n-switch v-model:value=\"bools[SMS_LOGIN_KEY]\" />\n </n-form-item-gi>\n </n-grid>\n <!-- 短信通道提示:内核默认 LoggingSmsSender 只写日志,生产须注册真实 ISmsSender -->\n <p class=\"sms-hint\">{{ t('config.security.sms.hint') }}</p>\n\n <n-divider title-placement=\"left\">{{ t('config.security.rateLimit.title') }}</n-divider>\n <n-grid :cols=\"'1 s:2'\" responsive=\"screen\" :x-gap=\"32\" :y-gap=\"0\">\n <n-form-item-gi :label=\"label('sys.security.rateLimit.enabled')\">\n <n-switch v-model:value=\"bools[RATELIMIT_KEY]\" />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.rateLimit.windowSeconds')\">\n <n-input-number\n v-model:value=\"nums['sys.security.rateLimit.windowSeconds']\"\n :min=\"1\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.rateLimit.permitPerWindow')\">\n <n-input-number\n v-model:value=\"nums['sys.security.rateLimit.permitPerWindow']\"\n :min=\"0\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n <n-form-item-gi :label=\"label('sys.security.rateLimit.authPermitPerWindow')\">\n <n-input-number\n v-model:value=\"nums['sys.security.rateLimit.authPermitPerWindow']\"\n :min=\"0\"\n style=\"width: 160px\"\n />\n </n-form-item-gi>\n </n-grid>\n\n <n-divider title-placement=\"left\">{{ t('config.security.highSens.title') }}</n-divider>\n <HighSensConfig />\n\n <div style=\"margin-top: 16px\">\n <n-button\n v-auth=\"'PUT:/api/v1/sys/config/batch'\"\n type=\"primary\"\n :loading=\"saving\"\n @click=\"save\"\n >\n <template #icon><AppIcon icon=\"ph:floppy-disk\" :size=\"16\" /></template>\n {{ t('common.save') }}\n </n-button>\n </div>\n </n-form>\n </n-spin>\n <GroupExtraConfig group=\"security\" :claimed=\"CLAIMED_KEYS\" />\n</template>\n\n<style scoped>\n/* 短信节的通道提示:弱化色说明行,置于开关与下一分组之间 */\n.sms-hint {\n margin: -6px 0 12px;\n font-size: 12px;\n color: var(--color-text-tertiary);\n}\n</style>\n"],"names":["CAPTCHA_KEY","CAPTCHA_TYPE_KEY","TOTP_KEY","TOTP_SUPER_KEY","SMS_MFA_KEY","SMS_LOGIN_KEY","RATELIMIT_KEY","t","useI18n","message","useMessage","NUM_FIELDS","BOOL_FIELDS","SECTION_SWITCHES","SWITCH_KEYS","CLAIMED_KEYS","f","nums","reactive","bools","captchaType","ref","captchaTypeOptions","computed","v","loading","saving","label","key","onMounted","rows","configApi","map","r","k","e","translateError","save","_createVNode","_unref","NSpin","NForm","NDivider","NGrid","NFormItemGi","NInputNumber","$event","_createElementBlock","_Fragment","_renderList","NSwitch","_cache","NSelect","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","HighSensConfig","_hoisted_3","_createBlock","NButton","AppIcon","_createTextVNode","GroupExtraConfig"],"mappings":";;;;;;;;wGAiDMA,IAAc,gCAEdC,IAAmB,6BAEnBC,IAAW,6BACXC,IAAiB,0CAGjBC,IAAc,4BACdC,IAAgB,iCAEhBC,IAAgB;;;AArCtB,UAAM,EAAE,GAAAC,EAAA,IAAMC,GAAA,GACRC,IAAUC,EAAA,GAGVC,IAAa;AAAA,MACjB,EAAE,KAAK,uCAAuC,KAAK,EAAA;AAAA,MACnD,EAAE,KAAK,sCAAsC,KAAK,EAAA;AAAA,MAClD,EAAE,KAAK,mCAAmC,KAAK,EAAA;AAAA,MAC/C,EAAE,KAAK,oCAAoC,KAAK,EAAA;AAAA;AAAA,MAChD,EAAE,KAAK,sCAAsC,KAAK,EAAA;AAAA;AAAA,MAElD,EAAE,KAAK,sCAAsC,KAAK,EAAA;AAAA,MAClD,EAAE,KAAK,uCAAuC,KAAK,EAAA;AAAA,MACnD,EAAE,KAAK,wCAAwC,KAAK,EAAA;AAAA,MACpD,EAAE,KAAK,0CAA0C,KAAK,EAAA;AAAA,MACtD,EAAE,KAAK,8CAA8C,KAAK,EAAA;AAAA,IAAE,GAGxDC,IAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAiBIC,IAAmB;AAAA,MACvBb;AAAA,MACAE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA,GAEIQ,IAAc,CAAC,GAAGF,GAAa,GAAGC,CAAgB,GAElDE,IAAe,CAAC,GAAGJ,EAAW,IAAI,CAAAK,MAAKA,EAAE,GAAG,GAAG,GAAGF,GAAab,CAAgB,GAE/EgB,IAAOC,EAAiC,EAAE,GAC1CC,IAAQD,EAAkC,EAAE,GAC5CE,IAAcC,EAAI,MAAM,GACxBC,IAAqBC;AAAA,MAAS,MAClC,CAAC,QAAQ,QAAQ,MAAM,EAAE,IAAI,CAAAC,OAAM,EAAE,OAAOjB,EAAE,mCAAmCiB,CAAC,GAAG,OAAOA,IAAI;AAAA,IAAA,GAE5FC,IAAUJ,EAAI,EAAI,GAClBK,IAASL,EAAI,EAAK,GAGlBM,IAAQ,CAACC,MAAgBrB,EAAE,qBAAqBqB,EAAI,QAAQ,iBAAiB,EAAE,CAAC;AAEtF,IAAAC,EAAU,YAAY;AACpB,UAAI;AACF,cAAMC,IAAO,MAAMC,EAAU,YAAY,UAAU,GAC7CC,IAAM,IAAI,IAAIF,EAAK,IAAI,CAAAG,MAAK,CAACA,EAAE,WAAWA,EAAE,eAAe,EAAE,CAAC,CAAC;AACrE,mBAAWjB,KAAKL,EAAY,CAAAM,EAAKD,EAAE,GAAG,IAAI,OAAOgB,EAAI,IAAIhB,EAAE,GAAG,CAAC,KAAKA,EAAE;AACtE,mBAAWkB,KAAKpB,EAAa,CAAAK,EAAMe,CAAC,IAAIF,EAAI,IAAIE,CAAC,MAAM;AACvD,QAAAd,EAAY,QAAQY,EAAI,IAAI/B,CAAgB,KAAK;AAAA,MACnD,SAASkC,GAAG;AACV,QAAA1B,EAAQ,MAAM2B,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAV,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAED,mBAAeY,IAAO;AACpB,MAAAX,EAAO,QAAQ;AACf,UAAI;AAEF,cAAMK,EAAU,UAAU;AAAA,UACxB,GAAGpB,EAAW,IAAI,CAAAK,OAAM,EAAE,WAAWA,EAAE,KAAK,aAAa,OAAOC,EAAKD,EAAE,GAAG,CAAC,IAAI;AAAA,UAC/E,GAAGF,EAAY,IAAI,CAAAoB,OAAM,EAAE,WAAWA,GAAG,aAAa,OAAOf,EAAMe,CAAC,CAAC,IAAI;AAAA,UACzE,EAAE,WAAWjC,GAAkB,aAAamB,EAAY,MAAA;AAAA,QAAM,CAC/D,GACDX,EAAQ,QAAQF,EAAE,cAAc,CAAC;AAAA,MACnC,SAAS4B,GAAG;AACV,QAAA1B,EAAQ,MAAM2B,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAT,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;;;;QAIEY,EAkJSC,EAAAC,CAAA,GAAA,EAlJA,MAAMf,EAAA,SAAO;AAAA,qBACpB,MAgJS;AAAA,YAhJTa,EAgJSC,EAAAE,EAAA,GAAA;AAAA,cAhJD,mBAAgB;AAAA,cAAM,OAAA,EAAA,aAAA,QAAA;AAAA,YAAA;yBAC5B,MAAwF;AAAA,gBAAxFH,EAAwFC,EAAAG,CAAA,GAAA,EAA7E,mBAAgB,UAAM;AAAA,6BAAC,MAA0C;AAAA,wBAAvCH,EAAAhC,CAAA,EAAC,iCAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAeSC,EAAAI,CAAA,GAAA;AAAA,kBAfA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAMiB;AAAA,oBANjBL,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,qCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,qCAAA;AAAA,mEAAJA,EAAI,qCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;oBAGJR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,oCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,oCAAA;AAAA,mEAAJA,EAAI,oCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;;;;gBAKNR,EAAuFC,EAAAG,CAAA,GAAA,EAA5E,mBAAgB,UAAM;AAAA,6BAAC,MAAyC;AAAA,wBAAtCH,EAAAhC,CAAA,EAAC,gCAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAyBSC,EAAAI,CAAA,GAAA;AAAA,kBAzBA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAMiB;AAAA,oBANjBL,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,iCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,iCAAA;AAAA,mEAAJA,EAAI,iCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;oBAGJR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,kCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,kCAAA;AAAA,mEAAJA,EAAI,kCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;oBAGJR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,oCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,oCAAA;AAAA,mEAAJA,EAAI,oCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;0BAGJC,EAEiBC,GAAA,MAAAC,EAFWrC,GAAW,CAAhBsB,MAAvBI,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFyB,KAAKV;AAAA,sBAAI,OAAOP,EAAMO,CAAC;AAAA,oBAAA;iCAC/D,MAAqC;AAAA,wBAArCI,EAAqCC,EAAAW,CAAA,GAAA;AAAA,0BAAnB,OAAO/B,EAAMe,CAAC;AAAA,0BAAP,kBAAA,CAAAY,MAAA3B,EAAMe,CAAC,IAAAY;AAAA,wBAAA;;;;;;;gBAIpCR,EAAsFC,EAAAG,CAAA,GAAA,EAA3E,mBAAgB,UAAM;AAAA,6BAAC,MAAwC;AAAA,wBAArCH,EAAAhC,CAAA,EAAC,+BAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAeSC,EAAAI,CAAA,GAAA;AAAA,kBAfA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAMiB;AAAA,oBANjBL,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,oCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,oCAAA;AAAA,mEAAJA,EAAI,oCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;oBAGJR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,qCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,qCAAA;AAAA,mEAAJA,EAAI,qCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;;;;gBAKNR,EAAsFC,EAAAG,CAAA,GAAA,EAA3E,mBAAgB,UAAM;AAAA,6BAAC,MAAwC;AAAA,wBAArCH,EAAAhC,CAAA,EAAC,+BAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAWSC,EAAAI,CAAA,GAAA;AAAA,kBAXA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAEiB;AAAA,oBAFjBL,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFA,OAAOjB,EAAK,8BAAA;AAAA,oBAAA;iCAC3B,MAA+C;AAAA,wBAA/CW,EAA+CC,EAAAW,CAAA,GAAA;AAAA,0BAA7B,OAAO/B,EAAMnB,CAAW;AAAA,0BAAjB,kBAAAmD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAL,MAAA3B,EAAMnB,CAAW,IAAA8C;AAAA,wBAAA;;;;oBAE5CR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOL,EAAAhC,CAAA,EAAC,8BAAA;AAAA,oBAAA;iCACvB,MAIE;AAAA,wBAJF+B,EAIEC,EAAAa,EAAA,GAAA;AAAA,0BAHQ,OAAOhC,EAAA;AAAA,mEAAAA,EAAW,QAAA0B;AAAA,0BACzB,SAASxB,EAAA;AAAA,0BACV,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;;;;gBAKNgB,EAAmFC,EAAAG,CAAA,GAAA,EAAxE,mBAAgB,UAAM;AAAA,6BAAC,MAAqC;AAAA,wBAAlCH,EAAAhC,CAAA,EAAC,4BAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAOSC,EAAAI,CAAA,GAAA;AAAA,kBAPA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAEiB;AAAA,oBAFjBL,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFA,OAAOjB,EAAK,2BAAA;AAAA,oBAAA;iCAC3B,MAA4C;AAAA,wBAA5CW,EAA4CC,EAAAW,CAAA,GAAA;AAAA,0BAA1B,OAAO/B,EAAMjB,CAAQ;AAAA,0BAAd,kBAAAiD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAL,MAAA3B,EAAMjB,CAAQ,IAAA4C;AAAA,wBAAA;;;;oBAEzCR,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFA,OAAOjB,EAAK,wCAAA;AAAA,oBAAA;iCAC3B,MAA+E;AAAA,wBAA/EW,EAA+EC,EAAAW,CAAA,GAAA;AAAA,0BAA7D,OAAO/B,EAAMhB,CAAc;AAAA,0BAApB,kBAAAgD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAL,MAAA3B,EAAMhB,CAAc,IAAA2C;AAAA,0BAAI,UAAQ,CAAG3B,EAAMjB,CAAQ;AAAA,wBAAA;;;;;;;gBAG9EmD,EAA4D,KAA5DC,IAA4DC,EAArChB,EAAAhC,CAAA,EAAC,2BAAA,CAAA,GAAA,CAAA;AAAA,gBAExB+B,EAAkFC,EAAAG,CAAA,GAAA,EAAvE,mBAAgB,UAAM;AAAA,6BAAC,MAAoC;AAAA,wBAAjCH,EAAAhC,CAAA,EAAC,2BAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAOSC,EAAAI,CAAA,GAAA;AAAA,kBAPA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAEiB;AAAA,oBAFjBL,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFA,OAAOjB,EAAK,0BAAA;AAAA,oBAAA;iCAC3B,MAA+C;AAAA,wBAA/CW,EAA+CC,EAAAW,CAAA,GAAA;AAAA,0BAA7B,OAAO/B,EAAMf,CAAW;AAAA,0BAAjB,kBAAA+C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAL,MAAA3B,EAAMf,CAAW,IAAA0C;AAAA,wBAAA;;;;oBAE5CR,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFA,OAAOjB,EAAK,+BAAA;AAAA,oBAAA;iCAC3B,MAAiD;AAAA,wBAAjDW,EAAiDC,EAAAW,CAAA,GAAA;AAAA,0BAA/B,OAAO/B,EAAMd,CAAa;AAAA,0BAAnB,kBAAA8C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAL,MAAA3B,EAAMd,CAAa,IAAAyC;AAAA,wBAAA;;;;;;;gBAIhDO,EAA2D,KAA3DG,IAA2DD,EAApChB,EAAAhC,CAAA,EAAC,0BAAA,CAAA,GAAA,CAAA;AAAA,gBAExB+B,EAAwFC,EAAAG,CAAA,GAAA,EAA7E,mBAAgB,UAAM;AAAA,6BAAC,MAA0C;AAAA,wBAAvCH,EAAAhC,CAAA,EAAC,iCAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAyBSC,EAAAI,CAAA,GAAA;AAAA,kBAzBA,MAAM;AAAA,kBAAS,YAAW;AAAA,kBAAU,SAAO;AAAA,kBAAK,SAAO;AAAA,gBAAA;6BAC9D,MAEiB;AAAA,oBAFjBL,EAEiBC,EAAAK,CAAA,GAAA;AAAA,sBAFA,OAAOjB,EAAK,gCAAA;AAAA,oBAAA;iCAC3B,MAAiD;AAAA,wBAAjDW,EAAiDC,EAAAW,CAAA,GAAA;AAAA,0BAA/B,OAAO/B,EAAMb,CAAa;AAAA,0BAAnB,kBAAA6C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAL,MAAA3B,EAAMb,CAAa,IAAAwC;AAAA,wBAAA;;;;oBAE9CR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,sCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,sCAAA;AAAA,qEAAJA,EAAI,sCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;oBAGJR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,wCAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,wCAAA;AAAA,qEAAJA,EAAI,wCAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;oBAGJR,EAMiBC,EAAAK,CAAA,GAAA;AAAA,sBANA,OAAOjB,EAAK,4CAAA;AAAA,oBAAA;iCAC3B,MAIE;AAAA,wBAJFW,EAIEC,EAAAM,CAAA,GAAA;AAAA,0BAHQ,OAAO5B,EAAI,4CAAA;AAAA,qEAAJA,EAAI,4CAAA,IAAA6B;AAAA,0BAClB,KAAK;AAAA,0BACN,OAAA,EAAA,OAAA,QAAA;AAAA,wBAAA;;;;;;;gBAKNR,EAAuFC,EAAAG,CAAA,GAAA,EAA5E,mBAAgB,UAAM;AAAA,6BAAC,MAAyC;AAAA,wBAAtCH,EAAAhC,CAAA,EAAC,gCAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACtC+B,EAAkBmB,EAAA;AAAA,gBAElBJ,EAUM,OAVNK,IAUM;AAAA,0BATJC,EAQWpB,EAAAqB,EAAA,GAAA;AAAA,oBANT,MAAK;AAAA,oBACJ,SAASlC,EAAA;AAAA,oBACT,SAAOW;AAAA,kBAAA;oBAEG,QAAK,MAA4C;AAAA,sBAA5CC,EAA4CuB,IAAA;AAAA,wBAAnC,MAAK;AAAA,wBAAkB,MAAM;AAAA,sBAAA;;+BAAiB,MACvE;AAAA,sBADuEC,EAAA,QACpEvB,EAAAhC,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;wBANI,8BAA8B;AAAA,kBAAA;;;;;;;;QAW9C+B,EAA6DyB,IAAA;AAAA,UAA3C,OAAM;AAAA,UAAY,SAAShD;AAAA,QAAA;;;;;"}
@@ -1,5 +0,0 @@
1
- import f from "./SysBaseConfig2.vue.js";
2
- export {
3
- f as default
4
- };
5
- //# sourceMappingURL=SysBaseConfig.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SysBaseConfig.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,107 +0,0 @@
1
- import { defineComponent as x, reactive as B, ref as m, onMounted as N, resolveDirective as C, openBlock as y, createElementBlock as g, Fragment as d, createVNode as l, unref as t, withCtx as s, renderList as E, withDirectives as D, createBlock as I, createTextVNode as U, toDisplayString as F } from "vue";
2
- import { useMessage as V, NSpin as K, NForm as L, NFormItem as b, NInput as M, NButton as T } from "naive-ui";
3
- import { useI18n as A } from "vue-i18n";
4
- import G from "../../../../components/AppIcon.vue.js";
5
- import { configApi as h } from "../../../../api/index.js";
6
- import { useSite as z } from "../../../../composables/useSite.js";
7
- import { translateError as v } from "../../../../utils/error.js";
8
- import P from "./GroupExtraConfig.vue.js";
9
- const W = /* @__PURE__ */ x({
10
- __name: "SysBaseConfig",
11
- setup(Y) {
12
- const { t: a } = A(), u = V(), { loadSite: k } = z(), i = [
13
- { key: "sys.site.title", label: () => a("config.base.siteTitle") },
14
- { key: "sys.site.logo", label: () => a("config.base.logo") },
15
- { key: "sys.site.subtitle", label: () => a("config.base.siteSubtitle") },
16
- { key: "sys.site.copyright", label: () => a("config.base.copyright") },
17
- { key: "sys.site.copyrightUrl", label: () => a("config.base.copyrightUrl") }
18
- ], _ = i.map((e) => e.key), r = B({}), p = m(!0), f = m(!1);
19
- N(async () => {
20
- var e;
21
- try {
22
- const n = await h.listByGroup("sys");
23
- for (const c of i) r[c.key] = ((e = n.find((o) => o.configKey === c.key)) == null ? void 0 : e.configValue) ?? "";
24
- } catch (n) {
25
- u.error(v(n));
26
- } finally {
27
- p.value = !1;
28
- }
29
- });
30
- async function w() {
31
- f.value = !0;
32
- try {
33
- await h.saveBatch(i.map((e) => ({ configKey: e.key, configValue: r[e.key] }))), u.success(a("config.saved")), await k(!0);
34
- } catch (e) {
35
- u.error(v(e));
36
- } finally {
37
- f.value = !1;
38
- }
39
- }
40
- return (e, n) => {
41
- const c = C("auth");
42
- return y(), g(d, null, [
43
- l(t(K), { show: p.value }, {
44
- default: s(() => [
45
- l(t(L), {
46
- "label-placement": "left",
47
- "label-width": 90,
48
- style: { "max-width": "560px" }
49
- }, {
50
- default: s(() => [
51
- (y(), g(d, null, E(i, (o) => l(t(b), {
52
- key: o.key,
53
- label: o.label()
54
- }, {
55
- default: s(() => [
56
- l(t(M), {
57
- value: r[o.key],
58
- "onUpdate:value": (S) => r[o.key] = S,
59
- placeholder: o.label()
60
- }, null, 8, ["value", "onUpdate:value", "placeholder"])
61
- ]),
62
- _: 2
63
- }, 1032, ["label"])), 64)),
64
- l(t(b), {
65
- label: " ",
66
- "show-feedback": !1
67
- }, {
68
- default: s(() => [
69
- D((y(), I(t(T), {
70
- type: "primary",
71
- loading: f.value,
72
- onClick: w
73
- }, {
74
- icon: s(() => [
75
- l(G, {
76
- icon: "ph:floppy-disk",
77
- size: 16
78
- })
79
- ]),
80
- default: s(() => [
81
- U(" " + F(t(a)("common.save")), 1)
82
- ]),
83
- _: 1
84
- }, 8, ["loading"])), [
85
- [c, "PUT:/api/v1/sys/config/batch"]
86
- ])
87
- ]),
88
- _: 1
89
- })
90
- ]),
91
- _: 1
92
- })
93
- ]),
94
- _: 1
95
- }, 8, ["show"]),
96
- l(P, {
97
- group: "sys",
98
- claimed: t(_)
99
- }, null, 8, ["claimed"])
100
- ], 64);
101
- };
102
- }
103
- });
104
- export {
105
- W as default
106
- };
107
- //# sourceMappingURL=SysBaseConfig2.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SysBaseConfig2.vue.js","sources":["../../../../../src/views/system/config/components/SysBaseConfig.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 系统基础配置 = 分类配置中心「结构化表单」范式:字段绑定固定 config key,运维不需知道 key。\n// 载入走 configApi.listByGroup('sys') 回填,保存走 configApi.saveBatch(仅回写值)。后续加参数=加一个 FIELDS 项 + 一个 n-form-item。\nimport { onMounted, reactive, ref } from 'vue'\nimport { NForm, NFormItem, NInput, NButton, NSpin, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { configApi } from '#/api'\nimport { useSite } from '#/composables/useSite'\nimport { translateError } from '#/utils/error'\nimport GroupExtraConfig from './GroupExtraConfig.vue'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { loadSite } = useSite()\n\n// 结构化字段:key 绑定后端配置键(GroupCode='sys'),label 走 i18n。全部经匿名 siteInfo 下发,\n// 真实消费点在登录页/侧栏/顶栏/页脚(见 useSite)。加参数 = 加一个 FIELDS 项 + 一条 config.base i18n。\nconst FIELDS = [\n { key: 'sys.site.title', label: () => t('config.base.siteTitle') },\n { key: 'sys.site.logo', label: () => t('config.base.logo') },\n { key: 'sys.site.subtitle', label: () => t('config.base.siteSubtitle') },\n { key: 'sys.site.copyright', label: () => t('config.base.copyright') },\n { key: 'sys.site.copyrightUrl', label: () => t('config.base.copyrightUrl') },\n] as const\nconst CLAIMED_KEYS = FIELDS.map(f => f.key)\n\nconst values = reactive<Record<string, string>>({})\nconst loading = ref(true)\nconst saving = ref(false)\n\nonMounted(async () => {\n try {\n const rows = await configApi.listByGroup('sys')\n for (const f of FIELDS) values[f.key] = rows.find(r => r.configKey === f.key)?.configValue ?? ''\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n})\n\nasync function save() {\n saving.value = true\n try {\n await configApi.saveBatch(FIELDS.map(f => ({ configKey: f.key, configValue: values[f.key] })))\n message.success(t('config.saved'))\n // 即时生效:重取全站共用的站点信息,侧栏/顶栏/登录页品牌与浏览器标题(usePageTitle 跟着 site.title)随之更新。\n await loadSite(true)\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <n-spin :show=\"loading\">\n <n-form label-placement=\"left\" :label-width=\"90\" style=\"max-width: 560px\">\n <n-form-item v-for=\"f in FIELDS\" :key=\"f.key\" :label=\"f.label()\">\n <n-input v-model:value=\"values[f.key]\" :placeholder=\"f.label()\" />\n </n-form-item>\n <n-form-item :label=\"' '\" :show-feedback=\"false\">\n <n-button\n v-auth=\"'PUT:/api/v1/sys/config/batch'\"\n type=\"primary\"\n :loading=\"saving\"\n @click=\"save\"\n >\n <template #icon><AppIcon icon=\"ph:floppy-disk\" :size=\"16\" /></template>\n {{ t('common.save') }}\n </n-button>\n </n-form-item>\n </n-form>\n </n-spin>\n <GroupExtraConfig group=\"sys\" :claimed=\"CLAIMED_KEYS\" />\n</template>\n"],"names":["t","useI18n","message","useMessage","loadSite","useSite","FIELDS","CLAIMED_KEYS","f","values","reactive","loading","ref","saving","onMounted","rows","configApi","_a","r","e","translateError","save","_createVNode","_unref","NSpin","NForm","_createElementBlock","_Fragment","_renderList","NFormItem","NInput","$event","_createBlock","NButton","AppIcon","_createTextVNode","GroupExtraConfig"],"mappings":";;;;;;;;;;;AAYA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAA,GACV,EAAE,UAAAC,EAAA,IAAaC,EAAA,GAIfC,IAAS;AAAA,MACb,EAAE,KAAK,kBAAkB,OAAO,MAAMN,EAAE,uBAAuB,EAAA;AAAA,MAC/D,EAAE,KAAK,iBAAiB,OAAO,MAAMA,EAAE,kBAAkB,EAAA;AAAA,MACzD,EAAE,KAAK,qBAAqB,OAAO,MAAMA,EAAE,0BAA0B,EAAA;AAAA,MACrE,EAAE,KAAK,sBAAsB,OAAO,MAAMA,EAAE,uBAAuB,EAAA;AAAA,MACnE,EAAE,KAAK,yBAAyB,OAAO,MAAMA,EAAE,0BAA0B,EAAA;AAAA,IAAE,GAEvEO,IAAeD,EAAO,IAAI,CAAAE,MAAKA,EAAE,GAAG,GAEpCC,IAASC,EAAiC,EAAE,GAC5CC,IAAUC,EAAI,EAAI,GAClBC,IAASD,EAAI,EAAK;AAExB,IAAAE,EAAU,YAAY;;AACpB,UAAI;AACF,cAAMC,IAAO,MAAMC,EAAU,YAAY,KAAK;AAC9C,mBAAWR,KAAKF,EAAQ,CAAAG,EAAOD,EAAE,GAAG,MAAIS,IAAAF,EAAK,KAAK,CAAAG,MAAKA,EAAE,cAAcV,EAAE,GAAG,MAApC,gBAAAS,EAAuC,gBAAe;AAAA,MAChG,SAASE,GAAG;AACV,QAAAjB,EAAQ,MAAMkB,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAR,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAED,mBAAeU,IAAO;AACpB,MAAAR,EAAO,QAAQ;AACf,UAAI;AACF,cAAMG,EAAU,UAAUV,EAAO,IAAI,QAAM,EAAE,WAAWE,EAAE,KAAK,aAAaC,EAAOD,EAAE,GAAG,EAAA,EAAI,CAAC,GAC7FN,EAAQ,QAAQF,EAAE,cAAc,CAAC,GAEjC,MAAMI,EAAS,EAAI;AAAA,MACrB,SAAS,GAAG;AACV,QAAAF,EAAQ,MAAMkB,EAAe,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAP,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;;;;QAIES,EAiBSC,EAAAC,CAAA,GAAA,EAjBA,MAAMb,EAAA,SAAO;AAAA,qBACpB,MAeS;AAAA,YAfTW,EAeSC,EAAAE,CAAA,GAAA;AAAA,cAfD,mBAAgB;AAAA,cAAQ,eAAa;AAAA,cAAI,OAAA,EAAA,aAAA,QAAA;AAAA,YAAA;yBAClC,MAAmB;AAAA,sBAAhCC,EAEcC,GAAA,MAAAC,EAFWtB,GAAM,CAAXE,MAApBc,EAEcC,EAAAM,CAAA,GAAA;AAAA,kBAFoB,KAAKrB,EAAE;AAAA,kBAAM,OAAOA,EAAE,MAAA;AAAA,gBAAK;6BAC3D,MAAkE;AAAA,oBAAlEc,EAAkEC,EAAAO,CAAA,GAAA;AAAA,sBAAjD,OAAOrB,EAAOD,EAAE,GAAG;AAAA,+CAAZC,EAAOD,EAAE,GAAG,IAAAuB;AAAA,sBAAI,aAAavB,EAAE,MAAA;AAAA,oBAAK;;;;gBAE9Dc,EAUcC,EAAAM,CAAA,GAAA;AAAA,kBAVA,OAAO;AAAA,kBAAM,iBAAe;AAAA,gBAAA;6BACxC,MAQW;AAAA,4BARXG,EAQWT,EAAAU,CAAA,GAAA;AAAA,sBANT,MAAK;AAAA,sBACJ,SAASpB,EAAA;AAAA,sBACT,SAAOQ;AAAA,oBAAA;sBAEG,QAAK,MAA4C;AAAA,wBAA5CC,EAA4CY,GAAA;AAAA,0BAAnC,MAAK;AAAA,0BAAkB,MAAM;AAAA,wBAAA;;iCAAiB,MACvE;AAAA,wBADuEC,EAAA,QACpEZ,EAAAvB,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;0BANI,8BAA8B;AAAA,oBAAA;;;;;;;;;;QAW9CsB,EAAwDc,GAAA;AAAA,UAAtC,OAAM;AAAA,UAAO,SAASb,EAAAhB,CAAA;AAAA,QAAA;;;;;"}
@@ -1,5 +0,0 @@
1
- import f from "./UploadConfig2.vue.js";
2
- export {
3
- f as default
4
- };
5
- //# sourceMappingURL=UploadConfig.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UploadConfig.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}