1855f190f5
- 新增 PromptConfig 模型 + API,支持提示词在线编辑(16条默认) - 调度器动态读取 TaskConfig.schedule,admin 可调执行时间 - 新增 KeywordDomainMap、SensitiveWord、ContentCleanRule、TrendFieldMapping 表 - DOMAINS、TREND_DOMAIN_MAP、PLATFORM_TAGS、china_pains、RSS关键词、priority_weights 全部迁移到 DB - tasks.html 重构:卡片网格+配置/产出/历史/提示词四个Tab,折叠显示 - 清理冗余代码:DEFAULT_PROMPTS死代码、collector.py unreachable代码、compliance_checker bug - strip_thinking_html 改用 DB 规则优先
66 lines
3.3 KiB
Python
66 lines
3.3 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
from typing import List, Optional
|
|
|
|
from ..database import get_db
|
|
from ..models import TaskConfig, TaskLog
|
|
from ..schemas import TaskConfigBase, TaskConfigUpdate, TaskConfigResponse, TaskLogResponse
|
|
from .auth import get_current_admin
|
|
|
|
router = APIRouter(prefix="/api/admin/task-configs", tags=["admin"])
|
|
|
|
DEFAULT_CONFIGS = {
|
|
"scheduled_refresh_search_cache": {"name": "🔍 搜索缓存", "cron": "01:00", "params": {}},
|
|
"scheduled_fetch_trends": {"name": "🔥 热点趋势", "cron": "01:10", "params": {}},
|
|
"scheduled_collect": {"name": "📡 内容采集", "cron": "01:30", "params": {"max_topics": 20}},
|
|
"scheduled_generate": {"name": "🤖 内容创作", "cron": "02:00", "params": {"auto_review": True}},
|
|
"scheduled_optimize": {"name": "🔍 合规审查", "cron": "03:00", "params": {"auto_pass_threshold": 80}},
|
|
"scheduled_optimize_sources": {"name": "📡 信息源优化", "cron": "05:00", "params": {}},
|
|
"scheduled_metrics_sync": {"name": "📊 指标同步", "cron": "06:00", "params": {}},
|
|
}
|
|
|
|
@router.get("", response_model=List[TaskConfigResponse])
|
|
def list_configs(db: Session = Depends(get_db), admin_user=Depends(get_current_admin)):
|
|
configs = db.query(TaskConfig).order_by(TaskConfig.id).all()
|
|
if not configs:
|
|
_ensure_defaults(db)
|
|
configs = db.query(TaskConfig).order_by(TaskConfig.id).all()
|
|
return [TaskConfigResponse.model_validate(c) for c in configs]
|
|
|
|
@router.get("/{module_id}", response_model=TaskConfigResponse)
|
|
def get_config(module_id: str, db: Session = Depends(get_db), admin_user=Depends(get_current_admin)):
|
|
cfg = db.query(TaskConfig).filter(TaskConfig.module_id == module_id).first()
|
|
if not cfg:
|
|
_ensure_defaults(db)
|
|
cfg = db.query(TaskConfig).filter(TaskConfig.module_id == module_id).first()
|
|
return cfg
|
|
|
|
@router.put("/{module_id}", response_model=TaskConfigResponse)
|
|
def update_config(module_id: str, data: TaskConfigUpdate, db: Session = Depends(get_db), admin_user=Depends(get_current_admin)):
|
|
cfg = db.query(TaskConfig).filter(TaskConfig.module_id == module_id).first()
|
|
if not cfg:
|
|
_ensure_defaults(db)
|
|
cfg = db.query(TaskConfig).filter(TaskConfig.module_id == module_id).first()
|
|
if data.enabled is not None:
|
|
cfg.enabled = data.enabled
|
|
if data.params is not None:
|
|
cfg.params = data.params
|
|
if data.schedule is not None:
|
|
cfg.schedule = data.schedule
|
|
if data.last_modified_by:
|
|
cfg.last_modified_by = data.last_modified_by
|
|
db.commit()
|
|
db.refresh(cfg)
|
|
return cfg
|
|
|
|
@router.get("/history/{module_id}", response_model=List[TaskLogResponse])
|
|
def get_module_history(module_id: str, db: Session = Depends(get_db), admin_user=Depends(get_current_admin), limit: int = 20):
|
|
logs = db.query(TaskLog).filter(TaskLog.module_id == module_id).order_by(TaskLog.started_at.desc()).limit(limit).all()
|
|
return [TaskLogResponse.model_validate(l) for l in logs]
|
|
|
|
def _ensure_defaults(db: Session):
|
|
existing = {c.module_id for c in db.query(TaskConfig).all()}
|
|
for mid, info in DEFAULT_CONFIGS.items():
|
|
if mid not in existing:
|
|
db.add(TaskConfig(module_id=mid, enabled=True, params=info.get("params", {}), schedule=info.get("cron", "")))
|
|
db.commit() |