6f0713953a
- 统一使用绝对导入(backend 目录在 PYTHONPATH) - 修改 main.py、api 模块、core/security 的导入 - 移除 generate 模块(缺失 GenerateTask 模型) - 修复 database.py 导入 Base - backend/run.sh 添加 PYTHONPATH 设置 - 前端 topics.html 修复 currentUser 初始值和 Vue 结构 - 添加前端代码语法检查脚本 版本: v1.0.3 (导入修复版)
172 lines
5.0 KiB
Python
172 lines
5.0 KiB
Python
# 宇之然内容创作平台 - 文章生成API
|
|
|
|
from pydantic import BaseModel
|
|
from datetime import datetime
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from typing import List, Optional
|
|
import asyncio
|
|
|
|
from core.security import get_current_user, create_audit_log
|
|
from app.database import get_db
|
|
from app.models import Topic, User, GenerateTask
|
|
|
|
router = APIRouter()
|
|
|
|
class BatchGenerateRequest(BaseModel):
|
|
topic_ids: Optional[List[int]] = None
|
|
|
|
class BatchOptimizeRequest(BaseModel):
|
|
topic_ids: List[int]
|
|
|
|
@router.post("/run")
|
|
async def batch_generate(
|
|
request: BatchGenerateRequest,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""批量创建选题文章"""
|
|
|
|
# 如果没有指定topic_ids,则获取所有待处理的选题
|
|
if not request.topic_ids:
|
|
topics = db.query(Topic).filter(Topic.status == "待处理").all()
|
|
topic_ids = [t.id for t in topics]
|
|
else:
|
|
topic_ids = request.topic_ids
|
|
|
|
if not topic_ids:
|
|
return {"result": {"ok": True, "count": 0}}
|
|
|
|
# 验证选题是否存在且状态正确
|
|
valid_topics = db.query(Topic).filter(
|
|
Topic.id.in_(topic_ids),
|
|
Topic.status == "待处理"
|
|
).all()
|
|
|
|
if len(valid_topics) != len(topic_ids):
|
|
invalid_count = len(topic_ids) - len(valid_topics)
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"有{invalid_count}个选题状态不正确或不存在"
|
|
)
|
|
|
|
# 创建生成任务记录
|
|
tasks = []
|
|
for topic in valid_topics:
|
|
task = GenerateTask(
|
|
topic_id=topic.id,
|
|
status="pending",
|
|
created_by=current_user.id
|
|
)
|
|
db.add(task)
|
|
tasks.append(task)
|
|
|
|
db.commit()
|
|
|
|
# 异步执行生成任务(简化实现)
|
|
# 实际生产环境应使用Celery等任务队列
|
|
asyncio.create_task(process_generation_tasks(tasks))
|
|
|
|
# 更新选题状态为"待审查"
|
|
for topic in valid_topics:
|
|
topic.generated_at = datetime.utcnow()
|
|
topic.status = "待审查"
|
|
topic.updated_at = datetime.utcnow()
|
|
|
|
db.commit()
|
|
|
|
# 记录审计日志
|
|
create_audit_log(
|
|
db=db,
|
|
user_id=current_user.id,
|
|
action="batch_generate",
|
|
resource_type="topic",
|
|
resource_id=None,
|
|
details=f"处理选题数量: {len(tasks)}"
|
|
)
|
|
|
|
return {
|
|
"result": {
|
|
"ok": True,
|
|
"count": len(tasks)
|
|
}
|
|
}
|
|
|
|
@router.post("/optimize/run")
|
|
async def batch_optimize(
|
|
request: BatchOptimizeRequest,
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""批量优化选题文章"""
|
|
|
|
# 检查选题是否存在且状态正确(必须是待审查)
|
|
valid_topics = db.query(Topic).filter(
|
|
Topic.id.in_(request.topic_ids),
|
|
Topic.status == "待审查"
|
|
).all()
|
|
|
|
if len(valid_topics) != len(request.topic_ids):
|
|
invalid_count = len(request.topic_ids) - len(valid_topics)
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"有{invalid_count}个选题状态不正确或不存在"
|
|
)
|
|
|
|
# 执行优化逻辑(简化实现)
|
|
auto_passed = 0
|
|
need_manual = 0
|
|
|
|
for topic in valid_topics:
|
|
# 这里应该调用实际的合规性检查逻辑
|
|
# 简化实现:随机决定通过或不通过
|
|
import random
|
|
if random.choice([True, False]):
|
|
topic.status = "待发布"
|
|
auto_passed += 1
|
|
else:
|
|
topic.status = "待审查"
|
|
need_manual += 1
|
|
|
|
topic.updated_at = datetime.utcnow()
|
|
|
|
db.commit()
|
|
|
|
# 记录审计日志
|
|
create_audit_log(
|
|
db=db,
|
|
user_id=current_user.id,
|
|
action="batch_optimize",
|
|
resource_type="topic",
|
|
resource_id=None,
|
|
details=f"自动通过: {auto_passed}, 需人工: {need_manual}"
|
|
)
|
|
|
|
return {
|
|
"summary": {
|
|
"passed_auto": auto_passed,
|
|
"need_manual": need_manual,
|
|
"total": len(valid_topics)
|
|
}
|
|
}
|
|
|
|
async def process_generation_tasks(tasks: List[GenerateTask]):
|
|
"""处理生成任务(异步函数)"""
|
|
# 这里是生成文章的异步逻辑
|
|
# 实际生产环境应使用Celery等专业的任务队列系统
|
|
|
|
for task in tasks:
|
|
try:
|
|
# 模拟生成过程
|
|
await asyncio.sleep(2) # 模拟耗时操作
|
|
|
|
# 更新任务状态为已完成
|
|
task.status = "completed"
|
|
task.result = {"success": True, "message": "文章生成完成"}
|
|
|
|
except Exception as e:
|
|
# 处理失败情况
|
|
task.status = "failed"
|
|
task.result = {"success": False, "error": str(e)}
|
|
|
|
# 注意:这个函数需要访问数据库,实际实现中可能需要额外的依赖注入 |