diff --git a/platform/backend/run.sh b/platform/backend/run.sh index bee88c3..12bc676 100755 --- a/platform/backend/run.sh +++ b/platform/backend/run.sh @@ -3,35 +3,27 @@ echo "宇之然内容创作平台 - 后端服务启动" echo "==================================" -# 检查Python环境 if ! command -v python3 &> /dev/null; then echo "错误: 未找到python3,请先安装Python 3.8+" exit 1 fi -# 检查虚拟环境 if [ ! -d "venv" ]; then echo "正在创建虚拟环境..." python3 -m venv venv fi -# 激活虚拟环境 source venv/bin/activate -# 安装依赖 echo "正在安装依赖包..." pip install --upgrade pip pip install -r requirements.txt -# 检查.env文件 if [ ! -f ".env" ]; then echo "警告: .env文件不存在,正在复制示例文件..." cp .env.example .env echo "请编辑 .env 文件配置数据库连接等信息" fi -# 启动服务 echo "正在启动后端服务 (端口 8001)..." -PYTHONPATH=$(pwd) uvicorn main:app --host 0.0.0.0 --port 8001 --reload - -echo "服务已停止" \ No newline at end of file +exec python -m uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload diff --git a/platform/frontend/logs.html b/platform/frontend/logs.html index ed401b3..05ee9b9 100644 --- a/platform/frontend/logs.html +++ b/platform/frontend/logs.html @@ -7,130 +7,93 @@ - -
- - - -
- + + +
-

📄 系统日志

-
- + +
+ - + 加载日志
-
{{ logContent }}
- +
+
{{ logContent }}
+
+
-
- \ No newline at end of file + diff --git a/platform/frontend/tasks.html b/platform/frontend/tasks.html index c79eb4b..8027215 100644 --- a/platform/frontend/tasks.html +++ b/platform/frontend/tasks.html @@ -7,22 +7,26 @@ @@ -52,27 +61,30 @@
-

🚀 创作任务

-
- - 全部 - 进行中 - 等待中 - 已完成 - 失败 - - 🔄 刷新 + -
加载中...
-
-
📋
-
暂无任务
+
加载中...
+
+
📋
+
暂无任务
+
前往 选题管理 创建新任务
-
+
#{{ task.task_id }} {{ getStatusLabel(task.status) }} {{ getStageLabel(task.stage) }} @@ -80,7 +92,7 @@
取消 重试 - 详情 + 详情
@@ -96,9 +108,7 @@ 耗时: {{ task.duration }}秒 创建人: {{ task.created_by }}
-
- 错误: {{ task.error_msg }} -
+
错误: {{ task.error_msg }}
@@ -135,52 +145,42 @@ const TasksApp = { data() { return { - currentUser: { username: '' }, - isAdmin: false, - isLoggedIn: false, - tasks: [], - loading: false, - filterStatus: '', - showDetailDialog: false, - detailTask: null + currentUser: { username: '' }, isAdmin: false, isLoggedIn: false, + tasks: [], loading: false, filterStatus: '', + showDetailDialog: false, detailTask: null } }, methods: { + getToken() { return localStorage.getItem('authToken'); }, + async api(url, opts = {}) { + const token = this.getToken(); + if (!token) { this.$message.error('请先登录'); return null; } + const res = await fetch(url, { headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', ...opts.headers }, ...opts }); + if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error(data.detail || `请求失败: ${res.status}`); } + return res.json(); + }, handleLogout() { localStorage.removeItem('authToken'); localStorage.removeItem('userRole'); localStorage.removeItem('currentUser'); window.location.href = '/login.html'; }, redirectToPage(page) { window.location.href = page.startsWith('/') ? page : '/' + page; }, checkAuth() { - const token = localStorage.getItem('authToken'); + const token = this.getToken(); if (!token) { window.location.href = '/login.html'; return; } fetch('/api/auth/me', { headers: { 'Authorization': 'Bearer ' + token } }) .then(r => r.ok ? r.json() : Promise.reject()) - .then(data => { - this.currentUser = data.user; - this.isAdmin = data.user.role === 'admin'; - this.isLoggedIn = true; - this.loadTasks(); - }) + .then(data => { this.currentUser = data.user; this.isAdmin = data.user.role === 'admin'; this.isLoggedIn = true; this.loadTasks(); }) .catch(() => { localStorage.removeItem('authToken'); localStorage.removeItem('userRole'); localStorage.removeItem('currentUser'); window.location.href = '/login.html'; }); }, - getStatusLabel(status) { - const map = { 'pending': '等待中', 'running': '进行中', 'completed': '已完成', 'failed': '失败', 'cancelled': '已取消' }; - return map[status] || status; - }, - getStageLabel(stage) { - const map = { 'creator': '创作', 'optimize': '优化', 'review': '审查', 'publish': '发布' }; - return map[stage] || stage; - }, + getStatusLabel(status) { return { 'pending': '等待中', 'running': '进行中', 'completed': '已完成', 'failed': '失败', 'cancelled': '已取消' }[status] || status; }, + getStageLabel(stage) { return { 'creator': '创作', 'optimize': '优化', 'review': '审查', 'publish': '发布' }[stage] || stage; }, formatDate(dateStr) { if (!dateStr) return '-'; - return new Date(dateStr).toLocaleString('zh-CN'); + try { return new Date(dateStr).toLocaleString('zh-CN'); } catch (e) { return dateStr; } }, async loadTasks() { this.loading = true; try { - const token = localStorage.getItem('authToken'); let url = '/api/tasks?limit=50'; if (this.filterStatus) url += '&status=' + this.filterStatus; - const res = await fetch(url, { headers: { 'Authorization': 'Bearer ' + token } }); - if (res.ok) this.tasks = await res.json(); + this.tasks = await this.api(url) || []; } catch (e) { console.error(e); } finally { this.loading = false; } }, @@ -188,18 +188,21 @@ const TasksApp = { async cancelTask(taskId) { try { await this.$confirm('确定取消该任务?', '提示', { type: 'warning' }); - const token = localStorage.getItem('authToken'); - const res = await fetch('/api/tasks/' + taskId, { method: 'DELETE', headers: { 'Authorization': 'Bearer ' + token } }); - if (res.ok) { this.$message.success('任务已取消'); this.loadTasks(); } + await this.api('/api/tasks/' + taskId, { method: 'DELETE' }); + this.$message.success('任务已取消'); + this.loadTasks(); } catch (e) { if (e !== 'cancel') this.$message.error(e.message || '操作失败'); } }, - retryTask(task) { - this.$message.info('重试功能开发中...'); + async retryTask(task) { + if (!task.topic_id) { this.$message.warning('该任务无关联选题,无法重试'); return; } + try { + await this.api('/api/tasks/run-creator?topic_id=' + task.topic_id, { method: 'POST' }); + this.$message.success('已重新提交创作任务'); + this.loadTasks(); + } catch (e) { this.$message.error('重试失败: ' + e.message); } } }, - mounted() { - this.checkAuth(); - } + mounted() { this.checkAuth(); } }; const app = Vue.createApp(TasksApp); app.use(ElementPlus); diff --git a/platform/frontend/topics.html b/platform/frontend/topics.html index 59c57df..6adfed1 100644 --- a/platform/frontend/topics.html +++ b/platform/frontend/topics.html @@ -4,215 +4,147 @@ 宇之然内容创作平台 - 选题管理 - + - + -
- - -
+ + +
-

📋 选题管理

-
-
+ -
- 全部 ({{ topics.length }}) - 待处理 ({{ statusStats.pending }}) - 待审查 ({{ statusStats.review }}) - 待发布 ({{ statusStats.ready }}) - 已发布 ({{ statusStats.published }}) +
+ 全部 ({{ topics.length }}) + 待处理 ({{ statusStats.pending }}) + 待审查 ({{ statusStats.review }}) + 待发布 ({{ statusStats.ready }}) + 已发布 ({{ statusStats.published }})
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
{{ topic.id }}. {{ topic.title }}
- {{ getStatusLabel(topic.status) }} -
-
- {{ topic.field }} - 合规{{ topic.compliance_score }} -
-
-
创建: {{ formatDate(topic.created_at) }}
-
创作: {{ topic.generated_at ? formatDate(topic.generated_at) : '-' }}
-
发布: {{ topic.published_at ? formatDate(topic.published_at) : '-' }}
-
-
- 预览 - 创作 - 审查 - 发布 - 删除 + + + + + + + + + + + + + + + + + + +
+
+
+
{{ topic.id }}. {{ topic.title }}
+ {{ getStatusLabel(topic.status) }} +
+
+ {{ topic.field }} + 合规{{ topic.compliance_score }} +
+
+
创建: {{ formatDate(topic.created_at) }}
+
创作: {{ topic.generated_at ? formatDate(topic.generated_at) : '-' }}
+
发布: {{ topic.published_at ? formatDate(topic.published_at) : '-' }}
+
+
+ 预览 + 创作 + 审查 + 发布 + 删除
-
-
-
知乎 @@ -220,7 +152,6 @@ 小红书
-

{{ previewTopic.title }}

@@ -228,36 +159,23 @@ 状态:{{ getStatusLabel(previewTopic.status) }} 创作:{{ formatDate(previewTopic.generated_at) }} 发布:{{ formatDate(previewTopic.published_at) }} - - {{ previewFullscreen ? '退出全屏' : '全屏' }} - + {{ previewFullscreen ? '退出全屏' : '全屏' }}
- -
- +
-