feat: HSAP platform v2 — modular navigation, quality review, audit log, world model simulation
Major changes: - New frontend (platform/web/): Vite + React 18 + TypeScript + Tailwind - 4-module navigation: 数据送标 / 模型管理 / 车队管理 / 系统管理 - Data catalog with charts (DMS/ADAS/Lane 3-tab view) - Quality review workflow (标注质检): Good/Fine/Bad scoring with auto-advance - Audit enhancements: batch operations, rejection categories, Feishu notifications - Operation audit log (操作日志) - World model simulation studio (仿真工坊) - Dataset version management with snapshots and diff - ADAS 7-class dataset integration (138K images organized + compressed) - User management with Feishu integration and pagination - CRUD/search/filter on all pages, card layout redesign - PIL-optimized image overlay rendering - Auto-snapshot on build, in_review workflow stage - Removed embedded algorithm code (now in workspace)
This commit is contained in:
63
platform/as_platform/audit/log_utils.py
Normal file
63
platform/as_platform/audit/log_utils.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""操作审计日志工具。异步写入,不阻塞主流程。"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import threading
|
||||
from datetime import datetime, timezone
|
||||
from typing import Any
|
||||
|
||||
from as_platform.db.models import OperationLog
|
||||
|
||||
|
||||
def log_op(
|
||||
*,
|
||||
user_id: int | None = None,
|
||||
user_name: str | None = None,
|
||||
category: str,
|
||||
action: str,
|
||||
target_type: str | None = None,
|
||||
target_id: str | None = None,
|
||||
summary: str = "",
|
||||
detail: dict[str, Any] | None = None,
|
||||
ip_address: str | None = None,
|
||||
) -> None:
|
||||
"""异步记录操作日志。"""
|
||||
threading.Thread(
|
||||
target=_write_log,
|
||||
args=(user_id, user_name, category, action, target_type, target_id, summary, detail, ip_address),
|
||||
daemon=True,
|
||||
name=f"audit-log-{action}",
|
||||
).start()
|
||||
|
||||
|
||||
def _write_log(
|
||||
user_id: int | None,
|
||||
user_name: str | None,
|
||||
category: str,
|
||||
action: str,
|
||||
target_type: str | None,
|
||||
target_id: str | None,
|
||||
summary: str,
|
||||
detail: dict[str, Any] | None,
|
||||
ip_address: str | None,
|
||||
) -> None:
|
||||
try:
|
||||
from as_platform.db.engine import session_scope
|
||||
|
||||
with session_scope() as db:
|
||||
log = OperationLog(
|
||||
timestamp=datetime.now(timezone.utc),
|
||||
user_id=user_id,
|
||||
user_name=user_name,
|
||||
category=category,
|
||||
action=action,
|
||||
target_type=target_type,
|
||||
target_id=str(target_id)[:128] if target_id else None,
|
||||
summary=summary[:512] if summary else None,
|
||||
detail_json=json.dumps(detail, ensure_ascii=False) if detail else None,
|
||||
ip_address=ip_address,
|
||||
)
|
||||
db.add(log)
|
||||
db.commit()
|
||||
except Exception:
|
||||
pass # 日志写入失败不影响业务
|
||||
Reference in New Issue
Block a user