mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 11:29:37 +08:00
refactor: 自动转存功能重构
This commit is contained in:
12
README.md
12
README.md
@@ -31,19 +31,15 @@
|
||||
|
||||
## 🔔 温馨提示
|
||||
|
||||
📌 **本项目仅供技术交流与学习使用**,自身不存储或提供任何资源文件及下载链接。
|
||||
|
||||
📌 **请勿将本项目用于任何违法用途**,否则后果自负。
|
||||
|
||||
📌 如有任何问题或建议,欢迎交流探讨! 😊
|
||||
|
||||
> **免责声明**:本项目由 Trae AI 辅助编写。由于时间有限,仅在空闲时维护。如遇使用问题,请优先自行排查,感谢理解!
|
||||
- [文档说明](https://ecn5khs4t956.feishu.cn/wiki/PsnDwtxghiP0mLkTiruczKtxnwd?from=from_copylink)
|
||||
- [服务器要求](https://ecn5khs4t956.feishu.cn/wiki/W8YBww1Mmiu4Cdkp5W4c8pFNnMf?from=from_copylink)
|
||||
- [QQ机器人](https://github.com/ctwj/astrbot_plugin_urldb)
|
||||
|
||||
---
|
||||
|
||||
## 📸 项目截图
|
||||
|
||||
[文档说明](https://ecn5khs4t956.feishu.cn/wiki/PsnDwtxghiP0mLkTiruczKtxnwd?from=from_copylink) [服务器要求](https://ecn5khs4t956.feishu.cn/wiki/W8YBww1Mmiu4Cdkp5W4c8pFNnMf?from=from_copylink)
|
||||
|
||||
|
||||
### 🏠 首页
|
||||

|
||||
|
||||
@@ -61,12 +61,6 @@ func (h *SystemConfigHandler) UpdateConfig(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// 验证自动转存配置
|
||||
if req.AutoTransferLimitDays > 0 && (req.AutoTransferLimitDays < 0 || req.AutoTransferLimitDays > 365) {
|
||||
ErrorResponse(c, "自动转存限制天数必须在0-365之间", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
if req.AutoTransferMinSpace > 0 && (req.AutoTransferMinSpace < 100 || req.AutoTransferMinSpace > 1024) {
|
||||
ErrorResponse(c, "最小存储空间必须在100-1024GB之间", http.StatusBadRequest)
|
||||
return
|
||||
|
||||
18
main.go
18
main.go
@@ -111,15 +111,15 @@ func main() {
|
||||
utils.Info("系统配置中自动拉取热播剧功能已禁用,跳过启动定时任务")
|
||||
}
|
||||
|
||||
autoTransferEnabled, err := repoManager.SystemConfigRepository.GetConfigBool(entity.ConfigKeyAutoTransferEnabled)
|
||||
if err != nil {
|
||||
utils.Error("获取自动转存配置失败: %v", err)
|
||||
} else if autoTransferEnabled {
|
||||
scheduler.StartAutoTransferScheduler()
|
||||
utils.Info("已启动自动转存任务")
|
||||
} else {
|
||||
utils.Info("系统配置中自动转存功能已禁用,跳过启动定时任务")
|
||||
}
|
||||
// autoTransferEnabled, err := repoManager.SystemConfigRepository.GetConfigBool(entity.ConfigKeyAutoTransferEnabled)
|
||||
// if err != nil {
|
||||
// utils.Error("获取自动转存配置失败: %v", err)
|
||||
// } else if autoTransferEnabled {
|
||||
// scheduler.StartAutoTransferScheduler()
|
||||
// utils.Info("已启动自动转存任务")
|
||||
// } else {
|
||||
// utils.Info("系统配置中自动转存功能已禁用,跳过启动定时任务")
|
||||
// }
|
||||
|
||||
// 创建Gin实例
|
||||
r := gin.Default()
|
||||
|
||||
@@ -33,6 +33,10 @@ func NewAutoTransferScheduler(base *BaseScheduler) *AutoTransferScheduler {
|
||||
|
||||
// Start 启动自动转存定时任务
|
||||
func (a *AutoTransferScheduler) Start() {
|
||||
|
||||
// 自动转存已经放弃,不再自动缓存
|
||||
return
|
||||
|
||||
if a.autoTransferRunning {
|
||||
utils.Info("自动转存定时任务已在运行中")
|
||||
return
|
||||
|
||||
1138
utils/scheduler.go
1138
utils/scheduler.go
File diff suppressed because it is too large
Load Diff
@@ -452,10 +452,10 @@ const operationItems = ref([
|
||||
active: (route: any) => route.path.startsWith('/admin/data-push')
|
||||
},
|
||||
{
|
||||
to: '/admin/bot',
|
||||
label: '机器人',
|
||||
icon: 'fas fa-robot',
|
||||
active: (route: any) => route.path.startsWith('/admin/bot')
|
||||
to: '/admin/auto-reply',
|
||||
label: '自动回复',
|
||||
icon: 'fas fa-comments',
|
||||
active: (route: any) => route.path.startsWith('/admin/auto-reply')
|
||||
},
|
||||
{
|
||||
to: '/admin/seo',
|
||||
@@ -490,7 +490,7 @@ const autoExpandCurrentGroup = () => {
|
||||
expandedGroups.value.dataManagement = true
|
||||
} else if (currentPath.startsWith('/admin/site-config') || currentPath.startsWith('/admin/feature-config') || currentPath.startsWith('/admin/dev-config') || currentPath.startsWith('/admin/users') || currentPath.startsWith('/admin/version')) {
|
||||
expandedGroups.value.systemConfig = true
|
||||
} else if (currentPath.startsWith('/admin/data-transfer') || currentPath.startsWith('/admin/seo') || currentPath.startsWith('/admin/data-push') || currentPath.startsWith('/admin/bot')) {
|
||||
} else if (currentPath.startsWith('/admin/data-transfer') || currentPath.startsWith('/admin/seo') || currentPath.startsWith('/admin/data-push') || currentPath.startsWith('/admin/auto-reply')) {
|
||||
expandedGroups.value.operation = true
|
||||
} else if (currentPath.startsWith('/admin/search-stats') || currentPath.startsWith('/admin/third-party-stats')) {
|
||||
expandedGroups.value.statistics = true
|
||||
@@ -512,7 +512,7 @@ watch(() => useRoute().path, (newPath) => {
|
||||
expandedGroups.value.dataManagement = true
|
||||
} else if (newPath.startsWith('/admin/site-config') || newPath.startsWith('/admin/feature-config') || newPath.startsWith('/admin/dev-config') || newPath.startsWith('/admin/users') || newPath.startsWith('/admin/version')) {
|
||||
expandedGroups.value.systemConfig = true
|
||||
} else if (newPath.startsWith('/admin/data-transfer') || newPath.startsWith('/admin/seo') || newPath.startsWith('/admin/data-push') || newPath.startsWith('/admin/bot')) {
|
||||
} else if (newPath.startsWith('/admin/data-transfer') || newPath.startsWith('/admin/seo') || newPath.startsWith('/admin/data-push') || newPath.startsWith('/admin/auto-reply')) {
|
||||
expandedGroups.value.operation = true
|
||||
} else if (newPath.startsWith('/admin/search-stats') || newPath.startsWith('/admin/third-party-stats')) {
|
||||
expandedGroups.value.statistics = true
|
||||
|
||||
201
web/pages/admin/auto-reply.vue
Normal file
201
web/pages/admin/auto-reply.vue
Normal file
@@ -0,0 +1,201 @@
|
||||
<template>
|
||||
<div class="space-y-6">
|
||||
<!-- 页面标题 -->
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold text-gray-900 dark:text-white">自动回复</h1>
|
||||
<p class="text-gray-600 dark:text-gray-400">管理各平台的自动回复配置</p>
|
||||
</div>
|
||||
<n-button type="primary" @click="saveConfig" :loading="saving">
|
||||
<template #icon>
|
||||
<i class="fas fa-save"></i>
|
||||
</template>
|
||||
保存配置
|
||||
</n-button>
|
||||
</div>
|
||||
|
||||
<!-- 配置表单 -->
|
||||
<n-card>
|
||||
<!-- 顶部Tabs -->
|
||||
<n-tabs
|
||||
v-model:value="activeTab"
|
||||
type="line"
|
||||
animated
|
||||
class="mb-6"
|
||||
>
|
||||
<n-tab-pane name="qq" tab="QQ机器人">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- QQ机器人配置占位符 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">QQ机器人开关</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启QQ机器人自动回复功能</span>
|
||||
</div>
|
||||
<n-switch v-model:value="configForm.qq_bot_enabled" />
|
||||
</div>
|
||||
|
||||
<!-- 占位符内容 -->
|
||||
<div class="p-8 text-center text-gray-500 dark:text-gray-400">
|
||||
<i class="fas fa-cog text-4xl mb-4"></i>
|
||||
<p class="text-lg font-medium mb-2">QQ机器人配置</p>
|
||||
<p class="text-sm">QQ机器人自动回复功能配置区域</p>
|
||||
<p class="text-xs mt-2">具体配置项待开发...</p>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
|
||||
<n-tab-pane name="wechat" tab="微信公众号">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- 微信公众号配置占位符 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">微信公众号开关</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启微信公众号自动回复功能</span>
|
||||
</div>
|
||||
<n-switch v-model:value="configForm.wechat_mp_enabled" />
|
||||
</div>
|
||||
|
||||
<!-- 占位符内容 -->
|
||||
<div class="p-8 text-center text-gray-500 dark:text-gray-400">
|
||||
<i class="fas fa-comment-dots text-4xl mb-4"></i>
|
||||
<p class="text-lg font-medium mb-2">微信公众号配置</p>
|
||||
<p class="text-sm">微信公众号自动回复功能配置区域</p>
|
||||
<p class="text-xs mt-2">具体配置项待开发...</p>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
|
||||
<n-tab-pane name="wechat_open" tab="微信对话开放平台">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- 微信对话开放平台配置占位符 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">微信对话开放平台开关</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启微信对话开放平台自动回复功能</span>
|
||||
</div>
|
||||
<n-switch v-model:value="configForm.wechat_open_enabled" />
|
||||
</div>
|
||||
|
||||
<!-- 占位符内容 -->
|
||||
<div class="p-8 text-center text-gray-500 dark:text-gray-400">
|
||||
<i class="fas fa-comments text-4xl mb-4"></i>
|
||||
<p class="text-lg font-medium mb-2">微信对话开放平台配置</p>
|
||||
<p class="text-sm">微信对话开放平台自动回复功能配置区域</p>
|
||||
<p class="text-xs mt-2">具体配置项待开发...</p>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
</n-tabs>
|
||||
</n-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// 设置页面布局
|
||||
definePageMeta({
|
||||
layout: 'admin',
|
||||
ssr: false
|
||||
})
|
||||
|
||||
const notification = useNotification()
|
||||
const formRef = ref()
|
||||
const saving = ref(false)
|
||||
const activeTab = ref('qq')
|
||||
|
||||
// 配置表单数据
|
||||
const configForm = ref({
|
||||
qq_bot_enabled: false,
|
||||
wechat_mp_enabled: false,
|
||||
wechat_open_enabled: false
|
||||
})
|
||||
|
||||
// 表单验证规则
|
||||
const rules = {
|
||||
// 暂时为空,后续添加验证规则
|
||||
}
|
||||
|
||||
// 获取配置
|
||||
const fetchConfig = async () => {
|
||||
try {
|
||||
// 暂时使用模拟数据
|
||||
configForm.value = {
|
||||
qq_bot_enabled: false,
|
||||
wechat_mp_enabled: false,
|
||||
wechat_open_enabled: false
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取自动回复配置失败:', error)
|
||||
notification.error({
|
||||
content: '获取自动回复配置失败',
|
||||
duration: 3000
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 保存配置
|
||||
const saveConfig = async () => {
|
||||
try {
|
||||
saving.value = true
|
||||
|
||||
// 暂时使用模拟保存
|
||||
await new Promise(resolve => setTimeout(resolve, 1000))
|
||||
|
||||
notification.success({
|
||||
content: '自动回复配置保存成功',
|
||||
duration: 3000
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('保存自动回复配置失败:', error)
|
||||
notification.error({
|
||||
content: '保存自动回复配置失败',
|
||||
duration: 3000
|
||||
})
|
||||
} finally {
|
||||
saving.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 页面加载时获取配置
|
||||
onMounted(() => {
|
||||
fetchConfig()
|
||||
})
|
||||
|
||||
// 设置页面标题
|
||||
useHead({
|
||||
title: '自动回复 - 老九网盘资源数据库'
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
</style>
|
||||
@@ -16,91 +16,141 @@
|
||||
|
||||
<!-- 配置表单 -->
|
||||
<n-card>
|
||||
<!-- 顶部Tabs -->
|
||||
<n-tabs
|
||||
v-model:value="activeTab"
|
||||
type="line"
|
||||
animated
|
||||
class="mb-6"
|
||||
>
|
||||
<n-tab-pane name="resource" tab="资源处理">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- 自动处理 -->
|
||||
<div class="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
|
||||
<div class="flex-1">
|
||||
<h3 class="text-lg font-medium text-gray-900 dark:text-white">
|
||||
待处理资源自动处理
|
||||
</h3>
|
||||
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
|
||||
开启后,系统将自动处理待处理的资源,无需手动操作
|
||||
</p>
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">待处理资源自动处理</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启后,系统将自动处理待处理的资源,无需手动操作</span>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<n-switch v-model:value="configForm.auto_process_enabled" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 自动处理间隔 -->
|
||||
<div v-if="configForm.auto_process_enabled" class="ml-6">
|
||||
<n-form-item label="自动处理间隔 (分钟)" path="auto_process_interval">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">自动处理间隔 (分钟)</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">建议设置 5-60 分钟,避免过于频繁的处理</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.auto_process_interval"
|
||||
type="text"
|
||||
placeholder="30"
|
||||
:disabled="!configForm.auto_process_enabled"
|
||||
/>
|
||||
<template #help>
|
||||
建议设置 5-60 分钟,避免过于频繁的处理
|
||||
</template>
|
||||
</n-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
|
||||
<n-tab-pane name="transfer" tab="转存配置">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- 自动转存 -->
|
||||
<div class="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
|
||||
<div class="flex-1">
|
||||
<h3 class="text-lg font-medium text-gray-900 dark:text-white">
|
||||
自动转存
|
||||
</h3>
|
||||
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
|
||||
开启后,系统将自动转存资源到其他网盘平台
|
||||
</p>
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">自动转存</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启后,访问夸克资源,将自动转存,并提供转存后分享链接</span>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<n-switch v-model:value="configForm.auto_transfer_enabled" />
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- 最小存储空间 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">最小存储空间(GB)</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">当网盘剩余空间小于此值时,停止自动转存(100-1024GB)</span>
|
||||
</div>
|
||||
|
||||
<!-- 自动转存配置 -->
|
||||
<div v-if="configForm.auto_transfer_enabled" class="ml-6 space-y-4">
|
||||
<n-form-item label="自动转存限制(n天内资源)" path="auto_transfer_limit_days">
|
||||
<n-input
|
||||
v-model:value="configForm.auto_transfer_limit_days"
|
||||
type="text"
|
||||
placeholder="30"
|
||||
/>
|
||||
<template #help>
|
||||
只转存指定天数内的资源,0表示不限制时间
|
||||
</template>
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item label="最小存储空间(GB)" path="auto_transfer_min_space">
|
||||
<n-input
|
||||
v-model:value="configForm.auto_transfer_min_space"
|
||||
type="text"
|
||||
placeholder="500"
|
||||
:disabled="!configForm.auto_transfer_enabled"
|
||||
/>
|
||||
<template #help>
|
||||
当网盘剩余空间小于此值时,停止自动转存(100-1024GB)
|
||||
</template>
|
||||
</n-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 热播剧自动获取 -->
|
||||
<div class="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
|
||||
<div class="flex-1">
|
||||
<h3 class="text-lg font-medium text-gray-900 dark:text-white">
|
||||
自动拉取热播剧
|
||||
</h3>
|
||||
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
|
||||
开启后,系统将自动从豆瓣获取热播剧信息
|
||||
</p>
|
||||
<!-- 广告关键词 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">广告关键词</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">设置广告关键词,转存时,如果文件名包含广告关键词,则文件被删除</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.ad_keywords"
|
||||
type="text"
|
||||
placeholder="电影,电视剧,综艺"
|
||||
:disabled="!configForm.auto_transfer_enabled"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 自动插入广告 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">自动插入广告</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">在分享链接中的广告内容,会在转存时自动插入到转存文件夹</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.auto_insert_ad"
|
||||
type="textarea"
|
||||
placeholder="请输入广告内容..."
|
||||
:rows="3"
|
||||
:disabled="!configForm.auto_transfer_enabled"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
|
||||
<n-tab-pane name="drama" tab="热播剧">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- 热播剧自动获取 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">自动拉取热播剧</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启后,系统将自动从豆瓣获取热播剧信息</span>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<n-switch v-model:value="configForm.hot_drama_auto_fetch" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
</n-tabs>
|
||||
</n-card>
|
||||
</div>
|
||||
</template>
|
||||
@@ -114,14 +164,16 @@ definePageMeta({
|
||||
|
||||
const notification = useNotification()
|
||||
const saving = ref(false)
|
||||
const activeTab = ref('resource')
|
||||
|
||||
// 配置表单数据
|
||||
const configForm = ref({
|
||||
auto_process_enabled: false,
|
||||
auto_process_interval: 30,
|
||||
auto_transfer_enabled: false,
|
||||
auto_transfer_limit_days: 30,
|
||||
auto_transfer_min_space: 500,
|
||||
ad_keywords: '',
|
||||
auto_insert_ad: '',
|
||||
hot_drama_auto_fetch: false
|
||||
})
|
||||
|
||||
@@ -137,8 +189,9 @@ const fetchConfig = async () => {
|
||||
auto_process_enabled: response.auto_process_ready_resources || false,
|
||||
auto_process_interval: response.auto_process_interval || 30,
|
||||
auto_transfer_enabled: response.auto_transfer_enabled || false,
|
||||
auto_transfer_limit_days: response.auto_transfer_limit_days || 30,
|
||||
auto_transfer_min_space: response.auto_transfer_min_space || 500,
|
||||
ad_keywords: response.ad_keywords || '',
|
||||
auto_insert_ad: response.auto_insert_ad || '',
|
||||
hot_drama_auto_fetch: response.auto_fetch_hot_drama_enabled || false
|
||||
}
|
||||
}
|
||||
@@ -163,8 +216,9 @@ const saveConfig = async () => {
|
||||
auto_process_ready_resources: configForm.value.auto_process_enabled,
|
||||
auto_process_interval: configForm.value.auto_process_interval,
|
||||
auto_transfer_enabled: configForm.value.auto_transfer_enabled,
|
||||
auto_transfer_limit_days: configForm.value.auto_transfer_limit_days,
|
||||
auto_transfer_min_space: configForm.value.auto_transfer_min_space,
|
||||
ad_keywords: configForm.value.ad_keywords,
|
||||
auto_insert_ad: configForm.value.auto_insert_ad,
|
||||
auto_fetch_hot_drama_enabled: configForm.value.hot_drama_auto_fetch
|
||||
})
|
||||
|
||||
|
||||
@@ -16,6 +16,15 @@
|
||||
|
||||
<!-- 配置表单 -->
|
||||
<n-card>
|
||||
<!-- 顶部Tabs -->
|
||||
<n-tabs
|
||||
v-model:value="activeTab"
|
||||
type="line"
|
||||
animated
|
||||
class="mb-6"
|
||||
>
|
||||
<n-tab-pane name="basic" tab="基本信息">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
@@ -24,69 +33,106 @@
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="space-y-6">
|
||||
<!-- 网站标题 -->
|
||||
<n-form-item label="网站标题" path="site_title">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">网站标题</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">网站的主要标识,显示在浏览器标签页和搜索结果中</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.site_title"
|
||||
placeholder="请输入网站标题"
|
||||
/>
|
||||
</n-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 网站描述 -->
|
||||
<n-form-item label="网站描述" path="site_description">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">网站描述</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">网站的简要介绍,用于SEO和社交媒体分享</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.site_description"
|
||||
placeholder="请输入网站描述"
|
||||
/>
|
||||
</n-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 关键词 -->
|
||||
<n-form-item label="关键词" path="keywords">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">关键词</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">用于SEO优化,多个关键词用逗号分隔</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.keywords"
|
||||
placeholder="请输入关键词,用逗号分隔"
|
||||
/>
|
||||
</n-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 版权信息 -->
|
||||
<n-form-item label="版权信息" path="copyright">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">版权信息</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">网站底部的版权声明信息</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.copyright"
|
||||
placeholder="请输入版权信息"
|
||||
/>
|
||||
</n-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
|
||||
|
||||
|
||||
<n-tab-pane name="security" tab="安全设置">
|
||||
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="configForm"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<!-- 维护模式 -->
|
||||
<n-form-item label="维护模式" path="maintenance_mode">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">维护模式</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启后网站将显示维护页面,暂停用户访问</span>
|
||||
</div>
|
||||
<n-switch v-model:value="configForm.maintenance_mode" />
|
||||
<template #help>
|
||||
开启后网站将显示维护页面
|
||||
</template>
|
||||
</n-form-item>
|
||||
|
||||
<!-- 开启注册 -->
|
||||
<n-form-item label="开启注册" path="enable_register">
|
||||
<n-switch v-model:value="configForm.enable_register" />
|
||||
<template #help>
|
||||
开启后用户才能注册新账号,关闭后注册页面将显示"当前系统已关闭注册功能"
|
||||
</template>
|
||||
</n-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 违禁词 -->
|
||||
<n-form-item label="违禁词" path="forbidden_words" class="md:col-span-2">
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">违禁词</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">包含这些词汇的资源将被过滤,多个词汇用逗号分隔</span>
|
||||
</div>
|
||||
<n-input
|
||||
v-model:value="configForm.forbidden_words"
|
||||
placeholder="请输入违禁词,用逗号分隔"
|
||||
type="textarea"
|
||||
:rows="4"
|
||||
/>
|
||||
<template #help>
|
||||
包含这些词汇的资源将被过滤
|
||||
</template>
|
||||
</n-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 开启注册 -->
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center space-x-2">
|
||||
<label class="text-base font-semibold text-gray-800 dark:text-gray-200">开启注册</label>
|
||||
<span class="text-xs text-gray-500 dark:text-gray-400">开启后用户才能注册新账号,关闭后注册页面将显示"当前系统已关闭注册功能"</span>
|
||||
</div>
|
||||
<n-switch v-model:value="configForm.enable_register" />
|
||||
</div>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
</n-tabs>
|
||||
</n-card>
|
||||
</div>
|
||||
</template>
|
||||
@@ -101,6 +147,7 @@ definePageMeta({
|
||||
const notification = useNotification()
|
||||
const formRef = ref()
|
||||
const saving = ref(false)
|
||||
const activeTab = ref('basic')
|
||||
|
||||
// 配置表单数据
|
||||
const configForm = ref<{
|
||||
@@ -111,6 +158,8 @@ const configForm = ref<{
|
||||
maintenance_mode: boolean
|
||||
enable_register: boolean
|
||||
forbidden_words: string
|
||||
enable_sitemap: boolean
|
||||
sitemap_update_frequency: string
|
||||
}>({
|
||||
site_title: '',
|
||||
site_description: '',
|
||||
@@ -118,9 +167,13 @@ const configForm = ref<{
|
||||
copyright: '',
|
||||
maintenance_mode: false,
|
||||
enable_register: false, // 新增:开启注册开关
|
||||
forbidden_words: ''
|
||||
forbidden_words: '',
|
||||
enable_sitemap: false,
|
||||
sitemap_update_frequency: 'daily'
|
||||
})
|
||||
|
||||
|
||||
|
||||
// 表单验证规则
|
||||
const rules = {
|
||||
site_title: {
|
||||
@@ -150,7 +203,9 @@ const fetchConfig = async () => {
|
||||
copyright: response.copyright || '',
|
||||
maintenance_mode: response.maintenance_mode || false,
|
||||
enable_register: response.enable_register || false, // 新增:获取开启注册开关
|
||||
forbidden_words: response.forbidden_words || ''
|
||||
forbidden_words: response.forbidden_words || '',
|
||||
enable_sitemap: response.enable_sitemap || false,
|
||||
sitemap_update_frequency: response.sitemap_update_frequency || 'daily'
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -178,7 +233,9 @@ const saveConfig = async () => {
|
||||
copyright: configForm.value.copyright,
|
||||
maintenance_mode: configForm.value.maintenance_mode,
|
||||
enable_register: configForm.value.enable_register, // 新增:保存开启注册开关
|
||||
forbidden_words: configForm.value.forbidden_words
|
||||
forbidden_words: configForm.value.forbidden_words,
|
||||
enable_sitemap: configForm.value.enable_sitemap,
|
||||
sitemap_update_frequency: configForm.value.sitemap_update_frequency
|
||||
})
|
||||
|
||||
notification.success({
|
||||
|
||||
Reference in New Issue
Block a user