资讯动态

基于ThinkPHP与微信小程序的烘焙教程平台开发实战

发布时间:2026/9/15 0:12:40 来源:尧图企业网站定制
1. 项目背景与整体设计思路1.1 这个毕业设计到底在做什么先说结论这是一个以蛋糕甜品烘焙教程为核心内容的微信小程序项目后端采用ThinkPHP或Laravel框架提供数据接口前端用微信小程序原生开发也可以用uniapp。说白了就是做一个“烘焙版小红书”用户在微信里打开小程序就能浏览蛋糕、甜品、饼干的图文教程和视频教程可以按分类筛选、收藏自己喜欢的配方、给教程打分留言管理员通过后端管理后台维护教程内容和用户数据。这个选题在毕业设计里属于典型的“电商/内容类小程序”方向难度适中既能体现前端小程序开发能力又能展示后端框架运用水平而且烘焙教程这个垂直领域比较接地气演示效果直观答辩时容易讲清楚。我当年带过不少学生做类似项目这类“内容展示用户交互”的小程序在毕设选题里属于性价比很高的选择。那为什么后端要选ThinkPHP或Laravel因为这两种框架在国内的PHP生态里占有率最高ThinkPHP是国内老牌框架中文文档完善、上手曲线平缓Laravel是国际主流框架设计优雅、生态强大两者都能很好地支撑小程序的API接口开发。做毕设嘛选哪个都行关键是要在论文里写清楚“为什么选它”。1.2 核心功能模块拆解在动工之前先把功能边界画清楚。很多学生一上来就想着做大而全的商城系统、支付系统结果做不完、做不深答辩被问住。我建议把这个项目拆成以下几个核心模块用户模块微信授权登录、用户信息维护、我的收藏、我的浏览记录教程模块教程列表展示、分类筛选蛋糕、饼干、甜品、面包等、教程详情页图文步骤操作视频、搜索互动模块教程收藏、点赞、评论/留言内容管理后台教程的增删改查、分类管理、用户管理、评论管理、数据统计访问量、收藏量这些模块覆盖了小程序开发的常见技术点微信登录态处理、列表渲染、数据交互、富文本展示、视频播放等技术含量和完成度都足够支撑一篇像样的毕业设计论文。有一点要特别提醒教程的“视频播放”不要自己存视频文件。小程序对视频源有域名白名单要求而且大文件存储成本高、加载慢最省事的做法是用腾讯视频或第三方云存储的视频链接小程序里用video组件直接播放URL即可。1.3 为什么后端接口要独立出来这个项目采用前后端分离的架构。前端是微信小程序后端是ThinkPHP/Laravel写的API接口服务两者通过HTTP请求JSON数据通信。前后端分离的好处有三个第一逻辑清晰。小程序只负责展示和交互所有的业务逻辑比如登录校验、收藏判断、数据统计都放在后端处理前端代码精简维护方便。第二便于答辩讲解。你可以把后端接口单独演示用Postman或浏览器直接请求API接口看返回结果比直接在手机上点小程序更能展示“你确实做了后端开发”。第三扩展性好。以后如果要做管理后台网页直接复用同一套API接口就行不用重新写逻辑。接口设计上统一采用RESTful风格比如GET /api/tutorial/list 教程列表 GET /api/tutorial/detail 教程详情 POST /api/tutorial/favorite 收藏/取消收藏 POST /api/comment/add 发表评论 GET /api/category/list 分类列表 POST /api/user/login 微信登录接口返回格式统一为{ code: 200, msg: success, data: {} }这样前端解析方便后端调试也直观。2. 技术选型深度对比ThinkPHP还是Laravel2.1 两种框架的核心差异这是很多同学纠结的问题。我直接给结论如果你的PHP基础比较薄弱或者时间紧张选ThinkPHP如果你想把毕设做出“高级感”愿意多花时间学习选Laravel。两者的具体差异主要体现在这几个方面对比维度ThinkPHP以6.x为例Laravel以10.x为例上手难度低中文文档友好函数风格较强中高需理解Composer、中间件、服务容器等概念路由定义简单直接支持路由到控制器方法功能强大支持路由分组、中间件、资源路由ORM模型think-orm简洁易用Eloquent功能丰富但概念多中间件支持核心特性逻辑清晰数据校验内置Validate类FormRequest概念更优雅社区生态国内资料丰富问题好查国际主流插件丰富但中文资料相对分散运行性能相对轻量较重但可用缓存优化适合场景快速开发、中小型项目中大型项目、需要长期维护的工程化项目我在实际带项目的过程中发现大部分本科毕设选ThinkPHP就够了。原因很简单毕设的核心目标是“完成功能讲清原理”ThinkPHP的数据库操作、验证器、模板渲染都非常直接学生一个月左右就能上手。而Laravel虽然优雅但要真正理解服务容器、门面Facade、Eloquent关联模型这些概念对基础薄弱的学生来说容易陷入“照着抄但不知道为啥”的状态。2.2 版本选择要特别注意选好框架之后版本又是一个坑。很多同学下载了旧教程里的ThinkPHP 3.2版本结果PHP都8.0了老框架一堆兼容性问题运行都跑不起来。血的教训不要用ThinkPHP 3.2这个版本已经严重过时网上虽然教程多但都是十年前的内容跟现在的PHP 8环境兼容性极差。我建议的版本组合ThinkPHP 6.x PHP 7.4/8.0Laravel 10.x PHP 8.1以上如果你之前没装过PHP环境我推荐用phpstudy这个集成环境工具一键切换PHP版本、MySQL版本比手动配置XAMPP省心很多。开发调试阶段用内置的服务器就行等做完了再部署到云服务器。题外话这个项目标题里提到了“Thinkphp 3.2版本兼容php8”这个热搜词说明有不少人在这个坑里挣扎过。如果你确实想看老项目的代码可以用Docker把老环境打包起来跑但毕设项目完全没有必要给自己找这个麻烦。2.3 中间件的用途与实现原理不管选哪个框架“中间件”这个概念在小程序后端开发里都很重要因为微信小程序的每个接口都需要做登录态校验。Laravel的中间件机制值得好好写进论文里。它的核心原理是一个“请求管道”HTTP请求进入应用后会经过一系列中间件每个中间件可以在请求到达控制器之前做预处理也可以在响应返回客户端之前做后处理。用生活中的例子来说就像进机场安检——先查身份证认证中间件再查行李日志中间件然后才能进候机厅控制器。在微信小程序场景下我们主要用到的是中间件做登录校验。每次请求都带上一个token中间件拦截请求看看token是否有效// Laravel中间件示例 public function handle($request, Closure $next) { $token $request-header(Authorization); $openid Redis::get(token: . $token); if (!$openid) { return response()-json([code 401, msg 未登录], 401); } $request-attributes-set(openid, $openid); return $next($request); }ThinkPHP 6也有中间件概念用法类似只是实现方式略有差别。理解了中间件的原理论文里就多了一个可以深入探讨的技术点而且这确实是小程序后端开发中非常实用且高频使用的功能。3. 数据库设计与后端接口实现3.1 核心数据表结构设计数据库设计是小程序项目的重中之重表结构直接决定了代码怎么写、功能怎么实现。以下是我认为一套合理完整的数据表设计用户表usersCREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, openid varchar(64) NOT NULL COMMENT 微信openid, nickname varchar(100) DEFAULT COMMENT 昵称, avatar varchar(255) DEFAULT COMMENT 头像, gender tinyint(1) DEFAULT 0 COMMENT 性别, city varchar(100) DEFAULT COMMENT 城市, create_time int(11) DEFAULT NULL COMMENT 创建时间, update_time int(11) DEFAULT NULL COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uniq_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这张表的核心字段是openid它是用户在微信生态里的唯一标识。注意一定要加唯一索引因为在并发登录的时候可能会出现重复插入的问题。utf8mb4字符集是目前的标准配置能完整支持emoji表情——烘焙教程的评论区用户经常会发表情。教程分类表categoriesCREATE TABLE categories ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL COMMENT 分类名称, sort int(11) DEFAULT 0 COMMENT 排序值越大越靠前, status tinyint(1) DEFAULT 1 COMMENT 是否启用, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;教程表tutorials这张表是核心中的核心字段比较多CREATE TABLE tutorials ( id int(11) NOT NULL AUTO_INCREMENT, category_id int(11) NOT NULL COMMENT 所属分类, title varchar(200) NOT NULL COMMENT 教程标题, cover varchar(255) DEFAULT COMMENT 封面图, video_url varchar(255) DEFAULT COMMENT 视频链接, content text COMMENT 图文教程内容, ingredients text COMMENT 食材清单JSON格式, steps text COMMENT 步骤说明JSON格式, view_count int(11) DEFAULT 0 COMMENT 浏览量, favorite_count int(11) DEFAULT 0 COMMENT 收藏量, status tinyint(1) DEFAULT 1 COMMENT 状态0下架 1上架, sort int(11) DEFAULT 0 COMMENT 排序值, create_time int(11) DEFAULT NULL, update_time int(11) DEFAULT NULL, PRIMARY KEY (id), KEY idx_category (category_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里的食材清单ingredients和步骤steps用JSON格式存储是比较推荐的方案。因为不同教程的步骤数和食材项数不一样用JSON格式可以灵活保存任意长度的结构化数据而不需要额外建两张关联表。比如// ingredients字段示例 [ {name: 低筋面粉, amount: 100克}, {name: 鸡蛋, amount: 3个}, {name: 细砂糖, amount: 60克} ] // steps字段示例 [ {order: 1, text: 将蛋清蛋黄分离, image: https://xxx/step1.jpg}, {order: 2, text: 蛋清分三次加糖打发至硬性发泡, image: https://xxx/step2.jpg} ]收藏表favoritesCREATE TABLE favorites ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, tutorial_id int(11) NOT NULL, create_time int(11) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uniq_user_tutorial (user_id, tutorial_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;收藏表一定要加user_id tutorial_id的联合唯一索引防止用户重复收藏。查询“当前用户是否收藏了某教程”就变成了一条简短SQL效率非常高。评论表commentsCREATE TABLE comments ( id int(11) NOT NULL AUTO_INCREMENT, tutorial_id int(11) NOT NULL, user_id int(11) NOT NULL, content varchar(500) NOT NULL, create_time int(11) DEFAULT NULL, PRIMARY KEY (id), KEY idx_tutorial (tutorial_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.2 ThinkPHP/Laravel的模型关联应用有了这些表后端代码就好写了。以Laravel为例一个很漂亮的特性就是Eloquent ORM的关联模型// Tutorial模型 class Tutorial extends Model { // 教程属于一个分类 public function category() { return $this-belongsTo(Category::class); } // 教程有多个收藏 public function favorites() { return $this-hasMany(Favorite::class); } // 教程有多个评论 public function comments() { return $this-hasMany(Comment::class); } }这样在查询教程详情时一行代码就能把关联数据全部取出来$tutorial Tutorial::with([category, comments.user, favorites]) -where(id, $request-id) -first();ThinkPHP的模型关联机制类似用hasMany、belongsTo这些方法也能实现同样的效果。这部分内容很值得在论文里展开因为它体现了面向对象设计中对数据关系的抽象能力。3.3 教程列表接口的完整实现列表接口是最常用的接口我看过太多学生写列表接口就是SELECT * FROM table然后把数据原样返回这种做法在真实项目里问题不小。一个合格的列表接口至少要支持分页、关键词搜索、分类筛选、排序这四个能力。以Laravel为例public function list(Request $request) { $query Tutorial::query()-where(status, 1); // 分类筛选 if ($request-has(category_id)) { $query-where(category_id, $request-category_id); } // 关键词搜索标题模糊匹配 if ($request-has(keyword) $request-keyword ! ) { $query-where(title, like, % . $request-keyword . %); } // 排序1最新 2最热按浏览量 $sort $request-input(sort, 1); if ($sort 2) { $query-orderBy(view_count, desc); } else { $query-orderBy(id, desc); } // 分页 $list $query-paginate($request-input(pagesize, 10)); return response()-json([code 200, data $list]); }小程序端用wx.request请求这个接口把category_id、keyword、page、pagesize这些参数传过来就能实现下拉刷新、上拉加载更多、分类切换、搜索这些常见交互了。这里有一个性能优化的经验列表接口不要返回教程的完整内容字段content、ingredients、steps只返回列表展示需要的关键字段即可。数据量小的时候没感觉等教程多了以后一次返回几十条大字段数据小程序端解析会明显变慢流量也白白浪费。可以这样优化$list $query-select(id, title, cover, view_count, favorite_count, create_time) -paginate(...);3.4 微信登录的完整流程小程序的登录逻辑是很多学生搞不清楚的地方但它是所有功能的基础。整个流程是这样的小程序端调用wx.login()接口获取一个临时凭证code有效期5分钟小程序把code通过wx.request发送到后端后端拿着code调用微信服务端的code2Session接口换取openid和session_key后端用openid查找或创建用户记录后端生成一个自定义的token可以是md5(openid 时间戳 随机数)存到Redis或数据库里并设置有效期返回token给小程序小程序后续所有请求都在Header里带上这个token后端通过中间件解析token识别用户身份后端核心代码Laravelpublic function login(Request $request) { $code $request-input(code); // 调用微信接口换取openid $appid config(wx.appid); $secret config(wx.secret); $url https://api.weixin.qq.com/sns/jscode2session?appid{$appid}secret{$secret}js_code{$code}grant_typeauthorization_code; $result json_decode(file_get_contents($url), true); if (!isset($result[openid])) { return response()-json([code 500, msg 登录失败]); } $openid $result[openid]; // 查找或创建用户 $user User::firstOrCreate([openid $openid]); // 生成登录token $token md5($openid . time() . rand(1000, 9999)); Cache::put(token: . $token, $user-id, 7200); // 2小时有效 return response()-json([ code 200, data [ token $token, user $user ] ]); }注意这里有一个常见的坑file_get_contents请求微信接口属于服务端请求如果你在本地开发调试不需要在小程序后台配置服务器域名白名单但一旦部署到线上你的后端服务域名必须在微信公众平台配置为业务域名。这个我后面专门讲。4. 微信小程序前端实现4.1 页面结构和跳转关系设计小程序端我建议按下面这个结构来组织页面pages/ ├── index/ 首页教程瀑布流列表 ├── category/ 分类页左侧分类菜单右侧教程列表 ├── detail/ 教程详情页视频图文步骤食材清单 ├── user/ 我的页面头像昵称、收藏、浏览记录 ├── favorites/ 我的收藏页 ├── comment/ 评论列表页 ├── search/ 搜索结果页页面跳转关系很直观index和category可以互相切换底部TabBar点击任一教程卡片进入detail在detail里可以跳转comment查看全部评论user页里可以点击进入favorites。关于底部导航栏小程序要在app.json里配置TabBar我建议设置3个Tab首页、分类、我的。烘焙教程内容多3个Tab足够清晰不需要画蛇添足。4.2 教程详情页的关键实现教程详情页是这个项目的颜值担当也是功能最复杂的页面建议做得细致一些。页面结构大致是顶部封面大图或视频播放器标题和基础信息分类、浏览量、收藏量食材清单卡片式展示按食材列表逐行显示名称和用量图文教程步骤分步骤展示每一步有文字说明和配图底部操作栏收藏按钮、评论入口页面布局代码简化版WXMLview classdetail-container video wx:if{{detail.video_url}} src{{detail.video_url}} controls classvideo-player/video image wx:else src{{detail.cover}} classcover-img/image view classtitle-block text classtitle{{detail.title}}/text view classmeta text{{detail.view_count}}人看过/text text{{detail.favorite_count}}人收藏/text /view /view view classsection wx:if{{detail.ingredients.length 0}} view classsection-title食材清单/view view classingredient-item wx:for{{detail.ingredients}} wx:keyindex text{{item.name}}/text text classamount{{item.amount}}/text /view /view view classsection wx:if{{detail.steps.length 0}} view classsection-title制作步骤/view view classstep-item wx:for{{detail.steps}} wx:keyorder view classstep-num{{item.order}}/view view classstep-content text{{item.text}}/text image wx:if{{item.image}} src{{item.image}} modewidthFix/image /view /view /view /view view classbottom-bar view classfavorite-btn {{isFavorite ? active : }} bindtaptoggleFavorite text{{isFavorite ? 已收藏 : 收藏}}/text /view view classcomment-btn bindtapgoComment评论/view /view视频播放这里有个小细节如果教程没有视频就显示封面大图。我在实际做类似项目时发现烘焙教程的视频往往比较长微信小程序原生video组件较好但要注意视频源的域名必须在小程序后台配置到downloadFile合法域名里否则真机预览播放不了。收藏功能的实现Page({ data: { detail: {}, isFavorite: false }, onLoad(options) { this.tutorialId options.id; this.loadDetail(); }, loadDetail() { const token wx.getStorageSync(token); wx.request({ url: https://yourdomain.com/api/tutorial/detail, data: { id: this.tutorialId }, header: { Authorization: token }, success: (res) { if (res.data.code 200) { this.setData({ detail: res.data.data, isFavorite: res.data.data.is_favorite }); } } }); }, toggleFavorite() { if (!wx.getStorageSync(token)) { wx.showToast({ title: 请先登录, icon: none }); return; } wx.request({ url: https://yourdomain.com/api/tutorial/favorite, method: POST, data: { tutorial_id: this.tutorialId }, header: { Authorization: wx.getStorageSync(token) }, success: (res) { if (res.data.code 200) { this.setData({ isFavorite: !this.data.isFavorite }); wx.showToast({ title: res.data.msg }); } } }); } });4.3 uniapp与原生开发的取舍前面提到了uniapp这里展开说说。如果你只想围绕微信小程序做直接用微信原生开发就够了没有什么学习成本。但如果你的论文想强调“多端适配”用uniapp框架写一套代码既能编译成微信小程序也能编译成H5和App这种“一套代码多端运行”的卖点在答辩的时候会比较加分。我个人的建议是时间充裕、想写点有技术深度的内容uniapp Vue3语法做一个完整的项目论文里多一个“跨端方案对比”的亮点。时间紧张、想尽快跑通整个流程微信小程序原生开发文档资料多排查问题方便。4.4 需要注意的小程序配置细节小程序开发不只是在编辑器里写代码还涉及到很多平台配置的工作。这些细节往往是学生最容易忽略的1. 服务器域名白名单登录微信公众平台在“开发管理-开发设置-服务器域名”里配置request合法域名。你所用的后端API接口域名必须在这里配置否则真机调试时所有wx.request都会报域名不合法错误。开发模式下可以在微信开发者工具里勾选“不校验合法域名”绕过但线上版本一定要配上。2. 登录态过期微信小程序的token有效期要合理安排。太短比如30分钟会导致用户频繁重新登录体验很差太长比如7天又有安全隐患。我建议后台管理员类操作校验严格一些普通浏览接口放宽到2小时到7天。缓存策略可以用Redis设置不同的失效时间。3. 首页加载体验很多学生反映小程序“刚进入的加载页面”不好看。微信小程序默认启动时会出现一个白屏如果配置了window里的backgroundColor和navigationBarBackgroundColor能让启动过程看起来舒服一些。更进阶的做法是在app.json里配置loading相关的启动屏。我试过在首页用一个骨架屏组件代替传统的loading动画用户在等待数据加载时看到的不是白屏而是内容占位图体验会好很多。5. 部署上线与常见问题排查5.1 后端部署的完整流程当你的代码本地都调试OK之后就要部署到云服务器上。这里记录一下我在实际部署中经常用到的步骤购买一台云服务器2核4G就够了学生机就可以安装LNMP环境Linux Nginx MySQL PHP把后端代码上传到服务器配置Nginx站点指向项目的public目录配置HTTPS证书微信小程序要求所有请求必须HTTPS创建数据库并把SQL导入修改项目的数据库配置和微信小程序配置测试所有API接口是否能正常访问这里有一个非常关键的细节小程序要求request合法域名必须是HTTPS协议且证书要有效。所以必须在服务器上配置SSL证书。如果是学生项目可以用免费的Lets Encrypt证书一年有效期到期前记得重新申请。5.2 安全方面必须注意的坑在带着学生做毕设的过程中我发现后端安全问题始终是最容易被忽视的环节。好在微信小程序项目天然有一层安全防护用户必须经过微信登录才能操作但该做的检查一个都不能少参数校验所有接口的参数都不能直接信任前端传来的值后端必须做类型判断、长度限制、枚举检查。比如tutorial_id必须是正整数不能是字符串或负数。SQL注入使用ORM模型的参数绑定方式能有效防止SQL注入。不要拼SQL字符串。越权防护用户只能操作自己的数据。比如删除评论时后端要校验这条评论确实属于当前用户不能被前端伪造请求删掉别人的评论。XSS防护用户输入的内容比如昵称、评论前端展示时要转义处理。小程序端用{{}}绑定默认是转义的这点比Web要安全一些。5.3 常见问题速查表我把做这类项目最常见的坑集中整理成表格供大家排查时参考问题现象可能原因解决方案wx.request报“域名不合法”没有配置request合法域名微信公众平台配置请求域名开发模式勾选不校验真机上看不了视频视频域名不在白名单配置downloadFile合法域名或使用第三方视频链接登录一直失败code过期/后端appid密钥不对确认appid和secret无误code在5分钟内使用数据库插入中文乱码表字符集不是utf8mb4建表时设置CHARSETutf8mb4API接口访问超时数据库连接慢/服务器带宽不足查看慢查询日志必要时加索引和缓存图片加载不出来图片域名未配置/图片被防盗链把图片放到后端同域名下或配置downloadFile域名收藏按钮状态不对前后端状态同步问题详情接口返回is_favorite字段前端以接口为准评论区emoji显示为问号数据库字符集不支持表结构改为utf8mb4字符集部署后接口500报错PHP错误/数据库连接失败查看Nginx错误日志和PHP错误日志定位问题5.4 性能优化的小技巧虽然毕设对性能要求不高但在论文里写上一两段“性能优化”的内容会让答辩老师觉得你考虑问题很全面Redis缓存教程列表是高频访问的数据可以缓存到Redis里设置10分钟过期。每次请求先查Redis没有再查MySQL然后把结果写回Redis。数据冗余在教程列表的返回数据里直接附带收藏量和浏览量字段避免前端每次都要额外请求统计接口。图片懒加载小程序image组件的lazy-load属性可以开启图片懒加载列表页图片较多时能明显减少首屏网络请求。大文本字段分离列表页只查列表字段详情页再查完整内容这种“字段裁剪”的做法在数据量大时效果很明显。有一点要特别强调不要为了优化而过度设计。毕设项目最终的目的是把所有功能跑通、讲清楚如果因为加了Redis缓存导致代码复杂度大增、自己都解释不清楚那就得不偿失了。量力而行就好。6. 实操总结与避坑心得做完整个项目我最想跟大家分享的就是“动手之前先想清楚数据关系”。很多同学把表结构设计错了后面改代码的时候痛苦不堪。你在画表之前先问问自己用户和教程什么关系教程和分类什么关系用户和收藏什么关系这些一对多、多对多的关系理清楚了模型层的代码基本就是顺水推舟。另外我建议把项目分成四个阶段来做每个阶段都有明确的目标第一阶段大约一周搭建开发环境跑通一个最简单的hello world接口从小程序端调通这个接口。这一步看着简单但能把整个开发链路打通后面就不会有“环境问题”来干扰你的正常开发。第二阶段大约两周完成数据库设计和后端所有接口开发用Postman或者Apifox把每个接口都测一遍。我建议在做前端之前先把所有接口测通不要边做前端边改后端接口。第三阶段大约两周实现小程序前端页面和交互逻辑把每个页面做出来、连上接口。第四阶段大约一周整体联调、真机测试、部署上线、准备答辩材料系统架构图、数据库设计图、功能截图。这个分工很符合一般毕业设计的节奏当然你要是能力强压缩时间也没问题但尽量不要跳过“联调部署”这个环节。在答辩的时候有几类问题老师几乎必问你提前准备一下为什么选这个课题、技术选型方案是怎么考虑的、表结构为什么这么设计、某个功能的具体实现思路是什么、遇到过什么困难怎么解决的。上面写的这些内容其实都是给这些问题准备好的答案。最后再分享一个我在实际操作中摸索出的小技巧在小程序开发者工具里把不校验合法域名、TLS版本以及HTTPS证书这个选项打开能省很多开发阶段的功夫。但提交审核前一定要记得关掉用真机走一遍完整的流程确保所有API都正常。这个操作我至少踩过三次坑每次都因为没关这个选项上线后小程序在某些网络环境下请求全部失败。烘焙教程小程序这个题目看起来不大但麻雀虽小五脏俱全——用户登录、内容管理、收藏互动、搜索浏览所有主流电商和内容类App的核心模块都有了。一步一个脚印把它做完你会发现自己PHP、数据库、小程序三方面的能力都会有一个质的提升论文素材也会非常充实。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价