feat: 迁移专家工作台和管理后台到web2
CI / 后端测试 (push) Has been cancelled
CI / 前端构建 (push) Has been cancelled

专家工作台(4页面):
- WorkbenchPendingServices: 待确认服务
- WorkbenchPending: 待回复咨询
- WorkbenchReplied: 已回复咨询
- WorkbenchUsers: 服务中用户
- shared.tsx: 共享hook/弹窗/外壳

管理后台(5页面):
- AdminStats: 平台统计
- AdminAiUsage: AI使用情况(含图表)
- AdminExpertActivity: 专家沟通情况(含图表)
- AdminUsers: 用户管理(搜索/重置密码/停用)
- AdminExperts: 专家管理(上下架/编辑/头像)
- constants.ts: 标签映射和图表配色

路由: workbench/* 和 admin/* 接入实际页面
适配: EmptyState icon 从JSX元素改为ComponentType
修正: 管理端场景标签"法务参谋"→"私人法务"

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-08-31 15:46:01 +08:00
co-authored by Devin
parent 5272ed5339
commit 9310ba141d
15 changed files with 1577 additions and 5 deletions
+20 -2
View File
@@ -313,8 +313,26 @@ export const api = {
users: number; experts_active: number; experts_total: number;
services_active: number; consultations_total: number; consultations_pending: number;
}>('/admin/stats'),
adminAiUsage: () => request<Record<string, unknown>>('/admin/ai-usage'),
adminExpertActivity: () => request<Record<string, unknown>>('/admin/expert-activity'),
adminAiUsage: () => request<{
total_questions: number
active_users: number
by_scene: Array<{ scene: string; count: number }>
by_mode: Array<{ mode: string; count: number }>
by_risk: Array<{ level: string; count: number }>
by_inference: Array<{ location: string; count: number }>
daily_trend: Array<{ date: string; count: number }>
by_user: Array<{ phone_masked: string; questions: number; replies: number; last_active: string | null; top_scene: string | null }>
}>('/admin/ai-usage'),
adminExpertActivity: () => request<{
total: number
replied: number
pending: number
by_status: Array<{ status: string; count: number }>
by_category: Array<{ category: string; count: number }>
by_expert: Array<{ name: string; category: string; title: string; total: number; replied: number; pending: number; avg_rating: number; rating_count: number }>
daily_trend: Array<{ date: string; count: number }>
by_user: Array<{ phone_masked: string; consultations: number; last_active: string | null }>
}>('/admin/expert-activity'),
// ===== 对话历史 =====
listHistorySessions: (mode?: 'normal' | 'confidential') =>