前端代码

This commit is contained in:
2026-08-13 22:35:13 +08:00
parent 9044bafdff
commit f1a0b17bb0
412 changed files with 36769 additions and 6617 deletions
+140
View File
@@ -0,0 +1,140 @@
<template>
<div class="kra-table-box config-layout">
<div class="flex items-center justify-between mb-5">
<div>
<h2 class="text-xl font-semibold">系统配置</h2>
<p class="text-sm text-gray-500 mt-1">管理 Kra 后台运行参数和邮件服务。</p>
</div>
<div class="flex gap-2">
<el-button @click="reload">重载服务</el-button>
<el-button type="primary" :loading="saving" @click="update">保存配置</el-button>
</div>
</div>
<el-tabs v-model="activeKey">
<el-tab-pane label="基础设置" name="basic">
<el-form label-position="top" class="grid grid-cols-1 md:grid-cols-2 gap-x-5">
<el-form-item label="路由前缀">
<el-input v-model.trim="config.admin.routerPrefix" placeholder="例如 /api;留空表示无前缀" />
</el-form-item>
<el-form-item label="JWT 签发者">
<el-input v-model.trim="config.admin.jwt.issuer" />
</el-form-item>
<el-form-item label="JWT 签名密钥">
<el-input v-model="config.admin.jwt.signingKey" show-password />
</el-form-item>
<el-form-item label="本地文件目录">
<el-input v-model.trim="config.admin.local.storePath" />
</el-form-item>
<el-form-item label="文件访问前缀">
<el-input v-model.trim="config.admin.local.pathPrefix" />
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="邮件设置" name="email">
<el-form label-position="top" class="grid grid-cols-1 md:grid-cols-2 gap-x-5">
<el-form-item label="默认收件人">
<el-input v-model.trim="config.email.to" placeholder="多个地址用英文逗号分隔" />
</el-form-item>
<el-form-item label="发件人">
<el-input v-model.trim="config.email.from" />
</el-form-item>
<el-form-item label="SMTP 主机">
<el-input v-model.trim="config.email.host" />
</el-form-item>
<el-form-item label="SMTP 端口">
<el-input-number v-model="config.email.port" :min="1" :max="65535" class="!w-full" />
</el-form-item>
<el-form-item label="SMTP 密钥">
<el-input v-model="config.email.secret" show-password />
</el-form-item>
<el-form-item label="发件人昵称">
<el-input v-model.trim="config.email.nickname" />
</el-form-item>
<el-form-item label="连接方式">
<div class="flex gap-5">
<el-switch v-model="config.email['is-ssl']" active-text="SSL" />
<el-switch v-model="config.email['is-loginauth']" active-text="LOGIN 认证" />
</div>
</el-form-item>
<el-form-item label="连通性测试">
<el-button :loading="testing" @click="testEmail">发送测试邮件</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getSystemConfig, reloadSystem, setSystemConfig } from '@/api/system'
import { emailTest } from '@/api/email'
defineOptions({ name: 'Config' })
const activeKey = ref('basic')
const saving = ref(false)
const testing = ref(false)
const config = ref({
admin: {
routerPrefix: '',
jwt: { signingKey: '******', issuer: 'kra' },
local: { storePath: 'uploads/file', pathPrefix: 'uploads/file' }
},
email: {
to: '', from: '', host: '', secret: '******', nickname: '', port: 465,
'is-ssl': true, 'is-loginauth': false
}
})
const initForm = async () => {
const res = await getSystemConfig()
if (res.code === 0) {
config.value = {
admin: { ...config.value.admin, ...res.data.config.admin,
jwt: { ...config.value.admin.jwt, ...res.data.config.admin?.jwt },
local: { ...config.value.admin.local, ...res.data.config.admin?.local }
},
email: { ...config.value.email, ...res.data.config.email }
}
}
}
const update = async () => {
saving.value = true
try {
const res = await setSystemConfig({ config: config.value })
if (res.code === 0) {
ElMessage.success('配置保存成功')
await initForm()
}
} finally {
saving.value = false
}
}
const reload = async () => {
await ElMessageBox.confirm('确定要重载服务配置吗?', '提示')
const res = await reloadSystem()
if (res.code === 0) ElMessage.success('配置已重载')
}
const testEmail = async () => {
testing.value = true
try {
const res = await emailTest()
if (res.code === 0) ElMessage.success('测试邮件发送成功')
} finally {
testing.value = false
}
}
initForm()
</script>
<style scoped>
.config-layout { min-height: 520px; }
</style>