feat(交易记录): 新增交易记录管理页面与API接口 feat(上传): 添加统一上传接口支持自动识别文件类型 feat(用户管理): 为用户模型添加备注字段并更新相关接口 feat(邮件): 实现SMTP邮件发送功能并添加测试脚本 feat(短信): 增强短信服务配置灵活性与日志记录 fix(发票): 修复发票列表时间筛选功能 fix(nginx): 调整上传大小限制与超时配置 docs: 添加多个功能模块的说明文档 docs(估值): 补充估值计算流程与API提交数据说明 chore: 更新依赖与Docker镜像版本
80 lines
3.4 KiB
Python
80 lines
3.4 KiB
Python
from fastapi import APIRouter, Query, Depends, HTTPException
|
|
from typing import Optional
|
|
|
|
from app.schemas.base import Success, SuccessExtra, BasicResponse, PageResponse
|
|
from app.schemas.app_user import AppUserQuotaUpdateSchema, AppUserQuotaLogOut
|
|
from app.controllers.app_user import app_user_controller
|
|
from app.models.user import AppUser, AppUserQuotaLog
|
|
from app.core.dependency import DependAuth, DependPermission, AuthControl
|
|
|
|
|
|
admin_app_users_router = APIRouter(dependencies=[DependAuth, DependPermission], tags=["admin-App用户管理"])
|
|
|
|
|
|
@admin_app_users_router.get("/list", summary="App用户列表", response_model=PageResponse[dict])
|
|
async def list_app_users(
|
|
phone: Optional[str] = Query(None),
|
|
wechat: Optional[str] = Query(None),
|
|
page: int = Query(1, ge=1),
|
|
page_size: int = Query(10, ge=1, le=100),
|
|
):
|
|
qs = AppUser.filter()
|
|
if phone:
|
|
qs = qs.filter(phone__icontains=phone)
|
|
if wechat:
|
|
qs = qs.filter(alias__icontains=wechat)
|
|
total = await qs.count()
|
|
rows = await qs.order_by("-created_at").offset((page - 1) * page_size).limit(page_size)
|
|
items = []
|
|
for u in rows:
|
|
items.append({
|
|
"id": u.id,
|
|
"phone": u.phone,
|
|
"wechat": u.alias,
|
|
"created_at": u.created_at.isoformat() if u.created_at else "",
|
|
"notes": getattr(u, "notes", "") or "",
|
|
"remaining_count": int(getattr(u, "remaining_quota", 0) or 0),
|
|
"user_type": None,
|
|
})
|
|
return SuccessExtra(data=items, total=total, page=page, page_size=page_size, msg="获取成功")
|
|
|
|
|
|
@admin_app_users_router.post("/quota", summary="调整用户剩余估值次数", response_model=BasicResponse[dict])
|
|
async def update_quota(payload: AppUserQuotaUpdateSchema, operator=Depends(AuthControl.is_authed)):
|
|
user = await app_user_controller.update_quota(
|
|
operator_id=getattr(operator, "id", 0),
|
|
operator_name=getattr(operator, "username", "admin"),
|
|
user_id=payload.user_id,
|
|
target_count=payload.target_count,
|
|
delta=payload.delta,
|
|
op_type=payload.op_type,
|
|
remark=payload.remark,
|
|
)
|
|
if not user:
|
|
raise HTTPException(status_code=404, detail="用户不存在")
|
|
if payload.remark is not None:
|
|
user.notes = payload.remark
|
|
await user.save()
|
|
return Success(data={"user_id": user.id, "remaining_quota": user.remaining_quota}, msg="调整成功")
|
|
|
|
|
|
@admin_app_users_router.get("/{user_id}/quota-logs", summary="用户估值次数操作日志", response_model=PageResponse[AppUserQuotaLogOut])
|
|
async def quota_logs(user_id: int, page: int = Query(1, ge=1), page_size: int = Query(10, ge=1, le=100)):
|
|
qs = AppUserQuotaLog.filter(app_user_id=user_id)
|
|
total = await qs.count()
|
|
rows = await qs.order_by("-created_at").offset((page - 1) * page_size).limit(page_size)
|
|
models = [
|
|
AppUserQuotaLogOut(
|
|
id=r.id,
|
|
app_user_id=r.app_user_id,
|
|
operator_id=r.operator_id,
|
|
operator_name=r.operator_name,
|
|
before_count=r.before_count,
|
|
after_count=r.after_count,
|
|
op_type=r.op_type,
|
|
remark=r.remark,
|
|
created_at=r.created_at.isoformat() if r.created_at else "",
|
|
) for r in rows
|
|
]
|
|
data_items = [m.model_dump() for m in models]
|
|
return SuccessExtra(data=data_items, total=total, page=page, page_size=page_size, msg="获取成功") |