做了个基于 PHP 后端 + 微信小程序前端的学习交流论坛考试平台,不是那种只能演示几个静态页面的 Demo,而是包含用户注册登录、发帖、评论、收藏、参加在线考试、自动判分、错题记录,以及后台题库/帖子管理的完整闭环项目。起初我以为论坛和考试系统都是现成套路,真把二者合并到一个体系里才发现坑点不少,而且大多集中在业务规则设计、登录态、内容安全和前端兼容这些不显眼的地方。如果你正打算用类似题目做毕业设计、课程实训,或者帮培训机构搭学习平台,这篇东西能让你少走两到三周弯路。
这个项目最终能跑通,靠的不只是“会写接口”,而是把三类角色(学生、老师、管理员)的权限边界、考试流程与社区内容的审核机制全部理清楚。下面直接按实际开发顺序,把整体设计、库表结构、后端细节、小程序端实现和上线时容易踩的坑完整拆一遍。全程不会只贴代码,我会把每一步的为什么也讲透。
1. 项目整体设计与技术方案拆解
1.1 先想清楚平台要承载什么业务
项目名字听起来是“论坛 + 考试”两个系统的叠加,但实际业务不是简单拼接。论坛部分的核心是学员之间、学员与老师之间的学习交流:学生可以发图文提问、回复别人、对高质量的帖子点赞收藏;老师可以发课程公告、学习资料,也可以把优质回答置顶。考试部分的核心是让老师创建试卷、管理题库、发起考试,学生在小程序端限时作答,交卷后系统自动评分并生成错题集。
将这两块放在一起的意义在于“以考促学,以学助考”。学员在社区里讨论完某个知识点,马上可以参加对应章节的小测,做到学练结合;教师在后台看到某道题错误率极高,就能反推哪个知识点需要重点讲解,又可以在交流区发补充帖。这样形成一个学习闭环,而不是两个独立模块放在同一个 App 里各干各的。
因此在整理需求时,我建议不要上来就画界面,而是先把主体流程走一遍:用户进入小程序后,先授权登录,由后台判断角色;学生看到的是学习社区 + 考试中心;老师除了学生功能外,还能在管理后台维护题库和试卷;超级管理员则掌握全部用户、帖子审核、系统配置权限。这种角色差异会直接影响后续菜单设计、接口权限和数据库表结构。
1.2 为什么选 PHP 而不是其他后端方案
我在这类项目上最终选择 PHP,并不是因为它多新潮,而是从部署成本、团队熟悉度和生态成熟度三个角度考虑。PHP 几乎可以在任何一台云服务器上快速部署,Nginx + PHP-FPM 的组合非常稳定,ThinkPHP 这类框架对路由、ORM、中间件、验证器都提供了现成支持,能大幅缩短开发周期。加上微信官方文档里 PHP 示例代码和社区资料非常多,遇到问题几乎都能找到对应方案,对新手很友好。
另一个实际因素是开发环境容易搭。本地装 PHPStudy、XAMPP 或者 Docker 都能一键起环境,服务器上用宝塔面板点几下就能配置好 PHP 版本和 HTTPS 证书,对没系统学过运维的同学是个优势。相比之下,如果全上 Java 微服务,环境配置与部署的学习成本已经比项目本身高不少;用 Node.js 也不是不行,但如果你手里的虚拟主机只支持 PHP,那几乎没什么选择余地。技术选型要考虑“现有运行环境、团队/自己的能力、后续维护成本”三个维度,而不是单纯看哪个技术最热门。
1.3 整体架构与模块划分
整个系统可以分为三个端:微信小程序客户端(用户侧)、PHP 后端接口服务、运营管理后台。小程序端的核心职责是交互展示和数据采集;后端负责所有业务逻辑、数据校验和权限判断;管理后台为老师和管理员提供维护入口。它们之间通过 HTTPS + JSON 格式的数据进行通信,小程序端绝不能直接连接数据库,所有请求都要走后端 API。
模块划分上,我把系统拆成六个核心模块:认证与用户、学习社区(帖子/评论/点赞/收藏)、题库管理(单选/多选/判断)、考试执行(组卷/计时/交卷/判分)、统计分析、内容审核。每个模块内部的接口尽量独立,模块之间通过用户 ID 和关联表通信,这样以后想单独扩展比如加一个“积分商城”或者“学习直播”模块,不动原有核心表也能接进来。
这种拆分方式决定了代码目录结构。如果用 ThinkPHP,我建议应用目录下按模块分组:controller/Auth、controller/Forum、controller/Exam、service/ExamService、model/User.php 等。控制器尽量瘦,业务逻辑封装在 service 层,这样接口测试和后期维护会舒服很多。项目后期增加接口只需要在对应模块下加方法,不会把所有代码堆在一个庞大的文件里。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与登录状态处理
2.1 核心数据表不要偷懒
数据库设计好坏直接决定后续开发的痛苦程度。我在这套平台里第一版图省事,把“帖子”和“考试题目”里很多字段用 JSON 塞在同一个 text 字段中,后来发现做搜索、统计和复用数据时非常别扭,改了三轮才稳定下来。推荐的核心表如下:
users:用户基础信息,包含微信 openid、unionid、昵称、头像、角色(student/teacher/admin)、状态、创建时间。角色字段不要做成布尔值,否则以后加一个“助教”角色就得改表。categories:论坛版块分类,例如“PHP 学习”“前端问答”“职场交流”。课程或考试可以关联分类,便于后期做多维筛选。posts:帖子表,包含作者用户 ID、分类 ID、标题、正文内容、配图 JSON、浏览量、点赞数、评论数、精华标记、状态(待审/已发布/已删除)。comments:评论表,包含帖子 ID、用户 ID、父级评论 ID(用于楼中楼)、内容、状态。帖子删除时要注意连带删评论,否则界面会出现无法查看父帖子的孤儿评论。exam_paper:试卷表,包含名称、分类或课程 ID、总分、单选题数/分值、多选、判断、时长限制、状态。question_bank:题目表,包含题目类型、题干、选项(JSON)、正确答案、解析、难度、所属课程或知识点。exam_paper_question:试卷与题目的关联表,记录某张试卷包含哪些题目以及每题的分数和顺序。exam_record:考试记录表,记录某位用户参与某张试卷的开始时间、交卷时间、总得分、状态(考试中/已交卷/超时)。exam_answer:答题明细表,记录用户在某个考试记录里对某道题的选择答案、是否正确、得分。
表与表之间不要只靠逻辑外键,该建索引的地方一定要建。比如 posts 表的 user_id、status、created_at,exam_record 表的 user_id + paper_id 组合索引都是高频查询条件。线上数据量不大时感受不到差别,一旦用户在社区发帖量过万,没有索引的分页查询会很痛苦。
2.2 微信登录的 code2session 完整流程
小程序端登录的标准做法是 wx.login() 拿到临时 code,再将 code 发送到后端 /api/auth/login 接口。后端拿到 code 后调用微信接口 jscode2session,用 appid + secret + code 去微信服务器换 openid 和 session_key。其中 session_key 绝不能返回到小程序端,否则会带来严重安全问题。
我用的方案是用自己生成的一串随机 token(例如 md5(uniqid() . random_bytes(16)))作为用户登录凭证,存到 users 表或者 Redis 中并设置有效期。小程序后续请求在 Header 里带上 Authorization: Bearer token,后端请求入口统一解析 token 并获取当前用户 ID。没有自定义 token 的情况下直接用 openid 当登录凭证也很常见,但用户在同一台手机上有多个小程序账号时会有登录冲突隐患,建议不要直接用 openid 作为会话标识。
后端 PHP 请求微信接口时,我用的是 curl:
php复制public function code2Session(string $code): array
{
$url = 'https://api.weixin.qq.com/sns/jscode2session';
$params = [
'appid' => '你的appid',
'secret' => '你的secret',
'js_code' => $code,
'grant_type' => 'authorization_code',
];
$response = curl_get($url . '?' . http_build_query($params));
return json_decode($response, true);
}
这里有个隐藏细节:同一个 code 只能用一次,用过后就失效,而且 code 有效期大概五分钟。如果调试时发现偶尔登录失败,先检查是不是前端重复发送了同一个 code。比如某些页面的登录请求被多个入口同时触发,导致第一个请求用掉 code 后第二个请求自然失败。解决方案是把登录流程封装成全局 Promise,等第一次登录完成后再让后续业务请求继续执行。
2.3 权限控制和并发状态要提早设计
社区帖子这类 UGC 内容,不能让用户一发布就直接显示在所有用户面前。我的方案是默认帖子需经过状态拦截:普通用户发帖默认进入“待审核”,管理员可以在后台审核通过,也可以设置白名单用户(比如教师发布的帖子可直接显示)。这样能防止一些不合规内容直接扩散,审核流程也便于人工干预。
考试模块的并发问题更值得注意。学生可能由于网络原因或者多点登录连续发起多次交卷请求,如果没有做幂等,就会造成重复判分、成绩覆盖错乱。我的处理方式是在 exam_record 表增加一个 status 字段并通过数据库事务控制:前端请求交卷接口时先 UPDATE ... WHERE id=? AND status=1,如果影响行数为 0,说明该记录已交卷或不存在,直接返回“不要重复交卷”;影响行数为 1 才进入正式判分逻辑。这样从数据库层面挡住了并发重复提交,而不只是靠前端按钮置灰。
3. 后端接口与业务逻辑的关键实现
3.1 统一响应格式与 API 鉴权中间件
后端接口最怕一个控制器一种返回格式,前端解析代码会写到崩溃。我在项目里规定所有接口返回统一 JSON 结构:
json复制{
"code": 0,
"msg": "ok",
"data": {}
}
任何业务异常都通过 code 标识:1001 表示未登录,1002 表示权限不足,2001 表示帖子不存在等。前端封装 request 方法时只处理 code 为 0 的情况,其他 code 统一弹 toast。这样前端和后端之间的沟通成本会大幅降低。鉴权逻辑我用 ThinkPHP 的中间件实现,不需要在每个控制器里重复判断。只要请求不包含有效的 token 且访问的路由属于需要登录的接口,中间件直接返回对应错误码,业务代码根本不用关心到底有没有带 token。
跨域问题也顺便说一下。虽然微信小程序端没有浏览器的同源策略限制,不需要 CORS,但如果管理后台是网页端,PHP 接口就必须允许跨域。可以配置中间件统一输出 Header:Access-Control-Allow-Origin、Access-Control-Allow-Headers、Access-Control-Allow-Methods,并且对预检请求直接返回 200,避免网页端开发时被 OPTIONS 请求拦路浪费时间。
3.2 社区发帖与回复中的内容安全处理
社区功能看似简单,核心难点在内容安全处理上。用户发帖时不能直接把字符串拼进页面里。我在这里的底线规则是:第一,后端统一做 XSS 过滤,对所有用户输入执行 HTML 标签过滤;第二,长度限制要做在接口层,不能只依赖小程序端输入框的 maxlength;第三,对用户上传的图片 URL 或视频 URL 做域名白名单校验,只允许在业务配置的存储域名范围内。
小程序端如果使用 rich-text 组件渲染富文本内容,它接受的是一段 HTML 字符串,但它并不是浏览器环境,没有完整的 DOM 操作能力,也执行不了 JavaScript。所以后端输出时要做一层“白名单清洗”,只允许 p、img、strong、br、ul、li 这类基础标签通过,禁掉 script、style、iframe,以及所有带 on* 事件属性的标签。这样既能保证富文本里的图片正常展示,又不会引入 XSS 风险。
还有个容易忽略的坑是帖子图片的存储路径。开发阶段很多人把图片直接上传到本地服务器某个目录,上线后仍沿用相对路径,但微信小程序真机的 downloadFile 或 image 访问域名必须是 HTTPS 并且已经配置为合法域名。图片上传最终建议用一个独立的存储方案(如阿里云 OSS、腾讯云 COS)或单独配置静态资源域名,和业务域名区分开,处理起来会清楚许多。
3.3 试卷组卷与自动判分的核心规则
创建试卷时,最省事的方案是老师从题库中按题型分别随机抽题。比如“单选 20 题,每题 2 分;多选 10 题,每题 3 分;判断 10 题,每题 2 分”。抽题逻辑放在后端执行,不要依赖前端传题目的 ID 列表,更不要在前端直接展示整张卷子答案。我推荐后端在用户点击“开始考试”时才生成一份“本次考试快照”,写入 exam_record 和 exam_answer 的初始数据。这种快照机制非常重要,它保证用户一旦开始考试,即使老师之后修改了题库中的某些题,用户看到的仍是开考时的题目,分数计算也不会混乱。
组卷 SQL 可以这样优化。题目量小的时候用 ORDER BY RAND() LIMIT 20 没毛病,题目数量超过几千之后会产生严重性能问题,因为它会对全表做随机排序。稳妥做法是先查出符合条件的主键范围,再用 ORDER BY RAND() 只随机取 ID,最后根据这些 ID 查出完整题目。比如:
sql复制SELECT id FROM question_bank WHERE category_id = 5 AND type = 'single' ORDER BY RAND() LIMIT 20;
再根据返回的 ID 集合查询完整题目字段。评分逻辑上,单选题和判断题直接比对选项;多选题建议“与标准答案完全一致”才给满分,漏选、错选都不得分。多选题判分规则也可以在试卷表加字段配置,有的考试要求漏选也能得部分分,那么后端就要将用户的选择与标准答案交集做逐项计算。
3.4 考试计时与交卷防作弊的取舍
考试页面倒计时是前端交互层面的事,但真正的超时判断必须由后端兜底。前端倒计时归零后自动调交卷接口没错,可总有极端情况:用户手机被来电打断、网络变慢、小程序被杀掉。所以后端在交卷接口中一定要重新校验当前时间和 exam_record.start_time 的差值,如果已经超过试卷设置的时间上限,则要按照服务端时间强制截断答卷,而不是信任前端传来的答题记录。这样才不会被用户利用“修改本地时间/修改前端数据包”的方式延长答题时间。
防作弊这件事不能走极端。仅靠小程序端技术手段无法真正监控用户是否用另一台设备搜索答案或打开小抄。我实际做下来,能在考试流程里做的比较有效的限制是:记录用户切到后台/切出小程序的次数;交卷时返回本次考试中用户切出次数和剩余时间,老师可以在后台看到异常记录;前端在考试页面禁用长按复制和截图回调提示。但这些设计都只是提高作弊成本,不可能完全杜绝,想做到高水平防作弊就得引入前后摄像头监控等更重度的方案,对于普通学习平台没有太大必要。
4. 微信小程序端开发实录
4.1 登录态的时序问题与全局请求封装
小程序端开发最折磨人的不是页面 UI,而是登录态时序。没封装好会出现一个非常经典的 bug:小程序冷启动后,首页 onLoad 立刻发起请求,但此时登录请求还没完成,token 还是空的,于是首页所有数据请求全部返回“未登录”。我的解决办法是做一个全局的 loginPromise 单例,首次调用登录时生成 Promise 并缓存,页面请求如果需要登录态,先 await loginPromise 再发起业务请求。这样无论多少个页面同时触发,最终只会调用一次 wx.login() 和后端登录接口。
请求封装方面,统一用 wx.request 包一层 Promise。业务请求前自动带上 Authorization 头,遇到 code 为 1001 时做一次静默重登并重放当前请求。为了让用户无感,获取用户头像昵称采取渐进授权:先通过 wx.getUserProfile 让用户主动授权,如果用户拒绝,也可以先以默认昵称和头像使用基本功能,等后续想参与社区时再补全资料。这种设计能明显降低首屏使用门槛。
4.2 帖子列表、分页加载与图片上传的细节
帖子列表页我用的是“下拉刷新 + 触底分页加载”。分页参数不使用传统的 page 和 limit,而是优先传最后一条帖子的 last_id,后端按 WHERE id < last_id ORDER BY id DESC LIMIT 20 查询。这种方式在数据量大时比 OFFSET 分页稳定得多,因为 OFFSET 越翻越慢,而主键定位方式一直走索引。
发帖页有图片上传功能,小程序端选择图片用 wx.chooseMedia,拿到临时文件路径后通过 wx.uploadFile 上传。这里必须注意:wx.uploadFile 的请求头不能手动设置 Content-Type,否则会导致 formData 解析异常。后端接收时对文件类型做校验,不能只看扩展名,要用 finfo_file 或 getimagesize 等函数检查真实文件类型;同时限制单个文件大小(比如 5MB),否则会拖垮服务器的 PHP 执行内存和磁盘配额。前端也要带上 compressed: true 压缩图片,避免几 MB 的照片直接传到服务器,既慢又消耗流量。
4.3 考试页面:倒计时、状态保存与自动交卷
考试页面是前端交互最重的部分。用户点“开始考试”后,页面进入答题状态,顶部显示倒计时,下面按题型分组展示题目。我的前端状态管理方案是:把当前试卷的所有题目和用户答案统一放在页面 data 里,每次用户点击选项都更新内存数据并同步写入本地 storage。用户一旦意外退出小程序(比如接电话),重启后进入“考试中”页面时先读取本地缓存恢复答题状态,避免白考一场。
倒计时实现不能用纯 setInterval 累加剩余秒数,因为小程序在后台运行一段时间后定时器可能被挂起,回来时会发现时间还停留在退出前,导致超时作弊。正确做法是记录 end_time 时间戳,倒计时只负责以本地时间计算“剩余时间”,同时在后端交卷时校验真实开始时间。页面离开时也要 catch 到小程序切后台的 onHide 事件,提示用户时间仍然在走,而不是暂停。
自动交卷逻辑则有双重保障:前端倒计时到 0 时调用一次交卷接口;如果前端因为各种原因没自动交掉,后端在每次进入考试记录详情时判断是否超时,超时则显示“已超时,按实际作答自动交卷”。这能最大限度地避免因前端异常导致用户考试数据永久卡在“考试中”状态。
4.4 自定义导航栏与自定义 tabBar 的做法
项目如果希望在考试页面和社区页面有更好的沉浸式体验,就需要自定义导航栏。配置方式是在页面 JSON 里开启 "navigationStyle": "custom",然后自行构造顶部返回按钮和标题。别以为只是把 wx.navigationBarTitle 去掉,还要处理 Android 和 iOS 状态栏高度差异。我被这个坑过:用固定 64px 模拟导航栏,在 iPhone X 上没问题,但换成某些 Android 全面屏时标题跑到状态栏下面去了。
正确的导航栏高度计算方式如下:先调用 wx.getSystemInfo 或 wx.getWindowInfo 获取 statusBarHeight,再用 wx.getMenuButtonBoundingClientRect() 获取胶囊按钮的坐标信息,导航栏高度大约是“胶囊按钮顶部到状态栏底部的距离 × 2 + 胶囊高度”。基本公式可以写成 menuButton.top - statusBarHeight 是胶囊距状态栏底部的距离,导航栏总高度 = 状态栏高度 + 胶囊高度 + 该差值 × 2。这样在任意机型上都能保持胶囊按钮在导航栏内垂直居中。
自定义 tabBar 也是高频需求,例如考试中心需要一个可点击轮播入口,或者中间的“发布”按钮想整体凸起。小程序支持自定义 tabBar,但要求所有 tabBar 页面必须真实存在对应 wxml 内容,并且要把页面路径和 custom: true 配置在 app.json 的 tabBar.list 中。自定义 tabBar 组件里通过 wx.switchTab 控制页面切换,同时监听页面 onShow 更新选中状态。这个过程中最容易出的问题是 tabBar 组件在部分 Android 低版本机型上首次渲染空白,一般需要给组件根节点设置固定高度和背景色,避免内容层盖住组件。
4.5 小程序之间跳转与页面参数传递
项目里可能会放一个“友情链接”入口,跳到另一个小程序。小程序 A 跳转小程序 B,在微信公众平台的“小程序管理”里先做关联,并且调用时要在代码中明确传入目标小程序的 appId 和 path。不是关联过就一定能随意跳,很多场景需要用户真实点击后触发,不能自动跳转。微信对这类跳转的限制是为了防骚扰,开发时要做好按钮点击交互,避免在 onLoad 里直接调用 wx.navigateToMiniProgram 被判定为违规。
从 B 小程序返回 A 小程序,微信提供了 wx.navigateBackMiniProgram,但使用要谨慎。如果希望通过这个跳转实现跨小程序的业务闭环,建议多测试不同微信版本,因为这类能力升级频繁且不同基础库表现不一。
5. 部署上线与常用问题排查实录
5.1 从本地到服务器的配置
项目跑到本地没问题,并不代表离上线只有一步。本地开发用的通常是 http://localhost,开发者工具里可以勾选“不校验合法域名”随便访问;一旦真机预览或发布体验版,小程序必须通过 HTTPS 访问备案过的域名。你需要提前把云服务器、域名、HTTPS 证书准备到位。
以 Nginx 为例,PHP 项目部署好后要特别注意几个配置项:第一,上传文件大小限制,包括 client_max_body_size、PHP 的 upload_max_filesize 和 post_max_size,否则图片动不动上传失败;第二,路径 rewrite,确保像 /api/xxx 的请求都能正确转发到 index.php 入口;第三,PHP-FPM 与 Nginx 的超时时间要匹配。考试交卷接口虽然不至于执行太久,但某些题库导入接口需要处理大量数据,超时短的话会返回 504,数据库事务一旦不够短还可能造成锁表。
5.2 常见问题排查速查表
我把开发过程中最常遇到的问题整理成一张表,每一条都是真实踩过的,能帮你按图索骥定位问题:
| 现象 | 原因 | 解决方案 |
|---|---|---|
请求提示 url not in domain list |
request 合法域名未配置或域名没有 HTTPS | 登录微信公众平台在“开发管理-服务器域名”中配置 request 合法域名 |
| 真机预览白屏,开发者工具正常 | 请求的接口还是 http://localhost |
将接口地址改为线上 HTTPS 域名,并在手机端清缓存重试 |
| 上传图片一直转圈失败 | uploadFile 合法域名未配置,或服务端限制了上传大小 | 配置 uploadFile 合法域名,调整 Nginx/PHP 上传限制 |
登录接口偶尔报 invalid code |
同一个 code 被重复调用 | 确认前端登录请求是否有并发触发,确保一个 code 只消费一次 |
| 考试页面切后台回来时间还在增加 | 客户端定时器被挂起 | 记录结束时间戳,用本地时间差计算倒计时并在交卷时以服务端时间为准 |
| 用户昵称/头像获取到默认值 | 用户拒绝授权或 getUserProfile 时机不对 |
使用默认资料兜底,在用户主动点击时再弹出授权框 |
| swiper 嵌套 video 全屏错位 | 原生的 swiper 组件与 video 全屏层级处理存在兼容问题 | 不要在 swiper 的 item 里直接播放视频,使用 scroll-view 分页或只允许当前项播放 |
| 真机上评分记录与 PC 后台不一致 | 前后端时间格式化/时区不一致 | 统一按时间戳存储,输出时指定 Asia/Shanghai 时区 |
5.3 考试与内容合规的上线检查点
上线前还要做一轮全流程回归测试,重点关注“真实用户行为”。找几个同学组成小范围内测群,让他们用真实手机测试所有操作路径,比如发帖子被审核、考试中断电、进入考试页面后锁屏再回来、异常网络交卷。这些场景在开发者工具里模拟不出真实体验,很多隐藏问题都必须真机测试才能暴露。
小程序后台还需要配置完整的隐私保护指引,把采集的用户信息(头像、昵称、地理位置、相册权限等)说清楚。考试和小程序里如果要展示地理位置相关的天气内容(我后来把和风天气的查询小工具也接入到首页了),还要申请相应的接口权限。另外,涉及付费课程、购买会员时必须格外谨慎,微信小程序对虚拟支付管控相当严格,普通主体不允许通过小程序直接售卖虚拟商品。如果项目想商业化,得提前选好合规的支付通道,不能直接在页面上放“微信支付”按钮然后卖课程服务。
在内容审核这块,除了我们前面设定的发帖审核状态外,还应该在后台上线一个“举报处理”流程。用户看到违规内容可以点击举报,管理员处理举报后,可以对发布者执行禁言或删帖操作。这个功能在演示和答辩环节都是很好的亮点,也能体现你对内容安全问题的理解。
6. 一些真正帮到我的开发经验
我个人实际做完这个项目最大的体会是,很多时间并没有花在写代码上,而是在跟业务流程、数据结构和小程序各种平台限制做斗争。比如考试改卷规则一开始看似简单,想清楚多选题“漏选不得分”还是“部分得分”后,就得给表设计和判分逻辑留出扩展空间;又比如登录态如果刚开始没有做成统一中间件,后面每个接口往上补鉴权代码会改得想哭。
如果时光倒流重新做一次,我会第一时间把管理后台的题库 Excel 批量导入导出功能做上,而不是先在界面和样式上死磕。毕竟老师手里的题目都是现成的题库文件,手工一条条录入既慢又容易出错。再往后想迭代,可以考虑基于 Redis 做帖子热度排行、把实时聊天引入学习小组,用 PHP 配合 WebSocket 也完全可行。
再分享一个小技巧:小程序基础库和微信客户端版本迭代很快,接口废弃非常常见。平时写代码尽量少用“一看就会但不保证长期有效”的奇技淫巧,比如靠设置 navigationStyle: custom 在导航栏模拟按钮没问题,但涉及 wx.login 或 wx.getUserProfile 等变动频繁的接口,要多留意官方公告。上线前把微信开发者工具更新到比较新的基�础库版本跑一遍所有核心流程,很多问题其实都能提前暴露,不必非要等用户来提 bug。
