sequenceDiagram participant U as 管理员浏览器 participant G as Gin Router participant MW as AuthMiddleware participant H as HandlerCards participant CM as CardModel Note over U,CM: 卡片列表 U->>G: GET /admin/cards G->>MW: AuthRequired() MW->>MW: 检查 Cookie session_id alt 未登录 MW-->>U: 302 → /admin/login else 已登录 MW->>H: CardsList(c) H->>CM: GetAllCards() CM-->>H: []Card H-->>U: 卡片列表 HTML end Note over U,CM: 新增卡片 U->>G: GET /admin/cards/new G->>H: CardCreateGet(c) H-->>U: 空表单 HTML U->>G: POST /admin/cards {icon, title, subtitle, url} G->>H: CardCreatePost(c) H->>CM: CreateCard(&Card{...}) CM->>CM: INSERT INTO cards(...) CM-->>H: nil H-->>U: 302 Redirect → /admin/cards Note over U,CM: 编辑卡片 U->>G: GET /admin/cards/:id/edit G->>H: CardEditGet(c) H->>CM: GetCardByID(id) CM-->>H: *Card H-->>U: 预填表单 HTML U->>G: POST /admin/cards/:id {icon, title, subtitle, url} G->>H: CardEditPost(c) H->>CM: UpdateCard(&Card{...}) CM->>CM: UPDATE cards SET ... WHERE id=? CM-->>H: nil H-->>U: 302 Redirect → /admin/cards Note over U,CM: 删除卡片 U->>G: POST /admin/cards/:id/delete G->>H: CardDelete(c) H->>CM: DeleteCard(id) CM->>CM: DELETE FROM cards WHERE id=? CM-->>H: nil H-->>U: 302 Redirect → /admin/cards