feat: 管理端专家管理完整CRUD(新增创建和删除)
后端:
- ExpertStore.create_expert: 创建专家(含bcrypt密码哈希)
- ExpertStore.delete_expert: 级联删除(咨询+服务关系+专家)
- POST /admin/experts: 创建专家API
- DELETE /admin/experts/{id}: 删除专家API
前端:
- AdminExperts页面加"新增专家"按钮和创建弹窗
- 创建弹窗含姓名/手机号/密码/分类/职称/简介/专长
- 每个专家卡片加删除按钮,二次确认后删除
- api.ts加adminCreateExpert和adminDeleteExpert方法
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -1644,6 +1644,44 @@ def admin_list_experts(status: str | None = None):
|
||||
return {"results": expert_store.list_experts(status=status)}
|
||||
|
||||
|
||||
class ExpertCreateRequest(BaseModel):
|
||||
"""创建专家请求。"""
|
||||
name: str
|
||||
phone: str
|
||||
password: str
|
||||
category: str
|
||||
title: str = ""
|
||||
bio: str = ""
|
||||
expertise: str = ""
|
||||
avatar_url: str | None = None
|
||||
status: str = "active"
|
||||
|
||||
|
||||
@app.post("/admin/experts")
|
||||
def admin_create_expert(req: ExpertCreateRequest):
|
||||
"""管理端:创建专家(含登录账号)。"""
|
||||
if len(req.password) < 6:
|
||||
raise HTTPException(400, "密码至少 6 位")
|
||||
try:
|
||||
expert = expert_store.create_expert(
|
||||
name=req.name, phone=req.phone, password=req.password,
|
||||
category=req.category, title=req.title, bio=req.bio,
|
||||
expertise=req.expertise, avatar_url=req.avatar_url,
|
||||
status=req.status,
|
||||
)
|
||||
except ValueError as e:
|
||||
raise HTTPException(400, str(e))
|
||||
return {"created": True, "expert": expert}
|
||||
|
||||
|
||||
@app.delete("/admin/experts/{expert_id}")
|
||||
def admin_delete_expert(expert_id: int):
|
||||
"""管理端:删除专家(级联删除服务关系和咨询)。"""
|
||||
if not expert_store.delete_expert(expert_id):
|
||||
raise HTTPException(404, "专家不存在")
|
||||
return {"deleted": True, "expert_id": expert_id}
|
||||
|
||||
|
||||
@app.patch("/admin/experts/{expert_id}/status")
|
||||
def admin_update_expert_status(expert_id: int, body: dict):
|
||||
"""管理端:上架/下架专家。"""
|
||||
|
||||
Reference in New Issue
Block a user