最近在查“基于微信小程序的菜谱设计与实现”相关资料的朋友,大概率和我当时一样,对着满屏同质化的项目描述发愁。菜谱小程序确实是个被写烂的选题,但烂大街不等于没价值——恰恰因为它的业务链路完整、目标用户清晰、技术栈覆盖广,才成为不少本科毕设和课程项目里性价比最高的方向之一。这篇东西不打算讲教科书式的开题模板,而是围绕这个题目,把我在实际开发中踩过的坑、想清楚的事,以及可以直接抄作业的路线图完整放出来。适合正在写开题报告、准备答辩,或者打算从零做一个菜谱小程序的人参考。
1. 为什么选菜谱小程序:用户场景与选题空间
很多同学选这个题目的第一反应是“因为简单”,这个理由其实很危险。开题答辩时老师一句“菜谱小程序网上到处都是,你的方案有什么不一样”,就能把人问住。所以我先聊清楚:菜谱这个方向真正的用户场景在哪,差异化空间又在哪。
1.1 用户侧的问题确实存在
做饭的人在厨房里遇到的核心问题,永远就三个:今天吃什么、这道菜怎么做、大概要花多久。传统的菜谱网站和App解决了一部分问题,但体验早已跟不上现在的使用习惯——打开一个菜谱网页,先弹登录框,再刷三五屏的广告,真正步骤图被夹在一堆“美食人生感悟”中间,找起来非常痛苦。
短视频平台上的做菜内容又走另一个极端:信息零散、无法结构化检索,一个红烧肉能刷出八十种拍法,看完不记得材料配比。用户需要的是“结构化的、可快速检索的、能收藏后随时翻出来”的菜谱服务。这正好是小程序擅长的事情:微信里扫一扫或用一下就能打开,不用下载App,看到步骤时随手点收藏,下次买菜前在聊天窗口翻出来就能核对食材清单。这个场景是真实且高频的,尤其是一个人住、天天自己做饭的年轻人,以及想学几道硬菜招待朋友的厨房新手。
1.2 开发者视角的“性价比”
从毕设或课设的评估标准去看,菜谱小程序几乎完美命中所有考察点:它需要前端页面(列表、详情、搜索、收藏、个人中心)、需要后端接口(登录、CRUD、分页)、需要数据库设计(菜谱表、分类表、用户表、收藏关系表),还涉及大量小程序特有的工程细节,比如顶部导航适配、列表加载更多、登录态维护、包体控制。
相比“仿网易云音乐”“仿电商App”这类热门选题,菜谱项目的数据模型简单,业务逻辑不绕弯子,不容易做到一半因为需求膨胀而烂尾。但简单归简单,它覆盖的开发环节一个都不少,做完以后你对小程序整个开发链条会有完整的体感,这不是看十篇教程能替代的。
1.3 市场现状与差异化切口
市面上的确已经有下厨房、豆果美食这类成熟产品,毕设超市里也挂着大量雷同的“美食推荐小程序”。如果开题报告只写“做一个能看菜谱的小程序”,等于在告诉评委你没有做过市场调研。
差异化切口通常有三个方向:
| 切入方向 | 示例 | 目标用户 |
|---|---|---|
| 人群细分 | 健身减脂菜谱、宿舍小电锅菜谱、一人家常菜谱 | 特定饮食习惯人群 |
| 场景细分 | 露营野餐菜谱、合租共享餐桌、节假日晚宴菜谱 | 特定生活场景 |
| 内容形态 | 视频步骤菜谱、语音播报菜谱、食材替换建议 | 对体验敏感的用户 |
我当时选的是“面向宿舍场景的简易菜谱”——所有菜品的食材控制在五样以内、工具限定为电煮锅和微波炉,这个切口让整个项目从“又一个菜谱”变成了“解决特定人群具体问题的工具”。开题答辩时,老师对这个定位的兴趣明显高于功能堆砌。
2. 功能模块拆解:把开题报告变成可落地的产品地图
开题报告里最核心的部分就是“研究内容”,说白了就是功能清单。但很多人的功能清单写得像超市购物单,“登录、浏览、收藏、分享、个人中心”一列就完事。这样写的问题在于没有主次、没有链路、没有取舍逻辑,答辩时一问“为什么做这个不做那个”立刻露馅。
2.1 核心用户路径
先把用户的核心行为链路画出来。菜谱小程序里最基础的一条路径是:
打开小程序 → 看到首页推荐或进入分类 → 浏览菜谱列表 → 点击查看详情 → 查看食材清单和步骤 → 收藏或分享
这条链路任何一个环节断了,产品都立不住。开题报告的功能规划,应该先围绕这条链路把每段补齐,再考虑额外功能。不要一上来就想着做社区、做菜谱PK、做食材购买,那些都属于“链路之外”的东西,优先级靠后。
2.2 功能清单与优先级
我建议在开题报告里直接放一张优先级表,明确标注哪些是必要功能、哪些是选做功能。这既让老师看出你有产品思维,也给自己划清了开发边界,防止做到一半想加需求。
| 优先级 | 功能模块 | 说明 |
|---|---|---|
| P0 | 菜谱浏览与搜索 | 分类导航、关键词搜索、列表分页加载 |
| P0 | 菜谱详情 | 食材清单、步骤图、难度/耗时/份量标识 |
| P0 | 微信登录 | wx.login换取openid,建立用户身份 |
| P0 | 收藏功能 | 收藏/取消收藏,个人中心展示收藏列表 |
| P1 | 浏览历史 | 最近看过的菜谱,方便继续做菜 |
| P1 | 视频步骤 | 部分热门菜配教学视频,提升内容体验 |
| P1 | 个人资料 | 昵称头像设置(微信授权或自定义) |
| P2 | 评论/评分 | 用户对菜品的反馈,需要内容审核 |
| P2 | 后台管理 | 菜谱录入、分类维护、数据统计 |
为什么收藏必须做到P0,评论却放到P2?因为收藏是单用户的操作行为,数据模型简单,不涉及多人交互,也不产生内容合规风险。而评论一旦开放,就需要关键词过滤、用户举报、后台审核、恶意内容处理,这批工作量在毕设周期内很容易失控。明确“我会先做什么、不做是出于什么考虑”,比在报告里把功能写得又全又大要加分得多。
2.3 页面结构与导航设计
小程序通常是底部Tab结构,菜谱类产品建议三个Tab就够:首页、分类、我的。
- 首页:推荐位、搜索入口、热门分类快捷入口、最近更新列表
- 分类:按菜系(川菜、粤菜)、按场景(宿舍、一人食)、按属性(素菜、肉菜、汤羹)
- 我的:头像昵称、我的收藏、浏览历史、设置
此外还需要几个非Tab页面:菜谱列表页(分类结果、搜索结果的承载页)、菜谱详情页、登录授权页、关于页。页面清单不需要多,但要能覆盖上面那条核心用户路径。开题报告里如果能配一张页面跳转关系图,效果会非常直观,不过注意别用复杂的绘图工具,简单的表格或者文字描述同样清楚。
2.4 为什么不做“更多”
我后来见过不少同学在开题时把菜谱项目往“美食社区”方向写,加论坛、加私信、加达人认证,最后开发周期崩了,只能交一个空壳。核心原因是:任何涉及UGC的模块,都隐含着审核、反垃圾、权限控制这三座大山。菜谱数据由项目方控制,你可以集中精力做展示和交互体验;一旦开放用户发布,后台就必须有内容管理,否则小程序提审时也会因为“用户生成内容无监管机制”被驳回。开题报告里的功能范围,宁可在深度上做扎实,不要在广度上吹泡沫。
3. 技术选型与关键机制:从登录态到分页加载的实现思路
技术路线是开题报告里老师最想看的部分,也是最容易写成流水账的部分。“前端使用微信小程序,后端使用SpringBoot,数据库使用MySQL”这种写法太笼统,缺少决策理由。你要让评委看到你对比过、思考过、知道每个选择背后的代价。
3.1 前端框架:原生、uni-app还是Taro
| 方案 | 优势 | 代价 | 适合场景 |
|---|---|---|---|
| 微信原生小程序 | 无框架层损耗、调试直接、社区资料最多 | 不能一套代码多端发布 | 只想专注微信端 |
| uni-app | 一套代码可同时发布微信/支付宝/H5/App | 平台差异需要额外适配,排错成本更高 | 需要多端发布 |
| Taro | React语法,类型体验较好 | 中文资料少于uni-app,同样有跨端适配问题 | 熟悉React技术栈者 |
菜谱项目只跑微信端,我倾向于原生小程序。理由有两点:第一,自研菜谱项目没有任何跨端需求,引入跨端框架只是增加编译层变量,一旦某API在真机表现异常,你还要判断是框架的bug还是自己的代码问题;第二,原生小程序的文档和踩坑帖最多,一个初学者能通过搜索引擎解决大部分问题,这是隐性的时间成本优势。
3.2 后端方案:自建服务还是云开发
后端的选择直接影响开发节奏。传统做法是用SpringBoot或Node写REST接口,自己连MySQL,自己部署服务器。这适合学校明确要求展示后端能力的项目,毕竟答辩时“我独立设计并实现了后端接口”是很有分量的陈述。
但如果题目没有硬性后端要求,我更推荐云开发方案。云开发提供了云函数、云数据库、云存储三件套,免去了服务器购买、域名备案、HTTPS配置三件麻烦事。对菜谱这个项目来说,所有接口逻辑(查询菜谱、用户登录、收藏记录)都是典型的简单CRUD和临时计算,云函数完全能扛住。事实上我最后就用云函数把收藏逻辑做成了统一入口,前端只调一个接口,数据和鉴权都在云端完成,省掉了一整层服务器运维成本。
对比参考:
| 维度 | 自建后端 | 微信云开发 |
|---|---|---|
| 部署复杂度 | 高:需服务器、域名备案、SSL证书 | 低:开通即用 |
| 数据控制力 | 强:可自由设计复杂查询 | 中:适合中小规模项目 |
| 答辩表现力 | 强:能展示接口设计能力 | 中:偏业务逻辑 |
| 费用 | 服务器+域名(按年付费) | 按量计费,免费额度够用 |
3.3 wx.login登录态的完整逻辑
登录是小程序开发里第一个有门槛的环节。很多初学者以为登录就是调一下wx.login然后把code传给后端,其实完整链路比这多一点。
推荐流程是:
// 前端 wx.login({ success: async (res) => { if (res.code) { // res.code 是临时凭证,有效期只有几分钟 const loginResult = await wx.cloud.callFunction({ name: 'login', data: { code: res.code } }); // 云函数内部用 code 换取 openid this.globalData.openid = loginResult.result.openid; // 后续请求带上 openid 作为用户标识 } } });云函数侧的思路是:通过微信服务端接口把code换成openid,再查一下用户表里是否已有这个openid,没有就创建一条用户记录,返回给前端。这里关键的一点是:openid是用户在小程序内的唯一身份标识,不能只靠前端传来一个“用户名”就当登录完成——前端传什么都是可伪造的,用户身份必须在云函数或后端验证过。
开题报告里不用写代码,但要把流程讲清楚:获取临时凭证、换取身份标识、建立会话、校验身份。这套流程的表述能说明你是真的理解了登录机制,而不是只会抄模板。
3.4 请求封装与统一异常处理
如果采用云开发,每个页面都直接调wx.cloud.callFunction也能跑,但代码会越来越乱。我习惯在项目里做一个统一的请求模块,把所有云函数调用包起来,加上loading状态、错误提示、成功拦截。
const request = async (name, data = {}, showLoading = true) => { if (showLoading) { wx.showLoading({ title: '加载中', mask: true }); } try { const res = await wx.cloud.callFunction({ name, data }); if (res.result && res.result.code === 0) { return res.result.data; } else { wx.showToast({ title: res.result.msg || '请求失败', icon: 'none' }); return null; } } catch (err) { console.error('[request error]', err); wx.showToast({ title: '网络异常', icon: 'none' }); return null; } finally { if (showLoading) { wx.hideLoading(); } } }; // 用法 const recipeList = await request('getRecipeList', { category: 'sichuan' });统一封装的意义在于:所有云函数的返回结构保持一致(code/data/msg),前端在各业务页面里就只需要关心数据本身,不需要反复写错误处理逻辑。这个习惯对答辩时展示代码质量也很有帮助——评委看到你有一个清晰的request层,基本可以断定你不是拿网上的半成品拼的。
3.5 列表加载更多的分页机制
菜谱列表一长就不可能一次性加载完,分页加载是必考的细节。小程序的onReachBottom是页面滚动到底部时自动触发的,逻辑不复杂,但有两个高频bug:一是触底瞬间多次触发onReachBottom,导致同一页重复请求;二是切换分类后页码没有重置,导致加载出别的分类的菜谱。
我常用的写法是:
data: { recipeList: [], page: 1, pageSize: 10, isLoading: false, hasMore: true }, async loadRecipeList() { if (this.data.isLoading || !this.data.hasMore) return; this.setData({ isLoading: true }); const res = await request('getRecipeList', { page: this.data.page, pageSize: this.data.pageSize, category: this.data.currentCategory }); if (!res || !res.list.length) { this.setData({ hasMore: false }); } else { this.setData({ recipeList: this.data.recipeList.concat(res.list), page: this.data.page + 1 }); } this.setData({ isLoading: false }); }, onReachBottom() { this.loadRecipeList(); }isLoading这个锁是关键,它可以保证在上一轮请求返回之前不会发出新请求。很多人的分页出问题,不是因为不懂onReachBottom,而是漏了这个状态开关。开题报告的“技术难点”部分,可以把这类细节写进去,比如“如何避免分页加载的重复请求与数据错位”,这比写一堆概念要有说服力。
3.6 自定义顶部导航栏的高度与胶囊适配
现代小程序项目做自定义导航栏几乎是标配,为了让顶部区域贴合自己的设计风格。但自定义导航栏绕不开一个问题:微信右上角的胶囊按钮(就是那三个点)悬浮在页面上,你不能遮住它,所以必须动态计算导航栏高度。常用的计算方式是:
getNavBarInfo() { const menuButton = wx.getMenuButtonBoundingClientRect(); const windowInfo = wx.getWindowInfo(); const statusBarHeight = windowInfo.statusBarHeight; // 状态栏高度 const navBarHeight = (menuButton.top - statusBarHeight) * 2 + menuButton.height; // 导航栏高度 return { statusBarHeight, navBarHeight }; }简单说,胶囊按钮的上边缘到屏幕顶部的距离减去状态栏高度,乘2再加胶囊高度,就是这个页面自定义导航栏应有的总高度。为什么不用固定值48或是44?因为不同手机的刘海屏高度不一样,状态栏从20到60多都有,写死就会在某些机型上出现内容顶到状态栏或者被刘海遮住的情况。这个计算逻辑很值得写进开题报告的技术路线里,属于“看起来简单但真机踩坑严重”的典型细节。
3.7 用户离开小程序的监听与业务处理
“如何监听用户离开小程序”是很多人问过的题目。小程序的页面生命周期里有onHide和onUnload,但它们只管页面级,无法覆盖“用户切到聊天窗口”“用户按Home键回到桌面”这些场景。真正能感知应用级进退的是App级别的生命周期,配合Page的onShow/onHide也能实现。
我在菜谱项目里实际用到的场景是浏览历史的采集:用户在菜谱详情页停留,onShow时开始计时,onHide或onUnload时把“菜谱编号+浏览时长”上报到云函数,用于个人中心展示“最近看过”和首页推荐排序。如果完全不监听离开,只靠详情页加载时写一条记录,用户刚打开就走的情况也会被记成“认真看过”,数据就失真了。
4. 菜谱数据的底层设计:数据结构、来源与内容运维
菜谱类项目真正的墙角不在代码,在数据。一个没有内容的菜谱App就是空壳,而内容需要结构化、需要来源、需要持续更新。这部分往往是开题报告里被一笔带过、实际开发时最折磨人的环节。
4.1 菜谱的数据模型
菜谱不是一个简单的文本字段,它由多种结构拼成。我设计的数据结构大致如下:
{ "id": "recipe_001", "title": "番茄炒蛋", "cover": "cloud://xxx/cover/tomato_egg.jpg", "category": "家常菜", "tags": ["快手菜", "下饭"], "duration": 15, "difficulty": "简单", "servings": "2人份", "ingredients": [ { "name": "番茄", "amount": "2个" }, { "name": "鸡蛋", "amount": "3个" } ], "steps": [ { "index": 1, "image": "cloud://xxx/step/1.jpg", "text": "番茄切块,鸡蛋打散备用" } ], "tips": "最后放糖可以中和酸味", "createTime": "2024-06-01T12:00:00Z", "updateTime": "2024-06-01T12:00:00Z" }几个容易想不清楚的字段:食材为什么用嵌套数组而不是“番茄、鸡蛋、盐、糖”拼成一个字符串?因为列表页要按食材搜索,结构化的食材数组才能支持“含鸡蛋的菜谱”这种查询。步骤为什么也结构化?因为详情页需要逐条展示步骤图,后期要调整某一步也比改一张长图方便。列表页展示用到的封面图和详情页用到步骤图分开存,可以控制列表接口的数据量,避免详情里的图片把列表接口拖慢。
4.2 数据库集合设计
如果用云数据库,建议建四张表:
| 集合名 | 核心字段 | 说明 |
|---|---|---|
| users | openid,昵称,头像,收藏记录关联 | 用户身份 |
| cookbook | 上述菜品结构 + likeCount | 菜谱主表 |
| categories | name,icon,sort | 分类标签 |
| collect | openid,cookbookId,createTime | 收藏关系表 |
收藏关系为什么单独建一张表而不是在用户表里塞一个菜谱ID数组?因为收藏功能需要查询“某个菜谱被收藏了多少次”,也需要快速查看“我收藏的菜谱列表”。独立的关系表可以用一条查询同时满足这两个需求,数组字段在数据量大后更新和统计都比较吃力。
4.3 数据来源与版权红线
数据从哪里来,是开题答辩的高频追问。最不推荐的做法是写一个爬虫去爬竞品App的数据,一方面有版权风险,另一方面你答辩时也没法说“数据是我从XXApp爬的”。不建议选择这条路的原因还包括对方平台的反爬机制和数据格式不公开,你会把大量时间耗在对抗反爬虫上,而不是做自己的产品。
我自己用的组合是“公开的开放数据集+手工整理”。像一些开放的美食数据集、以及菜谱网站上明确标注可转载的内容,加上自己入录的几十道基础家常菜,凑成了初始的120道菜。手工录入很枯燥,但录入的同时你是在检验自己的数据结构是否合理,哪个字段用不上、哪个字段还需要补充,这比凭空设计有价值得多。
初始数据量建议在100道以上。你要知道一个用户搜索“土豆”的时候,如果只有两条结果,他立刻会觉得这个App是空的。数据量是做内容类产品最低的准入门槛,也是开题报告“预期成果”部分最容易低估的指标之一。
4.4 图片与视频资源处理
菜谱项目的资源基本是图片和视频,处理不好就是包体超标和页面卡顿。我的经验是:所有图片不要放在小程序代码包里,一律传到云存储,代码里只存cloud://地址;图片在录入时统一处理尺寸,封面图建议720×540左右,步骤图800×600左右,太小看不清、太大加载慢;视频走video组件的封面图属性,不要在列表里直接放视频,否则滑动卡顿非常明显。
云存储还有一层好处:控制台可以直接看到文件的访问量,如果某个菜谱的封面图下载量特别高,说明它是热门菜品,可以据此调整首页推荐位。这个数据对后期运营很有用。
5. 开题报告怎么写:框架、进度规划与答辩问题
技术准备得再好,开题报告写不出来也白搭。这一章说点实际的:开题报告每一部分怎么写、进度怎么排、答辩时哪些问题会被反复问。
5.1 各部分的实战写法
标准的开题报告框架大致是这样的:选题背景与意义、国内外研究现状、研究内容与目标、技术路线与可行性分析、进度安排、预期成果、参考文献。很多人的通病是“引言注水,正文缩水”。
- 选题背景:不要用“随着智能手机的普及”这种开场。直接写“在厨房场景中,用户需要快速获得结构化菜谱,而现有平台存在广告多、搜索不便、内容零散的问题”,用用户痛点开场,比宏大叙事有力度。
- 国内外研究现状:既要有文献支撑,也要有产品对比。学术库里找“微信小程序”“美食推荐”方向的论文,产品层面对比下厨房、豆果美食的优劣,指出它们的用户场景覆盖不足。
- 研究目标:写“实现一个面向宿舍/健身/一人食人群的菜谱小程序”,比“实现一个功能完善的美食分享平台”要真实得多。
- 技术路线:按数据流写:前端页面 → 云函数接口 → 数据库设计 → 内容生产与测试流程,每一步对应一个模块。
- 预期成果:可运行的小程序、包含核心功能的后台、结题报告或论文、演示视频。
5.2 进度安排要切细
进度表不要写“第1-2周:需求分析”这种大而化之的安排,要切到可验收的里程碑。我给一个参考版本:
| 时间 | 任务 | 可验收产出 |
|---|---|---|
| 第1-2周 | 需求分析、竞品调研、原型设计 | 功能清单、原型图 |
| 第3-4周 | 小程序框架搭建、Tab页面与底部导航 | 可点击浏览的静态页面 |
| 第5-7周 | 菜谱列表、搜索、详情页开发 | 核心浏览链路跑通 |
| 第8周 | 登录、收藏、浏览历史 | 可登录操作的闭环 |
| 第9周 | 内容录入与测试、机型兼容 | 至少100道菜谱数据 |
| 第10-11周 | 文档撰写、答辩PPT | 结题报告与答辩材料 |
| 第12周 | 查漏补缺与演示彩排 | 完整演示流程 |
提醒一句:进度表里务必留出1-2周的缓冲期。真正开发时一定会遇到环境问题、兼容问题、测试反馈修改,没有缓冲的进度表基本等于计划必崩。
5.3 答辩高频问题与应对思路
- “为什么用小程序不用App?”答:免安装、微信生态内即用即走、开发成本低,对低频刚需型工具是更合适的载体。
- “数据从哪里来?”答:公开数据加工+自录,说明数据结构设计和版权处理(不要提爬虫)。
- “并发怎么办?”答:云开发自带弹性伸缩,云函数按需运行,普通毕设级别访问量无需自建集群。
- “有什么创新点?”答:结合自己选的细分场景(宿舍/健身/一人食)来说,不要硬造“AI推荐算法”这种无法落地的亮点。
- “你自己做了什么?”答:准备一段Demo演示,把登录、浏览、收藏这条链路完整跑一遍,比说任何概念都强。
5.4 叙事策略:避开同质化陷阱
菜谱选题最大的“黑点”就是同质化。开题报告里的主标题如果是“基于微信小程序的菜谱设计与实现”,那你的副标题或者核心功能定位一定要有一句差异化描述,比如“面向宿舍场景的轻量菜谱小程序设计与实现”。页眉和摘要里反复强化场景,让评委第一印象就是“这个和满地的菜谱不一样”。这一招在答辩现场的反馈立竿见影。
6. 从开发到上线:实测复盘与踏坑记录
最后一章,说点代码之外的真实体会。整个项目做下来,我发现真正耗时间的往往不是写业务逻辑,而是处理那些“看着简单、一跑就炸”的工程细节。
6.1 分页加载的重复请求与边界处理
开发列表页时我以为很稳,结果测试同学连续快速滑动列表,控制台同一批数据被拉了两遍。问题不在onReachBottom,而在于isLoading锁的setData是异步的,连续触底时第二个事件已经进入函数体,锁还没来得及设为true。后来把锁的判断提前到函数入口并配合节流,才算彻底解决。
还有分页的“最后一页”边界:当某次查询返回的数据小于pageSize时,不能再继续发请求了,否则下一页永远返回空。这个状态我用hasMore布尔值管理,并在滚动到底部前判断一次,代码在第3.5节里可以看到。
6.2 自定义导航栏在真机上的“撞头”问题
自定义导航栏开发版在开发者工具里怎么看都正常,一上手机就发现标题偏上或者右侧被胶囊顶出去。原因是模拟器的状态栏高度和真机不同,部分安卓机的状态栏高度返回的是dp而不是px,虽然微信官方API返回的是px,但不同机型的刘海区域高度差异仍然巨大。
解决方法是按3.6节的胶囊算法动态计算,同时保证页面样式里不要写死padding-top。上真机测试时至少准备一部带刘海的iPhone和一部安卓机各测一遍,这个组合基本能覆盖大多数高度适配问题。
6.3 体验版分发与试用反馈收集
开发完以后想让同学帮忙测试,很多人不知道怎么看。正确的流程是在微信开发者工具里点击“上传”,然后在微信公众平台后台的“版本管理”里找到开发版本,提交为体验版,生成体验二维码发给测试者。一个小细节:体验版有成员限制,需要在后台“成员管理”里添加体验成员,否则别人扫了也进不来。
收集试用反馈时,我建了一个简单问卷,让测试者在做完一道菜以后填:菜谱好不好懂、步骤有没有缺图、有没有搜索不到想要的菜。实测下来,开放性问题反馈远少于选择题,所以问卷里多用几道选择题和评分题,最后留一个选填的“最想吐槽的点”就够。反馈的价值比你预想的大——测试者照着菜谱做了一遍,就会发现我漏掉了盐的用量、步骤图拍得不清楚等一系列自己开发时完全察觉不到的问题。
6.4 包体、审核与备案的几个自查项
小程序主包限制是2MB,如果所有页面和组件都塞在主包里,很容易超。菜谱详情页的图片都是云存储地址,不占包体,但页面代码和UI资源要留意,必要时用分包加载,把详情页放进去。
提审前有几件事要自查:隐私协议弹窗是否完整、用户授权是否在用到时才申请、类目选择是否与实际内容匹配。菜谱属于“餐饮-菜谱”一类,如果接入了视频,还要注意视频内容是否需要相关资质。个人主体能做的类目有限,设计功能时先查清自己注册主体能开通的类目,别开发完发现某个功能无法提交审核,那就晚了。
6.5 数据备份是最后一道保险
用云开发最怕的是在控制台手滑删错集合,或者某次操作把菜品表字段批量改坏。我的切身教训是:每次大规模录入数据或调整数据结构前,先在云开发控制台手动导出一次数据库。云开发提供了导出功能,输出为JSON文件,定期备份到本地。菜谱数据是内容型产品的命根子,代码丢了可以重写,数据丢了基本等于项目从零再来。这个习惯养成了,答辩前的安全感会提升很多。
一路走下来,我最深的体会是:菜谱小程序这个题目,难点从来不在“小程序”这三个字上,而在你怎么定义用户、怎么组织内容、怎么控制开发范围。开题报告写得好不好,不在于功能列表长不长,而在于每一项设计都能讲出“为什么”。把上面这些思路消化一下,改写成自己的语言放进报告里,你会比大多数同题目的同学站得高一点。