这是《从零开发校园墙微信小程序》系列的第 0 篇。系列根据我真实在跑的项目「培正森林」重写,文中代码都来自生产代码(密钥与内部地址已脱敏)。

它是什么

「培正森林」是给广东培正学院做的校园墙 / 表白墙 微信小程序。同学在小程序里写下一段话、配几张图,投稿就会出现在「墙」上;别人可以浏览、评论、回复。除此之外,它还顺手做了几件校园里很实用的事:

  • 课表 :绑定教务账号后拉取课表(强智教务),按教学周展示,还能导出、分享成卡片;
  • 考试倒计时 :自己添加考试,看剩余天数,一键加到手机日历;
  • 文章 / 公告 :管理员在后台发布,小程序里展示;
  • 问题反馈 :用户提交,后台回复,开发者邮箱收每日汇总;
  • 管理后台 :审核、封禁、敏感词、配置、审计日志都能在网页里操作。

一个关键设计:墙就是一个微博账号

很多人第一次看会好奇:投稿存在哪里?
项目的「墙」建在微博之上 :小程序把投稿发给后端,后端做完校验后,通过微博开放平台接口,以墙号的身份发一条微博;同时把这条微博镜像一份到自己的数据库 ,小程序读墙时读的是自己的库,而不是实时去调微博。
这样做有三个好处:

  1. 墙天然有一个公开出口,微博上的人也能看到;
  2. 自己的库可以做搜索、分页、缩略图,速度不受微博接口限制;
  3. 微博的评论也能被镜像回来,小程序里直接回复。

代价是要处理微博接口的频率限制 和令牌失效 ,这会在后面的文章里反复出现。

整体架构

┌──────────────────────┐        HTTPS         ┌─────────────────────────────┐
│ 微信小程序(Taro)     │ ───────────────────▶ │ 后端 Spring Boot (WebFlux)   │
│ Vue3 + NutUI + Pinia │ ◀─────────────────── │  Sa-Token 鉴权               │
└──────────────────────┘      JSON            │  MyBatis-Plus + R2DBC        │
                                              └───┬───────┬────────┬────────┘
┌──────────────────────┐                          │       │        │
│ 管理后台(Vue3+Vite) │ ───────────────────────▶ │       │        │
└──────────────────────┘                    MariaDB   Redis    MinIO
                                              │ 业务数据   │ 会话/缓存  │ 图片
                                              └──────────┬─┴────────────┘
                                                         ▼
                                                  微博开放平台 API
                                              微信接口(登录 / 内容安全)

技术栈

层选型说明
小程序Taro 3.6 + Vue3(<script setup>)+ TypeScript一套代码,可编译到多端,本项目主要用微信小程序
UINutUI 4(@nutui/nutui-taro)京东出品,和 Taro 配套
状态Pinia只管登录态
后端Spring Boot 3.2 + WebFlux / NettyJDK 17
鉴权Sa-Token 1.42登录态 = 微信 openid
数据层MyBatis-Plus(阻塞)+ Spring Data R2DBC(响应式)两套并存,原因见第 2 篇
数据库MariaDButf8mb4
缓存RedisSa-Token 会话持久化、验证码等
对象存储MinIO投稿配图
其他Hutool、Jsoup(课表解析)、springdoc(接口文档)

这个系列怎么读

旧版教程我是跟着 AI 一口气生成的,写得很糙,很多地方「能跑但不知道为什么」。这一版我按真实的开发顺序 重写,每篇只讲一件事(前 9 篇是主线,09 起是进阶),并且讲清楚「为什么这样做」和「我踩过的坑」:

篇主题你会学到
01数据库设计为什么用 openid 做用户主键、微博数据怎么镜像、敏感词与封禁表
02后端脚手架WebFlux 与阻塞代码如何共存,配置分层与密钥管理
03登录与鉴权微信 code 换 openid,Sa-Token 在 WebFlux 下的坑
04小程序前端结构Taro 项目目录、请求封装、401 自动静默重登
05投稿全链路多图拼长图、后端五道关卡、为什么「谁投稿」只信服务端
06敏感词过滤Trie 树 + 单遍扫描,修复首字重复绕过
07图片上传缩放压缩、MinIO、内外网地址
08部署与上线jar 部署、健康检查、回滚、几个血泪教训
09进阶:微博开放平台接入OAuth2.0 access_token、发帖与 @ 转发、反风控节流、幂等与重试
10进阶:多令牌与限流退避按「令牌 × 读写作用域」递增冷却、两层退避
11进阶:评论的多层降级Redis → 官方接口 → 网页接口 → 本地镜像,「失败」与「空」
12进阶:强智课表(上)教务登录、会话、验证码 OCR、网络容错链
13进阶:强智课表(中)Redis 登录队列、防重复提交、失败重试的白名单判定
14进阶:强智课表(下)Jsoup 解析、周次位掩码、学期与教学周、校历调整
15为什么要做管理后台哪些东西该做成数据 + 后台页面、「令牌 / 教务代理 / 卡住用户」监控
16后台的安全防护统一鉴权、两层登录限流、恒时比较、CSP、审计日志
17选型笔记用了哪些开源项目、各自干什么、附 GitHub 链接

开始之前

你需要:

  • 会一点 Java 和 Spring Boot(不用会 WebFlux,我会讲);
  • 会一点 Vue3 / TypeScript;
  • 一个微信小程序 AppID(个人主体就行);
  • 一台能跑 MariaDB、Redis 的机器(本地 Docker 也行)。

下一篇我们从最底层的数据库 开始。

最后修改:2026 年 11 月 12 日
如果觉得我的文章对你有用,请随意赞赏