feat: 风险分定时衰减 + 密码提示修复 + 浏览器池API + next回跳

1. 风险分衰减定时任务:
   - services/scheduler.py: 每天 CST 04:00 自动执行 decay_scores()
   - 支持 RISK_SCORE_DECAY_TIME_CST 环境变量覆盖

2. 密码长度提示统一为8位:
   - app-frontend/src/pages/RegisterPage.vue
   - app-frontend/src/layouts/AppLayout.vue
   - admin-frontend/src/pages/SettingsPage.vue
   - templates/register.html

3. 浏览器池统计API:
   - GET /yuyx/api/browser_pool/stats
   - 返回 worker 状态、队列等待数等信息
   - browser_pool_worker.py: 增强 get_stats() 方法

4. 登录后支持 next 参数回跳:
   - app-frontend/src/pages/LoginPage.vue: 检查 ?next= 参数
   - 仅允许站内路径(防止开放重定向)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-27 18:28:21 +08:00
parent 3d9dba272e
commit 1b20478a08
49 changed files with 305 additions and 160 deletions

View File

@@ -1,20 +1,20 @@
{
"_accounts-CTfB-Ncr.js": {
"file": "assets/accounts-CTfB-Ncr.js",
"_accounts-sBYX3ZUA.js": {
"file": "assets/accounts-sBYX3ZUA.js",
"name": "accounts",
"imports": [
"index.html"
]
},
"_auth-WsWSY0rn.js": {
"file": "assets/auth-WsWSY0rn.js",
"_auth-GozuPnLT.js": {
"file": "assets/auth-GozuPnLT.js",
"name": "auth",
"imports": [
"index.html"
]
},
"index.html": {
"file": "assets/index-CEOd73lG.js",
"file": "assets/index-Dzjm38x5.js",
"name": "index",
"src": "index.html",
"isEntry": true,
@@ -28,16 +28,16 @@
"src/pages/ScreenshotsPage.vue"
],
"css": [
"assets/index-CD3NfpmF.css"
"assets/index-Dfx-VTPl.css"
]
},
"src/pages/AccountsPage.vue": {
"file": "assets/AccountsPage-D3IUho1c.js",
"file": "assets/AccountsPage-ZOKJprfz.js",
"name": "AccountsPage",
"src": "src/pages/AccountsPage.vue",
"isDynamicEntry": true,
"imports": [
"_accounts-CTfB-Ncr.js",
"_accounts-sBYX3ZUA.js",
"index.html"
],
"css": [
@@ -45,51 +45,51 @@
]
},
"src/pages/LoginPage.vue": {
"file": "assets/LoginPage-x4LlIM56.js",
"file": "assets/LoginPage-BrSs7jRF.js",
"name": "LoginPage",
"src": "src/pages/LoginPage.vue",
"isDynamicEntry": true,
"imports": [
"index.html",
"_auth-WsWSY0rn.js"
"_auth-GozuPnLT.js"
],
"css": [
"assets/LoginPage-C_sxX_84.css"
"assets/LoginPage-CnwOLKJz.css"
]
},
"src/pages/RegisterPage.vue": {
"file": "assets/RegisterPage-BBedBh-y.js",
"file": "assets/RegisterPage-TozgjjGu.js",
"name": "RegisterPage",
"src": "src/pages/RegisterPage.vue",
"isDynamicEntry": true,
"imports": [
"index.html",
"_auth-WsWSY0rn.js"
"_auth-GozuPnLT.js"
],
"css": [
"assets/RegisterPage-yylt2w7b.css"
"assets/RegisterPage-BOcNcW5D.css"
]
},
"src/pages/ResetPasswordPage.vue": {
"file": "assets/ResetPasswordPage--Vqm02p7.js",
"file": "assets/ResetPasswordPage-CLFescRq.js",
"name": "ResetPasswordPage",
"src": "src/pages/ResetPasswordPage.vue",
"isDynamicEntry": true,
"imports": [
"index.html",
"_auth-WsWSY0rn.js"
"_auth-GozuPnLT.js"
],
"css": [
"assets/ResetPasswordPage-DybfLMAw.css"
]
},
"src/pages/SchedulesPage.vue": {
"file": "assets/SchedulesPage-Cln6Gk1v.js",
"file": "assets/SchedulesPage-CvQTwIDx.js",
"name": "SchedulesPage",
"src": "src/pages/SchedulesPage.vue",
"isDynamicEntry": true,
"imports": [
"_accounts-CTfB-Ncr.js",
"_accounts-sBYX3ZUA.js",
"index.html"
],
"css": [
@@ -97,7 +97,7 @@
]
},
"src/pages/ScreenshotsPage.vue": {
"file": "assets/ScreenshotsPage-BeyAIC93.js",
"file": "assets/ScreenshotsPage-BO_6agG8.js",
"name": "ScreenshotsPage",
"src": "src/pages/ScreenshotsPage.vue",
"isDynamicEntry": true,
@@ -109,7 +109,7 @@
]
},
"src/pages/VerifyResultPage.vue": {
"file": "assets/VerifyResultPage-Ci85Um-V.js",
"file": "assets/VerifyResultPage-DAOtFHKf.js",
"name": "VerifyResultPage",
"src": "src/pages/VerifyResultPage.vue",
"isDynamicEntry": true,