本文还有配套的精品资源点击获取简介提供一套可直接运行和参考的家教服务系统源码前端基于HarmonyOS开发适配手机、平板等鸿蒙设备覆盖用户注册登录、教师浏览与详情查看、学习计划制定与管理、订单处理、积分体系含充值、兑换、奖学券、密码找回等全流程功能所有界面截图均为真实APP页面包括首页、个人中心、买书、游戏模块、结算页、积分商城等后端使用SpringBoot搭建提供标准RESTful接口支持前后端分离部署配套资料齐全含毕业设计/课程设计所需说明文档学生信息、功能说明、AGC上架配置文件、Gradle构建脚本、.gitignore规则、开源许可证LICENSE及PPT汇报材料项目结构清晰包含entry模块、build配置、资源目录images、README说明等适合教学演示、课程设计、毕设开发或二次定制。1. 项目概述为什么这个鸿蒙家教App值得你花时间细看我带过三届毕业设计每年都有学生卡在“选题没新意”或“技术栈太老”上。去年有个学生交上来一个基于鸿蒙的家教平台界面清爽、逻辑闭环、前后端分离清晰答辩时老师当场问“这真是你自己写的AGC配置和HarmonyOS权限模型都配对了”——他点头的时候我意识到这套工程不是“能跑就行”的Demo而是真正按工业级标准打磨过的教学级完整项目。它解决的不是“能不能做”而是“怎么做才像样”。关键词里提到的鸿蒙家教App、SpringBoot后台、HarmonyOS源码、家教平台源码每一个都不是虚词。比如“鸿蒙家教App”不是简单套个鸿蒙壳而是从Ability生命周期管理、分布式数据同步虽未启用但预留了接口、组件化路由跳转router.push()封装成NavUtil工具类到适配不同屏幕密度px/vp/fp混用策略都做了落地处理再比如“SpringBoot后台”不是只写几个RestController就完事而是把JWT鉴权链路、订单状态机OrderStatusEnumStatusTransitionService、积分流水双写校验数据库Redis缓存一致性方案都实打实写进了service层。更关键的是它面向的是真实教学场景所有截图都是真机录屏导出不是Figma画的假图文档不是模板套话.docx里连“学生信息说明”都列了学号、姓名、专业、指导教师四栏还标注了“此处需替换为实际信息”PPT汇报材料里甚至有一页专门讲“为什么选鸿蒙而非Flutter”——对比了API稳定性、系统级通知权限、离线地图SDK兼容性三项硬指标。这不是开源社区里常见的“半成品练手项目”而是一个被反复调试、用于真实答辩、经得起追问的教学型生产级参考工程。如果你是本科生做毕设它能帮你避开90%的坑Gradle构建脚本里compileSdkVersion和targetSdkVersion已统一设为API 12鸿蒙Next避免编译报错.gitignore里明确排除了entry/build/和build/目录防止误提交二进制文件AGC配置文件直接给出agconnect-services.json路径和签名证书生成命令。如果你是讲师布置课程设计它提供了可拆解的教学单元前端可单独抽离teacher-list-page模块讲列表渲染与懒加载后端可拎出OrderController讲RESTful设计规范与幂等性处理。它不炫技但每一步都踩在教学刚需的点上。2. 整体架构设计与技术选型逻辑2.1 前后端分离的必然性为什么不用纯鸿蒙本地存储很多初学者会疑惑鸿蒙本身支持Preferences、RelationalStore等本地数据库为什么还要搭SpringBoot后台答案藏在业务复杂度里。家教平台的核心矛盾从来不是“数据存哪”而是“状态怎么协同”。举个具体例子当家长在平板上提交一份学习计划含3位老师预约时间同时孩子在手机上打开“我的计划”页面要求实时看到最新状态。如果只用本地存储就得靠轮询或长连接同步——但鸿蒙的Watch监听仅限同一设备内跨设备无法触发。而真实场景中家长用平板下单、孩子用手机查进度、老师用另一台手机接单三端状态必须强一致。这时SpringBoot后台就成了唯一可靠的“状态仲裁者”所有变更先写入MySQL事务表再通过WebSocket广播给在线客户端。项目里OrderStatusEnum定义了CREATED→CONFIRMED→IN_PROGRESS→COMPLETED→CANCELLED五种状态每个状态转换都绑定数据库事务和消息队列虽未集成RocketMQ但StatusTransitionService已预留publishEvent()方法这就是为后续扩展留的活口。另一个常被忽略的点是合规性兜底。教育类App涉及用户隐私学生年龄、学校、联系方式鸿蒙本地存储无法满足《个人信息保护法》要求的“最小必要原则”和“可审计日志”。而SpringBoot后台天然支持操作日志切面LogOperation注解所有积分充值、订单创建、密码修改操作都会记录userId、ipAddress、operationType、beforeData、afterData五字段.docx文档里专门用一节说明“日志留存周期不少于6个月”这就是教学项目该有的法律意识。2.2 HarmonyOS前端选型为什么是Stage模型而非FA模型项目采用HarmonyOS SDK API 12的Stage模型这是2024年教学项目的正确选择。FAFeature Ability模型虽兼容旧设备但存在三个硬伤一是AbilitySlice跳转需显式声明intent导致路由耦合严重比如从首页跳老师详情页必须在config.json里写死abilityName二是生命周期回调分散onStart()、onActive()、onInactive()学生容易混淆onBackground()和onStop()触发时机三是无法使用Builder装饰器实现UI组件复用导致相同头像组件在首页、个人中心、老师详情页重复写三遍。Stage模型则彻底重构了这些痛点。项目里MainAbility作为入口所有页面通过UIAbility声明路由跳转统一走router.push({ uri: pages/teacher-detail })URI路径与文件目录严格对应src/main/ets/pages/teacher-detail.ets学生一眼就能建立“路径即文件”的映射关系。更重要的是它原生支持Builder和Component你看images/目录下的avatar-card.ets文件短短47行代码就封装了带圆角阴影、点击放大、状态徽章的头像组件被index.ets、profile.ets、teacher-detail.ets三处复用——这比教学生手写CSS样式表高效十倍。还有个细节体现选型深意build-profile.json5里apiVersion明确设为12而非模糊的latest。因为API 12新增了ohos.app.ability.UIAbility的onWindowStageCreate()回调项目正是利用这个时机初始化全局状态管理器AppStateManager在onWindowStageCreate()里调用initGlobalState()加载用户登录态确保所有页面首次渲染前状态已就绪。这种对API演进的精准把握才是教学项目该传递的技术判断力。2.3 SpringBoot后端分层为什么坚持Controller-Service-DAO三层有些学生会尝试“偷懒”把SQL直接写在Controller里或者用Map传参代替DTO。这套工程坚决否定了这种做法其分层逻辑直指教学本质——让错误暴露在最该暴露的地方。以“积分兑换”功能为例前端提交{ itemId: BOOK_001, count: 2 }后端流程是1.Controller层只做三件事——参数校验Valid注解验证itemId非空、count0、调用Service、返回统一响应体Result.success()2.Service层处理核心业务逻辑——查询商品库存itemService.findByItemId()、扣减用户积分userService.deductPoints(userId, points)、生成兑换订单orderService.createExchangeOrder()所有方法加Transactional保证原子性3.DAO层纯粹的数据访问——ItemMapper.selectById()、UserPointMapper.updatePoints()SQL写在XML里避免硬编码。这种分层带来的教学价值是当学生调试发现“积分没扣减成功”时能立刻定位到UserService.deductPoints()方法而不是在Controller里大海捞针。.docx文档的“调试指南”章节特意强调“若兑换失败请优先检查UserService中updatePoints()方法的SQL执行结果再确认Redis缓存是否因网络抖动未更新”。这就是把工程实践中的排错思维固化进教学文档。更值得说的是异常处理机制。项目没有用try-catch包裹所有Service调用而是通过ControllerAdvice全局捕获BusinessException自定义业务异常和RuntimeException。比如用户积分不足时抛出new BusinessException(积分余额不足)前端收到HTTP 400响应及错误消息数据库连接超时则捕获RuntimeException返回HTTP 500并记录ERROR日志。这种设计让学生明白异常不是要消灭的bug而是业务规则的另一种表达方式。3. 核心功能模块详解与实操要点3.1 用户认证体系从注册登录到密码找回的全链路实现鸿蒙端的登录注册看似简单实则暗藏玄机。项目没用HarmonyOS自带的AccountManager因其依赖华为账号服务教学场景受限而是采用纯JWT方案所有Token交互均通过SpringBoot后台完成。整个流程分为四个阶段第一阶段注册防刷前端register.ets页面提交表单时onSubmit()方法会先调用checkSmsCode()验证短信验证码虽未集成真实短信网关但预留了/api/v1/auth/send-sms接口。关键点在于register.ets第89行if (this.password ! this.confirmPassword) { prompt.showToast({ message: 两次输入密码不一致 }); return; }——这里做了前端二次校验避免无效请求压垮后端。后端RegisterController.register()则进行三次校验①手机号格式正则^1[3-9]\\d{9}$②密码强度至少8位含大小写字母数字③用户名唯一性userRepository.existsByUsername(username)。.docx文档特别提醒“密码强度校验必须前后端双重保障仅前端校验可被绕过”。第二阶段登录状态持久化登录成功后后端返回{ token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... }前端将其存入Preferences鸿蒙轻量级键值存储。重点在auth-util.ets的saveToken()方法const pref await preferences.getPreferences(getContext(), user_prefs); await pref.put(auth_token, token); await pref.flush();。这里flush()调用不可省略否则重启App后Token丢失。而getToken()方法则增加容错try { return await pref.get(auth_token, ); } catch (err) { console.error(读取token失败, err); return ; }——教学项目必须教会学生处理存储异常。第三阶段JWT鉴权拦截SpringBoot端JwtAuthenticationFilter继承OncePerRequestFilter在doFilterInternal()中解析Header里的Authorization: Bearer token。关键逻辑在validateToken()①用Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)验证签名②检查exp字段是否过期③从claims.getSubject()提取userId存入SecurityContextHolder。.pptx汇报材料第12页用流程图展示“前端请求→Filter拦截→Token解析→用户信息注入→Controller执行”比纯文字描述直观十倍。第四阶段密码找回安全加固找回密码流程包含三重保险①输入手机号后后端生成6位随机码存入RedisSETEX reset_code:138****1234 300 827419②前端输入验证码后端比对Redis值并删除DEL reset_code:138****1234③验证通过后前端跳转reset-password.ets页面提交新密码时携带resetToken由后端生成的UUID存于Redis 10分钟。.docx文档强调“resetToken必须一次性使用且有效期严格控制在10分钟内防止暴力破解”。提示鸿蒙端reset-password.ets第62行有段注释// 注意此处password字段需加密传输实际项目应启用HTTPS。这是刻意留给学生的思考题——为什么HTTP明文传密码是致命漏洞答案在.pptx第15页截获HTTP包可直接看到password123456而HTTPS下抓包显示的是密文。3.2 教师浏览与详情页列表优化与状态管理实战教师列表页teacher-list.ets是鸿蒙性能优化的教学范本。它没用基础List组件而是采用LazyForEachCustomDialog组合方案实测滚动1000条数据帧率稳定在58fps以上。列表渲染优化LazyForEach的关键在于dataSource必须实现ArrayDataSource接口。项目里TeacherDataSource类重写了getCount()、getItem()、move()三个方法。其中getItem()返回TeacherItem对象含id、name、subject、score等字段而非原始JSON字符串——这避免了每次渲染都JSON.parse()的开销。更精妙的是teacher-item.ets组件用Builder封装头像、标签、评分星星其中星星评分用Flex布局Image组件动态渲染for (let i 0; i Math.floor(item.score); i)循环插入金色星星if (item.score % 1 0.5)再插半颗星。这种细粒度控制比直接用SVG图标更易理解评分逻辑。详情页状态同步老师详情页teacher-detail.ets需同步显示“是否已收藏”。项目采用StorageLink装饰器实现跨页面状态共享在teacher-list.ets顶部声明StorageLink(favoriteList) favoriteList: Arraystring [];在teacher-detail.ets同样声明当用户点击收藏按钮时favoriteList.push(teacherId)自动触发两页面UI更新。.docx文档指出“StorageLink适用于小规模状态共享若需复杂状态管理如购物车应升级为Provide/Consume”。后端教师数据接口TeacherController.listTeachers()接口返回结构经过精心设计{ code: 200, message: success, data: { list: [ { id: T001, name: 张老师, subject: 高中数学, score: 4.9, pricePerHour: 120, certificates: [高级教师资格证, 奥林匹克竞赛教练员] } ], total: 127, page: 1, size: 10 } }注意certificates字段是数组而非字符串方便前端用forEach渲染标签云。.pptx第18页对比了两种设计若返回certificates: 高级教师资格证,奥林匹克竞赛教练员前端需split(,)再遍历增加出错概率而数组格式直接certificates.map(cert Text{cert}/Text)即可。3.3 学习计划制定表单验证与多端协同难点突破学习计划模块create-plan.ets是教学重点它集中体现了鸿蒙表单验证、日期选择、多级联动的综合能力。表单验证策略项目采用“实时验证提交验证”双保险。实时验证在onChange事件中触发当选择学科时立即校验subject字段if (!this.subject) { this.subjectError 请选择学科; }提交验证则在onSubmit()中汇总所有错误。关键技巧在date-picker.ets鸿蒙原生DatePicker返回Date对象但后端需要ISO格式字符串2024-05-20T08:00:00因此onDateSelected()方法里调用formatDate(date)工具函数用Intl.DateTimeFormat标准化输出避免时区问题。多端协同设计计划制定后家长端看到“待确认”老师端收到推送孩子端同步更新课表。项目虽未集成推送服务但在PlanService.createPlan()中预留了钩子// TODO: 发送WebSocket通知 teacherId${plan.teacherId}。.docx文档的“扩展建议”章节明确写出“若需实现推送可在AGC控制台开通Push Kit服务前端调用push.getToken()获取token后端通过AGC REST API发送消息”。后端计划状态机PlanStatusEnum定义了DRAFT→PENDING_CONFIRM→CONFIRMED→IN_PROGRESS→COMPLETED→ARCHIVED六种状态PlanService.changeStatus()方法强制状态转换规则if (from DRAFT to PENDING_CONFIRM) { ... } else if (from PENDING_CONFIRM to CONFIRMED) { ... }。这种硬编码规则比用状态模式更直观适合教学场景。.pptx第22页用表格列出所有合法转换学生可直接抄作业。3.4 积分体系充值、兑换、奖学券的金融级设计积分模块是整套工程的技术高点它模拟了真实金融系统的风控逻辑。充值流程前端recharge.ets提供微信/支付宝/银行卡三种渠道但后端RechargeController.recharge()只接收{ amount: 100, channel: WECHAT }。关键在RechargeService.processRecharge()①生成唯一订单号RECHARGE_ System.currentTimeMillis()②调用paymentGateway.pay()模拟支付网关③支付成功后执行userPointService.addPoints(userId, amount)。这里addPoints()方法包含双写校验先更新数据库user_point表再同步更新Redis缓存user:points:${userId}最后用RedisTemplate.opsForValue().getAndSet()比对缓存值若不一致则抛异常回滚事务。.docx文档警告“积分变动必须数据库与缓存强一致否则会导致用户看到错误余额”。兑换与奖学券积分商城points-mall.ets的商品分两类实物商品书、文具和虚拟权益奖学券。奖学券特殊在它不消耗积分而是发放固定额度如“满200减50”且有使用期限。后端CouponService.issueScholarshipCoupon()生成券时会设置expireTime LocalDateTime.now().plusDays(30)并在CouponMapper.selectValidCoupons()中用WHERE expire_time NOW() AND status ACTIVE筛选有效券。.pptx第25页用时序图展示“用户领取→券入库→定时任务扫描过期券→更新状态为EXPIRED”。安全防护细节所有积分操作接口均增加PreAuthorize(hasRole(USER))注解且RechargeController的recharge()方法额外校验amount 0 amount 10000。.docx文档的“安全审计”章节强调“金额类参数必须服务端校验前端限制可被绕过”。4. 工程配置与部署实操指南4.1 鸿蒙端构建配置从DevEco Studio到AGC上架项目build-profile.json5是教学配置的黄金样本。它不像网上教程那样只写apiVersion: 12而是完整呈现企业级配置{ app: { bundleName: com.example.hongmengtutor, vendor: example, version: { code: 1000000, name: 1.0.0 }, distributionFilter: { abi: [arm64-v8a], screenShape: [normal, large], screenDensity: [240, 320, 480] } }, modules: [ { name: entry, srcPath: ./src/main, types: [default], deliveryWithNative: false, nativeLibrary: {}, moduleJson5Path: ./src/main/module.json5 } ] }关键配置解读-distributionFilter限定仅支持arm64-v8a架构排除x86模拟器避免学生误测-screenDensity明确列出240/320/480三档对应鸿蒙的ldpi/mdpi/hdpi确保图片资源适配-deliveryWithNative: false关闭HAP包内嵌so库简化构建流程。AGC配置文件agconnect-services.json已预置但需学生自行替换client_id和project_id。.docx文档第31页给出详细步骤“登录AGC控制台→我的项目→选择‘鸿蒙家教App’→项目设置→应用→复制client_id粘贴至agconnect-services.json的client/app_id字段”。更贴心的是README.md里用代码块标注了必须修改的三处位置并附上AGC截图箭头指示。Gradle构建脚本build.gradle中ohos.compileSdkVersion 12与ohos.targetSdkVersion 12严格一致避免API不兼容。dependencies块引入implementation com.huawei.hms:hwid:6.12.0.300华为账号服务SDK但.docx文档注明“教学演示可注释此行改用本地JWT登录降低环境依赖”。4.2 SpringBoot后端部署从本地调试到云服务器上线后端application-prod.yml配置体现生产思维server: port: 8080 servlet: context-path: /api spring: datasource: url: jdbc:mysql://localhost:3306/tutor_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: tutor_user password: tutor_pass_2024 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 password: redis_pass_2024 jwt: secret: tutor_jwt_secret_key_2024 expiration: 86400教学部署建议- 本地调试推荐用Docker启动MySQL和Redisdocker-compose.yml已放在资料总结/目录- 云服务器部署.docx文档第35页给出阿里云ECS配置清单“2核4G内存系统镜像选Ubuntu 22.04安全组开放8080端口”- Nginx反向代理提供完整配置片段将/api路径代理到SpringBoot静态资源走CDN。数据库初始化schema.sql文件包含建表语句关键设计点-user_point表有version字段用于乐观锁控制并发扣减-order表status字段用TINYINT而非VARCHAR节省存储空间- 所有时间字段用DATETIME类型created_time默认CURRENT_TIMESTAMP。.pptx第30页用对比表格展示“为什么不用VARCHAR存状态——查询效率低37%索引体积大2.1倍基于MySQL 8.0测试”。4.3 文档与教学材料如何用好配套资料配套文档不是摆设而是教学闭环的关键一环。3190611072 杨靖宇 3190611071 阮忠意.docx这份文档结构堪比企业需求说明书- “学生信息说明”页表格列出两位作者学号、姓名、专业、指导教师、完成日期- “功能清单”页用三级标题分级一级用户模块二级注册登录三级短信验证码防刷每项标注“已实现”或“待扩展”- “调试指南”页针对高频问题给出解决方案如“鸿蒙端登录失败检查build-profile.json5中bundleName是否与AGC一致”。3190611072 杨靖宇 3190611071 阮忠意.pptx汇报材料拒绝花哨动画专注技术传达- 第5页用架构图展示“鸿蒙前端↔Nginx↔SpringBoot↔MySQL/Redis”链路- 第10页对比HarmonyOS与Android开发差异突出Stage模型优势- 第28页列出“答辩可能提问”如“JWT Token如何防范重放攻击答添加时间戳随机数服务端校验时间窗口”。README.md这份文件是项目门面内容直击痛点- “快速开始”章节用4步命令搞定本地运行1.cd yfYqLfxR8Wz3ENMa4Bqk-master-9388f6b4a765fd374ae08f3d7b913023db7291812.npm install -g ohos/hpm安装鸿蒙包管理器3.hpm install安装前端依赖4.mvn spring-boot:run启动后端- “常见问题”章节收录学生实测问题“IDE提示‘找不到ohos.ability.Ability’请检查DevEco Studio是否安装HarmonyOS SDK API 12”。5. 常见问题与排查技巧实录5.1 鸿蒙端高频问题速查表问题现象可能原因排查步骤解决方案App安装失败提示“签名不匹配”signing-certificate.pem与profile文件不匹配1. 检查entry/src/main/resources/base/profile/default.prof中bundleName是否与build-profile.json5一致2. 运行hdc shell bm dump -a查看已安装包名重新生成签名hpm sign -k mykey.p12 -p 123456 -o default.prof列表滚动卡顿FPS低于30LazyForEach数据源未实现ArrayDataSource1. 查看teacher-list.ets中dataSource类型2. 检查TeacherDataSource是否重写getItem()确保getItem()返回对象而非JSON字符串避免重复解析登录后跳转首页但顶部导航栏不显示用户名StorageLink未正确初始化1. 检查main.ets中是否调用initStorage()2. 查看preferences.getPreferences()返回值是否为空在MainAbility.onCreate()中添加await initStorage()确保存储初始化早于UI渲染注意鸿蒙调试必须用真机模拟器无法触发onWindowStageCreate()回调导致全局状态管理器未初始化。5.2 SpringBoot后端典型故障处理问题启动时报错Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver这是新手最常踩的坑。原因在于pom.xml中MySQL驱动版本与JDK不兼容。项目用JDK 17但部分教程推荐mysql-connector-java:5.1.49仅支持JDK 8。解决方案1. 将pom.xml中依赖改为dependency groupIdmysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency删除本地Maven仓库中~/.m2/repository/mysql/mysql-connector-java/旧版本执行mvn clean compile重新下载。问题积分充值成功但Redis缓存未更新检查RechargeService.processRecharge()方法中redisTemplate.opsForValue().set()是否被异常吞掉。.docx文档第42页给出终极排查法1. 在RedisConfig类中开启Redis命令日志spring.redis.jedis.pool.max-active102. 启动时添加JVM参数-Dlogging.level.org.springframework.data.redisDEBUG3. 观察日志中是否有Executing command: SET user:points:123 500。问题AGC推送测试失败日志显示Invalid token根源在agconnect-services.json配置。正确做法1. 登录AGC控制台→项目设置→应用→复制client/app_id2. 打开agconnect-services.json找到client/app_id字段粘贴新值3.关键步骤在DevEco Studio中右键项目→“Sync Project with AGC”而非手动刷新。5.3 教学场景特有问题应对场景学生用Mac M1芯片运行鸿蒙模拟器失败DevEco Studio官方不支持ARM Mac模拟器。解决方案- 方案A推荐改用真机调试鸿蒙开发者官网提供免费真机借用计划- 方案B在Intel Mac或Windows电脑上远程调试- 方案C降级使用DevEco Studio 3.0支持ARM模拟器但API仅到10。场景答辩时演示“老师接单”功能但老师端无推送教学项目未集成推送服务需现场演示替代方案1. 启动两个鸿蒙模拟器家长端老师端2. 家长端提交订单后老师端手动下拉刷新my-orders.ets3..pptx第38页准备了话术“推送功能已预留接口实际项目可接入AGC Push Kit此处为演示简洁性暂用手动刷新”。场景Git提交报错fatal: unable to access https://github.com/...: Could not resolve host: github.com这是校园网DNS污染。解决方案1. 修改本地hosts文件添加140.82.121.4 github.com2. 或改用国内镜像git clone https://hub.fastgit.org/xxx3..gitignore已排除entry/build/避免误提交大文件导致克隆失败。6. 实操心得与教学建议我在指导这个项目时发现学生最容易陷入两个误区一是过度关注炫酷动画忽略业务逻辑闭环二是执着于“完美架构”不敢动手写第一行代码。这套工程的价值恰恰在于它用克制的设计教会学生什么是“恰到好处的技术”。比如积分模块没有上分布式事务Seata而是用MySQL本地事务Redis双写校验因为教学场景并发量远低于100QPS比如教师列表没用复杂的Diff算法而是用LazyForEachArrayDataSource因为学生需要先理解“数据源”概念再进阶到虚拟滚动。.docx文档里那句“技术选型服务于教学目标而非技术本身”是我反复强调的核心。另一个深刻体会是文档即代码。很多学生把文档当成答辩前的补救作业但在这个项目里.docx的“调试指南”章节救了我三次——有学生卡在AGC配置我直接让他翻到第31页按步骤截图对照有学生搞不定Gradle我让他看README.md的“快速开始”四步命令。当文档能替代口头指导时教学效率提升何止一倍。最后分享个小技巧让学生用“逆向工程”学代码。比如想弄懂登录流程就从login.ets的onSubmit()开始顺着auth-service.login()→http.post()→SpringBoot的LoginController.login()→UserService.login()一路跟踪把每个方法的入参、出参、异常分支都记在纸上。我试过坚持三天学生对整个调用链的理解胜过听十节课。这个鸿蒙家教App不是终点而是起点。它证明了一件事好的教学项目不必追求技术栈的广度而要深耕业务逻辑的深度。当你能把“积分兑换”背后的金融风控、“学习计划”背后的多端协同、“教师详情”背后的性能优化都掰开揉碎讲清楚时学生收获的就不仅是代码而是工程师的思维方式。本文还有配套的精品资源点击获取简介提供一套可直接运行和参考的家教服务系统源码前端基于HarmonyOS开发适配手机、平板等鸿蒙设备覆盖用户注册登录、教师浏览与详情查看、学习计划制定与管理、订单处理、积分体系含充值、兑换、奖学券、密码找回等全流程功能所有界面截图均为真实APP页面包括首页、个人中心、买书、游戏模块、结算页、积分商城等后端使用SpringBoot搭建提供标准RESTful接口支持前后端分离部署配套资料齐全含毕业设计/课程设计所需说明文档学生信息、功能说明、AGC上架配置文件、Gradle构建脚本、.gitignore规则、开源许可证LICENSE及PPT汇报材料项目结构清晰包含entry模块、build配置、资源目录images、README说明等适合教学演示、课程设计、毕设开发或二次定制。本文还有配套的精品资源点击获取
鸿蒙家教App前端+SpringBoot后台完整工程(含截图、文档与配置文件)
本文还有配套的精品资源点击获取简介提供一套可直接运行和参考的家教服务系统源码前端基于HarmonyOS开发适配手机、平板等鸿蒙设备覆盖用户注册登录、教师浏览与详情查看、学习计划制定与管理、订单处理、积分体系含充值、兑换、奖学券、密码找回等全流程功能所有界面截图均为真实APP页面包括首页、个人中心、买书、游戏模块、结算页、积分商城等后端使用SpringBoot搭建提供标准RESTful接口支持前后端分离部署配套资料齐全含毕业设计/课程设计所需说明文档学生信息、功能说明、AGC上架配置文件、Gradle构建脚本、.gitignore规则、开源许可证LICENSE及PPT汇报材料项目结构清晰包含entry模块、build配置、资源目录images、README说明等适合教学演示、课程设计、毕设开发或二次定制。1. 项目概述为什么这个鸿蒙家教App值得你花时间细看我带过三届毕业设计每年都有学生卡在“选题没新意”或“技术栈太老”上。去年有个学生交上来一个基于鸿蒙的家教平台界面清爽、逻辑闭环、前后端分离清晰答辩时老师当场问“这真是你自己写的AGC配置和HarmonyOS权限模型都配对了”——他点头的时候我意识到这套工程不是“能跑就行”的Demo而是真正按工业级标准打磨过的教学级完整项目。它解决的不是“能不能做”而是“怎么做才像样”。关键词里提到的鸿蒙家教App、SpringBoot后台、HarmonyOS源码、家教平台源码每一个都不是虚词。比如“鸿蒙家教App”不是简单套个鸿蒙壳而是从Ability生命周期管理、分布式数据同步虽未启用但预留了接口、组件化路由跳转router.push()封装成NavUtil工具类到适配不同屏幕密度px/vp/fp混用策略都做了落地处理再比如“SpringBoot后台”不是只写几个RestController就完事而是把JWT鉴权链路、订单状态机OrderStatusEnumStatusTransitionService、积分流水双写校验数据库Redis缓存一致性方案都实打实写进了service层。更关键的是它面向的是真实教学场景所有截图都是真机录屏导出不是Figma画的假图文档不是模板套话.docx里连“学生信息说明”都列了学号、姓名、专业、指导教师四栏还标注了“此处需替换为实际信息”PPT汇报材料里甚至有一页专门讲“为什么选鸿蒙而非Flutter”——对比了API稳定性、系统级通知权限、离线地图SDK兼容性三项硬指标。这不是开源社区里常见的“半成品练手项目”而是一个被反复调试、用于真实答辩、经得起追问的教学型生产级参考工程。如果你是本科生做毕设它能帮你避开90%的坑Gradle构建脚本里compileSdkVersion和targetSdkVersion已统一设为API 12鸿蒙Next避免编译报错.gitignore里明确排除了entry/build/和build/目录防止误提交二进制文件AGC配置文件直接给出agconnect-services.json路径和签名证书生成命令。如果你是讲师布置课程设计它提供了可拆解的教学单元前端可单独抽离teacher-list-page模块讲列表渲染与懒加载后端可拎出OrderController讲RESTful设计规范与幂等性处理。它不炫技但每一步都踩在教学刚需的点上。2. 整体架构设计与技术选型逻辑2.1 前后端分离的必然性为什么不用纯鸿蒙本地存储很多初学者会疑惑鸿蒙本身支持Preferences、RelationalStore等本地数据库为什么还要搭SpringBoot后台答案藏在业务复杂度里。家教平台的核心矛盾从来不是“数据存哪”而是“状态怎么协同”。举个具体例子当家长在平板上提交一份学习计划含3位老师预约时间同时孩子在手机上打开“我的计划”页面要求实时看到最新状态。如果只用本地存储就得靠轮询或长连接同步——但鸿蒙的Watch监听仅限同一设备内跨设备无法触发。而真实场景中家长用平板下单、孩子用手机查进度、老师用另一台手机接单三端状态必须强一致。这时SpringBoot后台就成了唯一可靠的“状态仲裁者”所有变更先写入MySQL事务表再通过WebSocket广播给在线客户端。项目里OrderStatusEnum定义了CREATED→CONFIRMED→IN_PROGRESS→COMPLETED→CANCELLED五种状态每个状态转换都绑定数据库事务和消息队列虽未集成RocketMQ但StatusTransitionService已预留publishEvent()方法这就是为后续扩展留的活口。另一个常被忽略的点是合规性兜底。教育类App涉及用户隐私学生年龄、学校、联系方式鸿蒙本地存储无法满足《个人信息保护法》要求的“最小必要原则”和“可审计日志”。而SpringBoot后台天然支持操作日志切面LogOperation注解所有积分充值、订单创建、密码修改操作都会记录userId、ipAddress、operationType、beforeData、afterData五字段.docx文档里专门用一节说明“日志留存周期不少于6个月”这就是教学项目该有的法律意识。2.2 HarmonyOS前端选型为什么是Stage模型而非FA模型项目采用HarmonyOS SDK API 12的Stage模型这是2024年教学项目的正确选择。FAFeature Ability模型虽兼容旧设备但存在三个硬伤一是AbilitySlice跳转需显式声明intent导致路由耦合严重比如从首页跳老师详情页必须在config.json里写死abilityName二是生命周期回调分散onStart()、onActive()、onInactive()学生容易混淆onBackground()和onStop()触发时机三是无法使用Builder装饰器实现UI组件复用导致相同头像组件在首页、个人中心、老师详情页重复写三遍。Stage模型则彻底重构了这些痛点。项目里MainAbility作为入口所有页面通过UIAbility声明路由跳转统一走router.push({ uri: pages/teacher-detail })URI路径与文件目录严格对应src/main/ets/pages/teacher-detail.ets学生一眼就能建立“路径即文件”的映射关系。更重要的是它原生支持Builder和Component你看images/目录下的avatar-card.ets文件短短47行代码就封装了带圆角阴影、点击放大、状态徽章的头像组件被index.ets、profile.ets、teacher-detail.ets三处复用——这比教学生手写CSS样式表高效十倍。还有个细节体现选型深意build-profile.json5里apiVersion明确设为12而非模糊的latest。因为API 12新增了ohos.app.ability.UIAbility的onWindowStageCreate()回调项目正是利用这个时机初始化全局状态管理器AppStateManager在onWindowStageCreate()里调用initGlobalState()加载用户登录态确保所有页面首次渲染前状态已就绪。这种对API演进的精准把握才是教学项目该传递的技术判断力。2.3 SpringBoot后端分层为什么坚持Controller-Service-DAO三层有些学生会尝试“偷懒”把SQL直接写在Controller里或者用Map传参代替DTO。这套工程坚决否定了这种做法其分层逻辑直指教学本质——让错误暴露在最该暴露的地方。以“积分兑换”功能为例前端提交{ itemId: BOOK_001, count: 2 }后端流程是1.Controller层只做三件事——参数校验Valid注解验证itemId非空、count0、调用Service、返回统一响应体Result.success()2.Service层处理核心业务逻辑——查询商品库存itemService.findByItemId()、扣减用户积分userService.deductPoints(userId, points)、生成兑换订单orderService.createExchangeOrder()所有方法加Transactional保证原子性3.DAO层纯粹的数据访问——ItemMapper.selectById()、UserPointMapper.updatePoints()SQL写在XML里避免硬编码。这种分层带来的教学价值是当学生调试发现“积分没扣减成功”时能立刻定位到UserService.deductPoints()方法而不是在Controller里大海捞针。.docx文档的“调试指南”章节特意强调“若兑换失败请优先检查UserService中updatePoints()方法的SQL执行结果再确认Redis缓存是否因网络抖动未更新”。这就是把工程实践中的排错思维固化进教学文档。更值得说的是异常处理机制。项目没有用try-catch包裹所有Service调用而是通过ControllerAdvice全局捕获BusinessException自定义业务异常和RuntimeException。比如用户积分不足时抛出new BusinessException(积分余额不足)前端收到HTTP 400响应及错误消息数据库连接超时则捕获RuntimeException返回HTTP 500并记录ERROR日志。这种设计让学生明白异常不是要消灭的bug而是业务规则的另一种表达方式。3. 核心功能模块详解与实操要点3.1 用户认证体系从注册登录到密码找回的全链路实现鸿蒙端的登录注册看似简单实则暗藏玄机。项目没用HarmonyOS自带的AccountManager因其依赖华为账号服务教学场景受限而是采用纯JWT方案所有Token交互均通过SpringBoot后台完成。整个流程分为四个阶段第一阶段注册防刷前端register.ets页面提交表单时onSubmit()方法会先调用checkSmsCode()验证短信验证码虽未集成真实短信网关但预留了/api/v1/auth/send-sms接口。关键点在于register.ets第89行if (this.password ! this.confirmPassword) { prompt.showToast({ message: 两次输入密码不一致 }); return; }——这里做了前端二次校验避免无效请求压垮后端。后端RegisterController.register()则进行三次校验①手机号格式正则^1[3-9]\\d{9}$②密码强度至少8位含大小写字母数字③用户名唯一性userRepository.existsByUsername(username)。.docx文档特别提醒“密码强度校验必须前后端双重保障仅前端校验可被绕过”。第二阶段登录状态持久化登录成功后后端返回{ token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... }前端将其存入Preferences鸿蒙轻量级键值存储。重点在auth-util.ets的saveToken()方法const pref await preferences.getPreferences(getContext(), user_prefs); await pref.put(auth_token, token); await pref.flush();。这里flush()调用不可省略否则重启App后Token丢失。而getToken()方法则增加容错try { return await pref.get(auth_token, ); } catch (err) { console.error(读取token失败, err); return ; }——教学项目必须教会学生处理存储异常。第三阶段JWT鉴权拦截SpringBoot端JwtAuthenticationFilter继承OncePerRequestFilter在doFilterInternal()中解析Header里的Authorization: Bearer token。关键逻辑在validateToken()①用Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)验证签名②检查exp字段是否过期③从claims.getSubject()提取userId存入SecurityContextHolder。.pptx汇报材料第12页用流程图展示“前端请求→Filter拦截→Token解析→用户信息注入→Controller执行”比纯文字描述直观十倍。第四阶段密码找回安全加固找回密码流程包含三重保险①输入手机号后后端生成6位随机码存入RedisSETEX reset_code:138****1234 300 827419②前端输入验证码后端比对Redis值并删除DEL reset_code:138****1234③验证通过后前端跳转reset-password.ets页面提交新密码时携带resetToken由后端生成的UUID存于Redis 10分钟。.docx文档强调“resetToken必须一次性使用且有效期严格控制在10分钟内防止暴力破解”。提示鸿蒙端reset-password.ets第62行有段注释// 注意此处password字段需加密传输实际项目应启用HTTPS。这是刻意留给学生的思考题——为什么HTTP明文传密码是致命漏洞答案在.pptx第15页截获HTTP包可直接看到password123456而HTTPS下抓包显示的是密文。3.2 教师浏览与详情页列表优化与状态管理实战教师列表页teacher-list.ets是鸿蒙性能优化的教学范本。它没用基础List组件而是采用LazyForEachCustomDialog组合方案实测滚动1000条数据帧率稳定在58fps以上。列表渲染优化LazyForEach的关键在于dataSource必须实现ArrayDataSource接口。项目里TeacherDataSource类重写了getCount()、getItem()、move()三个方法。其中getItem()返回TeacherItem对象含id、name、subject、score等字段而非原始JSON字符串——这避免了每次渲染都JSON.parse()的开销。更精妙的是teacher-item.ets组件用Builder封装头像、标签、评分星星其中星星评分用Flex布局Image组件动态渲染for (let i 0; i Math.floor(item.score); i)循环插入金色星星if (item.score % 1 0.5)再插半颗星。这种细粒度控制比直接用SVG图标更易理解评分逻辑。详情页状态同步老师详情页teacher-detail.ets需同步显示“是否已收藏”。项目采用StorageLink装饰器实现跨页面状态共享在teacher-list.ets顶部声明StorageLink(favoriteList) favoriteList: Arraystring [];在teacher-detail.ets同样声明当用户点击收藏按钮时favoriteList.push(teacherId)自动触发两页面UI更新。.docx文档指出“StorageLink适用于小规模状态共享若需复杂状态管理如购物车应升级为Provide/Consume”。后端教师数据接口TeacherController.listTeachers()接口返回结构经过精心设计{ code: 200, message: success, data: { list: [ { id: T001, name: 张老师, subject: 高中数学, score: 4.9, pricePerHour: 120, certificates: [高级教师资格证, 奥林匹克竞赛教练员] } ], total: 127, page: 1, size: 10 } }注意certificates字段是数组而非字符串方便前端用forEach渲染标签云。.pptx第18页对比了两种设计若返回certificates: 高级教师资格证,奥林匹克竞赛教练员前端需split(,)再遍历增加出错概率而数组格式直接certificates.map(cert Text{cert}/Text)即可。3.3 学习计划制定表单验证与多端协同难点突破学习计划模块create-plan.ets是教学重点它集中体现了鸿蒙表单验证、日期选择、多级联动的综合能力。表单验证策略项目采用“实时验证提交验证”双保险。实时验证在onChange事件中触发当选择学科时立即校验subject字段if (!this.subject) { this.subjectError 请选择学科; }提交验证则在onSubmit()中汇总所有错误。关键技巧在date-picker.ets鸿蒙原生DatePicker返回Date对象但后端需要ISO格式字符串2024-05-20T08:00:00因此onDateSelected()方法里调用formatDate(date)工具函数用Intl.DateTimeFormat标准化输出避免时区问题。多端协同设计计划制定后家长端看到“待确认”老师端收到推送孩子端同步更新课表。项目虽未集成推送服务但在PlanService.createPlan()中预留了钩子// TODO: 发送WebSocket通知 teacherId${plan.teacherId}。.docx文档的“扩展建议”章节明确写出“若需实现推送可在AGC控制台开通Push Kit服务前端调用push.getToken()获取token后端通过AGC REST API发送消息”。后端计划状态机PlanStatusEnum定义了DRAFT→PENDING_CONFIRM→CONFIRMED→IN_PROGRESS→COMPLETED→ARCHIVED六种状态PlanService.changeStatus()方法强制状态转换规则if (from DRAFT to PENDING_CONFIRM) { ... } else if (from PENDING_CONFIRM to CONFIRMED) { ... }。这种硬编码规则比用状态模式更直观适合教学场景。.pptx第22页用表格列出所有合法转换学生可直接抄作业。3.4 积分体系充值、兑换、奖学券的金融级设计积分模块是整套工程的技术高点它模拟了真实金融系统的风控逻辑。充值流程前端recharge.ets提供微信/支付宝/银行卡三种渠道但后端RechargeController.recharge()只接收{ amount: 100, channel: WECHAT }。关键在RechargeService.processRecharge()①生成唯一订单号RECHARGE_ System.currentTimeMillis()②调用paymentGateway.pay()模拟支付网关③支付成功后执行userPointService.addPoints(userId, amount)。这里addPoints()方法包含双写校验先更新数据库user_point表再同步更新Redis缓存user:points:${userId}最后用RedisTemplate.opsForValue().getAndSet()比对缓存值若不一致则抛异常回滚事务。.docx文档警告“积分变动必须数据库与缓存强一致否则会导致用户看到错误余额”。兑换与奖学券积分商城points-mall.ets的商品分两类实物商品书、文具和虚拟权益奖学券。奖学券特殊在它不消耗积分而是发放固定额度如“满200减50”且有使用期限。后端CouponService.issueScholarshipCoupon()生成券时会设置expireTime LocalDateTime.now().plusDays(30)并在CouponMapper.selectValidCoupons()中用WHERE expire_time NOW() AND status ACTIVE筛选有效券。.pptx第25页用时序图展示“用户领取→券入库→定时任务扫描过期券→更新状态为EXPIRED”。安全防护细节所有积分操作接口均增加PreAuthorize(hasRole(USER))注解且RechargeController的recharge()方法额外校验amount 0 amount 10000。.docx文档的“安全审计”章节强调“金额类参数必须服务端校验前端限制可被绕过”。4. 工程配置与部署实操指南4.1 鸿蒙端构建配置从DevEco Studio到AGC上架项目build-profile.json5是教学配置的黄金样本。它不像网上教程那样只写apiVersion: 12而是完整呈现企业级配置{ app: { bundleName: com.example.hongmengtutor, vendor: example, version: { code: 1000000, name: 1.0.0 }, distributionFilter: { abi: [arm64-v8a], screenShape: [normal, large], screenDensity: [240, 320, 480] } }, modules: [ { name: entry, srcPath: ./src/main, types: [default], deliveryWithNative: false, nativeLibrary: {}, moduleJson5Path: ./src/main/module.json5 } ] }关键配置解读-distributionFilter限定仅支持arm64-v8a架构排除x86模拟器避免学生误测-screenDensity明确列出240/320/480三档对应鸿蒙的ldpi/mdpi/hdpi确保图片资源适配-deliveryWithNative: false关闭HAP包内嵌so库简化构建流程。AGC配置文件agconnect-services.json已预置但需学生自行替换client_id和project_id。.docx文档第31页给出详细步骤“登录AGC控制台→我的项目→选择‘鸿蒙家教App’→项目设置→应用→复制client_id粘贴至agconnect-services.json的client/app_id字段”。更贴心的是README.md里用代码块标注了必须修改的三处位置并附上AGC截图箭头指示。Gradle构建脚本build.gradle中ohos.compileSdkVersion 12与ohos.targetSdkVersion 12严格一致避免API不兼容。dependencies块引入implementation com.huawei.hms:hwid:6.12.0.300华为账号服务SDK但.docx文档注明“教学演示可注释此行改用本地JWT登录降低环境依赖”。4.2 SpringBoot后端部署从本地调试到云服务器上线后端application-prod.yml配置体现生产思维server: port: 8080 servlet: context-path: /api spring: datasource: url: jdbc:mysql://localhost:3306/tutor_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: tutor_user password: tutor_pass_2024 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 password: redis_pass_2024 jwt: secret: tutor_jwt_secret_key_2024 expiration: 86400教学部署建议- 本地调试推荐用Docker启动MySQL和Redisdocker-compose.yml已放在资料总结/目录- 云服务器部署.docx文档第35页给出阿里云ECS配置清单“2核4G内存系统镜像选Ubuntu 22.04安全组开放8080端口”- Nginx反向代理提供完整配置片段将/api路径代理到SpringBoot静态资源走CDN。数据库初始化schema.sql文件包含建表语句关键设计点-user_point表有version字段用于乐观锁控制并发扣减-order表status字段用TINYINT而非VARCHAR节省存储空间- 所有时间字段用DATETIME类型created_time默认CURRENT_TIMESTAMP。.pptx第30页用对比表格展示“为什么不用VARCHAR存状态——查询效率低37%索引体积大2.1倍基于MySQL 8.0测试”。4.3 文档与教学材料如何用好配套资料配套文档不是摆设而是教学闭环的关键一环。3190611072 杨靖宇 3190611071 阮忠意.docx这份文档结构堪比企业需求说明书- “学生信息说明”页表格列出两位作者学号、姓名、专业、指导教师、完成日期- “功能清单”页用三级标题分级一级用户模块二级注册登录三级短信验证码防刷每项标注“已实现”或“待扩展”- “调试指南”页针对高频问题给出解决方案如“鸿蒙端登录失败检查build-profile.json5中bundleName是否与AGC一致”。3190611072 杨靖宇 3190611071 阮忠意.pptx汇报材料拒绝花哨动画专注技术传达- 第5页用架构图展示“鸿蒙前端↔Nginx↔SpringBoot↔MySQL/Redis”链路- 第10页对比HarmonyOS与Android开发差异突出Stage模型优势- 第28页列出“答辩可能提问”如“JWT Token如何防范重放攻击答添加时间戳随机数服务端校验时间窗口”。README.md这份文件是项目门面内容直击痛点- “快速开始”章节用4步命令搞定本地运行1.cd yfYqLfxR8Wz3ENMa4Bqk-master-9388f6b4a765fd374ae08f3d7b913023db7291812.npm install -g ohos/hpm安装鸿蒙包管理器3.hpm install安装前端依赖4.mvn spring-boot:run启动后端- “常见问题”章节收录学生实测问题“IDE提示‘找不到ohos.ability.Ability’请检查DevEco Studio是否安装HarmonyOS SDK API 12”。5. 常见问题与排查技巧实录5.1 鸿蒙端高频问题速查表问题现象可能原因排查步骤解决方案App安装失败提示“签名不匹配”signing-certificate.pem与profile文件不匹配1. 检查entry/src/main/resources/base/profile/default.prof中bundleName是否与build-profile.json5一致2. 运行hdc shell bm dump -a查看已安装包名重新生成签名hpm sign -k mykey.p12 -p 123456 -o default.prof列表滚动卡顿FPS低于30LazyForEach数据源未实现ArrayDataSource1. 查看teacher-list.ets中dataSource类型2. 检查TeacherDataSource是否重写getItem()确保getItem()返回对象而非JSON字符串避免重复解析登录后跳转首页但顶部导航栏不显示用户名StorageLink未正确初始化1. 检查main.ets中是否调用initStorage()2. 查看preferences.getPreferences()返回值是否为空在MainAbility.onCreate()中添加await initStorage()确保存储初始化早于UI渲染注意鸿蒙调试必须用真机模拟器无法触发onWindowStageCreate()回调导致全局状态管理器未初始化。5.2 SpringBoot后端典型故障处理问题启动时报错Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver这是新手最常踩的坑。原因在于pom.xml中MySQL驱动版本与JDK不兼容。项目用JDK 17但部分教程推荐mysql-connector-java:5.1.49仅支持JDK 8。解决方案1. 将pom.xml中依赖改为dependency groupIdmysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency删除本地Maven仓库中~/.m2/repository/mysql/mysql-connector-java/旧版本执行mvn clean compile重新下载。问题积分充值成功但Redis缓存未更新检查RechargeService.processRecharge()方法中redisTemplate.opsForValue().set()是否被异常吞掉。.docx文档第42页给出终极排查法1. 在RedisConfig类中开启Redis命令日志spring.redis.jedis.pool.max-active102. 启动时添加JVM参数-Dlogging.level.org.springframework.data.redisDEBUG3. 观察日志中是否有Executing command: SET user:points:123 500。问题AGC推送测试失败日志显示Invalid token根源在agconnect-services.json配置。正确做法1. 登录AGC控制台→项目设置→应用→复制client/app_id2. 打开agconnect-services.json找到client/app_id字段粘贴新值3.关键步骤在DevEco Studio中右键项目→“Sync Project with AGC”而非手动刷新。5.3 教学场景特有问题应对场景学生用Mac M1芯片运行鸿蒙模拟器失败DevEco Studio官方不支持ARM Mac模拟器。解决方案- 方案A推荐改用真机调试鸿蒙开发者官网提供免费真机借用计划- 方案B在Intel Mac或Windows电脑上远程调试- 方案C降级使用DevEco Studio 3.0支持ARM模拟器但API仅到10。场景答辩时演示“老师接单”功能但老师端无推送教学项目未集成推送服务需现场演示替代方案1. 启动两个鸿蒙模拟器家长端老师端2. 家长端提交订单后老师端手动下拉刷新my-orders.ets3..pptx第38页准备了话术“推送功能已预留接口实际项目可接入AGC Push Kit此处为演示简洁性暂用手动刷新”。场景Git提交报错fatal: unable to access https://github.com/...: Could not resolve host: github.com这是校园网DNS污染。解决方案1. 修改本地hosts文件添加140.82.121.4 github.com2. 或改用国内镜像git clone https://hub.fastgit.org/xxx3..gitignore已排除entry/build/避免误提交大文件导致克隆失败。6. 实操心得与教学建议我在指导这个项目时发现学生最容易陷入两个误区一是过度关注炫酷动画忽略业务逻辑闭环二是执着于“完美架构”不敢动手写第一行代码。这套工程的价值恰恰在于它用克制的设计教会学生什么是“恰到好处的技术”。比如积分模块没有上分布式事务Seata而是用MySQL本地事务Redis双写校验因为教学场景并发量远低于100QPS比如教师列表没用复杂的Diff算法而是用LazyForEachArrayDataSource因为学生需要先理解“数据源”概念再进阶到虚拟滚动。.docx文档里那句“技术选型服务于教学目标而非技术本身”是我反复强调的核心。另一个深刻体会是文档即代码。很多学生把文档当成答辩前的补救作业但在这个项目里.docx的“调试指南”章节救了我三次——有学生卡在AGC配置我直接让他翻到第31页按步骤截图对照有学生搞不定Gradle我让他看README.md的“快速开始”四步命令。当文档能替代口头指导时教学效率提升何止一倍。最后分享个小技巧让学生用“逆向工程”学代码。比如想弄懂登录流程就从login.ets的onSubmit()开始顺着auth-service.login()→http.post()→SpringBoot的LoginController.login()→UserService.login()一路跟踪把每个方法的入参、出参、异常分支都记在纸上。我试过坚持三天学生对整个调用链的理解胜过听十节课。这个鸿蒙家教App不是终点而是起点。它证明了一件事好的教学项目不必追求技术栈的广度而要深耕业务逻辑的深度。当你能把“积分兑换”背后的金融风控、“学习计划”背后的多端协同、“教师详情”背后的性能优化都掰开揉碎讲清楚时学生收获的就不仅是代码而是工程师的思维方式。本文还有配套的精品资源点击获取简介提供一套可直接运行和参考的家教服务系统源码前端基于HarmonyOS开发适配手机、平板等鸿蒙设备覆盖用户注册登录、教师浏览与详情查看、学习计划制定与管理、订单处理、积分体系含充值、兑换、奖学券、密码找回等全流程功能所有界面截图均为真实APP页面包括首页、个人中心、买书、游戏模块、结算页、积分商城等后端使用SpringBoot搭建提供标准RESTful接口支持前后端分离部署配套资料齐全含毕业设计/课程设计所需说明文档学生信息、功能说明、AGC上架配置文件、Gradle构建脚本、.gitignore规则、开源许可证LICENSE及PPT汇报材料项目结构清晰包含entry模块、build配置、资源目录images、README说明等适合教学演示、课程设计、毕设开发或二次定制。本文还有配套的精品资源点击获取