|
|
@@ -0,0 +1,129 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import { onMounted, reactive, ref } from 'vue'
|
|
|
+import { useMetaStore } from '../store'
|
|
|
+import { getMetaController } from '../api/meta-controller'
|
|
|
+import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
|
|
|
+
|
|
|
+const activeTab = ref('basic')
|
|
|
+const formRef = ref<FormInstance>()
|
|
|
+
|
|
|
+const { websiteMeta } = useMetaStore()
|
|
|
+
|
|
|
+const form = reactive({
|
|
|
+ title: '',
|
|
|
+ logo: '',
|
|
|
+ statement: '',
|
|
|
+ announcement: '',
|
|
|
+})
|
|
|
+
|
|
|
+const rules: FormRules = {
|
|
|
+ title: [
|
|
|
+ { max: 200, message: '网站标题不能超过 200 个字符', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+ logo: [
|
|
|
+ { max: 500, message: 'Logo URL 不能超过 500 个字符', trigger: 'blur' },
|
|
|
+ {
|
|
|
+ pattern: /^(https?):\/\/[^\s$.?#].[^\s]*$/,
|
|
|
+ message: '请输入正确的 URL 格式',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ statement: [
|
|
|
+ { max: 500, message: '网站声明不能超过 500 个字符', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+ announcement: [
|
|
|
+ { max: 500, message: '网站公告不能超过 500 个字符', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ form.title = websiteMeta.title
|
|
|
+ form.logo = websiteMeta.logo
|
|
|
+ form.statement = websiteMeta.statement
|
|
|
+ form.announcement = websiteMeta.announcement
|
|
|
+})
|
|
|
+
|
|
|
+const handleUpload = () => {
|
|
|
+ ElMessage.info('图片上传功能待实现')
|
|
|
+}
|
|
|
+
|
|
|
+const handleSubmit = async () => {
|
|
|
+ const valid = await formRef.value?.validate().catch(() => false)
|
|
|
+ if (!valid) return
|
|
|
+ try {
|
|
|
+ await getMetaController().updateWebsiteMeta({
|
|
|
+ title: form.title,
|
|
|
+ logo: form.logo,
|
|
|
+ announcement: form.announcement,
|
|
|
+ statement: form.statement,
|
|
|
+ })
|
|
|
+ websiteMeta.title = form.title
|
|
|
+ websiteMeta.logo = form.logo
|
|
|
+ websiteMeta.statement = form.statement
|
|
|
+ websiteMeta.announcement = form.announcement
|
|
|
+ ElMessage.success('保存成功')
|
|
|
+ } catch {
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <div class="site-settings">
|
|
|
+<!-- <h2>网站设置</h2>-->
|
|
|
+ <el-tabs v-model="activeTab" class="tabs">
|
|
|
+ <el-tab-pane label="网站基础信息" name="basic">
|
|
|
+ <el-form ref="formRef" :model="form" :rules="rules" label-width="120px" class="form">
|
|
|
+ <el-form-item label="网站标题" prop="title">
|
|
|
+ <el-input v-model="form.title" placeholder="请输入网站标题" maxlength="200" show-word-limit />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="网站Logo" prop="logo">
|
|
|
+ <el-input v-model="form.logo" placeholder="Logo URL" maxlength="500">
|
|
|
+ <template #append>
|
|
|
+ <el-button @click="handleUpload">上传</el-button>
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ <div v-if="form.logo" class="logo-preview">
|
|
|
+ <img :src="form.logo" alt="logo preview">
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="网站声明" prop="statement">
|
|
|
+ <el-input v-model="form.statement" type="textarea" :rows="3" placeholder="请输入网站声明" maxlength="500" show-word-limit />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="网站公告" prop="announcement">
|
|
|
+ <el-input v-model="form.announcement" type="textarea" :rows="3" placeholder="请输入网站公告" maxlength="500" show-word-limit />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" @click="handleSubmit">保存</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.site-settings {
|
|
|
+ padding: 20px;
|
|
|
+}
|
|
|
+.site-settings h2 {
|
|
|
+ margin: 0 0 20px;
|
|
|
+ font-size: 18px;
|
|
|
+}
|
|
|
+.tabs {
|
|
|
+ max-width: 700px;
|
|
|
+}
|
|
|
+.form {
|
|
|
+ margin-top: 20px;
|
|
|
+ max-width: 600px;
|
|
|
+}
|
|
|
+.logo-preview {
|
|
|
+ margin-top: 8px;
|
|
|
+}
|
|
|
+.logo-preview img {
|
|
|
+ max-width: 200px;
|
|
|
+ max-height: 80px;
|
|
|
+ border: 1px solid #dcdfe6;
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+</style>
|