fix: resolve 10 code review issues

High priority:
- Fix concurrent race condition for view_count/like_count (atomic update)
- Add route request ID tracking to prevent race conditions
- Filter get_joke by status=approved (no pending content leak)
- Add error feedback for like button

Performance:
- Optimize random joke query (avoid full table sort)
- Limit page_size max to 100 (DoS prevention)

Medium:
- Add localStorage quota error handling
- Handle empty AI response gracefully
- Fix generate content title extraction

Low:
- Add rejected_jokes to stats API
- Update dashboard to show rejected count
This commit is contained in:
bwstudio
2026-06-02 20:35:08 +08:00
parent 0b43973236
commit ceed63fcb0
144 changed files with 191660 additions and 270 deletions
+100
View File
@@ -0,0 +1,100 @@
"""
笑话优化 CLI 工具。
循环检测所有笑话 → AI 质量检测 → AI 润色 → AI 评价分类。
用法:
python optimizer/main.py # 处理所有 pending/approved 笑话
python optimizer/main.py --status rejected # 只处理已拒绝的
python optimizer/main.py --limit 10 # 只处理前 10 条
python optimizer/main.py --id 1,2,3 # 指定 ID 处理
python optimizer/main.py --api-url http://localhost:8001
"""
import argparse
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from optimizer.optimizer import Optimizer
def parse_args():
parser = argparse.ArgumentParser(description="笑话优化工具 — 质量检测 / AI 润色 / 评价分类")
parser.add_argument(
"--api-url",
type=str,
default=os.getenv("API_URL", "http://localhost:8001"),
help="API 地址(默认: http://localhost:8001",
)
parser.add_argument(
"--username",
type=str,
default=os.getenv("API_USERNAME", "admin"),
help="管理员用户名(默认: admin",
)
parser.add_argument(
"--password",
type=str,
default=os.getenv("API_PASSWORD", "admin123"),
help="管理员密码(默认: admin123",
)
parser.add_argument(
"--status",
type=str,
default=None,
choices=["pending", "approved", "rejected"],
help="按状态筛选(默认: 全部)",
)
parser.add_argument(
"--limit",
type=int,
default=None,
help="最多处理 N 条(默认: 全部)",
)
parser.add_argument(
"--id",
type=str,
default=None,
dest="ids",
help="指定笑话 ID,逗号分隔(如: 1,2,3)",
)
return parser.parse_args()
def main():
args = parse_args()
ids = None
if args.ids:
ids = [int(x.strip()) for x in args.ids.split(",") if x.strip()]
print(f"=" * 50)
print(f"笑话优化工具")
print(f"API 地址: {args.api_url}")
print(f"筛选状态: {args.status or '全部'}")
if args.limit:
print(f"处理上限: {args.limit}")
if ids:
print(f"指定 ID: {ids}")
print(f"=" * 50)
optimizer = Optimizer(
api_base=args.api_url,
username=args.username,
password=args.password,
)
try:
optimizer.run(status=args.status, limit=args.limit, ids=ids)
except KeyboardInterrupt:
print("\n用户中断")
except Exception as e:
print(f"\n[!] 运行错误: {e}")
sys.exit(1)
if __name__ == "__main__":
main()