feat: 新增管理后台前端项目及安全加固
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
refactor(saas): 重构认证中间件与限流策略
- 登录限流调整为5次/分钟/IP
- 注册限流调整为3次/小时/IP
- GET请求不计入限流
fix(saas): 修复调度器时间戳处理
- 使用NOW()替代文本时间戳
- 兼容TEXT和TIMESTAMPTZ列类型
feat(saas): 实现环境变量插值
- 支持${ENV_VAR}语法解析
- 数据库密码支持环境变量注入
chore: 新增前端管理界面
- 基于React+Ant Design Pro
- 包含路由守卫/错误边界
- 对接58个API端点
docs: 更新安全加固文档
- 新增密钥管理规范
- 记录P0安全项审计结果
- 补充TLS终止说明
test: 完善配置解析单元测试
- 新增环境变量插值测试用例
This commit is contained in:
@@ -122,14 +122,11 @@ pub fn start_user_task_scheduler(db: PgPool) {
|
||||
}
|
||||
|
||||
async fn tick_user_tasks(db: &PgPool) -> Result<(), sqlx::Error> {
|
||||
let now = chrono::Utc::now().to_rfc3339();
|
||||
|
||||
// 查找到期任务
|
||||
// 查找到期任务(next_run_at 兼容 TEXT 和 TIMESTAMPTZ 两种列类型)
|
||||
let due_tasks: Vec<(String, String, String)> = sqlx::query_as(
|
||||
"SELECT id, schedule_type, target_type FROM scheduled_tasks
|
||||
WHERE enabled = TRUE AND next_run_at <= $1"
|
||||
WHERE enabled = TRUE AND next_run_at::TIMESTAMPTZ <= NOW()"
|
||||
)
|
||||
.bind(&now)
|
||||
.fetch_all(db)
|
||||
.await?;
|
||||
|
||||
@@ -140,16 +137,14 @@ async fn tick_user_tasks(db: &PgPool) -> Result<(), sqlx::Error> {
|
||||
tracing::debug!("[UserScheduler] {} tasks due", due_tasks.len());
|
||||
|
||||
for (task_id, schedule_type, _target_type) in due_tasks {
|
||||
// 标记执行
|
||||
let now_str = chrono::Utc::now().to_rfc3339();
|
||||
// 标记执行(用 NOW() 写入时间戳)
|
||||
let result = sqlx::query(
|
||||
"UPDATE scheduled_tasks
|
||||
SET last_run_at = $1, run_count = run_count + 1, updated_at = $1,
|
||||
SET last_run_at = NOW(), run_count = run_count + 1, updated_at = NOW(),
|
||||
enabled = CASE WHEN schedule_type = 'once' THEN FALSE ELSE TRUE END,
|
||||
next_run_at = NULL
|
||||
WHERE id = $2"
|
||||
WHERE id = $1"
|
||||
)
|
||||
.bind(&now_str)
|
||||
.bind(&task_id)
|
||||
.execute(db)
|
||||
.await;
|
||||
|
||||
Reference in New Issue
Block a user