自律学习小程序毕设实战:微信云开发+番茄钟全流程
如果你正在做毕业设计选题方向是“自律学习类微信小程序”或者导师只给了“做一个学习工具类小程序”这种宽泛要求那这一篇可以直接收藏。这次我按“演示项目”的思路把自律学习小程序从功能设计、技术选型、环境搭建、页面实现、云开发接入到真机调试完整过一遍。重点回答几个毕设里最常被问的问题登录怎么处理、任务和打卡数据存哪里、番茄钟能不能做、数据统计图表怎么画、小程序能不能在手机上直接跑、答辩时要展示哪些模块。自律学习类小程序在毕业设计里属于“工具型应用”比商城、外卖、交友这类题目好做因为业务逻辑清晰、功能边界明确而且可以天然接入微信的登录、订阅消息、云开发等能力。1. 核心能力速览能力项说明项目类型微信小程序原生开发 微信云开发核心功能每日任务清单、番茄钟专注计时、打卡记录、学习数据统计、用户积分体系登录方案微信授权登录 云开发匿名登录 / 自定义登录态数据存储云开发数据库tasks、focusRecords、userProfiles 等集合后台能力云函数处理签到、统计、积分变更等逻辑消息能力微信订阅消息每日学习提醒、打卡成功通知前端框架微信原生 WXML WXSS JS无额外 UI 框架依赖开发工具微信开发者工具稳定版部署方式云开发一键开通无需自建服务器是否支持真机支持需要 AppID 且开通云开发环境批量任务支持批量插入默认任务模板、批量导入课程表通过云函数接口 API云函数即接口也可通过 HTTP API 方式暴露部分查询能力适合场景毕业设计演示、微信小程序课程设计、自律学习工具快速原型从选型上看原生小程序 云开发的组合是目前做毕设最稳的路径不需要自己买服务器、不需要备案域名、不需要处理 HTTPS 证书微信开发者工具里一键开环境写云函数也不需要单独的 Node.js 服务。对于“演示”这个目标来说这套方案能让你把时间花在功能实现上而不是花在运维上。2. 适用场景与使用边界自律学习小程序的核心使用场景是“个人学习管理”典型流程是用户打开小程序授权登录。在今日任务页创建学习任务例如“背单词 30 分钟”“完成算法题 2 道”。点击开始专注进入番茄钟计时。专注结束后自动打卡写入学习记录。在统计页查看每日专注时长、连续打卡天数、任务完成率。通过积分体系激励自己持续使用。这个场景适合作为毕业设计的“业务主线”因为每个环节都能单独展示登录模块展示微信能力接入。任务模块展示增删改查和本地缓存。番茄钟展示定时器、后台计时、页面状态同步。统计模块展示图表绘制和数据聚合。云函数展示后端逻辑和数据库操作。订阅消息展示小程序消息触达能力。不适合做的场景也很明确如果你打算做“多人实时同步”“在线自习室”“排行榜 PK”需要引入 WebSocket 或实时数据库监听复杂度会明显上升。毕设答辩通常更关注“完整闭环”而不是“花哨的实时互动”所以先保证单人闭环跑通再考虑扩展。使用边界上要注意自律学习类小程序涉及用户行为数据必须有“用户协议”和“隐私保护指引”入口。微信授权登录获取用户头像昵称时2022 年后微信调整了 getUserProfile 策略需要使用头像昵称填写能力或者仅获取 openid不要在答辩演示时临时依赖弹窗授权。番茄钟如果用到订阅消息订阅消息只能由用户主动触发订阅不能强制推送。所有学习数据归用户个人所有云开发数据库建议按用户 openid 隔离避免越权访问。3. 环境准备与前置条件先列一套干净的基础环境清单这是我建议的毕设开发配置环境项要求操作系统Windows 10/11 或 macOS微信开发者工具稳定版即可建议更新到最新稳定版小程序账号注册微信小程序个人主体账号获取 AppIDNode.js建议 16 或 18 LTS 版本云函数本地调试会用到云开发环境在开发者工具中开通免费额度足够毕设演示数据库云开发自带文档型数据库不需要额外装 MySQL注册小程序账号这一步要提前做因为个人主体小程序可以注册审核需要一点时间。如果只是本地模拟器调试也可以使用测试号但测试号不支持云开发和真机预览的部分能力。开发工具下载地址直接搜索“微信开发者工具”进入官网选择稳定版即可。安装完成后需要扫码登录。云开发环境的开通路径是打开微信开发者工具导入项目。选择“云开发”按钮。创建环境环境名称建议用英文例如study-dev。等待环境初始化完成。个人版云开发有免费额度数据库读写次数、云函数调用次数、存储空间对毕设演示来说都够用。如果你选择 uni-app 方案HBuilderX uni-app环境准备会变成安装 HBuilderX。创建 uni-app 项目选择微信小程序编译模式。安装微信开发者工具并在 HBuilderX 中配置小程序运行路径。同样需要 AppID。两种方案各有优势。原生小程序更贴近“微信小程序课程设计”的评分标准代码结构一目了然uni-app 更适合你以后想同时发布支付宝小程序、百度小程序、抖音小程序的场景。从热搜数据来看很多同学在用 uni-app 开发微信小程序也有不少问题是关于 HBuilderX 中修改小程序 ID、运行到模拟器后 ID 未更新这些细节。我的建议是如果只做微信小程序原生开发足够如果想要跨端再选 uni-app。4. 安装部署与启动方式这里我给出基于原生小程序 云开发的完整目录结构你拿到之后可以直接模仿。├── cloudfunctions/ │ ├── login/ │ │ ├── index.js │ │ └── package.json │ ├── getTaskList/ │ ├── addTask/ │ ├── updateTask/ │ ├── deleteTask/ │ ├── startFocus/ │ ├── finishFocus/ │ ├── getStatistics/ │ └── sendReminder/ ├── miniprogram/ │ ├── pages/ │ │ ├── index/ │ │ ├── task/ │ │ ├── focus/ │ │ ├── stats/ │ │ └── profile/ │ ├── components/ │ │ ├── task-item/ │ │ └── progress-ring/ │ ├── utils/ │ │ ├── auth.js │ │ ├── time.js │ │ └── format.js │ ├── app.js │ ├── app.json │ ├── app.wxss │ └── project.config.json └── project.config.jsonapp.json 的基础配置大概是这样的{ pages: [ pages/index/index, pages/task/task, pages/focus/focus, pages/stats/stats, pages/profile/profile ], window: { navigationBarTitleText: 自律学习助手, navigationBarBackgroundColor: #4A6CF7, navigationBarTextStyle: white }, tabBar: { list: [ { pagePath: pages/index/index, text: 今日 }, { pagePath: pages/task/task, text: 任务 }, { pagePath: pages/stats/stats, text: 统计 }, { pagePath: pages/profile/profile, text: 我的 } ] }, cloud: true }云开发初始化放在 app.js 里App({ onLaunch() { if (!wx.cloud) { console.error(请使用 2.2.3 以上基础库以使用云能力) return } wx.cloud.init({ env: study-dev, traceUser: true }) const openid wx.getStorageSync(openid) if (!openid) { this.globalData.loginReady this.login() } else { this.globalData.openid openid this.globalData.loginReady Promise.resolve(openid) } }, login() { return wx.cloud.callFunction({ name: login }).then(res { const openid res.result.openid wx.setStorageSync(openid, openid) this.globalData.openid openid return openid }) }, globalData: { openid: , loginReady: null } })这里需要注意login 是云函数不是传统后端接口。云函数中通过cloud.getWXContext()拿到用户 openid。login 云函数实现const cloud require(wx-server-sdk) cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) exports.main async (event, context) { const wxContext cloud.getWXContext() const db cloud.database() const users db.collection(userProfiles) const existing await users.where({ openid: wxContext.OPENID }).get() if (existing.data.length 0) { await users.add({ data: { openid: wxContext.OPENID, nickname: , avatar: , totalFocusMinutes: 0, totalTasks: 0, streakDays: 0, createdAt: db.serverDate() } }) } return { openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID || } }运行步骤很简单在微信开发者工具中导入项目根目录。工具会自动识别 project.config.json。开通云开发环境。右键 cloudfunctions 下的每个云函数选择“上传并部署云端安装依赖”。编译小程序即可。如果你用的是 uni-app HBuilderX启动流程为新建 uni-app 项目选择默认模板。修改 manifest.json 中的小程序 AppID。在 HBuilderX 菜单中点击“运行 - 运行到小程序模拟器 - 微信开发者工具”。如果弹出运行时微信开发者工具中的 AppID 没有变化检查 HBuilderX 的 manifest.json 是否保存以及微信开发者工具是否关闭了“不校验合法域名”选项。5. 功能测试与效果验证自律学习小程序的功能验证要按模块拆开测不要一把梭。5.1 登录功能测试测试目的验证用户能通过云函数获取 openid并能在数据库中创建或读取用户档案。操作步骤清除小程序本地缓存退出登录态。重新编译小程序。在页面 onLoad 中调用 app.globalData.loginReady。打开云开发控制台查看 userProfiles 集合。预期结果能获取到 openid。userProfiles 集合中出现一条记录。再次登录时不会重复插入记录。失败排查问题现象可能原因排查方式解决方案调用云函数报错云函数未部署查看云函数列表右键云函数上传并部署登录报无权限云开发环境名配置错误检查 app.js 中的 env修改为实际环境 ID数据库集合不存在未手动创建集合打开云开发控制台数据库页添加集合 userProfiles5.2 任务增删改查测试测试目的验证任务列表可以正常读取、添加、编辑、删除。操作示例调用云函数添加任务。wx.cloud.callFunction({ name: addTask, data: { title: 背英语单词, planMinutes: 30, date: 2025-01-15 } }).then(res { console.log(添加结果, res.result) })前端页面建议在 onShow 中拉取任务列表保证每次页面显示时数据都是最新的onShow() { this.fetchTaskList() }, async fetchTaskList() { const db wx.cloud.database() const date formatDate(new Date()) const res await db.collection(tasks) .where({ openid: app.globalData.openid, date: date }) .orderBy(createTime, desc) .get() this.setData({ taskList: res.data }) }预期结果添加任务后列表立即出现新任务。刷新页面后任务不丢失。完成任务后任务状态变为已完成。注意云开发数据库的权限默认是“仅创建者可读写”这是好事但如果你在测试时遇到页面读取不到任何数据先检查集合权限设置。建议把集合权限设置为“仅创建者可读写”然后所有前端查询都通过 where 条件限制 openid。5.3 番茄钟功能测试测试目的验证开始专注、倒计时、暂停、完成打卡全流程。番茄钟的核心逻辑建议放在页面级别代码结构大概这样Page({ data: { totalMinutes: 25, remainingSeconds: 25 * 60, status: idle, // idle | running | paused | finished timer: null }, startTimer() { this.setData({ status: running }) this.data.timer setInterval(() { const remaining this.data.remainingSeconds - 1 if (remaining 0) { clearInterval(this.data.timer) this.finishFocus() return } this.setData({ remainingSeconds: remaining }) }, 1000) }, pauseTimer() { clearInterval(this.data.timer) this.setData({ status: paused }) }, finishFocus() { wx.vibrateLong() wx.cloud.callFunction({ name: finishFocus, data: { taskId: this.data.currentTaskId, actualMinutes: this.data.totalMinutes } }) } })需要特别注意的一点小程序进入后台后setInterval 会被系统挂起。如果你希望在后台也能计时需要记录开始时间戳在页面重新显示时计算差值。更完整的方案是使用wx.setBackgroundFetchToken配合后台预拉取或者用云函数记录开始时间、结束时间来计算时长。建议的做法是开始专注时记录startTime到全局变量和 storage倒计时仅在页面可见时刷新页面回到前台时用当前时间减去 startTime 得到实际已用时。这样即使小程序被切到后台数据也不会丢失。预期结果点击开始后按钮文字变为暂停。倒计时数字每秒变化。时间到后触发震动并调用打卡云函数。打卡成功后任务状态更新。stats 页的专注时长数据刷新。5.4 订阅消息测试这里很容易被卡住。微信订阅消息要求用户主动点击订阅按钮而且一次性订阅模板只允许推送一条消息。测试流程在小程序后台申请订阅消息模板拿到 templateId。在页面里添加一个按钮button open-typeopenSetting bindtapsubscribeReminder开启每日提醒/button点击按钮时调用subscribeReminder() { wx.requestSubscribeMessage({ tmplIds: [你的模板ID], success(res) { if (res.errMsg requestSubscribeMessage:ok) { wx.showToast({ title: 订阅成功 }) } } }) }云函数中通过cloud.openapi.subscribeMessage.send发送订阅消息。如果你在做“每日提醒”类的定时推送需要另外处理定时触发的机制。云开发本身没有类似 cron 的内置功能常见方案是使用云函数定时触发器在cloudfunctions/sendReminder/config.json中配置触发器{ triggers: [ { name: dailyReminder, type: timer, config: 0 0 9 * * * * } ] }这里配置的是每天 9 点触发。但需要注意一次性订阅消息模板只能发一条如果用户订阅了 3 次才可以发 3 条。连续订阅需要每次发送前重新请求订阅授权。5.5 数据统计测试测试目的验证统计页能正确展示今日专注时长、连续打卡天数、任务完成率。推荐在云函数中做聚合避免前端处理大量数据。const cloud require(wx-server-sdk) cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db cloud.database() const _ db.command exports.main async (event, context) { const wxContext cloud.getWXContext() const openid wxContext.OPENID const today formatDate(new Date()) const [taskRes, focusRes, userRes] await Promise.all([ db.collection(tasks) .where({ openid, date: today }) .count(), db.collection(focusRecords) .where({ openid, date: today }) .get(), db.collection(userProfiles) .where({ openid }) .get() ]) const focusRecords focusRes.data const totalMinutes focusRecords.reduce( (sum, item) sum item.actualMinutes, 0 ) return { todayTaskCount: taskRes.total, todayTotalMinutes: totalMinutes, streakDays: userRes.data[0]?.streakDays || 0, focusRecords } }前端拿到数据后用原生 canvas 绘制柱状图或环形图。如果你的基础库版本较新可以考虑使用echarts-for-weixin组件或wx-charts但原生 canvas 对毕设答辩来说完全够用而且不用引入额外依赖。6. 接口 API 与批量任务云开发中小程序的接口设计有两种形态云函数透传前端通过 wx.cloud.callFunction 调用云函数云函数再解析参数、查数据库、返回结果。HTTP 访问云函数本身不能直接暴露 HTTP URL但云开发提供了 HTTP API 服务可以通过云函数调用外链或使用云开发 HTTP 触发能力。对于毕设演示我建议全部走云函数。理由很简单不用处理跨域、不用配置域名白名单、不用考虑 token 鉴权微信内部已经帮你做了身份绑定。你的选题关键词是“演示”所以越简单越可靠。下面给一个 getTaskList 云函数的接口示例const cloud require(wx-server-sdk) cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db cloud.database() exports.main async (event, context) { const wxContext cloud.getWXContext() const openid wxContext.OPENID const { date, status } event const where { openid } if (date) where.date date if (status) where.status status try { const res await db.collection(tasks) .where(where) .orderBy(createTime, desc) .limit(50) .get() return { code: 0, message: success, data: res.data } } catch (err) { return { code: -1, message: err.message } } }对应的前端调用方式wx.cloud.callFunction({ name: getTaskList, data: { date: 2025-01-15, status: ongoing } }).then(res { const { code, data } res.result if (code 0) { this.setData({ taskList: data }) } })批量任务主要体现在两个场景6.1 批量创建默认任务模板首次进入小程序时可以通过一个initDefaultTasks云函数自动插入一组示例任务方便演示。比如const defaultTasks [ { title: 晨间阅读, planMinutes: 30 }, { title: 学习编程, planMinutes: 60 }, { title: 运动锻炼, planMinutes: 30 }, { title: 复盘总结, planMinutes: 20 } ] exports.main async (event, context) { const wxContext cloud.getWXContext() const openid wxContext.OPENID const date event.date || formatDate(new Date()) const db cloud.database() const existing await db.collection(tasks) .where({ openid, date }) .count() if (existing.total 0) { return { code: 0, skipped: true } } const tasks defaultTasks.map(item ({ ...item, openid, date, status: ongoing, completed: false, createTime: db.serverDate() })) await db.collection(tasks).add({ data: tasks }) return { code: 0, created: tasks.length } }6.2 批量导入课程表功能如果你想让项目更完整可以加一个课程表导入。用户在小程序里逐条添加课程或者通过一个文本输入框粘贴课程数据云函数解析后批量插入数据库。// 云函数 batchImportCourses exports.main async (event, context) { const wxContext cloud.getWXContext() const openid wxContext.OPENID const { courses } event // [{courseName, dayOfWeek, startTime, endTime}] if (!courses || !courses.length) { return { code: -1, message: 课程数据为空 } } const db cloud.database() const batch courses.map(item ({ ...item, openid, createTime: db.serverDate() })) await db.collection(courses).add({ data: batch }) return { code: 0, imported: batch.length } }批量任务的接口设计原则是一次请求对应一个云函数不要在云函数里频繁循环调用数据库 API尽量用数组批量写入。云开发数据库的 add 支持传入数组实现多条插入这一点对批量任务很关键。7. 资源占用与性能观察小程序不像本地 AI 模型那样有 GPU 显存概念但“资源占用”还是可以从几个现实维度观察。7.1 包体积微信小程序主包体积限制是 2MB超过后需要分包。自律学习小程序的页面不多通常不会超过限制但要注意图片资源。建议所有图标使用 iconfont 或 SVG不要放多张 PNG。tabBar 图标使用 81px * 81px 的 PNG体积控制在 2KB 内。如果引用了 echarts 或大量图片要开启分包加载。分包结构参考{ subpackages: [ { root: packageStats, pages: [ pages/charts/charts ] } ] }7.2 云函数冷启动云函数在第一次调用时需要冷启动耗时可能达到 1-3 秒。毕设演示时如果现场网络一般建议在演示前先在小程序里扫码打开一次触发各主要云函数的冷启动让后续调用更快。7.3 数据库请求并发尽量不要在页面 onLoad 中同时发起超过 5 个数据库查询。云开发数据库对单次请求有频率限制并行太多可能报错。更稳妥的做法是像统计接口那样在一个云函数里用 Promise.all 聚合数据前端只调一次。7.4 番茄钟计时精度如果你在真机上测试发现倒计时不准通常不是代码 bug而是小程序切后台后定时器被挂起。解决方案在 5.3 已经提到用时间戳差值计算。7.5 从热搜中提到的常见问题看资源占用热搜词里有几个和运行环境相关的关键词值得注意“小程序头部标题”这是导航栏配置问题在 app.json 或单页面的 json 中配置 navigationBarTitleText 即可。“小程序苹果底部兼容css”iOS 底部安全区适配可以用 env(safe-area-inset-bottom)。“小程序抓包”这个属于调试手段毕设阶段一般不需要。“小程序显示客户端ssl握手失败”通常是真机调试时域名证书问题云开发不存在这个问题因为云开发域名已经处理好了。“微信小程序真机测试failed net::ERR_CONNECTION_RESET”常见原因是手机和电脑不在同一网络、代理冲突、或者真机调试时项目配置问题。重启微信开发者工具和微信客户端通常能解决。8. 常见问题与排查方法问题现象可能原因排查方式解决方案真机预览时页面白屏基础库版本太低或 AppID 未配置查看调试器 console 报错升级基础库确认 AppID登录后用户头像昵称为空getUserProfile 策略调整查看接口返回使用头像昵称填写能力或 openid 展示番茄钟切后台后计时不准确setInterval 被挂起查看页面 onHide/onShow 日志改用时间戳差值计算数据库查询返回空数组集合权限或 where 条件不匹配在云开发控制台手动查询检查 openid 字段、权限设置云函数上传后调用报 module 不存在云端依赖未安装点击云函数列表展开查看右键“上传并部署云端安装依赖”订阅消息发送失败用户未订阅或模板 ID 错误查看云函数日志检查模板 ID重新请求订阅页面底部被 iOS 安全区遮挡未适配安全区真机截图查看添加 env(safe-area-inset-bottom) 样式小程序无法打开公众号文章未配置业务域名或用户未登录查看报错信息个人主体小程序建议直接使用 web-view 组件运行到小程序模拟器后 AppID 没变HBuilderX 项目配置未同步检查 manifest.json重新运行或重启微信开发者工具H5/小程序 SSL 握手失败真机调试网络代理问题关闭代理切换网络使用云开发域名不依赖自定义域名这里特别说明一下“小程序 a 跳转小程序 b”的问题。在自律学习小程序中如果你的“我的”页面放了一个“推荐给好友”入口需要跳转到另一个小程序调用 wx.navigateToMiniProgram 即可但前提是两个小程序都要在微信公众平台互相添加跳转白名单。个人主体小程序可以正常配置但建议答辩演示时不展示跳转因为这个流程需要后台审核容易在演示时出问题。另外很多同学在开发时遇到过“小程序获取登录后的微信用户失败”的问题。这个错误通常出现在你使用 wx.getUserInfo 或 wx.getUserProfile 获取头像昵称但用户拒绝了授权或者你的基础库版本较旧。更可靠的方案是直接使用 openid 作为用户唯一标识头像昵称在用户主动点击“完善资料”时再填写。9. 最佳实践与使用建议9.1 代码结构按业务模块拆不要堆页面自律学习小程序的业务模块可以拆成用户模块登录、个人资料、积分。任务模块任务的增删改查、状态流转。专注模块番茄钟、记录生成。统计模块数据聚合、图表展示。消息模块订阅消息、提醒。每个页面尽量只做一件事。比如 index 页面只展示今日概览和进入任务的入口task 页面负责任务管理focus 页面只做番茄钟stats 页面只放图表和统计结果profile 页面放用户信息、订阅消息入口和使用说明。9.2 数据字段设计要有预留建议数据库集合字段设计如下tasks 集合{ _id: 自动生成, openid: 用户标识, title: 任务标题, description: 任务描述, planMinutes: 30, actualMinutes: 0, date: 2025-01-15, startTime: , endTime: , status: ongoing | completed | expired, tags: [学习, 英语], createTime: 服务端时间 }focusRecords 集合{ _id: 自动生成, openid: 用户标识, taskId: 关联任务ID, taskTitle: 任务标题冗余存储, startTime: 专注开始时间, endTime: 专注结束时间, actualMinutes: 25, completed: true, date: 2025-01-15 }userProfiles 集合{ _id: 自动生成, openid: 用户标识, nickname: 昵称, avatar: 头像链接, totalFocusMinutes: 0, totalCompletedTasks: 0, streakDays: 0, lastCheckInDate: 2025-01-15, createdAt: 注册时间 }9.3 番茄钟的连续打卡计算连续打卡天数不建议每天定时任务去算而是每次打卡时更新。思路是用户完成一次专注后云函数检查 userProfiles.lastCheckInDate。如果 lastCheckInDate 是昨天streakDays 1。如果 lastCheckInDate 是今天不变化。如果是更早的日期streakDays 重置为 1。这个逻辑放在 finishFocus 云函数中执行保证打卡和连续天数更新是原子性的。9.4 答辩演示路线答辩演示建议按这条路线来打开小程序展示首页今日学习概览。进入登录流程展示云开发数据库新增用户记录。添加一条学习任务展示云函数调用日志。开始番茄钟等待 1-2 分钟切到统计页展示专注记录已生成。打开云开发控制台展示数据库集合、云函数调用次数、存储使用量。如果开通了订阅消息可以当场点击订阅并发送一条测试通知。这条演示路线能在 8-10 分钟内讲完整套闭环而且所有数据都是实时写入云端的。9.5 上线前检查清单如果你的目标是发布上线而不是仅仅答辩演示至少检查这些项小程序类目选择是否匹配教育类目需要资质自律学习工具可以选择“工具 效率”类目。隐私保护指引是否填写在微信公众平台后台填写用户隐私保护指引。用户协议是否添加至少需要在“我的”页面展示用户协议和隐私政策链接。云开发环境是否切换为正式环境不要在正式版中使用测试环境。订阅消息模板是否审核通过。小程序体验版先行测试再提交审核。10. 总结与下一步自律学习小程序这个选题对毕业设计来说是“下限低、上限也清晰”的一类项目。下限低是指核心闭环容易实现登录、任务、打卡、统计都有标准化的微信能力可以接入上限清晰是指你可以从个人自律工具进一步扩展到专注排行榜、学习小组、课程表导入、年度报告生成等模块。演示阶段最先应该验证的是“任务创建 - 番茄钟专注 - 打卡记录 - 统计数据刷新”这条链路。最容易踩的坑分散在三个地方云函数没有部署就调用、订阅消息在演示时临场授权导致弹窗卡住、以及 iOS 安全区适配后页面样式异常。把这些提前处理好答辩演示基本就稳了。如果你用的是 uni-app 开发额外留意“运行到小程序模拟器后 AppID 未更新”和“微信小程序真机测试网络连接失败”这两个高频问题。HBuilderX 中修改 AppID 后要确认 manifest.json 保存并重新运行真机调试前关闭电脑代理、保证手机和电脑在同一局域网。下一步的扩展方向可以是接入微信订阅消息做每日学习提醒、增加学习排行榜激励用户、加入课程表模块让任务自动生成、迁移到 uni-app 实现多端发布。如果时间充裕建议把“学习数据导出”做成图片分享卡片用户在统计页一键生成打卡海报这个功能在答辩现场很容易加分。想试运行的话建议先创建一个小项目只保留登录 任务 番茄钟三个页面跑通后再逐步补齐统计和个人中心。这比一开始就铺开所有页面稳妥得多。

相关新闻

COM-HPC载板设计实战:PCIe Gen5信号完整性与电源时序避坑指南

COM-HPC载板设计实战:PCIe Gen5信号完整性与电源时序避坑指南

做嵌入式硬件这些年,我明显感觉到一个趋势:高端计算平台正在从板卡级设计转向模块化设计。特别是这两年,COM-HPC 这个标准在工业、医疗、边缘计算领域冒头的速度非常快。我手里这块基于 COM-HPC 规格的载板项目,前前后后改了三版&…

2026/8/31 1:46:41 阅读更多 →
SAR ADC高精度数据采集实战:原理、采样电路与校准

SAR ADC高精度数据采集实战:原理、采样电路与校准

做高精度数据采集的工程师,早晚都会碰到SAR ADC。无论是电桥称重、电机电流采样、振动监测还是便携式仪器,逐次逼近型ADC几乎是无处不在的主力方案。很多人觉得选一颗24位的ADC就能得到24位精度,实际做出来一测,有效位数可能只有1…

2026/8/31 1:46:41 阅读更多 →
MATLAB PortfolioCVaR实战:从VaR到CVaR的投资组合优化

MATLAB PortfolioCVaR实战:从VaR到CVaR的投资组合优化

简介:本资源是一套基于Matlab金融工具箱的CVaR投资组合优化实战代码,面向计算机、电子信息工程、数学等专业的本科生与研究生,用于课程设计、期末大作业及毕业设计中金融建模与风险量化实践。代码依托PortfolioCVaR对象实现条件风险价值&…

2026/8/31 1:46:41 阅读更多 →

最新新闻

FF-16-TUI:交互式二进制模式发现工具的实现

FF-16-TUI:交互式二进制模式发现工具的实现

拿到一个未知结构的二进制文件时,最先想回答的问题通常不是“它能不能运行”,而是“里面有什么”——文件头是什么,是否包含可读字符串,哪些字节块在重复,哪些区域看起来像压缩或加密数据。这类工作称为二进制模式发现…

2026/8/31 2:35:03 阅读更多 →
Spring Security实战:从认证授权到权限控制完整落地指南

Spring Security实战:从认证授权到权限控制完整落地指南

之前在业务系统里接入 Spring Security 做登录认证和权限控制时,说实话踩了不少坑。网上资料虽然多,但很多是零散片段,要么只讲入门 Demo,要么直接甩一堆配置让人照着抄,出了问题也不知道怎么排查。这篇文章打算围绕 S…

2026/8/31 2:35:03 阅读更多 →
体制内女遇上大厂技术男:职业生态差异如何拖垮婚姻

体制内女遇上大厂技术男:职业生态差异如何拖垮婚姻

我见过好几对从相亲走到领证的组合,都是同一种配置:体制内女,大厂技术男。两个人没有不良嗜好,也没有应酬,看起来是婚姻里最省心的版本。但恰恰是这种组合,更容易走到死局。双方没有家暴、没有出轨、没有赌…

2026/8/31 2:35:03 阅读更多 →
Java学生成绩管理系统:从数据库设计到部署全解析

Java学生成绩管理系统:从数据库设计到部署全解析

简介:本资源是一套完整的Java Web学生成绩管理系统实战项目,面向Java初学者与高校课程设计学生,解决教育信息化场景下成绩录入、查询、统计与多角色协同管理的实际需求。压缩包共1073个文件,涵盖22个核心Java类(如Stud…

2026/8/31 2:35:03 阅读更多 →
x64dbg反汇编实战:从汇编指令还原C语言代码

x64dbg反汇编实战:从汇编指令还原C语言代码

完整的反汇编结果中,check_password通常会被内联到main,反而看不到独立函数。所以本文的目标程序不能开优化,必须使用-O0,后面还会专门讲优化选项对还原的影响。如果你希望在 Linux 环境下编译并在 Windows 上运行,需要…

2026/8/31 2:35:03 阅读更多 →
《异环》新版本未开放区域探索指南:边界探查与素材记录

《异环》新版本未开放区域探索指南:边界探查与素材记录

如果你关注过《异环》近期的测试版本,应该会注意到一个现象:玩家讨论的重点不只在角色强度和主线剧情,还有地图边缘那些“看得见却进不去”的区域。新版本把城市框架继续往外扩了一圈,但并非所有新地块都在同一时间开放。于是&…

2026/8/31 2:34:03 阅读更多 →

日新闻

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

2026/8/31 0:00:05 阅读更多 →
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

2026/8/31 0:00:05 阅读更多 →
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

2026/8/31 0:00:05 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →