从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(03)

55 阅读4分钟

第 3 章:整体架构设计

“架构设计不是为了炫技,而是为了让代码在一年后还能被看懂。”

在深入具体的代码实现之前,我们需要对系统的整体骨架有一个清晰的认识。本章将带你领略前后端分离的云开发架构之美。

3.1 前后端分离的云开发架构

传统的前后端分离通常是:前端(Vue/React) <--> HTTP API <--> 后端服务器(Java/Go/Node) <--> 数据库。

而在 Serverless 云开发 架构下,我们的链路变得更短、更轻:

graph LR
    Client[小程序端UniApp] -->|Cloud SDK| Gateway[云函数网关]
    Gateway --> Function[云函数 Node.js]
    Function --> DB[(云数据库 MySQL)]
    Function --> Storage[云存储 COS]

核心优势

  1. 免鉴权调用:小程序端调用云函数时,微信会自动注入用户信息(OpenID),无需手动维护复杂的 Session 或 Token。
  2. 弹性伸缩:活动报名高峰期,云函数自动扩容,不用担心服务器崩塌。
  3. 稳定可靠:MySQL 作为老牌关系型数据库,在处理复杂的报名事务、投票统计时,比 NoSQL 更让我们放心。

3.2 模块划分策略

一个好的目录结构就是最好的文档。我们采用了“按业务领域”划分的策略。

3.2.1 前端模块 (src/)

我们没有把所有页面都堆在 pages 里,而是按功能域分组:

  • pages/activity: 活动的核心领地。
    • list: 活动广场。
    • detail: 活动详情(展示页)。
    • form: 活动创建/编辑表单。
    • poster: 海报生成页。
  • pages/registration: 报名相关。
    • my-list: 我的报名记录。
    • verify: 管理员扫码核销页。
  • components/ActivityDesign: (重难点) 可视化编辑器模块。
    • widget: 基础组件库(文本、图片、按钮等)。
    • property: 属性编辑面板。
    • 这是整个项目中复用度最高、逻辑最复杂的部分。

3.2.2 后端模块 (server/)

云函数采用了 微服务 的思想,每个文件夹代表一个独立的服务:

  • auth: 鉴权中心。负责登录换取 Token、刷新 Token、校验权限。
  • user: 用户管理服务。负责用户信息的更新、查询。
  • activity: 活动领域服务。处理活动的 CRUD、状态变更。它不直接处理报名逻辑,保持单一职责。
  • registration: 报名领域服务。处理提交报名、审核报名、支付凭证校验。
  • vote: 投票领域服务。处理投票动作、实时统计、并发控制。
  • barrage: 弹幕服务。负责弹幕的发送、拉取,甚至未来的审核。
  • wechat: 微信集成服务。处理 AccessToken 获取、小程序码生成等与微信服务器的“外交”事务。

3.3 数据流转全景图

让我们通过一个“用户报名”的场景,看看数据是如何流转的:

  1. 触好 (UI): 用户在 ActivityDetail 页面点击“立即报名”按钮。
  2. 表单 (Form): 前端根据后台配置的 JSON Schema 动态渲染出表单(姓名、电话、图片上传)。
  3. 上传 (Storage): 用户上传支付截图,前端调用 uniCloud.uploadFile 将图片存入云存储,获得 fileID
  4. 请求 (Request): 前端调用云函数 registration/submit,携带表单数据和 fileID
  5. 逻辑 (Logic):
    • 云函数接收请求,校验用户是否已登录。
    • 检查活动状态(是否过期、名额是否已满)。
    • 向 MySQL 数据库 registrations 表插入一条记录,状态为 pending (待审核)。
  6. 响应 (Response): 返回成功消息,前端跳转到“报名成功待审核”页面。

3.4 技术栈深度解析

为什么选择 UniApp?

  • Vue 3: 组合式 API (setup语法糖) 让逻辑复用变得极其简单,特别是在处理复杂的编辑器逻辑时,Hooks 模式(如 useDraggable)大显身手。
  • TypeScript: 我们的数据结构(如活动配置 JSON)非常复杂,TS 的类型定义能帮我们规避 90% 的 undefined 报错。

为什么选择 MySQL?

  • 事务支持: 报名扣库存、投票防刷,这些涉及到数据一致性的操作,MySQL 的事务机制是最佳保障。
  • JSON 支持: 虽然是关系型数据库,但 MySQL 5.7+ 对 JSON 类型支持极好。我们可以把复杂的活动配置 (config) 存为 JSON 字段,既享受了 SQL 的严谨,又有了 NoSQL 的灵活。

本章小结: 我们确立了 UniApp + CloudBase + MySQL 的铁三角组合。虽然架构图看起来很简单,但魔鬼都在细节里。下一章,我们将深入数据的灵魂——设计那个既严谨又灵活的数据库模型。

下一章(04-数据库设计)