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.
- package/README.md +5 -5
- package/dist/api/index.d.ts +37 -0
- package/dist/api/index.js +35 -14
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +381 -3
- package/dist/assets/icons/ph-subset.json.js +3 -3
- package/dist/assets/smart-logo.svg.js +5 -0
- package/dist/assets/smart-logo.svg.js.map +1 -0
- package/dist/components/SmartLogo.vue.d.ts +3 -0
- package/dist/components/SmartLogo.vue.js +1 -1
- package/dist/components/SmartLogo2.vue.js +22 -64
- package/dist/components/SmartLogo2.vue.js.map +1 -1
- package/dist/composables/useLoginHero.d.ts +2 -0
- package/dist/composables/useLoginHero.js +22 -0
- package/dist/composables/useLoginHero.js.map +1 -0
- package/dist/composables/usePageTitle.js +16 -14
- package/dist/composables/usePageTitle.js.map +1 -1
- package/dist/composables/useSite.d.ts +5 -0
- package/dist/composables/useSite.js +16 -13
- package/dist/composables/useSite.js.map +1 -1
- package/dist/index.js +92 -91
- package/dist/lib/favicon.d.ts +1 -0
- package/dist/lib/favicon.js +12 -0
- package/dist/lib/favicon.js.map +1 -0
- package/dist/lib/loginHero.d.ts +16 -0
- package/dist/lib/loginHero.js +33 -0
- package/dist/lib/loginHero.js.map +1 -0
- package/dist/lib/logoCrop.d.ts +25 -0
- package/dist/lib/logoCrop.js +22 -0
- package/dist/lib/logoCrop.js.map +1 -0
- package/dist/lib/runtime.d.ts +2 -0
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/runtime.js.map +1 -1
- package/dist/lib/securityRules.d.ts +26 -0
- package/dist/lib/securityRules.js +86 -0
- package/dist/lib/securityRules.js.map +1 -0
- package/dist/locales/en-US.d.ts +250 -28
- package/dist/locales/en-US.js +271 -58
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +250 -28
- package/dist/locales/zh-CN.js +266 -58
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/viewRegistry.js +10 -10
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/utils/oauthBrand.d.ts +34 -9
- package/dist/utils/oauthBrand.js +70 -74
- package/dist/utils/oauthBrand.js.map +1 -1
- package/dist/views/login/components/LoginHeroPanel.vue.d.ts +18 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js +66 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
- package/dist/views/login/skins/SplitPanel.vue.js +1 -1
- package/dist/views/login/skins/SplitPanel2.vue.js +39 -59
- package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -1
- package/dist/views/system/api-docs/index.vue.js +5 -0
- package/dist/views/system/api-docs/index.vue.js.map +1 -0
- package/dist/views/system/api-docs/index2.vue.js +64 -0
- package/dist/views/system/api-docs/index2.vue.js.map +1 -0
- package/dist/views/system/config/components/AdminMock.vue.js +8 -0
- package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
- package/dist/views/system/config/components/AdminMock2.vue.js +76 -0
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js +5 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js +135 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
- package/dist/views/system/config/components/BrandSection.vue.js +8 -0
- package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection2.vue.js +264 -0
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
- package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
- package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
- package/dist/views/system/config/components/CfgRow.vue.js +9 -0
- package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow2.vue.js +53 -0
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
- package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
- package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js +44 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js +5 -2
- package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +66 -56
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +8 -0
- package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
- package/dist/views/system/config/components/JobSection2.vue.js +138 -0
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/{GroupExtraConfig.vue.d.ts → LoginMock.vue.d.ts} +3 -4
- package/dist/views/system/config/components/LoginMock.vue.js +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock2.vue.js +121 -0
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
- package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
- package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
- package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js +163 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
- package/dist/views/system/config/components/ScaleToFit.vue.d.ts +17 -0
- package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
- package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +28 -0
- package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
- package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js +45 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
- package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js +416 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js +209 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection.vue.d.ts +3 -0
- package/dist/views/system/config/components/SigninSection.vue.js +8 -0
- package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
- package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection.vue.d.ts +3 -0
- package/dist/views/system/config/components/UploadSection.vue.js +8 -0
- package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection2.vue.js +167 -0
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
- package/dist/views/system/config/draft.d.ts +148 -0
- package/dist/views/system/config/draft.js +170 -0
- package/dist/views/system/config/draft.js.map +1 -0
- package/dist/views/system/config/flash.d.ts +2 -0
- package/dist/views/system/config/flash.js +9 -0
- package/dist/views/system/config/flash.js.map +1 -0
- package/dist/views/system/config/groups.d.ts +35 -7
- package/dist/views/system/config/groups.js +99 -14
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +4 -1
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +180 -115
- package/dist/views/system/config/index2.vue.js.map +1 -1
- package/dist/views/system/config/providerForm.d.ts +33 -0
- package/dist/views/system/config/providerForm.js +63 -0
- package/dist/views/system/config/providerForm.js.map +1 -0
- package/package.json +4 -4
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
- package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
- package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
- package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig.vue.js +0 -5
- package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
- package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
- package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
- package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
- package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
- package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
- package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
- package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
- package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
- package/dist/views/system/config/components/UploadConfig2.vue.js.map +0 -1
- /package/dist/views/system/{config/components/ExternalAuthConfig.vue.d.ts → api-docs/index.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → AdminMock.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{JobConfig.vue.d.ts → AdvancedSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → JobSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{UploadConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecuritySection2.vue.js","sources":["../../../../../src/views/system/config/components/SecuritySection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 安全策略:登录保护、会话、密码、请求限流。后端经 ISecurityPolicyProvider 读这些键强制执行,保存即生效。\n// 设置项多,按 3:2 分:左边两列分组列表,右边把草稿翻成\"用户会遇到的规则\",再给一个密码试填框,\n// 当场看出新规则下什么样的密码能过。\nimport { computed, ref } from 'vue'\nimport { NInputNumber, NSwitch, NTooltip } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { humanizeMinutes, securityRules } from '#/lib/securityRules'\nimport { CAPTCHA_TYPE_KEY, SECURITY_NUMBERS } from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\nimport CfgSegment from './CfgSegment.vue'\n\nconst { t } = useI18n()\nconst { values } = useConfigDraft()\nconst { num, bool, str } = useDraftFields()\n\nconst s = (k: string) => `sys.security.${k}`\n/** 'loginLock.maxFailCount' → 数值绑定 + 下限 + 单位 */\nconst numField = (k: string, unit: string) => ({\n key: s(k),\n label: t(`config.security.${k}`),\n unit: t(`config.security.unit.${unit}`),\n min: SECURITY_NUMBERS[s(k)],\n model: num(s(k), SECURITY_NUMBERS[s(k)]),\n})\n\nconst lockCount = numField('loginLock.maxFailCount', 'times')\nconst lockMinutes = numField('loginLock.lockMinutes', 'minutes')\nconst captchaOn = bool(s('captcha.enabled'))\nconst captchaType = str(CAPTCHA_TYPE_KEY)\nconst captchaOptions = computed(() =>\n (['char', 'path', 'math'] as const).map(v => ({\n value: v,\n label: t(`config.security.captcha.types.${v}`),\n })),\n)\nconst captchaTypeModel = computed({\n get: () => (captchaType.value || 'char') as 'char' | 'path' | 'math',\n set: v => (captchaType.value = v),\n})\nconst totp = bool(s('totp.enabled'))\nconst totpSuper = bool(s('totp.requireForSuperAdmin'))\nconst mfa = bool(s('mfa.enabled'))\n\nconst access = numField('session.accessMinutes', 'minutes')\nconst refresh = numField('session.refreshMinutes', 'minutes')\n\nconst minLength = numField('password.minLength', 'chars')\nconst REQS = ['Upper', 'Lower', 'Digit', 'Special'] as const\nconst reqs = REQS.map(r => ({\n key: s(`password.require${r}`),\n label: t(`config.security.password.chip${r}`),\n name: t(`config.security.password.require${r}`),\n model: bool(s(`password.require${r}`)),\n}))\nconst expireDays = numField('password.expireDays', 'days')\nconst history = numField('password.historyCount', 'times')\nconst FIRST_CHANGE_KEY = s('password.forceChangeOnFirstLogin')\nconst firstChange = bool(FIRST_CHANGE_KEY)\n\nconst rateOn = bool(s('rateLimit.enabled'))\nconst rate = [\n numField('rateLimit.windowSeconds', 'seconds'),\n numField('rateLimit.permitPerWindow', 'times'),\n numField('rateLimit.authPermitPerWindow', 'times'),\n]\n\nconst duration = (minutes: number) => {\n const d = humanizeMinutes(minutes)\n return t(d.key, { n: d.n })\n}\nconst rules = computed(() =>\n securityRules(values, {\n duration: d => t(d.key, { n: d.n }),\n requirement: code => t(`config.preview.req.${code}`),\n captchaType: code => t(`config.security.captcha.types.${code}`),\n join: items => items.join(t('config.preview.sep')),\n }),\n)\n\n// 密码试填:只在本页做规则比对,不提交\nconst tryPassword = ref('Admin123')\nconst checks = computed(() => {\n const pw = tryPassword.value\n const list = [\n {\n label: t('config.security.tryMin', { n: minLength.model.value }),\n ok: pw.length >= minLength.model.value,\n },\n ]\n const test: Record<(typeof REQS)[number], RegExp> = {\n Upper: /[A-Z]/,\n Lower: /[a-z]/,\n Digit: /\\d/,\n Special: /[^A-Za-z0-9]/,\n }\n REQS.forEach((r, i) => {\n if (reqs[i].model.value)\n list.push({ label: t(`config.preview.req.${r.toLowerCase()}`), ok: test[r].test(pw) })\n })\n return list\n})\nconst passes = computed(() => checks.value.every(c => c.ok))\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.security')\"\n :desc=\"t('config.security.desc')\"\n :preview-title=\"t('config.security.preview')\"\n layout=\"wide\"\n preview-align=\"start\"\n >\n <div class=\"cols\">\n <div class=\"col\">\n <CfgGroup :title=\"t('config.security.groupLogin')\">\n <CfgRow\n v-for=\"f in [lockCount, lockMinutes]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"f === lockCount ? t('config.security.zeroNoLock') : undefined\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n <CfgRow :label=\"t('config.security.captcha.enabled')\" :keys=\"[s('captcha.enabled')]\">\n <n-switch\n v-model:value=\"captchaOn\"\n :aria-label=\"t('config.security.captcha.enabled')\"\n />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.captcha.type')\"\n :keys=\"[CAPTCHA_TYPE_KEY]\"\n :disabled=\"!captchaOn\"\n sub\n >\n <CfgSegment\n v-model=\"captchaTypeModel\"\n :options=\"captchaOptions\"\n :label=\"t('config.security.captcha.type')\"\n />\n </CfgRow>\n <CfgRow :keys=\"[s('totp.enabled')]\">\n <template #label>\n {{ t('config.security.totp.enabled') }}\n <n-tooltip :style=\"{ maxWidth: '320px' }\">\n <template #trigger>\n <button type=\"button\" class=\"tip\" :aria-label=\"t('config.security.totp.hint')\">\n <AppIcon icon=\"ph:question\" :size=\"12\" />\n </button>\n </template>\n {{ t('config.security.totp.hint') }}\n </n-tooltip>\n </template>\n <n-switch v-model:value=\"totp\" :aria-label=\"t('config.security.totp.enabled')\" />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.totp.requireForSuperAdmin')\"\n :keys=\"[s('totp.requireForSuperAdmin')]\"\n :disabled=\"!totp\"\n sub\n >\n <n-switch\n v-model:value=\"totpSuper\"\n :aria-label=\"t('config.security.totp.requireForSuperAdmin')\"\n />\n </CfgRow>\n <CfgRow :keys=\"[s('mfa.enabled')]\">\n <template #label>\n {{ t('config.security.mfa.enabled') }}\n <n-tooltip :style=\"{ maxWidth: '320px' }\">\n <template #trigger>\n <button type=\"button\" class=\"tip\" :aria-label=\"t('config.security.sms.hint')\">\n <AppIcon icon=\"ph:question\" :size=\"12\" />\n </button>\n </template>\n {{ t('config.security.sms.hint') }}\n </n-tooltip>\n </template>\n <n-switch v-model:value=\"mfa\" :aria-label=\"t('config.security.mfa.enabled')\" />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.security.groupSession')\">\n <CfgRow\n v-for=\"f in [access, refresh]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"`= ${duration(f.model.value)}`\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n </CfgGroup>\n </div>\n\n <div class=\"col\">\n <CfgGroup :title=\"t('config.security.password.title')\">\n <CfgRow :label=\"minLength.label\" :keys=\"[minLength.key]\">\n <n-input-number\n v-model:value=\"minLength.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"minLength.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': minLength.label }\"\n />\n <span class=\"unit\">{{ minLength.unit }}</span>\n </CfgRow>\n <CfgRow :label=\"t('config.security.password.mustContain')\" :keys=\"reqs.map(r => r.key)\">\n <span class=\"chips\">\n <button\n v-for=\"r in reqs\"\n :key=\"r.key\"\n type=\"button\"\n class=\"chip\"\n :aria-pressed=\"r.model.value\"\n :aria-label=\"r.name\"\n :title=\"r.name\"\n @click=\"r.model.value = !r.model.value\"\n >\n {{ r.label }}\n </button>\n </span>\n </CfgRow>\n <CfgRow\n v-for=\"f in [expireDays, history]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"t(f === expireDays ? 'config.security.zeroNever' : 'config.security.zeroOff')\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.password.forceChangeOnFirstLogin')\"\n :hint=\"t('config.security.password.forceChangeOnFirstLoginHint')\"\n :keys=\"[FIRST_CHANGE_KEY]\"\n >\n <n-switch\n v-model:value=\"firstChange\"\n :aria-label=\"t('config.security.password.forceChangeOnFirstLogin')\"\n />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.security.groupRate')\">\n <CfgRow :label=\"t('config.security.rateLimit.enabled')\" :keys=\"[s('rateLimit.enabled')]\">\n <n-switch v-model:value=\"rateOn\" :aria-label=\"t('config.security.rateLimit.enabled')\" />\n </CfgRow>\n <CfgRow\n v-for=\"f in rate\"\n :key=\"f.key\"\n :label=\"f.label\"\n :keys=\"[f.key]\"\n :disabled=\"!rateOn\"\n sub\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n </CfgGroup>\n </div>\n </div>\n\n <template #preview>\n <ul class=\"rules\" data-testid=\"security-rules\">\n <li\n v-for=\"r in rules\"\n :key=\"r.icon\"\n v-flash=\"`${r.on}|${t(r.key, r.params ?? {})}`\"\n :class=\"{ off: !r.on }\"\n >\n <span class=\"ic\"><AppIcon :icon=\"r.icon\" :size=\"14\" /></span>\n <span class=\"txt\">{{ t(r.key, r.params ?? {}) }}</span>\n <span v-if=\"!r.on\" class=\"sr-only\">{{ t('config.preview.off') }}</span>\n </li>\n </ul>\n <div class=\"try\">\n <label>\n <span>{{ t('config.security.tryLabel') }}</span>\n <input v-model=\"tryPassword\" autocomplete=\"off\" spellcheck=\"false\" />\n </label>\n <ul>\n <li v-for=\"c in checks\" :key=\"c.label\" :class=\"{ ok: c.ok }\">{{ c.label }}</li>\n <li :class=\"['verdict', { ok: passes }]\">\n {{ passes ? t('config.security.tryPass') : t('config.security.tryFail') }}\n </li>\n </ul>\n </div>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.cols {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 14px;\n align-items: start;\n}\n.col {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n.num {\n width: 96px;\n}\n.num :deep(input) {\n text-align: right;\n}\n.unit {\n flex: none;\n width: 32px;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n.tip {\n display: inline-grid;\n place-items: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: var(--color-fill);\n color: var(--color-text-secondary);\n cursor: help;\n}\n.tip:focus-visible {\n outline: 2px solid var(--color-primary);\n}\n.chips {\n display: inline-flex;\n flex: none;\n gap: 5px;\n}\n.chip {\n padding: 2px 8px;\n border: 0;\n border-radius: 6px;\n background: var(--color-fill);\n font:\n var(--font-size-sm) ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n monospace;\n line-height: 20px;\n color: var(--color-text-secondary);\n white-space: nowrap;\n cursor: pointer;\n}\n.chip[aria-pressed='true'] {\n background: var(--color-primary);\n color: #fff;\n}\n.chip:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 1px;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.rules {\n margin: 0;\n padding: 2px 0;\n list-style: none;\n border-radius: 12px;\n background: var(--color-bg-container);\n}\n.rules li {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 7px 14px;\n border-radius: 8px;\n font-size: var(--font-size-base);\n line-height: 1.5;\n}\n.rules li + li::before {\n content: '';\n position: absolute;\n top: 0;\n left: 46px;\n right: 0;\n border-top: 0.5px solid var(--color-border);\n}\n.ic {\n display: grid;\n flex: none;\n place-items: center;\n width: 22px;\n height: 22px;\n border-radius: 6px;\n color: #fff;\n background: var(--color-primary);\n}\n.rules li.off .ic {\n color: var(--color-text-tertiary);\n background: var(--color-fill);\n}\n.rules li.off .txt {\n color: var(--color-text-tertiary);\n}\n.try {\n flex: none;\n padding: 10px 14px;\n border-radius: 12px;\n background: var(--color-bg-container);\n}\n.try label {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n}\n.try input {\n flex: 1;\n min-width: 0;\n height: 28px;\n padding: 0 10px;\n border: 0;\n border-radius: 7px;\n outline: none;\n background: var(--color-fill);\n color: var(--color-text-primary);\n font: inherit;\n}\n.try input:focus-visible {\n box-shadow: 0 0 0 2px var(--color-primary);\n}\n.try ul {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 14px;\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.try li::before {\n content: '○ ';\n}\n.try li.ok {\n color: var(--color-success);\n}\n.try li.ok::before {\n content: '● ';\n}\n.try li.verdict {\n margin-left: auto;\n color: var(--color-danger);\n}\n.try li.verdict::before,\n.try li.verdict.ok::before {\n content: '';\n}\n.try li.verdict.ok {\n color: var(--color-success);\n}\n@media (max-width: 1280px) {\n .cols {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n</style>\n"],"names":["useI18n","values","useConfigDraft","num","bool","str","useDraftFields","s","k","numField","unit","SECURITY_NUMBERS","lockCount","lockMinutes","captchaOn","captchaType","CAPTCHA_TYPE_KEY","captchaOptions","computed","v","captchaTypeModel","totp","totpSuper","mfa","access","refresh","minLength","REQS","reqs","r","expireDays","history","FIRST_CHANGE_KEY","firstChange","rateOn","rate","duration","minutes","d","humanizeMinutes","rules","securityRules","code","items","tryPassword","ref","checks","pw","list","test","i","passes","c","_createBlock","SectionLayout","_unref","_createElementVNode","_hoisted_13","_createElementBlock","_Fragment","_renderList","_normalizeClass","_hoisted_14","_createVNode","AppIcon","_hoisted_15","_toDisplayString","_hoisted_16","_hoisted_17","$event","_hoisted_1","_hoisted_2","CfgGroup","_openBlock","f","CfgRow","NInputNumber","_hoisted_3","NSwitch","CfgSegment","_createTextVNode","NTooltip","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import o from "./SensitiveSection2.vue.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import t from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
+
const c = /* @__PURE__ */ t(o, [["__scopeId", "data-v-d6672f0c"]]);
|
|
5
|
+
export {
|
|
6
|
+
c as default
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=SensitiveSection.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SensitiveSection.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { defineComponent as I, ref as c, computed as K, onMounted as R, openBlock as p, createBlock as P, unref as e, withCtx as r, createElementVNode as a, toDisplayString as o, createVNode as v, createElementBlock as _, Fragment as T, renderList as U, withKeys as q, withModifiers as S, normalizeClass as B, createTextVNode as y, withDirectives as F, createCommentVNode as L } from "vue";
|
|
2
|
+
import { useMessage as A, NSpin as H, NPopconfirm as O, NButton as V, NInput as $ } from "naive-ui";
|
|
3
|
+
import { useI18n as j } from "vue-i18n";
|
|
4
|
+
import G from "../../../../components/AppIcon.vue.js";
|
|
5
|
+
import { highSensApi as x } from "../../../../api/index.js";
|
|
6
|
+
import { translateError as N } from "../../../../utils/error.js";
|
|
7
|
+
import { vFlash as J } from "../flash.js";
|
|
8
|
+
import Q from "./SectionLayout.vue.js";
|
|
9
|
+
const W = {
|
|
10
|
+
class: "tbl",
|
|
11
|
+
"data-testid": "sensitive-table"
|
|
12
|
+
}, X = {
|
|
13
|
+
class: "th",
|
|
14
|
+
"aria-hidden": "true"
|
|
15
|
+
}, Y = ["aria-label"], Z = ["aria-selected", "onClick", "onKeydown"], ee = ["title"], te = { class: "remark" }, ie = {
|
|
16
|
+
key: 0,
|
|
17
|
+
class: "badge"
|
|
18
|
+
}, se = {
|
|
19
|
+
key: 0,
|
|
20
|
+
class: "dlg",
|
|
21
|
+
"aria-hidden": "true"
|
|
22
|
+
}, ae = { class: "lock" }, ne = { class: "hint" }, oe = { class: "in" }, le = { class: "acts" }, re = { class: "p" }, _e = /* @__PURE__ */ I({
|
|
23
|
+
__name: "SensitiveSection",
|
|
24
|
+
setup(ce) {
|
|
25
|
+
const { t } = j(), u = A(), w = c(!1), d = c(!1), m = c([]), l = c(0), f = c(""), h = c(""), k = c(null);
|
|
26
|
+
function z(n, i = {}) {
|
|
27
|
+
const s = n.indexOf(":");
|
|
28
|
+
return s > 0 ? { code: n, method: n.slice(0, s).toUpperCase(), path: n.slice(s + 1), ...i } : { code: n, method: "", path: n, ...i };
|
|
29
|
+
}
|
|
30
|
+
async function b() {
|
|
31
|
+
w.value = !0;
|
|
32
|
+
try {
|
|
33
|
+
const n = await x.list();
|
|
34
|
+
m.value = [
|
|
35
|
+
...(n.defaults ?? []).map((i) => z(i)),
|
|
36
|
+
...(n.customs ?? []).flatMap(
|
|
37
|
+
(i) => i.id == null ? [] : [z(i.permissionCode ?? "", { id: Number(i.id), remark: i.remark })]
|
|
38
|
+
)
|
|
39
|
+
], l.value = Math.min(l.value, Math.max(m.value.length - 1, 0));
|
|
40
|
+
} catch (n) {
|
|
41
|
+
u.error(N(n));
|
|
42
|
+
} finally {
|
|
43
|
+
w.value = !1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function D() {
|
|
47
|
+
var i;
|
|
48
|
+
const n = f.value.trim();
|
|
49
|
+
if (!n) {
|
|
50
|
+
u.warning(t("config.security.highSens.codeRequired"));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
d.value = !0;
|
|
54
|
+
try {
|
|
55
|
+
await x.add({ permissionCode: n, remark: h.value.trim() || void 0 }), u.success(t("config.sensitive.added")), f.value = "", h.value = "", await b(), l.value = m.value.findIndex((s) => s.code === n), (i = k.value) == null || i.scrollTo({ top: k.value.scrollHeight });
|
|
56
|
+
} catch (s) {
|
|
57
|
+
u.error(N(s));
|
|
58
|
+
} finally {
|
|
59
|
+
d.value = !1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function E(n) {
|
|
63
|
+
d.value = !0;
|
|
64
|
+
try {
|
|
65
|
+
await x.remove(n), u.success(t("config.sensitive.removed")), await b();
|
|
66
|
+
} catch (i) {
|
|
67
|
+
u.error(N(i));
|
|
68
|
+
} finally {
|
|
69
|
+
d.value = !1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const C = K(() => m.value[l.value]);
|
|
73
|
+
return R(() => void b()), (n, i) => (p(), P(Q, {
|
|
74
|
+
title: e(t)("config.tab.sensitive"),
|
|
75
|
+
desc: e(t)("config.sensitive.desc"),
|
|
76
|
+
"preview-title": e(t)("config.sensitive.preview")
|
|
77
|
+
}, {
|
|
78
|
+
"preview-extra": r(() => [
|
|
79
|
+
a("span", null, o(e(t)("config.sensitive.previewTip")), 1)
|
|
80
|
+
]),
|
|
81
|
+
preview: r(() => [
|
|
82
|
+
C.value ? F((p(), _("div", se, [
|
|
83
|
+
a("div", ae, [
|
|
84
|
+
v(G, {
|
|
85
|
+
icon: "ph:lock-key",
|
|
86
|
+
size: 24
|
|
87
|
+
})
|
|
88
|
+
]),
|
|
89
|
+
a("b", null, o(e(t)("reauth.title")), 1),
|
|
90
|
+
a("p", null, [
|
|
91
|
+
y(o(e(t)("config.sensitive.previewDoing")) + " ", 1),
|
|
92
|
+
a("code", null, o(C.value.code), 1)
|
|
93
|
+
]),
|
|
94
|
+
a("p", ne, o(e(t)("reauth.hint")), 1),
|
|
95
|
+
a("i", oe, o(e(t)("reauth.passwordPlaceholder")), 1),
|
|
96
|
+
a("div", le, [
|
|
97
|
+
a("span", null, o(e(t)("common.cancel")), 1),
|
|
98
|
+
a("span", re, o(e(t)("reauth.confirm")), 1)
|
|
99
|
+
])
|
|
100
|
+
])), [
|
|
101
|
+
[e(J), C.value.code]
|
|
102
|
+
]) : L("", !0)
|
|
103
|
+
]),
|
|
104
|
+
default: r(() => [
|
|
105
|
+
a("div", W, [
|
|
106
|
+
a("div", X, [
|
|
107
|
+
a("span", null, o(e(t)("config.sensitive.method")), 1),
|
|
108
|
+
a("span", null, o(e(t)("config.sensitive.path")), 1),
|
|
109
|
+
a("span", null, o(e(t)("config.security.highSens.remark")), 1),
|
|
110
|
+
i[3] || (i[3] = a("span", null, null, -1))
|
|
111
|
+
]),
|
|
112
|
+
v(e(H), {
|
|
113
|
+
show: w.value,
|
|
114
|
+
class: "spin"
|
|
115
|
+
}, {
|
|
116
|
+
default: r(() => [
|
|
117
|
+
a("ul", {
|
|
118
|
+
ref_key: "list",
|
|
119
|
+
ref: k,
|
|
120
|
+
class: "tb",
|
|
121
|
+
role: "listbox",
|
|
122
|
+
"aria-label": e(t)("config.tab.sensitive")
|
|
123
|
+
}, [
|
|
124
|
+
(p(!0), _(T, null, U(m.value, (s, g) => (p(), _("li", {
|
|
125
|
+
key: s.code,
|
|
126
|
+
role: "option",
|
|
127
|
+
"aria-selected": g === l.value,
|
|
128
|
+
class: B(["tr", { sel: g === l.value }]),
|
|
129
|
+
tabindex: "0",
|
|
130
|
+
onClick: (M) => l.value = g,
|
|
131
|
+
onKeydown: q(S((M) => l.value = g, ["prevent"]), ["enter", "space"])
|
|
132
|
+
}, [
|
|
133
|
+
a("span", {
|
|
134
|
+
class: B(["m", s.method])
|
|
135
|
+
}, o(s.method || "—"), 3),
|
|
136
|
+
a("code", {
|
|
137
|
+
title: s.path
|
|
138
|
+
}, o(s.path), 9, ee),
|
|
139
|
+
a("span", te, o(s.remark || "—"), 1),
|
|
140
|
+
s.id == null ? (p(), _("span", ie, o(e(t)("config.sensitive.builtin")), 1)) : (p(), P(e(O), {
|
|
141
|
+
key: 1,
|
|
142
|
+
onPositiveClick: (M) => E(s.id)
|
|
143
|
+
}, {
|
|
144
|
+
trigger: r(() => [
|
|
145
|
+
v(e(V), {
|
|
146
|
+
size: "tiny",
|
|
147
|
+
quaternary: "",
|
|
148
|
+
type: "error",
|
|
149
|
+
disabled: d.value,
|
|
150
|
+
onClick: i[0] || (i[0] = S(() => {
|
|
151
|
+
}, ["stop"]))
|
|
152
|
+
}, {
|
|
153
|
+
default: r(() => [
|
|
154
|
+
y(o(e(t)("common.delete")), 1)
|
|
155
|
+
]),
|
|
156
|
+
_: 1
|
|
157
|
+
}, 8, ["disabled"])
|
|
158
|
+
]),
|
|
159
|
+
default: r(() => [
|
|
160
|
+
y(" " + o(e(t)("config.sensitive.removeConfirm", { code: s.code })), 1)
|
|
161
|
+
]),
|
|
162
|
+
_: 2
|
|
163
|
+
}, 1032, ["onPositiveClick"]))
|
|
164
|
+
], 42, Z))), 128))
|
|
165
|
+
], 8, Y)
|
|
166
|
+
]),
|
|
167
|
+
_: 1
|
|
168
|
+
}, 8, ["show"]),
|
|
169
|
+
a("form", {
|
|
170
|
+
class: "add",
|
|
171
|
+
onSubmit: S(D, ["prevent"])
|
|
172
|
+
}, [
|
|
173
|
+
v(e($), {
|
|
174
|
+
value: f.value,
|
|
175
|
+
"onUpdate:value": i[1] || (i[1] = (s) => f.value = s),
|
|
176
|
+
size: "small",
|
|
177
|
+
placeholder: e(t)("config.security.highSens.codePh"),
|
|
178
|
+
"input-props": { "aria-label": e(t)("config.security.highSens.code") }
|
|
179
|
+
}, null, 8, ["value", "placeholder", "input-props"]),
|
|
180
|
+
v(e($), {
|
|
181
|
+
value: h.value,
|
|
182
|
+
"onUpdate:value": i[2] || (i[2] = (s) => h.value = s),
|
|
183
|
+
size: "small",
|
|
184
|
+
class: "rm",
|
|
185
|
+
placeholder: e(t)("config.security.highSens.remarkPh"),
|
|
186
|
+
"input-props": { "aria-label": e(t)("config.security.highSens.remark") }
|
|
187
|
+
}, null, 8, ["value", "placeholder", "input-props"]),
|
|
188
|
+
v(e(V), {
|
|
189
|
+
type: "primary",
|
|
190
|
+
size: "small",
|
|
191
|
+
"attr-type": "submit",
|
|
192
|
+
loading: d.value
|
|
193
|
+
}, {
|
|
194
|
+
default: r(() => [
|
|
195
|
+
y(o(e(t)("common.add")), 1)
|
|
196
|
+
]),
|
|
197
|
+
_: 1
|
|
198
|
+
}, 8, ["loading"])
|
|
199
|
+
], 32)
|
|
200
|
+
])
|
|
201
|
+
]),
|
|
202
|
+
_: 1
|
|
203
|
+
}, 8, ["title", "desc", "preview-title"]));
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
export {
|
|
207
|
+
_e as default
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=SensitiveSection2.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SensitiveSection2.vue.js","sources":["../../../../../src/views/system/config/components/SensitiveSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 敏感操作:执行这些接口前要求用户再次验证身份(高敏感权限)。内核内置的只读列出,不能删;\n// 消费者可以追加自己的业务接口。增删直接调 highSensApi 即时生效,不走底部保存条\n// (写路径本身要求近期再认证,由后端强制)。\n// 预览是用户执行选中那一行时弹出的验证框,文案与 ReauthModal 一致。\nimport { computed, onMounted, ref } from 'vue'\nimport { NButton, NInput, NPopconfirm, NSpin, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { highSensApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\n\ninterface Row {\n code: string\n method: string\n path: string\n remark?: string | null\n /** 自定义项才有 id,可删除 */\n id?: number\n}\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst loading = ref(false)\nconst saving = ref(false)\nconst rows = ref<Row[]>([])\nconst selected = ref(0)\nconst newCode = ref('')\nconst newRemark = ref('')\nconst list = ref<HTMLElement | null>(null)\n\n/** 权限码是规范化路由 {METHOD}:/{route},拆成方法与路径分开显示 */\nfunction toRow(code: string, extra: Partial<Row> = {}): Row {\n const i = code.indexOf(':')\n return i > 0\n ? { code, method: code.slice(0, i).toUpperCase(), path: code.slice(i + 1), ...extra }\n : { code, method: '', path: code, ...extra }\n}\n\nasync function load() {\n loading.value = true\n try {\n const data = await highSensApi.list()\n rows.value = [\n ...(data.defaults ?? []).map(code => toRow(code)),\n ...(data.customs ?? []).flatMap(item =>\n item.id == null\n ? []\n : [toRow(item.permissionCode ?? '', { id: Number(item.id), remark: item.remark })],\n ),\n ]\n selected.value = Math.min(selected.value, Math.max(rows.value.length - 1, 0))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function add() {\n const code = newCode.value.trim()\n if (!code) {\n message.warning(t('config.security.highSens.codeRequired'))\n return\n }\n saving.value = true\n try {\n await highSensApi.add({ permissionCode: code, remark: newRemark.value.trim() || undefined })\n message.success(t('config.sensitive.added'))\n newCode.value = ''\n newRemark.value = ''\n await load()\n selected.value = rows.value.findIndex(r => r.code === code)\n list.value?.scrollTo({ top: list.value.scrollHeight })\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(id: number) {\n saving.value = true\n try {\n await highSensApi.remove(id)\n message.success(t('config.sensitive.removed'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n\nconst current = computed(() => rows.value[selected.value])\n\nonMounted(() => void load())\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.sensitive')\"\n :desc=\"t('config.sensitive.desc')\"\n :preview-title=\"t('config.sensitive.preview')\"\n >\n <div class=\"tbl\" data-testid=\"sensitive-table\">\n <div class=\"th\" aria-hidden=\"true\">\n <span>{{ t('config.sensitive.method') }}</span>\n <span>{{ t('config.sensitive.path') }}</span>\n <span>{{ t('config.security.highSens.remark') }}</span>\n <span />\n </div>\n <n-spin :show=\"loading\" class=\"spin\">\n <ul ref=\"list\" class=\"tb\" role=\"listbox\" :aria-label=\"t('config.tab.sensitive')\">\n <li\n v-for=\"(r, i) in rows\"\n :key=\"r.code\"\n role=\"option\"\n :aria-selected=\"i === selected\"\n :class=\"['tr', { sel: i === selected }]\"\n tabindex=\"0\"\n @click=\"selected = i\"\n @keydown.enter.space.prevent=\"selected = i\"\n >\n <span :class=\"['m', r.method]\">{{ r.method || '—' }}</span>\n <code :title=\"r.path\">{{ r.path }}</code>\n <span class=\"remark\">{{ r.remark || '—' }}</span>\n <span v-if=\"r.id == null\" class=\"badge\">{{ t('config.sensitive.builtin') }}</span>\n <n-popconfirm v-else @positive-click=\"remove(r.id)\">\n <template #trigger>\n <n-button size=\"tiny\" quaternary type=\"error\" :disabled=\"saving\" @click.stop>\n {{ t('common.delete') }}\n </n-button>\n </template>\n {{ t('config.sensitive.removeConfirm', { code: r.code }) }}\n </n-popconfirm>\n </li>\n </ul>\n </n-spin>\n <form class=\"add\" @submit.prevent=\"add\">\n <n-input\n v-model:value=\"newCode\"\n size=\"small\"\n :placeholder=\"t('config.security.highSens.codePh')\"\n :input-props=\"{ 'aria-label': t('config.security.highSens.code') }\"\n />\n <n-input\n v-model:value=\"newRemark\"\n size=\"small\"\n class=\"rm\"\n :placeholder=\"t('config.security.highSens.remarkPh')\"\n :input-props=\"{ 'aria-label': t('config.security.highSens.remark') }\"\n />\n <n-button type=\"primary\" size=\"small\" attr-type=\"submit\" :loading=\"saving\">\n {{ t('common.add') }}\n </n-button>\n </form>\n </div>\n\n <template #preview-extra>\n <span>{{ t('config.sensitive.previewTip') }}</span>\n </template>\n <template #preview>\n <div v-if=\"current\" v-flash=\"current.code\" class=\"dlg\" aria-hidden=\"true\">\n <div class=\"lock\"><AppIcon icon=\"ph:lock-key\" :size=\"24\" /></div>\n <b>{{ t('reauth.title') }}</b>\n <p>\n {{ t('config.sensitive.previewDoing') }}\n <code>{{ current.code }}</code>\n </p>\n <p class=\"hint\">{{ t('reauth.hint') }}</p>\n <i class=\"in\">{{ t('reauth.passwordPlaceholder') }}</i>\n <div class=\"acts\">\n <span>{{ t('common.cancel') }}</span>\n <span class=\"p\">{{ t('reauth.confirm') }}</span>\n </div>\n </div>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.tbl {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n border-radius: 12px;\n background: var(--color-bg-container);\n border: 1px solid var(--color-border);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n}\n.th,\n.tr {\n display: grid;\n grid-template-columns: 70px minmax(0, 1fr) 120px 64px;\n gap: 10px;\n align-items: center;\n min-height: 38px;\n padding: 0 14px;\n}\n.th {\n flex: none;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n border-bottom: 0.5px solid var(--color-border);\n}\n.spin {\n flex: 1;\n min-height: 0;\n}\n.spin :deep(.n-spin-content) {\n height: 100%;\n}\n.tb {\n height: 100%;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n}\n.tr {\n border-bottom: 0.5px solid var(--color-border);\n font-size: var(--font-size-base);\n cursor: pointer;\n}\n.tr:hover {\n background: var(--color-fill-hover);\n}\n.tr.sel {\n background: color-mix(in srgb, var(--color-primary) 12%, transparent);\n}\n.tr:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n}\ncode {\n overflow: hidden;\n font:\n var(--font-size-sm) ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n monospace;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.remark {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--color-text-secondary);\n}\n.m {\n justify-self: start;\n padding: 1px 6px;\n border-radius: 5px;\n font:\n 600 11px ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n monospace;\n background: var(--color-fill);\n color: var(--color-text-secondary);\n}\n.m.POST {\n background: var(--color-success-bg);\n color: var(--color-success);\n}\n.m.PUT {\n background: var(--color-warning-bg);\n color: var(--color-warning);\n}\n.m.DELETE {\n background: var(--color-danger-bg);\n color: var(--color-danger);\n}\n.badge {\n justify-self: start;\n padding: 1px 6px;\n border-radius: 5px;\n font-size: var(--font-size-xs);\n background: var(--color-fill);\n color: var(--color-text-secondary);\n}\n.add {\n display: flex;\n flex: none;\n gap: 8px;\n padding: 8px 10px;\n border-top: 0.5px solid var(--color-border);\n}\n.add .rm {\n flex: 0 0 150px;\n}\n/* 预览:ReauthModal 的样子 */\n.dlg {\n width: min(380px, 100%);\n margin: 0 auto;\n padding: 22px 22px 18px;\n border-radius: 14px;\n background: var(--color-bg-container);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.14);\n text-align: center;\n font-size: var(--font-size-base);\n}\n.lock {\n display: grid;\n place-items: center;\n width: 44px;\n height: 44px;\n margin: 0 auto 10px;\n border-radius: 12px;\n color: var(--color-primary);\n background: color-mix(in srgb, var(--color-primary) 12%, transparent);\n}\n.dlg b {\n font-size: 16px;\n}\n.dlg p {\n margin: 6px 0 0;\n color: var(--color-text-secondary);\n}\n.dlg p code {\n display: block;\n margin-top: 4px;\n white-space: normal;\n word-break: break-all;\n color: var(--color-text-primary);\n}\n.dlg .hint {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.in {\n display: block;\n height: 34px;\n margin: 14px 0 12px;\n padding: 0 10px;\n border-radius: 8px;\n background: var(--color-fill);\n font-style: normal;\n line-height: 34px;\n text-align: left;\n color: var(--color-text-tertiary);\n}\n.acts {\n display: flex;\n gap: 8px;\n}\n.acts span {\n flex: 1;\n height: 32px;\n border-radius: 8px;\n line-height: 32px;\n background: var(--color-fill);\n}\n.acts .p {\n color: #fff;\n background: var(--color-primary);\n}\n</style>\n"],"names":["useI18n","message","useMessage","loading","ref","saving","rows","selected","newCode","newRemark","list","toRow","code","extra","i","load","data","highSensApi","item","e","translateError","add","r","_a","remove","id","current","computed","onMounted","_createBlock","SectionLayout","_unref","_createElementVNode","_withDirectives","_openBlock","_createElementBlock","_hoisted_8","_hoisted_9","_createVNode","AppIcon","_createTextVNode","_toDisplayString","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","vFlash","_hoisted_1","_hoisted_2","NSpin","_Fragment","_renderList","_normalizeClass","$event","_withKeys","_withModifiers","_hoisted_5","_hoisted_6","_hoisted_7","NPopconfirm","NButton","NInput"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import o from "./SigninSection2.vue.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import t from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
+
const f = /* @__PURE__ */ t(o, [["__scopeId", "data-v-f795c261"]]);
|
|
5
|
+
export {
|
|
6
|
+
f as default
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=SigninSection.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SigninSection.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { defineComponent as M, computed as C, ref as k, openBlock as r, createBlock as f, unref as t, withCtx as o, createVNode as l, isRef as W, createElementBlock as N, Fragment as B, renderList as Y, createSlots as j, createElementVNode as p, normalizeClass as L, toDisplayString as s, createTextVNode as b, createCommentVNode as w } from "vue";
|
|
2
|
+
import { NSwitch as m, NButton as U } from "naive-ui";
|
|
3
|
+
import { useI18n as q } from "vue-i18n";
|
|
4
|
+
import J from "../../../../components/oauth/BrandIcon.vue.js";
|
|
5
|
+
import { useConfirm as Q } from "../../../../composables/useConfirm.js";
|
|
6
|
+
import { useAppStore as X } from "../../../../stores/app.js";
|
|
7
|
+
import { SMS_LOGIN_KEY as I } from "../groups.js";
|
|
8
|
+
import { useConfigDraft as Z, useDraftFields as ee, enabledKey as x, hasLinkSwitch as te, linkKey as S } from "../draft.js";
|
|
9
|
+
import ae from "./SectionLayout.vue.js";
|
|
10
|
+
import T from "./CfgGroup.vue.js";
|
|
11
|
+
import g from "./CfgRow.vue.js";
|
|
12
|
+
import ne from "./ScaleToFit.vue.js";
|
|
13
|
+
import oe from "./LoginMock.vue.js";
|
|
14
|
+
import le from "./ProviderSheet.vue.js";
|
|
15
|
+
const ie = { class: "avatar" }, we = /* @__PURE__ */ M({
|
|
16
|
+
__name: "SigninSection",
|
|
17
|
+
setup(re) {
|
|
18
|
+
const { t: a } = q(), O = X(), { ask: z } = Q(), h = Z(), { values: c } = h, { bool: R } = ee(), v = R(I), $ = C(() => h.providerRows.value), _ = (n) => c[x(n)] === "true", D = (n) => c[S(n)] === "true", E = {
|
|
19
|
+
wecom: "SmartAdmin.Auth.WeCom",
|
|
20
|
+
dingtalk: "SmartAdmin.Auth.DingTalk",
|
|
21
|
+
github: "SmartAdmin.Auth.GitHub",
|
|
22
|
+
wechat: "SmartAdmin.Auth.WeChat"
|
|
23
|
+
}, d = k(!1), y = k(null), A = k(""), F = C(() => h.catalog.value.types.some((n) => n.type === "oidc"));
|
|
24
|
+
function G(n) {
|
|
25
|
+
y.value = n, A.value = "", d.value = !0;
|
|
26
|
+
}
|
|
27
|
+
function H() {
|
|
28
|
+
y.value = null, A.value = "oidc", d.value = !0;
|
|
29
|
+
}
|
|
30
|
+
const K = (n) => a(`config.externalAuth.state.${n.state}`);
|
|
31
|
+
function V(n, i) {
|
|
32
|
+
n.registered && (c[x(n.code)] = String(i));
|
|
33
|
+
}
|
|
34
|
+
async function P(n, i) {
|
|
35
|
+
n.registered && (i && !await z({
|
|
36
|
+
title: a("config.externalAuth.linkByAccountConfirmTitle"),
|
|
37
|
+
content: a("config.externalAuth.linkByAccountConfirm", { name: n.displayName })
|
|
38
|
+
}) || (c[S(n.code)] = String(i)));
|
|
39
|
+
}
|
|
40
|
+
return (n, i) => (r(), f(ae, {
|
|
41
|
+
title: t(a)("config.tab.signin"),
|
|
42
|
+
desc: t(a)("config.externalAuth.hint"),
|
|
43
|
+
"preview-title": t(a)("config.externalAuth.preview")
|
|
44
|
+
}, {
|
|
45
|
+
preview: o(() => [
|
|
46
|
+
l(ne, {
|
|
47
|
+
width: 440,
|
|
48
|
+
height: 540
|
|
49
|
+
}, {
|
|
50
|
+
default: o(() => [
|
|
51
|
+
l(oe, {
|
|
52
|
+
locale: t(O).locale === "en-US" ? "en-US" : "zh-CN",
|
|
53
|
+
"form-only": ""
|
|
54
|
+
}, null, 8, ["locale"])
|
|
55
|
+
]),
|
|
56
|
+
_: 1
|
|
57
|
+
})
|
|
58
|
+
]),
|
|
59
|
+
default: o(() => [
|
|
60
|
+
l(T, {
|
|
61
|
+
title: t(a)("config.externalAuth.groupLocal")
|
|
62
|
+
}, {
|
|
63
|
+
default: o(() => [
|
|
64
|
+
l(g, {
|
|
65
|
+
label: t(a)("config.externalAuth.password"),
|
|
66
|
+
hint: t(a)("config.externalAuth.passwordHint")
|
|
67
|
+
}, {
|
|
68
|
+
default: o(() => [
|
|
69
|
+
l(t(m), {
|
|
70
|
+
value: !0,
|
|
71
|
+
disabled: "",
|
|
72
|
+
"aria-label": t(a)("config.externalAuth.password")
|
|
73
|
+
}, null, 8, ["aria-label"])
|
|
74
|
+
]),
|
|
75
|
+
_: 1
|
|
76
|
+
}, 8, ["label", "hint"]),
|
|
77
|
+
l(g, {
|
|
78
|
+
label: t(a)("config.security.smsLogin.enabled"),
|
|
79
|
+
hint: t(a)("config.externalAuth.smsHint"),
|
|
80
|
+
keys: [t(I)]
|
|
81
|
+
}, {
|
|
82
|
+
default: o(() => [
|
|
83
|
+
l(t(m), {
|
|
84
|
+
value: t(v),
|
|
85
|
+
"onUpdate:value": i[0] || (i[0] = (e) => W(v) ? v.value = e : null),
|
|
86
|
+
"aria-label": t(a)("config.security.smsLogin.enabled")
|
|
87
|
+
}, null, 8, ["value", "aria-label"])
|
|
88
|
+
]),
|
|
89
|
+
_: 1
|
|
90
|
+
}, 8, ["label", "hint", "keys"])
|
|
91
|
+
]),
|
|
92
|
+
_: 1
|
|
93
|
+
}, 8, ["title"]),
|
|
94
|
+
l(T, {
|
|
95
|
+
title: t(a)("config.externalAuth.groupThird")
|
|
96
|
+
}, {
|
|
97
|
+
extra: o(() => [
|
|
98
|
+
F.value ? (r(), f(t(U), {
|
|
99
|
+
key: 0,
|
|
100
|
+
text: "",
|
|
101
|
+
size: "tiny",
|
|
102
|
+
type: "primary",
|
|
103
|
+
"data-testid": "add-oidc",
|
|
104
|
+
onClick: H
|
|
105
|
+
}, {
|
|
106
|
+
default: o(() => [
|
|
107
|
+
b(s(t(a)("config.externalAuth.addOidc")), 1)
|
|
108
|
+
]),
|
|
109
|
+
_: 1
|
|
110
|
+
})) : w("", !0)
|
|
111
|
+
]),
|
|
112
|
+
default: o(() => [
|
|
113
|
+
(r(!0), N(B, null, Y($.value, (e) => (r(), N(B, {
|
|
114
|
+
key: e.code
|
|
115
|
+
}, [
|
|
116
|
+
l(g, {
|
|
117
|
+
keys: [t(x)(e.code)],
|
|
118
|
+
"data-provider": e.code,
|
|
119
|
+
"data-state": e.state
|
|
120
|
+
}, j({
|
|
121
|
+
label: o(() => [
|
|
122
|
+
p("span", ie, [
|
|
123
|
+
l(J, {
|
|
124
|
+
code: e.code,
|
|
125
|
+
icon: e.icon,
|
|
126
|
+
size: 18
|
|
127
|
+
}, null, 8, ["code", "icon"])
|
|
128
|
+
]),
|
|
129
|
+
p("span", {
|
|
130
|
+
class: L({ na: e.state === "notInstalled" })
|
|
131
|
+
}, s(e.displayName), 3)
|
|
132
|
+
]),
|
|
133
|
+
default: o(() => [
|
|
134
|
+
p("span", {
|
|
135
|
+
class: L(["status", e.state])
|
|
136
|
+
}, s(K(e)), 3),
|
|
137
|
+
e.state !== "notInstalled" && e.source !== "code" ? (r(), f(t(U), {
|
|
138
|
+
key: 0,
|
|
139
|
+
size: "small",
|
|
140
|
+
"data-testid": `provider-set-${e.code}`,
|
|
141
|
+
onClick: (u) => G(e)
|
|
142
|
+
}, {
|
|
143
|
+
default: o(() => [
|
|
144
|
+
b(s(t(a)("config.externalAuth.settings")), 1)
|
|
145
|
+
]),
|
|
146
|
+
_: 1
|
|
147
|
+
}, 8, ["data-testid", "onClick"])) : w("", !0),
|
|
148
|
+
l(t(m), {
|
|
149
|
+
value: _(e.code),
|
|
150
|
+
disabled: !e.registered,
|
|
151
|
+
"aria-label": e.displayName,
|
|
152
|
+
"onUpdate:value": (u) => V(e, u)
|
|
153
|
+
}, null, 8, ["value", "disabled", "aria-label", "onUpdate:value"])
|
|
154
|
+
]),
|
|
155
|
+
_: 2
|
|
156
|
+
}, [
|
|
157
|
+
e.state === "notInstalled" || e.source === "code" ? {
|
|
158
|
+
name: "hint",
|
|
159
|
+
fn: o(() => [
|
|
160
|
+
b(s(e.source === "code" ? t(a)("config.externalAuth.codeRegistered") : t(a)("config.externalAuth.needPackage", { pkg: E[e.code] ?? e.code })), 1)
|
|
161
|
+
]),
|
|
162
|
+
key: "0"
|
|
163
|
+
} : void 0
|
|
164
|
+
]), 1032, ["keys", "data-provider", "data-state"]),
|
|
165
|
+
t(te)(e.code) ? (r(), f(g, {
|
|
166
|
+
key: 0,
|
|
167
|
+
label: t(a)("config.externalAuth.linkByAccount"),
|
|
168
|
+
hint: t(a)("config.externalAuth.linkByAccountHint"),
|
|
169
|
+
keys: [t(S)(e.code)],
|
|
170
|
+
disabled: !e.registered || !_(e.code),
|
|
171
|
+
"data-link": e.code,
|
|
172
|
+
sub: ""
|
|
173
|
+
}, {
|
|
174
|
+
default: o(() => [
|
|
175
|
+
l(t(m), {
|
|
176
|
+
value: D(e.code),
|
|
177
|
+
"aria-label": `${e.displayName} ${t(a)("config.externalAuth.linkByAccount")}`,
|
|
178
|
+
"onUpdate:value": (u) => P(e, u)
|
|
179
|
+
}, null, 8, ["value", "aria-label", "onUpdate:value"])
|
|
180
|
+
]),
|
|
181
|
+
_: 2
|
|
182
|
+
}, 1032, ["label", "hint", "keys", "disabled", "data-link"])) : w("", !0)
|
|
183
|
+
], 64))), 128))
|
|
184
|
+
]),
|
|
185
|
+
_: 1
|
|
186
|
+
}, 8, ["title"]),
|
|
187
|
+
l(le, {
|
|
188
|
+
show: d.value,
|
|
189
|
+
"onUpdate:show": i[1] || (i[1] = (e) => d.value = e),
|
|
190
|
+
row: y.value,
|
|
191
|
+
"new-type": A.value
|
|
192
|
+
}, null, 8, ["show", "row", "new-type"])
|
|
193
|
+
]),
|
|
194
|
+
_: 1
|
|
195
|
+
}, 8, ["title", "desc", "preview-title"]));
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
export {
|
|
199
|
+
we as default
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=SigninSection2.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SigninSection2.vue.js","sources":["../../../../../src/views/system/config/components/SigninSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 登录方式:登录页上出现哪些登录入口——账号密码(始终可用)、短信验证码、各第三方登录。\n// 每个第三方一行:状态(未安装 / 未配置 / 已配置)、「设置」按钮、开关。连接信息与密钥在设置面板里填,\n// 加密入库,不经过页面草稿;开关是草稿项,随底部保存条保存。没配好的方式开关灰掉,也永远不写库。\n// 「按账号自动关联」打开前要确认两边账号是同一批人。预览就是登录框本身。\nimport { computed, ref } from 'vue'\nimport { NButton, NSwitch } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport BrandIcon from '#/components/oauth/BrandIcon.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAppStore } from '#/stores/app'\nimport type { ConfigProviderRow } from '#/utils/oauthBrand'\nimport { SMS_LOGIN_KEY } from '../groups'\nimport { enabledKey, hasLinkSwitch, linkKey, useConfigDraft, useDraftFields } from '../draft'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\nimport ScaleToFit from './ScaleToFit.vue'\nimport LoginMock from './LoginMock.vue'\nimport ProviderSheet from './ProviderSheet.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst { ask } = useConfirm()\nconst draft = useConfigDraft()\nconst { values } = draft\nconst { bool } = useDraftFields()\nconst smsLogin = bool(SMS_LOGIN_KEY)\nconst rows = computed(() => draft.providerRows.value)\nconst isOn = (code: string) => values[enabledKey(code)] === 'true'\nconst linkOn = (code: string) => values[linkKey(code)] === 'true'\n\n/** 官方厂商对应的服务器扩展包,「未安装」时告诉管理员装哪个。 */\nconst PACKAGE_OF: Record<string, string> = {\n wecom: 'SmartAdmin.Auth.WeCom',\n dingtalk: 'SmartAdmin.Auth.DingTalk',\n github: 'SmartAdmin.Auth.GitHub',\n wechat: 'SmartAdmin.Auth.WeChat',\n}\n\nconst sheetShow = ref(false)\nconst sheetRow = ref<ConfigProviderRow | null>(null)\nconst sheetNewType = ref('')\nconst oidcInstalled = computed(() => draft.catalog.value.types.some(x => x.type === 'oidc'))\n\nfunction openSheet(row: ConfigProviderRow) {\n sheetRow.value = row\n sheetNewType.value = ''\n sheetShow.value = true\n}\n\nfunction openAddOidc() {\n sheetRow.value = null\n sheetNewType.value = 'oidc'\n sheetShow.value = true\n}\n\nconst statusText = (p: ConfigProviderRow) => t(`config.externalAuth.state.${p.state}`)\n\nfunction toggle(p: ConfigProviderRow, v: boolean) {\n if (p.registered) values[enabledKey(p.code)] = String(v)\n}\n\nasync function toggleLink(p: ConfigProviderRow, v: boolean) {\n if (!p.registered) return\n if (\n v &&\n !(await ask({\n title: t('config.externalAuth.linkByAccountConfirmTitle'),\n content: t('config.externalAuth.linkByAccountConfirm', { name: p.displayName }),\n }))\n )\n return\n values[linkKey(p.code)] = String(v)\n}\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.signin')\"\n :desc=\"t('config.externalAuth.hint')\"\n :preview-title=\"t('config.externalAuth.preview')\"\n >\n <CfgGroup :title=\"t('config.externalAuth.groupLocal')\">\n <CfgRow\n :label=\"t('config.externalAuth.password')\"\n :hint=\"t('config.externalAuth.passwordHint')\"\n >\n <n-switch :value=\"true\" disabled :aria-label=\"t('config.externalAuth.password')\" />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.smsLogin.enabled')\"\n :hint=\"t('config.externalAuth.smsHint')\"\n :keys=\"[SMS_LOGIN_KEY]\"\n >\n <n-switch v-model:value=\"smsLogin\" :aria-label=\"t('config.security.smsLogin.enabled')\" />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.externalAuth.groupThird')\">\n <template #extra>\n <n-button\n v-if=\"oidcInstalled\"\n text\n size=\"tiny\"\n type=\"primary\"\n data-testid=\"add-oidc\"\n @click=\"openAddOidc\"\n >\n {{ t('config.externalAuth.addOidc') }}\n </n-button>\n </template>\n <template v-for=\"p in rows\" :key=\"p.code\">\n <CfgRow :keys=\"[enabledKey(p.code)]\" :data-provider=\"p.code\" :data-state=\"p.state\">\n <template #label>\n <span class=\"avatar\"><BrandIcon :code=\"p.code\" :icon=\"p.icon\" :size=\"18\" /></span>\n <span :class=\"{ na: p.state === 'notInstalled' }\">{{ p.displayName }}</span>\n </template>\n <template v-if=\"p.state === 'notInstalled' || p.source === 'code'\" #hint>\n {{\n p.source === 'code'\n ? t('config.externalAuth.codeRegistered')\n : t('config.externalAuth.needPackage', { pkg: PACKAGE_OF[p.code] ?? p.code })\n }}\n </template>\n <span :class=\"['status', p.state]\">{{ statusText(p) }}</span>\n <n-button\n v-if=\"p.state !== 'notInstalled' && p.source !== 'code'\"\n size=\"small\"\n :data-testid=\"`provider-set-${p.code}`\"\n @click=\"openSheet(p)\"\n >\n {{ t('config.externalAuth.settings') }}\n </n-button>\n <n-switch\n :value=\"isOn(p.code)\"\n :disabled=\"!p.registered\"\n :aria-label=\"p.displayName\"\n @update:value=\"v => toggle(p, v)\"\n />\n </CfgRow>\n <CfgRow\n v-if=\"hasLinkSwitch(p.code)\"\n :label=\"t('config.externalAuth.linkByAccount')\"\n :hint=\"t('config.externalAuth.linkByAccountHint')\"\n :keys=\"[linkKey(p.code)]\"\n :disabled=\"!p.registered || !isOn(p.code)\"\n :data-link=\"p.code\"\n sub\n >\n <n-switch\n :value=\"linkOn(p.code)\"\n :aria-label=\"`${p.displayName} ${t('config.externalAuth.linkByAccount')}`\"\n @update:value=\"v => toggleLink(p, v)\"\n />\n </CfgRow>\n </template>\n </CfgGroup>\n\n <ProviderSheet v-model:show=\"sheetShow\" :row=\"sheetRow\" :new-type=\"sheetNewType\" />\n\n <template #preview>\n <ScaleToFit :width=\"440\" :height=\"540\">\n <LoginMock :locale=\"app.locale === 'en-US' ? 'en-US' : 'zh-CN'\" form-only />\n </ScaleToFit>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.avatar {\n display: grid;\n flex: none;\n place-items: center;\n width: 24px;\n height: 24px;\n margin-right: 6px;\n overflow: hidden;\n border-radius: 6px;\n background: var(--color-fill);\n}\n.na {\n color: var(--color-text-tertiary);\n}\n.status {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.status.configured {\n color: var(--color-success);\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","ask","useConfirm","draft","useConfigDraft","values","bool","useDraftFields","smsLogin","SMS_LOGIN_KEY","rows","computed","isOn","code","enabledKey","linkOn","linkKey","PACKAGE_OF","sheetShow","ref","sheetRow","sheetNewType","oidcInstalled","x","openSheet","row","openAddOidc","statusText","p","toggle","v","toggleLink","_createBlock","SectionLayout","_unref","_createVNode","ScaleToFit","LoginMock","CfgGroup","CfgRow","NSwitch","$event","NButton","_createElementBlock","_Fragment","_renderList","_createElementVNode","_hoisted_1","BrandIcon","_normalizeClass","_toDisplayString","_createTextVNode","hasLinkSwitch","ProviderSheet"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import o from "./UploadSection2.vue.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import t from "../../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
+
const c = /* @__PURE__ */ t(o, [["__scopeId", "data-v-18bf86bc"]]);
|
|
5
|
+
export {
|
|
6
|
+
c as default
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=UploadSection.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadSection.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|