-
注册方式
-
- 选择允许用户使用的注册方式
+
+
+ 验证设置
+ 配置登录和注册的验证方式
+
+
+
+
+
+ 登录验证
-
-
-
{
- if (checked) {
- form.register_methods.push('username')
- }
- else {
- form.register_methods = form.register_methods.filter(m => m !== 'username')
- }
- }"
- />
-
- 用户名注册
-
+
+ 用户登录时需要进行验证
+
+
+
+
+
+
+
+
+ 注册验证
+
+
+ 用户注册时需要进行验证
+
+
+
+
+
+
+
+
验证方式
+
+
+
+
+
+ 邮箱验证
+
+
+ 发送验证码到邮箱
+
+
-
-
{
- if (checked) {
- form.register_methods.push('email')
- }
- else {
- form.register_methods = form.register_methods.filter(m => m !== 'email')
- }
- }"
- />
-
- 邮箱注册
-
+
+
+
+
+
+ 短信验证
+
+
+ 发送验证码到手机
+
+
-
- {
- if (checked) {
- form.register_methods.push('phone')
- }
- else {
- form.register_methods = form.register_methods.filter(m => m !== 'phone')
- }
- }"
- />
-
- 手机号注册
-
+
+
+
+
+
邮箱配置
+
form.email_config_id = val">
+
+
+
+
+
+ {{ config.name }}
+
+
+
+
+ 选择用于发送验证码的邮箱配置
+
+
+
+ 暂无可用的邮箱配置,请先在「系统设置 - 邮箱配置」中添加并启用邮箱配置
+
+
+
+
+
+
短信配置
+
form.sms_config_id = val">
+
+
+
+
+
+ {{ config.name }}
+
+
+
+
+ 选择用于发送验证码的短信配置
+
+
+
+ 暂无可用的短信配置,请先在「系统设置 - 短信配置」中添加并启用短信配置
+
+
+
+
+
+
+
+
+
+ 密码重置
+
+
+ 用户忘记密码时通过邮箱或短信重置
+
+
+
+
+
+
+
+
验证方式
+
+
+
+
+
+ 邮箱验证
+
+
+ 发送验证码到邮箱
+
+
+
+
+
+
+
+
+ 短信验证
+
+
+ 发送验证码到手机
+
+
+
+
+
+
+
+
邮箱配置
+
form.password_reset_email_id = val">
+
+
+
+
+
+ {{ config.name }}
+
+
+
+
+ 选择用于发送密码重置邮件的邮箱配置
+
+
+
+ 暂无可用的邮箱配置,请先在「系统设置 - 邮箱配置」中添加并启用邮箱配置
+
+
+
+
+
+
短信配置
+
form.password_reset_sms_id = val">
+
+
+
+
+
+ {{ config.name }}
+
+
+
+
+ 选择用于发送密码重置短信的短信配置
+
+
+
+ 暂无可用的短信配置,请先在「系统设置 - 短信配置」中添加并启用短信配置
+
-
- 至少选择一种注册方式
-
diff --git a/frontend/src/pages/admin/applications/components/columns.ts b/frontend/src/pages/admin/applications/components/columns.ts
index 544d15f..a0c0f46 100644
--- a/frontend/src/pages/admin/applications/components/columns.ts
+++ b/frontend/src/pages/admin/applications/components/columns.ts
@@ -4,7 +4,6 @@ import type { Composer } from 'vue-i18n'
import {
Ban,
CheckCircle,
- Mail,
MoreHorizontal,
Settings,
Shield,
@@ -27,7 +26,6 @@ import {
export function getColumns(actions: {
onGoToSettings: (app: App) => void
onGoToSecurity: (app: App) => void
- onGoToEmail: (app: App) => void
onToggleStatus: (app: App) => void
onDelete: (app: App) => void
}, t: Composer['t']): ColumnDef[] {
@@ -181,10 +179,6 @@ export function getColumns(actions: {
h(Shield, { class: 'mr-2 h-4 w-4' }),
'安全设置',
]),
- h(DropdownMenuItem, { onClick: () => actions.onGoToEmail(app) }, () => [
- h(Mail, { class: 'mr-2 h-4 w-4' }),
- '邮箱设置',
- ]),
h(DropdownMenuSeparator),
h(DropdownMenuItem, { onClick: () => actions.onToggleStatus(app) }, () => [
isActive ? h(Ban, { class: 'mr-2 h-4 w-4' }) : h(CheckCircle, { class: 'mr-2 h-4 w-4' }),
diff --git a/frontend/src/pages/admin/applications/components/data-table.vue b/frontend/src/pages/admin/applications/components/data-table.vue
index 32fbb39..b50512c 100644
--- a/frontend/src/pages/admin/applications/components/data-table.vue
+++ b/frontend/src/pages/admin/applications/components/data-table.vue
@@ -21,7 +21,6 @@ const emit = defineEmits<{
'refresh': []
'goToSettings': [app: App]
'goToSecurity': [app: App]
- 'goToEmail': [app: App]
'toggleStatus': [app: App]
'delete': [app: App]
'update:searchFilter': [value: string]
@@ -34,7 +33,6 @@ const columns = computed(() => [
...getColumns({
onGoToSettings: (app: App) => emit('goToSettings', app),
onGoToSecurity: (app: App) => emit('goToSecurity', app),
- onGoToEmail: (app: App) => emit('goToEmail', app),
onToggleStatus: (app: App) => emit('toggleStatus', app),
onDelete: (app: App) => emit('delete', app),
}, t),
diff --git a/frontend/src/pages/admin/applications/create.vue b/frontend/src/pages/admin/applications/create.vue
index c1ce131..fecf762 100644
--- a/frontend/src/pages/admin/applications/create.vue
+++ b/frontend/src/pages/admin/applications/create.vue
@@ -1,41 +1,34 @@
-
-
- {{ t('admin.applications.basicInfo') }}
- {{ t('admin.applications.basicInfoDesc') }}
-
-
-
-
-
- {{ t('admin.applications.appName') }} *
-
-
-
-
-
-
{{ t('admin.applications.appIcon') }}
-
-
-
![应用图标]()
-
-
-
-
-
-
-
-
-
-
-
- {{ t('admin.applications.appDescription') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.operationMode') }}
- {{ t('admin.applications.operationModeDesc') }}
-
-
-
-
-
-
-
- {{ t('admin.applications.freeMode') }}
-
-
- {{ t('admin.applications.freeModeDesc') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.subscriptionMode') }}
-
-
- {{ t('admin.applications.subscriptionModeDesc') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.timeMode') }}
-
-
- {{ t('admin.applications.timeModeDesc') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.countMode') }}
-
-
- {{ t('admin.applications.countModeDesc') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.deductionCycle') }}
-
-
-
-
-
-
- {{ t('admin.applications.perUse') }}
-
-
- {{ t('admin.applications.perMinute') }}
-
-
- {{ t('admin.applications.perHour') }}
-
-
- {{ t('admin.applications.perDay') }}
-
-
-
-
-
-
- {{ t('admin.applications.deductionAmount') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ t('admin.applications.loginPolicy') }}
- {{ t('admin.applications.loginPolicyDesc') }}
-
-
-
-
-
-
-
- {{ t('admin.applications.looseMode') }}
-
-
- {{ t('admin.applications.looseModeDesc') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.strictMode') }}
-
-
- {{ t('admin.applications.strictModeDesc') }}
-
-
-
-
-
-
-
-
- {{ t('admin.applications.hybridMode') }}
-
-
- {{ t('admin.applications.hybridModeDesc') }}
-
-
-
-
-
-
-
-
-
- {{ t('admin.applications.trialSettings') }}
- {{ t('admin.applications.trialSettings') }}
-
-
-
-
-
- {{ t('admin.applications.enableTrial') }}
-
-
- 新用户注册后自动获得试用权益
-
-
-
-
-
-
-
-
{{ t('admin.applications.trialBalance') }}
-
-
-
-
-
-
-
-
- 新用户注册后获得的余额
-
-
-
-
-
-
-
-
- {{ t('admin.applications.freePeriodSettings') }}
- {{ t('admin.applications.freePeriodSettings') }}
-
-
-
-
-
- {{ t('admin.applications.enableFreePeriod') }}
-
-
- 在设定的时间段内,所有用户可免费使用
-
-
-
-
-
-
-
-
{{ t('admin.applications.periodType') }}
-
-
-
-
-
- {{ t('admin.applications.dateRange') }}
-
-
- 指定开始和结束日期时间
-
-
+
+
+
+
+
+
+ 基本信息
+
+ 设置应用的基本信息
+
+
+
+
+
+ 应用名称 *
+
+
-
-
-
-
- {{ t('admin.applications.weekly') }}
-
-
- 每周固定日期和时间段
-
-
-
-
-
-
-
-
- {{ t('admin.applications.startTime') }}
-
-
-
- {{ t('admin.applications.endTime') }}
-
-
-
-
-
-
-
{{ t('admin.applications.weekdays') }}
-
-
-
+ 应用图标
+
+
+
![应用图标]()
+
+
+
-
- 选择每周哪些日期免费
-
-
-
-
-
-
{{ t('admin.applications.startTime') }}
-
-
- 每天免费开始时间
-
-
-
-
{{ t('admin.applications.endTime') }}
-
-
- 每天免费结束时间
-
+
+
+ {{ formData.iconPreview ? '更换' : '上传' }}
+
+
+
+
-
-
-
-
-
-
- {{ t('admin.applications.securitySettings') }}
- {{ t('admin.applications.securitySettingsDesc') }}
-
-
-
-
-
{{ t('admin.applications.encryptionType') }}
-
-
-
-
-
-
- {{ t('admin.applications.noEncryption') }}
-
-
- {{ t('admin.applications.aesEncryption') }}
-
-
- {{ t('admin.applications.rsaEncryption') }}
-
-
- {{ t('admin.applications.rc4Encryption') }}
-
-
-
-
- 数据明文传输,仅用于测试环境
- 使用AES-GCM算法加密,安全性高
- 非对称加密,安全性最高
- 使用RC4流加密,性能较好
-
-
-
-
-
{{ t('admin.applications.secretKey') }}
-
-
+ 应用描述
+
-
+
+
+
+
+
+
+
+ 运营模式
+
+ 选择应用的计费方式
+
+
+
+
-
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+ {{ option.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 预览
+
+
+
+
+
+
![图标]()
+
+
+
+
+ {{ formData.name || '未命名应用' }}
+
+
+ {{ selectedBilling?.label || '免费模式' }}
+
+
+
+
+
+
+ 应用名称
+ {{ formData.name || '-' }}
+
+
+ 运营模式
+ {{ selectedBilling?.label || '-' }}
+
+
+ 应用描述
+ {{ formData.description || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+ 创建应用
+
+
+ 取消
-
- 用于加密通信数据的密钥,留空则自动生成
-
-
-
-
-
+
+
-
-
- {{ t('admin.applications.deviceBind') }}
- 控制用户登录时是否需要绑定设备
-
-
-
-
-
- {{ t('admin.applications.deviceBind') }}
-
-
- 启用后,用户登录时需要绑定设备,可限制同时登录的设备数量
-
-
-
formData.bind_type = val ? 'device' : 'none'"
- />
-
-
-
-
{{ t('admin.applications.maxDevices') }}
-
-
-
-
-
-
-
-
- 每个账号最多绑定的设备数量
-
-
-
-
-
-
- {{ t('admin.applications.allowMultiOpen') }}
-
-
- 允许同一账号在同一设备上同时运行多个实例
-
-
-
-
-
-
-
-
-
- 取消
-
-
-
- {{ t('admin.applications.createApp') }}
-
+
+
+
+
+ 提示
+
+
+
+
+ -
+
+ 创建后可在设置页面配置更多选项
+
+ -
+
+ 支持配置验证方式、安全策略等
+
+ -
+
+ 可随时修改应用信息和设置
+
+
+
+
+
+
+
+
+
+
+
+ 应用创建成功
+
+
+ 您的应用已创建成功,接下来您可以配置更多设置。
+
+
+
+
+
+ 推荐配置:
+
+
+ -
+
+ 配置验证方式(邮箱/短信验证)
+
+ -
+
+ 设置安全策略(加密、绑定)
+
+ -
+
+ 上传应用版本文件
+
+
+
+
+
+
+ 稍后配置
+
+
+ 前往设置
+
+
+
+
diff --git a/frontend/src/pages/admin/sms-settings/[id].vue b/frontend/src/pages/admin/sms-settings/[id].vue
new file mode 100644
index 0000000..a09b2a3
--- /dev/null
+++ b/frontend/src/pages/admin/sms-settings/[id].vue
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 基本配置
+
+ 修改短信服务的基本信息
+
+
+
+
+
+ 配置名称 *
+
+
+
+
+
+
+ 短信类型 *
+
+
+
+
+
+
+
+
+
+ {{ type.label }}
+
+
+
+
+
+
+
+
+
配置信息
+
+
+ JSON格式的配置信息,根据所选短信服务商填写对应参数
+
+
+
+
+ 备注
+
+
+
+
+
+
+ 启用状态
+
+
+ 启用后该短信配置可用于发送短信
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 预览
+
+
+
+
+
+ 配置名称
+ {{ formData.name || '-' }}
+
+
+ 短信类型
+ {{ selectedType?.label || '-' }}
+
+
+ 状态
+ {{ formData.status === 'active' ? '启用' : '禁用' }}
+
+
+ 备注
+ {{ formData.remark || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+ 保存修改
+
+
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/admin/sms-settings/components/columns.ts b/frontend/src/pages/admin/sms-settings/components/columns.ts
new file mode 100644
index 0000000..b4f8a4b
--- /dev/null
+++ b/frontend/src/pages/admin/sms-settings/components/columns.ts
@@ -0,0 +1,113 @@
+import type { ColumnDef } from '@tanstack/vue-table'
+
+import { Icon } from '@iconify/vue'
+import { h } from 'vue'
+
+import type { SmsConfig } from '@/pages/admin/sms-settings/data/schema'
+
+import Badge from '@/components/ui/badge/Badge.vue'
+import Button from '@/components/ui/button/Button.vue'
+
+interface ColumnOptions {
+ onToggleStatus: (row: SmsConfig) => void
+ onEdit: (row: SmsConfig) => void
+ onDelete: (row: SmsConfig) => void
+ onTest: (row: SmsConfig) => void
+}
+
+export function getColumns(options: ColumnOptions, t: (key: string) => string): ColumnDef
[] {
+ return [
+ {
+ accessorKey: 'name',
+ header: () => '配置名称',
+ cell: ({ row }) => {
+ return h('div', { class: 'flex items-center gap-2' }, [
+ h(Icon, { icon: 'lucide:smartphone', class: 'h-4 w-4 text-muted-foreground' }),
+ h('span', { class: 'font-medium' }, row.original.name),
+ ])
+ },
+ },
+ {
+ accessorKey: 'type',
+ header: () => '类型',
+ cell: ({ row }) => {
+ const typeLabels: Record = {
+ aliyun: '阿里云',
+ tencent: '腾讯云',
+ other: '其他',
+ }
+ const typeIcons: Record = {
+ aliyun: 'lucide:cloud',
+ tencent: 'lucide:cloud',
+ other: 'lucide:settings',
+ }
+ return h('div', { class: 'flex items-center gap-2' }, [
+ h(Icon, { icon: typeIcons[row.original.type] || 'lucide:settings', class: 'h-4 w-4 text-muted-foreground' }),
+ h('span', { class: 'text-sm' }, typeLabels[row.original.type] || row.original.type),
+ ])
+ },
+ },
+ {
+ accessorKey: 'status',
+ header: () => '状态',
+ cell: ({ row }) => {
+ const statusLabels: Record = {
+ active: '启用',
+ inactive: '禁用',
+ }
+ const statusClasses: Record = {
+ active: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400 cursor-pointer',
+ inactive: 'bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400 cursor-pointer',
+ }
+ return h(Badge, {
+ class: statusClasses[row.original.status],
+ onClick: () => options.onToggleStatus(row.original),
+ }, () => statusLabels[row.original.status])
+ },
+ },
+ {
+ accessorKey: 'remark',
+ header: () => '备注',
+ cell: ({ row }) => {
+ return h('span', { class: 'text-sm text-muted-foreground' }, row.original.remark || '-')
+ },
+ },
+ {
+ accessorKey: 'created_at',
+ header: () => '创建时间',
+ cell: ({ row }) => {
+ return h('span', { class: 'text-sm text-muted-foreground' }, new Date(row.original.created_at).toLocaleString('zh-CN'))
+ },
+ },
+ {
+ id: 'actions',
+ header: () => '操作',
+ cell: ({ row }) => {
+ return h('div', { class: 'flex items-center justify-end gap-1' }, [
+ h(Button, {
+ variant: 'ghost',
+ size: 'sm',
+ title: '测试发送',
+ onClick: () => options.onTest(row.original),
+ }, () => [
+ h(Icon, { icon: 'lucide:send', class: 'h-4 w-4 text-blue-500' }),
+ ]),
+ h(Button, {
+ variant: 'ghost',
+ size: 'sm',
+ onClick: () => options.onEdit(row.original),
+ }, () => [
+ h(Icon, { icon: 'lucide:edit', class: 'h-4 w-4' }),
+ ]),
+ h(Button, {
+ variant: 'ghost',
+ size: 'sm',
+ onClick: () => options.onDelete(row.original),
+ }, () => [
+ h(Icon, { icon: 'lucide:trash-2', class: 'h-4 w-4 text-destructive' }),
+ ]),
+ ])
+ },
+ },
+ ]
+}
diff --git a/frontend/src/pages/admin/sms-settings/components/data-table.vue b/frontend/src/pages/admin/sms-settings/components/data-table.vue
new file mode 100644
index 0000000..66376b2
--- /dev/null
+++ b/frontend/src/pages/admin/sms-settings/components/data-table.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ 批量启用
+
+
+ 批量禁用
+
+
+ 批量删除
+
+
+
+
+ 共 {{ data.length }} 个短信配置
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/admin/sms-settings/create.vue b/frontend/src/pages/admin/sms-settings/create.vue
new file mode 100644
index 0000000..e395752
--- /dev/null
+++ b/frontend/src/pages/admin/sms-settings/create.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
+ 基本配置
+
+ 填写短信服务的基本信息
+
+
+
+
+
+ 配置名称 *
+
+
+
+
+
+
+ 短信类型 *
+
+
+
+
+
+
+
+
+
+ {{ type.label }}
+
+
+
+
+
+
+
+
+
配置信息
+
+
+ JSON格式的配置信息,根据所选短信服务商填写对应参数
+
+
+
+
+ 备注
+
+
+
+
+
+
+ 启用状态
+
+
+ 启用后该短信配置可用于发送短信
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 预览
+
+
+
+
+
+ 配置名称
+ {{ formData.name || '-' }}
+
+
+ 短信类型
+ {{ selectedType?.label || '-' }}
+
+
+ 状态
+ {{ formData.status === 'active' ? '启用' : '禁用' }}
+
+
+ 备注
+ {{ formData.remark || '-' }}
+
+
+
+
+
+
+
+
+
+
+
+ 添加配置
+
+
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/admin/sms-settings/data/schema.ts b/frontend/src/pages/admin/sms-settings/data/schema.ts
new file mode 100644
index 0000000..f5adba6
--- /dev/null
+++ b/frontend/src/pages/admin/sms-settings/data/schema.ts
@@ -0,0 +1,18 @@
+import { z } from 'zod'
+
+export const smsConfigStatusSchema = z.enum(['active', 'inactive'])
+
+export const smsConfigTypeSchema = z.enum(['aliyun', 'tencent', 'other'])
+
+export const smsConfigSchema = z.object({
+ id: z.number(),
+ name: z.string(),
+ type: smsConfigTypeSchema,
+ config: z.string(),
+ status: smsConfigStatusSchema,
+ remark: z.string().optional(),
+ created_at: z.string(),
+ updated_at: z.string(),
+})
+
+export type SmsConfig = z.infer
diff --git a/frontend/src/pages/admin/sms-settings/index.vue b/frontend/src/pages/admin/sms-settings/index.vue
new file mode 100644
index 0000000..ed5813b
--- /dev/null
+++ b/frontend/src/pages/admin/sms-settings/index.vue
@@ -0,0 +1,308 @@
+
+
+
+
+
+
+
+ 添加配置
+
+
+
+
+
+
+
+
+ 总配置数
+
+
+
+
+
+ {{ smsConfigs.length }}
+
+
+
+
+
+
+
+ 已启用
+
+
+
+
+
+ {{ activeCount }}
+
+
+
+
+
+
+
+ 已禁用
+
+
+
+
+
+ {{ inactiveCount }}
+
+
+
+
+
+
+
+ 启用率
+
+
+
+
+
+ {{ smsConfigs.length ? Math.round(activeCount / smsConfigs.length * 100) : 0 }}%
+
+
+
+
+
+
+
+ r.original.status === 'inactive').map((r: any) => r.original.id) || [], 'active')"
+ @batch-disable="batchToggleStatus(tableRef?.table?.getSelectedRowModel().rows.filter((r: any) => r.original.status === 'active').map((r: any) => r.original.id) || [], 'inactive')"
+ @batch-delete="confirmBatchDelete(tableRef?.table?.getSelectedRowModel().rows.map((r: any) => r.original.id) || [])"
+ />
+
+
+
+
+
+
+ 删除短信配置
+
+
+ 确定要删除短信配置"{{ deleteTarget?.name }}"吗?此操作不可撤销。
+
+
+
+
+
+ 批量删除短信配置
+
+
+ 确定要删除选中的 {{ batchDeleteIds.length }} 个短信配置吗?此操作不可撤销。
+
+
+
+
+
+
+ 发送测试短信
+
+ 将使用"{{ testTarget?.name }}"配置发送测试短信
+
+
+
+
+
+ 取消
+
+
+
+
+ 发送
+
+
+
+
+
+
diff --git a/frontend/src/router/routes.ts b/frontend/src/router/routes.ts
index 80528e0..e44bed6 100644
--- a/frontend/src/router/routes.ts
+++ b/frontend/src/router/routes.ts
@@ -62,12 +62,6 @@ const routes: RouteRecordRaw[] = [
component: () => import('@/pages/admin/applications/[id]/security.vue'),
meta: { title: '安全设置 - 管理后台' },
},
- {
- path: 'applications/:id/email',
- name: 'AdminApplicationEmail',
- component: () => import('@/pages/admin/applications/[id]/email.vue'),
- meta: { title: '邮箱设置 - 管理后台' },
- },
{
path: 'cards',
name: 'AdminCards',
@@ -386,6 +380,24 @@ const routes: RouteRecordRaw[] = [
component: () => import('@/pages/admin/email-settings/[id].vue'),
meta: { title: '编辑邮箱配置 - 管理后台' },
},
+ {
+ path: 'sms-settings',
+ name: 'AdminSmsSettings',
+ component: () => import('@/pages/admin/sms-settings/index.vue'),
+ meta: { title: '短信配置 - 管理后台' },
+ },
+ {
+ path: 'sms-settings/create',
+ name: 'AdminSmsSettingCreate',
+ component: () => import('@/pages/admin/sms-settings/create.vue'),
+ meta: { title: '添加短信配置 - 管理后台' },
+ },
+ {
+ path: 'sms-settings/:id',
+ name: 'AdminSmsSettingEdit',
+ component: () => import('@/pages/admin/sms-settings/[id].vue'),
+ meta: { title: '编辑短信配置 - 管理后台' },
+ },
{
path: 'storage-configs',
name: 'AdminStorageConfigs',
diff --git a/frontend/src/types/route-map.d.ts b/frontend/src/types/route-map.d.ts
index 3c5a40f..61a1c97 100644
--- a/frontend/src/types/route-map.d.ts
+++ b/frontend/src/types/route-map.d.ts
@@ -133,18 +133,10 @@ declare module 'vue-router/auto-routes' {
'/admin/applications',
Record,
Record,
- | '/admin/applications/[id]/email'
| '/admin/applications/[id]/security'
| '/admin/applications/[id]/settings'
| '/admin/applications/create'
>,
- '/admin/applications/[id]/email': RouteRecordInfo<
- '/admin/applications/[id]/email',
- '/admin/applications/:id/email',
- { id: ParamValue },
- { id: ParamValue },
- | never
- >,
'/admin/applications/[id]/security': RouteRecordInfo<
'/admin/applications/[id]/security',
'/admin/applications/:id/security',
@@ -399,6 +391,27 @@ declare module 'vue-router/auto-routes' {
Record,
| never
>,
+ '/admin/sms-settings/': RouteRecordInfo<
+ '/admin/sms-settings/',
+ '/admin/sms-settings',
+ Record,
+ Record,
+ | never
+ >,
+ '/admin/sms-settings/[id]': RouteRecordInfo<
+ '/admin/sms-settings/[id]',
+ '/admin/sms-settings/:id',
+ { id: ParamValue },
+ { id: ParamValue },
+ | never
+ >,
+ '/admin/sms-settings/create': RouteRecordInfo<
+ '/admin/sms-settings/create',
+ '/admin/sms-settings/create',
+ Record,
+ Record,
+ | never
+ >,
'/admin/storage-configs/': RouteRecordInfo<
'/admin/storage-configs/',
'/admin/storage-configs',
@@ -715,19 +728,12 @@ declare module 'vue-router/auto-routes' {
'src/pages/admin/applications.vue': {
routes:
| '/admin/applications'
- | '/admin/applications/[id]/email'
| '/admin/applications/[id]/security'
| '/admin/applications/[id]/settings'
| '/admin/applications/create'
views:
| 'default'
}
- 'src/pages/admin/applications/[id]/email.vue': {
- routes:
- | '/admin/applications/[id]/email'
- views:
- | never
- }
'src/pages/admin/applications/[id]/security.vue': {
routes:
| '/admin/applications/[id]/security'
@@ -949,6 +955,24 @@ declare module 'vue-router/auto-routes' {
views:
| never
}
+ 'src/pages/admin/sms-settings/index.vue': {
+ routes:
+ | '/admin/sms-settings/'
+ views:
+ | never
+ }
+ 'src/pages/admin/sms-settings/[id].vue': {
+ routes:
+ | '/admin/sms-settings/[id]'
+ views:
+ | never
+ }
+ 'src/pages/admin/sms-settings/create.vue': {
+ routes:
+ | '/admin/sms-settings/create'
+ views:
+ | never
+ }
'src/pages/admin/storage-configs/index.vue': {
routes:
| '/admin/storage-configs/'