1.0.0初始化源代码

This commit is contained in:
yuqianqian10204095yu
2026-03-23 15:40:36 +08:00
parent f13ecb3bba
commit cebc0a288f
53 changed files with 5300 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
"""
虚拟用户管理 API
"""
from fastapi import APIRouter, Depends, HTTPException, Query, UploadFile, File
from sqlalchemy.orm import Session
from typing import List, Optional
import pandas as pd
import io
from app.models.base import get_db
from app.schemas.virtual_user import (
VirtualUserCreate,
VirtualUserUpdate,
VirtualUserResponse,
VirtualUserListResponse,
VirtualUserGenerateRequest,
ActivityLevel,
UserStatus
)
from app.services.virtual_user_service import VirtualUserService, get_virtual_user_service
router = APIRouter()
@router.get("", response_model=VirtualUserListResponse)
def get_virtual_users(
page: int = Query(1, ge=1, description="页码"),
page_size: int = Query(20, ge=1, le=100, description="每页数量"),
status: Optional[UserStatus] = Query(None, description="状态筛选"),
search: Optional[str] = Query(None, description="搜索关键词"),
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""获取虚拟用户列表"""
result = service.get_users(page=page, page_size=page_size, status=status, search=search)
return result
@router.get("/{user_id}", response_model=VirtualUserResponse)
def get_virtual_user(
user_id: int,
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""获取虚拟用户详情"""
user = service.get_user_by_id(user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
@router.post("", response_model=VirtualUserResponse)
def create_virtual_user(
user_data: VirtualUserCreate,
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""创建虚拟用户"""
user = service.create_user(
username=user_data.username,
password=user_data.password,
nickname=user_data.nickname,
writing_style=user_data.writing_style,
activity_level=user_data.activity_level,
avatar_url=user_data.avatar_url,
persona_description=user_data.persona_description
)
if not user:
raise HTTPException(status_code=400, detail="Failed to create user (username may exist)")
return user
@router.post("/generate", response_model=VirtualUserListResponse)
def generate_virtual_users(
request: VirtualUserGenerateRequest,
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""批量生成虚拟用户"""
users = service.generate_users(
count=request.count,
writing_styles=request.writing_styles,
activity_levels=request.activity_levels,
generate_persona=request.generate_persona
)
return {"total": len(users), "items": users}
@router.put("/{user_id}", response_model=VirtualUserResponse)
def update_virtual_user(
user_id: int,
user_data: VirtualUserUpdate,
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""更新虚拟用户"""
update_data = user_data.model_dump(exclude_unset=True)
user = service.update_user(user_id, **update_data)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
@router.delete("/{user_id}")
def delete_virtual_user(
user_id: int,
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""删除虚拟用户"""
success = service.delete_user(user_id)
if not success:
raise HTTPException(status_code=404, detail="User not found")
return {"message": "User deleted successfully"}
@router.post("/import", response_model=dict)
def import_virtual_users(
file: UploadFile = File(...),
generate_persona: bool = Query(True, description="是否生成 AI 人格描述"),
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""从 Excel 导入虚拟用户"""
try:
# 读取 Excel 文件
contents = file.file.read()
df = pd.read_excel(io.BytesIO(contents))
# 转换为字典列表
users_data = df.to_dict('records')
# 导入用户
result = service.import_users_from_excel(
users_data=users_data,
generate_persona=generate_persona
)
return {
"message": "Import completed",
"success_count": result["success_count"],
"failed_count": result["failed_count"]
}
except Exception as e:
raise HTTPException(status_code=400, detail=f"Import failed: {str(e)}")
@router.get("/{user_id}/stats")
def get_user_stats(
user_id: int,
db: Session = Depends(get_db),
service: VirtualUserService = Depends(get_virtual_user_service)
):
"""获取用户统计信息"""
stats = service.get_user_stats(user_id)
return stats