FinBuddy_Web 项目初始化

· FinBuddy_Web

今日进展

  1. 初始化 FinBuddy_Web 项目 SVN 仓库,设置 svn:ignore 忽略规则
  2. 搭建 FastAPI + Vue 3 + MySQL 分层架构:Routes -> Services -> Repositories -> Models -> Infra
  3. 继承 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 积分系统:冻结-结算-退款事务