FinBuddy_Web 项目初始化
· FinBuddy_Web
今日进展
- 初始化 FinBuddy_Web 项目 SVN 仓库,设置 svn:ignore 忽略规则
- 搭建 FastAPI + Vue 3 + MySQL 分层架构:Routes -> Services -> Repositories -> Models -> Infra
- 继承 Basic_Web 脚手架的认证、权限、邮件等基础模块
关键代码/伪代码
分层架构设计
# FinBuddy_Web 分层架构 (继承 Basic_Web)
#
# 请求流: Client -> Route -> Service -> Repository -> Model -> DB
# 响应流: DB -> Model -> Repository -> Service -> Route -> Client
# Route 层: 只做参数校验和调度
@router.post("/finbuddy/llm/chat")
ASYNC def llm_chat(request: LLMChatRequest, user = Depends(get_current_user)):
validated = validate_chat_request(request)
result = await llm_service.proxy_chat(user.id, validated)
RETURN ApiResponse(data=result)
# Service 层: 业务逻辑
CLASS LLMProxyService:
ASYNC DEF proxy_chat(self, user_id, request):
# 1. 检查积分余额
balance = AWAIT self.credit_service.get_balance(user_id)
IF balance < MIN_CREDITS:
RAISE InsufficientCreditsError()
# 2. 冻结积分
AWAIT self.credit_service.freeze(user_id, estimated_cost)
# 3. 代理 LLM 请求 (流式)
ASYNC FOR chunk IN self.llm_provider.stream(request):
YIELD chunk
# 4. 结算积分 (按实际 token 用量)
AWAIT self.credit_service.settle(user_id, actual_tokens)
# Repository 层: 数据访问
CLASS CreditRepository:
ASYNC DEF get_balance(self, user_id) -> Decimal:
record = AWAIT self.session.query(CreditAccount).filter_by(user_id=user_id).first()
RETURN record.balance IF record ELSE Decimal("0")
SVN 忽略规则
# svn-ignore.txt
__pycache__/
*.pyc
.env
.venv/
node_modules/
dist/
*.egg-info/
.pytest_cache/
htmlcov/
遇到的问题
- SVN 仓库初始化时需要先在服务器端 svnadmin create,再在客户端 import,步骤比 git init 多
- 从 Basic_Web 继承代码时,需要调整 config.py 中的项目名称和数据库配置,不能直接复制
明日计划
- 实现 LLM 代理服务:流式/非流式双模式
- 实现 FinCredits 积分系统:冻结-结算-退款事务