⚒️ 重大重构 LoveACE V2

引入了 mongodb
对数据库进行了一定程度的数据加密
性能改善
代码简化
统一错误模型和响应
使用 apifox 作为文档
This commit is contained in:
2025-11-20 20:44:25 +08:00
parent 6b90c6d7bb
commit bbc86b8330
168 changed files with 14264 additions and 19152 deletions

View File

@@ -0,0 +1,185 @@
from typing import List
from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
from httpx import Headers, HTTPError
from pydantic import ValidationError
from loveace.router.endpoint.aac.model.base import AACConfig
from loveace.router.endpoint.aac.model.credit import (
LoveACCreditCategory,
LoveACCreditInfo,
)
from loveace.router.endpoint.aac.utils.aac_ticket import get_aac_header
from loveace.router.schemas.error import ProtectRouterErrorToCode
from loveace.router.schemas.uniresponse import UniResponseModel
from loveace.service.remote.aufe import AUFEConnection
from loveace.service.remote.aufe.depends import get_aufe_conn
aac_credit_router = APIRouter(
prefix="/credit",
responses=ProtectRouterErrorToCode().gen_code_table(),
)
ENDPOINT = {
"total_score": "/User/Center/DoGetScoreInfo?sf_request_type=ajax",
"score_list": "/User/Center/DoGetScoreList?sf_request_type=ajax",
}
@aac_credit_router.get(
"/info",
response_model=UniResponseModel[LoveACCreditInfo],
summary="获取爱安财总分信息",
)
async def get_credit_info(
conn: AUFEConnection = Depends(get_aufe_conn),
headers: Headers = Depends(get_aac_header),
) -> UniResponseModel[LoveACCreditInfo] | JSONResponse:
"""
获取用户的爱安财总分信息
✅ 功能特性:
- 获取爱安财总分和毕业要求状态
- 获取未达标的原因说明
- 实时从 AUFE 服务获取最新数据
💡 使用场景:
- 个人中心显示爱安财总分
- 检查是否满足毕业要求
- 了解分数不足的原因
Returns:
LoveACCreditInfo: 包含总分、达成状态和详细信息
"""
try:
conn.logger.info("开始获取爱安财总分信息")
response = await conn.client.post(
url=AACConfig().to_full_url(ENDPOINT["total_score"]),
data={},
headers=headers,
timeout=6000,
)
if response.status_code != 200:
conn.logger.error(
f"获取爱安财总分信息失败HTTP状态码: {response.status_code}"
)
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息失败,请稍后重试"
)
data = response.json()
if data.get("code") != 0:
conn.logger.error(f"获取爱安财总分信息失败,响应代码: {data.get('code')}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息失败,请稍后重试"
)
data = data.get("data", {})
if not data:
conn.logger.error("获取爱安财总分信息失败,响应数据为空")
return ProtectRouterErrorToCode().null_response.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息失败,请稍后重试"
)
try:
credit_info = LoveACCreditInfo.model_validate(data)
conn.logger.info("成功获取爱安财总分信息")
return UniResponseModel[LoveACCreditInfo](
success=True,
data=credit_info,
message="获取爱安财总分信息成功",
error=None,
)
except ValidationError as ve:
conn.logger.error(f"解析爱安财总分信息失败: {str(ve)}")
return ProtectRouterErrorToCode().validation_error.to_json_response(
conn.logger.trace_id, "解析爱安财总分信息失败,请稍后重试"
)
except HTTPError as he:
conn.logger.error(f"获取爱安财总分信息异常: {str(he)}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息异常,请稍后重试"
)
except Exception as e:
conn.logger.error(f"获取爱安财总分信息未知异常: {str(e)}")
return ProtectRouterErrorToCode().unknown_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息未知异常,请稍后重试"
)
@aac_credit_router.get(
"/list",
response_model=UniResponseModel[List[LoveACCreditCategory]],
summary="获取爱安财分数明细",
)
async def get_credit_list(
conn: AUFEConnection = Depends(get_aufe_conn),
headers: Headers = Depends(get_aac_header),
) -> UniResponseModel[List[LoveACCreditCategory]] | JSONResponse:
"""
获取用户的爱安财分数明细列表
✅ 功能特性:
- 获取分数的详细分类信息
- 显示每个分数项的具体内容
- 支持分页查询
💡 使用场景:
- 查看分数明细页面
- 了解各类别分数构成
- 分析分数不足的原因
Returns:
list[LoveACCreditCategory]: 分数分类列表,每个分类包含多个分数项
"""
try:
conn.logger.info("开始获取爱安财分数明细")
response = await conn.client.post(
url=AACConfig().to_full_url(ENDPOINT["score_list"]),
data={"pageIndex": "1", "pageSize": "10"},
headers=headers,
timeout=6000,
)
if response.status_code != 200:
conn.logger.error(
f"获取爱安财分数明细失败HTTP状态码: {response.status_code}"
)
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细失败,请稍后重试"
)
data = response.json()
if data.get("code") != 0:
conn.logger.error(f"获取爱安财分数明细失败,响应代码: {data.get('code')}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细失败,请稍后重试"
)
data = data.get("data", [])
if not data:
conn.logger.error("获取爱安财分数明细失败,响应数据为空")
return ProtectRouterErrorToCode().null_response.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细失败,请稍后重试"
)
try:
credit_list = [LoveACCreditCategory.model_validate(item) for item in data]
conn.logger.info("成功获取爱安财分数明细")
return UniResponseModel[List[LoveACCreditCategory]](
success=True,
data=credit_list,
message="获取爱安财分数明细成功",
error=None,
)
except ValidationError as ve:
conn.logger.error(f"解析爱安财分数明细失败: {str(ve)}")
return ProtectRouterErrorToCode().validation_error.to_json_response(
conn.logger.trace_id, "解析爱安财分数明细失败,请稍后重试"
)
except HTTPError as he:
conn.logger.error(f"获取爱安财分数明细异常: {str(he)}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细异常,请稍后重试"
)
except Exception as e:
conn.logger.error(f"获取爱安财分数明细未知异常: {str(e)}")
return ProtectRouterErrorToCode().unknown_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细未知异常,请稍后重试"
)