后端: - 新增 Scheduler + ScheduledTask 核心模块(croniter 解析 cron 表达式) - 新增 Schedule 数据模型(alembic 0016) - 新增 /api/v1/admin/schedules CRUD 接口 - lifespan 启动时注册默认定时任务并加载数据库配置 - 默认任务:每日比赛/积分榜/30分钟统计回填(默认禁用) 前端: - 设置页新增「定时任务」管理区块 - 支持:新建/启用禁用/立即执行/删除定时任务 - 显示:任务ID、类型、cron表达式、上次执行时间/状态 依赖:新增 croniter>=2.0 Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
"""新增 schedules 表
|
|
|
|
Revision ID: 0016_schedules
|
|
Revises: 0015_bzzoiro_single_source
|
|
Create Date: 2026-09-21
|
|
|
|
定时采集任务配置表。
|
|
"""
|
|
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = '0016_schedules'
|
|
down_revision: Union[str, None] = '0015_bzzoiro_single_source'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
'schedules',
|
|
sa.Column('id', sa.String(50), primary_key=True),
|
|
sa.Column('task', sa.String(20), nullable=False),
|
|
sa.Column('cron', sa.String(100), nullable=False),
|
|
sa.Column('leagues', sa.Text()),
|
|
sa.Column('enabled', sa.Boolean(), server_default='true'),
|
|
sa.Column('last_run_at', sa.DateTime(timezone=True)),
|
|
sa.Column('last_status', sa.String(20)),
|
|
sa.Column('created_at', sa.DateTime(timezone=True)),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True)),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table('schedules')
|