340 lines
13 KiB
Vue
Raw Permalink Normal View History

2025-06-26 11:24:11 +08:00
<template>
<div class="space-y-8">
<!-- 页面头部 -->
<div>
<h1 class="text-2xl font-bold text-gray-900">系统设置</h1>
<p class="mt-1 text-sm text-gray-600">管理系统的基本配置和参数</p>
</div>
<!-- 基本设置 -->
<div class="bg-white shadow rounded-lg">
<div class="px-4 py-5 sm:p-6">
<h3 class="text-lg leading-6 font-medium text-gray-900 mb-4">基本设置</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">系统名称</label>
<input
v-model="settings.systemName"
type="text"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入系统名称"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">系统描述</label>
<input
v-model="settings.systemDescription"
type="text"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入系统描述"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">管理员邮箱</label>
<input
v-model="settings.adminEmail"
type="email"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入管理员邮箱"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">联系电话</label>
<input
v-model="settings.contactPhone"
type="tel"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入联系电话"
/>
</div>
</div>
</div>
</div>
<!-- 翻译设置 -->
<div class="bg-white shadow rounded-lg">
<div class="px-4 py-5 sm:p-6">
<h3 class="text-lg leading-6 font-medium text-gray-900 mb-4">翻译设置</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">默认翻译费率/</label>
<input
v-model.number="settings.defaultRate"
type="number"
step="0.01"
min="0"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入默认费率"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">最低充值金额</label>
<input
v-model.number="settings.minRecharge"
type="number"
step="0.01"
min="0"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入最低充值金额"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">支持的语言对</label>
<select
v-model="settings.supportedLanguages"
multiple
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="zh-en">中文-英文</option>
<option value="zh-ja">中文-日文</option>
<option value="zh-ko">中文-韩文</option>
<option value="en-ja">英文-日文</option>
<option value="en-ko">英文-韩文</option>
<option value="ja-ko">日文-韩文</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">质量等级</label>
<select
v-model="settings.qualityLevel"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="standard">标准</option>
<option value="professional">专业</option>
<option value="premium">高级</option>
</select>
</div>
</div>
</div>
</div>
<!-- 用户管理设置 -->
<div class="bg-white shadow rounded-lg">
<div class="px-4 py-5 sm:p-6">
<h3 class="text-lg leading-6 font-medium text-gray-900 mb-4">用户管理设置</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">新用户默认余额</label>
<input
v-model.number="settings.defaultBalance"
type="number"
step="0.01"
min="0"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入默认余额"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">用户注册审核</label>
<select
v-model="settings.registrationApproval"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="auto">自动通过</option>
<option value="manual">手动审核</option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">会话超时时间分钟</label>
<input
v-model.number="settings.sessionTimeout"
type="number"
min="1"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入超时时间"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">密码最小长度</label>
<input
v-model.number="settings.minPasswordLength"
type="number"
min="6"
max="20"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="请输入最小长度"
/>
</div>
</div>
</div>
</div>
<!-- 系统维护 -->
<div class="bg-white shadow rounded-lg">
<div class="px-4 py-5 sm:p-6">
<h3 class="text-lg leading-6 font-medium text-gray-900 mb-4">系统维护</h3>
<div class="space-y-4">
<div class="flex items-center justify-between">
<div>
<h4 class="text-sm font-medium text-gray-900">维护模式</h4>
<p class="text-sm text-gray-500">启用后系统将进入维护状态</p>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input
v-model="settings.maintenanceMode"
type="checkbox"
class="sr-only peer"
/>
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"></div>
</label>
</div>
<div class="flex items-center justify-between">
<div>
<h4 class="text-sm font-medium text-gray-900">自动备份</h4>
<p class="text-sm text-gray-500">每日自动备份数据库</p>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input
v-model="settings.autoBackup"
type="checkbox"
class="sr-only peer"
/>
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"></div>
</label>
</div>
<div class="flex items-center justify-between">
<div>
<h4 class="text-sm font-medium text-gray-900">邮件通知</h4>
<p class="text-sm text-gray-500">系统事件邮件提醒</p>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input
v-model="settings.emailNotifications"
type="checkbox"
class="sr-only peer"
/>
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"></div>
</label>
</div>
</div>
</div>
</div>
<!-- 保存按钮 -->
<div class="flex justify-end space-x-3">
<button
@click="resetSettings"
class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50"
>
重置
</button>
<button
@click="saveSettings"
:disabled="saving"
class="px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 disabled:opacity-50"
>
{{ saving ? '保存中...' : '保存设置' }}
</button>
</div>
</div>
</template>
<script setup>
// 页面元数据 - 确保使用默认布局
definePageMeta({
middleware: 'auth',
layout: 'default' // 明确指定使用默认布局
})
// 页面标题
useHead({
title: '系统设置 - 翻译管理系统'
})
// 响应式数据
const saving = ref(false)
// 设置数据
const settings = ref({
// 基本设置
systemName: '翻译管理系统',
systemDescription: '专业的翻译服务管理平台',
adminEmail: 'admin@system.com',
contactPhone: '400-123-4567',
// 翻译设置
defaultRate: 0.15,
minRecharge: 100,
supportedLanguages: ['zh-en', 'zh-ja'],
qualityLevel: 'professional',
// 用户管理设置
defaultBalance: 0,
registrationApproval: 'auto',
sessionTimeout: 30,
minPasswordLength: 8,
// 系统维护
maintenanceMode: false,
autoBackup: true,
emailNotifications: true
})
// 默认设置(用于重置)
const defaultSettings = {
systemName: '翻译管理系统',
systemDescription: '专业的翻译服务管理平台',
adminEmail: 'admin@system.com',
contactPhone: '400-123-4567',
defaultRate: 0.15,
minRecharge: 100,
supportedLanguages: ['zh-en', 'zh-ja'],
qualityLevel: 'professional',
defaultBalance: 0,
registrationApproval: 'auto',
sessionTimeout: 30,
minPasswordLength: 8,
maintenanceMode: false,
autoBackup: true,
emailNotifications: true
}
// 保存设置
const saveSettings = () => {
try {
if (process.client) {
localStorage.setItem('systemSettings', JSON.stringify(settings.value))
}
ElMessage.success('设置保存成功')
console.log('设置已保存:', settings.value)
} catch (error) {
console.error('保存设置失败:', error)
ElMessage.error('保存设置失败')
}
}
// 加载设置
const loadSettings = () => {
try {
if (process.client) {
const savedSettings = localStorage.getItem('systemSettings')
if (savedSettings) {
const parsed = JSON.parse(savedSettings)
settings.value = { ...settings.value, ...parsed }
console.log('设置已加载:', settings.value)
}
}
} catch (error) {
console.error('加载设置失败:', error)
}
}
// 重置设置
const resetSettings = () => {
if (confirm('确定要重置所有设置到默认值吗?')) {
settings.value = { ...defaultSettings }
}
}
// 组件挂载时加载设置
onMounted(() => {
if (process.client) {
loadSettings()
}
})
</script>