ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于微信小程序的美容服务预约系统设计与实现——毕业设计全流程指南

基于微信小程序的美容服务预约系统设计与实现——毕业设计全流程指南 又到了一年毕业季后台不少学弟学妹来问我毕业设计到底怎么选、怎么做。说实话每次看到有人一上来就丢一句“帮我做个系统”我都有点头大因为这种需求往往连他自己都没想清楚。但有一个方向几乎每年都有人做而且做出来的东西既好答辩、又有真实业务场景就是今天要聊的这个——基于微信的美容服务小程序。这个项目我前后带过几个学生完整跑通过从选题、需求分析、数据库设计、前后端联调到最后写LW文档也就是毕业论文和准备答辩整套流程我都踩过一遍。所以这篇博文就把整个项目的设计思路、核心模块、关键代码、文档结构、避坑经验一次讲透。不管你是准备直接用这个题目还是想参考它的思路换个业务场景这篇文章都能帮你省下大量翻文档、查资料的时间。1. 项目整体设计与技术选型思路1.1 为什么选“微信小程序 美容服务”这个组合先说选题逻辑。毕业设计最怕的就是两种一种是题目太虚比如“基于XX的智能推荐系统研究”做完发现全是理论没有能演示的东西另一种是题目太简单比如“学生信息管理系统”随便一个课设都做过答辩老师看你两眼就知道你没什么深度。美容服务小程序这个题目的好处在于它有一个非常具体的线下业务场景。美容院有项目、有技师、有预约、有会员、有消费记录这些天然就是CRUD的最佳练习素材。更关键的是它不是一个简单的“增删改查”而是包含了一套完整的预约状态流转逻辑——从用户提交预约到商家确认或拒绝再到用户到店核销、完成订单、评价晒图。这一套流程走通你做的是“业务系统”而不是“数据管理系统”含金量完全不一样。再从技术角度说微信小程序是目前国内最成熟的轻应用生态开发门槛低、调试方便、上线流程清晰。对毕设来说小程序端天然解决了“移动端”的演示需求你不需要去折腾Android或iOS打包扫码就能在手机上跑。而后端无论是用Spring Boot、Node.js还是用原生PHP写接口都能很自然地对接小程序前端。1.2 角色划分与功能边界做毕设第一个要清楚的是系统里有谁在用。很多同学一上来就画一堆功能最后发现做不完或者做好了也不知道给谁用。美容服务小程序我建议拆成三个端用户端小程序面向普通顾客。核心功能包括微信一键登录、浏览服务项目、查看技师信息、在线预约、查看预约状态、我的订单、我的会员卡、个人资料管理。商家端管理后台面向美容院老板或前台。核心功能包括服务项目管理增删改查、技师排班管理、预约审核/确认/完成、订单管理、会员卡管理、数据统计看板。系统管理员可选如果你还想多一个亮点可以加一个后台管理员角色负责商家账号的审核与管理。但注意这个模块工作量会增加不少建议在基础功能全部完成后还有余力再上。角色划分清楚之后你会发现整个系统的功能边界变得很明确。用户端给顾客用商家端给美容院用两边通过数据库中的订单表、会员表来关联数据流清晰答辩的时候也特别好讲。1.3 技术选型前端原生还是uni-app后端怎么定微信小程序前端的开发方式有两种主流选择一种是微信官方原生开发WXML WXSS JS另一种是使用uni-app这类跨端框架。我个人的建议是毕设优先选原生开发。原因很简单原生开发出问题的时候你搜索解决方案时能直接对应到微信官方的文档和社区讨论uni-app虽然也能跑但它多了一层框架编译逻辑很多人一报错就懵了不知道是自己写错还是框架的问题。而且微信开发者工具对原生项目的调试体验是最完善的。后端的话结合计算机专业毕设的常见要求可以按你的语言基础来选Java技术栈推荐Spring Boot MyBatis Plus MySQL。Spring Boot是目前企业级开发绝对的主流答辩时能说清楚IoC、AOP、自动配置这些概念非常加分。MyBatis Plus可以帮你省掉大量XML配置写起来效率很高。Node.js技术栈Express或Koa框架 MySQL。如果你前端功底好JavaScript一把梭也是一种选择。数据量不大时性能完全够用。PHP技术栈如果你用的是PHPStudy这类集成环境ThinkPHP框架也是很多学校的老传统网上参考源码一堆。我个人带学生最常用的是Spring Boot MyBatis Plus MySQL这套。不要觉得它“太常见”毕设关键是做出来、讲清楚稳定的技术栈反而能让你少踩很多未知的坑。数据库就用MySQL5.7或8.0都行部署简单、资料多。1.4 项目目录结构与代码组织规范很多学生到后期代码写得一团乱连自己都找不到文件在哪。这里直接给一个我常用的工程结构参考后端beauty-miniapp/ ├── src/main/java/com/example/beauty/ │ ├── controller/ // 接口层只做参数接收和结果返回 │ ├── service/ // 业务逻辑层写核心业务判断 │ ├── mapper/ // MyBatis Plus 的 Mapper 接口 │ ├── entity/ // 数据库表对应的实体类 │ ├── dto/ // 接收前端参数的封装对象 │ ├── vo/ // 返回给前端的数据封装对象 │ ├── config/ // 配置类拦截器、跨域、微信配置等 │ ├── common/ // 统一返回结果、异常处理、工具类 │ └── BeautyApplication.java ├── src/main/resources/ │ ├── application.yml // 数据源、Redis、微信配置 │ └── mapper/ // 自定义 SQL 的 XML如需要 ├── sql/ │ └── beauty.sql // 建表语句加测试数据 └── pom.xml前端小程序端原生目录就按微信官方的规范来pages下面每个页面一个文件夹api统一封装请求utils放工具函数components放公共组件。我见过最糟糕的情况是有人把所有页面都堆在根目录两百个文件平铺——这种代码就算功能全对答辩老师看到也会摇头。一个清晰的目录结构本身就能体现工程素养这在评分的时候是隐性加分项。2. 核心功能模块与数据库设计详解2.1 用户端核心功能梳理用户端是直接面向终端顾客的小程序页面不用太多但每个页面都要有实际作用。我建议按下面的清单来设计页面首页顶部轮播图展示美容院环境和活动、推荐服务项目列表、底部TabBar导航。服务列表页按项目分类展示如面部护理、身体SPA、美甲美睫、脱毛等支持搜索框按名称模糊查询。服务详情页展示项目效果图、服务介绍、价格、预计时长、适用人群以及“立即预约”按钮。预约页选择预约日期、时间段、技师可选、填写备注信息。订单列表页展示用户所有预约订单按状态分组如待确认、待服务、已完成、已取消。订单详情页展示订单的完整信息包括预约时间、技师、项目、状态、操作按钮取消/评价。我的页面个人头像昵称、会员卡信息、我的收藏、联系客服、关于我们。会员卡页面展示余额、充值记录、消费记录以及充值套餐入口。这8个页面足够撑起一个完整且有业务闭环的小程序。注意页面贵精不贵多如果时间紧张甚至可以把“服务列表页”和“首页推荐”复用同一个页面用不同参数加载数据。2.2 数据库核心表设计数据库设计是毕设的灵魂。很多同学表结构建得很随意做到后面发现关联字段对不上、状态字段不够用回头改表的时候简直想哭。这里直接放出我整理好的核心表设计你照着建就行。用户表user字段名类型说明idbigint主键自增openidvarchar(64)微信用户唯一标识登录时获取nick_namevarchar(32)昵称avatar_urlvarchar(255)头像地址phonevarchar(11)手机号gendertinyint性别 0未知 1男 2女create_timedatetime注册时间update_timedatetime更新时间statustinyint状态 0禁用 1正常服务项目表service_item字段名类型说明idbigint主键category_idbigint分类ID关联分类表namevarchar(64)项目名称covervarchar(255)封面图introtext项目介绍pricedecimal(10,2)原价discount_pricedecimal(10,2)优惠价durationint预计时长分钟statustinyint上架状态 0下架 1上架salesint销量可优化用create_timedatetime创建时间预约订单表appointment这个表是整个系统的核心字段设计一定要想清楚。字段名类型说明idbigint主键order_novarchar(32)订单编号年月日随机数user_idbigint用户IDservice_idbigint服务项目IDtechnician_idbigint技师ID可空不指定则商家安排appointment_datedate预约日期appointment_timevarchar(16)预约时间段如“10:00-11:00”remarkvarchar(255)用户备注statustinyint0待确认 1已确认 2已完成 3已取消 4已过期pay_statustinyint0未支付 1已支付若走线上支付pricedecimal(10,2)下单时价格actual_amountdecimal(10,2)实际支付金额create_timedatetime下单时间update_timedatetime更新时间cancel_reasonvarchar(255)取消原因用户或商家技师表technician字段名类型说明idbigint主键namevarchar(32)姓名avatarvarchar(255)头像titlevarchar(32)职称如高级美容师introvarchar(500)个人简介yearsint从业年限statustinyint状态 0离职 1在职会员卡表member_card与充值记录表recharge_record字段名类型说明idbigint主键user_idbigint用户IDbalancedecimal(10,2)余额total_rechargedecimal(10,2)累计充值total_consumedecimal(10,2)累计消费create_timedatetime开卡时间充值记录表的字段就是常规的id、卡ID、充值金额、赠送金额如有、充值时间。如果想做成“余额从会员卡扣费”的模式那么预约订单里的pay_status和actual_amount就要配合会员卡余额一起判断这也是一个小的业务亮点答辩时能讲的东西又多了一个。2.3 状态机设计预约订单的完整生命周期预约订单的状态变化一定要设计好这是整个系统的业务骨架。我见过太多人在代码里if套if最后改了一个状态漏了另一个状态整理一下状态流转用户提交预约后生成订单状态为0待确认。商家端看到新订单可以点击“确认”状态变为1已确认如果时间无法安排可点击“拒绝”并填写原因状态变为3已取消取消原因必填。用户到达门店后商家点击“核销/完成”状态变为2已完成。如果预约日期已过且状态仍是“待确认”或“已确认”系统自动置为4已过期可以通过定时任务或者每次查询时动态判断。用户在“待确认”或“已确认”状态下可以主动“取消预约”状态变为3已取消。这个状态机并不复杂但它是你答辩时展示“业务逻辑设计能力”的关键素材。在代码里建议用一个常量类去定义这些状态而不是在业务逻辑里写魔法数字后续维护会舒服很多。3. 关键功能实现与核心代码实操3.1 微信登录与用户信息获取微信小程序的登录流程要说清楚。核心逻辑是小程序端通过wx.login拿到一个临时code传给后端后端拿着code调用微信接口换取openid和session_keyopenid可以用来在用户表里查该用户是否已注册未注册就自动创建一个新用户。前端代码大致这样在app.js的onLaunch里调用登录逻辑。// utils/api.js 中封装 wx.request const request (url, method, data) { return new Promise((resolve, reject) { wx.request({ url: https://你的后端域名/api url, method: method || GET, data: data || {}, header: { Content-Type: application/json }, success: (res) { if (res.data.code 200) { resolve(res.data.data); } else { wx.showToast({ title: res.data.msg, icon: none }); reject(res.data); } }, fail: (err) reject(err), }); }); }; module.exports { request };// pages/login/login.js 中获取登录code并传给后端 const { request } require(../../utils/api); Page({ onLoad() { wx.login({ success(res) { if (res.code) { request(/user/login, POST, { code: res.code }) .then((data) { // 后端返回 openid、用户信息等 wx.setStorageSync(token, data.token); wx.setStorageSync(userInfo, data.userInfo); wx.switchTab({ url: /pages/index/index }); }); } }, }); }, });后端用Spring Boot接收这个code并调用微信接口。这里有个细节一定要用JSR-303校验code非空否则微信接口返回错误时你会排查半天。PostMapping(/user/login) public Result login(RequestBody LoginDTO dto) { // 1. 校验参数 if (StringUtils.isBlank(dto.getCode())) { return Result.error(code不能为空); } // 2. 调用微信接口获取 openid String url https://api.weixin.qq.com/sns/jscode2session?appid appid secret secret js_code dto.getCode() grant_typeauthorization_code; String result restTemplate.getForObject(url, String.class); JSONObject json JSON.parseObject(result); String openid json.getString(openid); if (StringUtils.isBlank(openid)) { return Result.error(json.getString(errmsg)); } // 3. 查询用户不存在则注册 User user userService.getOne(new LambdaQueryWrapperUser().eq(User::getOpenid, openid)); if (user null) { user new User(); user.setOpenid(openid); user.setNickName(微信用户); user.setStatus(1); userService.save(user); } // 4. 返回用户信息前端自行缓存 return Result.success(user); }注意学号信息里提到的“appid secret”在真正上线时应该放在后端配置里千万不能写在前端代码里否则任何人都能拿到你的AppSecret去调用你的接口这是我在实际检查代码时反复强调的安全红线。3.2 预约下单的核心实现与库存校验预约不是简单的Insert。用户选择日期和时间段后后端要做两件事一是判断这个时间段是否已经被约满二是判断同一用户是否在不同商家项目间“撞单”。时间段的设计建议用固定的槽位比如全天分为10:00-11:00、11:00-12:00、13:00-14:00……每个时段商家可以预先设置允许的预约数量。这个可以抽象成一个appointment_config表字段包括日期、时间段、可预约数量、已预约数量。用户在预约时后端事务里做一次原子性的“扣减”Transactional(rollbackFor Exception.class) public Result createAppointment(AppointmentDTO dto) { // 1. 检查订单时段配置是否存在 AppointmentConfig config configService.getOne(new LambdaQueryWrapperAppointmentConfig() .eq(AppointmentConfig::getAppointmentDate, dto.getAppointmentDate()) .eq(AppointmentConfig::getAppointmentTime, dto.getAppointmentTime())); if (config null) { return Result.error(该时段暂不可预约); } // 2. 原子扣减库存相当于乐观锁判断 int update configService.updateCount(config.getId()); if (update 0) { return Result.error(该时段已约满请更换时间); } // 3. 生成订单 Appointment appointment new Appointment(); String orderNo YY System.currentTimeMillis() RandomUtil.randomNumbers(4); appointment.setOrderNo(orderNo); // ... 设置其他字段 appointment.setStatus(0); appointmentService.save(appointment); return Result.success(appointment); }updateCount的SQL可以这样写UPDATE appointment_config SET booked_count booked_count 1 WHERE id #{id} AND booked_count max_count当更新影响行数为0时说明并发下这个时段已经被约完。这样通过一条SQL就实现了并发安全不用去引入Redis分布式锁对毕设项目来说既简单又不容易出bug。3.3 商家端预约审核与状态操作商家端我建议做成一个普通Web项目可以继续用Spring Boot的thymeleaf模板也可以把前后端分离Vue Element UI。毕设为了省事直接用Spring Boot thymeleaf Bootstrap搭管理后台是效率最高的一种方式不用考虑跨域、不用起两个服务。管理后台的核心界面仪表盘显示今日预约数量、今日新增用户、本月营业额、待处理预约数量。预约管理表格列出所有预约按状态筛选每行有“确认”“完成”“取消”按钮。点击操作时弹窗让商家填写备注特别是取消订单要填原因。服务项目管理列表展示所有服务项支持新增、编辑、上架/下架、删除有订单关联时做逻辑删除。技师管理管理技师信息支持设置排班简单做法每个技师维护一个时间段数组在预约选择时过滤。会员管理查看用户列表和会员卡余额可手动为线下充值订单核销。这里要特别提醒一下商家端和用户端的接口要复用同一套后端逻辑但是要做权限区分。简单的做法是用Spring Boot拦截器拦截/admin/**路径要求请求头里带上管理员Token。这个Token在管理员登录时用UUID生成并存入Redis或数据库过期时间设为2小时。虽然简单但足以应付毕设的要求。3.4 微信支付与订阅消息可选加分项如果不想做复杂的线上支付链路但又想展示深度可以做“余额支付”模式用户充值到会员卡预约后直接从卡余额扣费。这样的好处是避免了申请微信支付商户号的繁琐流程。但如果你有商户号或者不需要真实收款微信支付也支持模拟测试官方有一个测试商户号可以用来调试具体可以参考微信支付开发者文档的“沙箱环境”说明。订阅消息是另一个很好的加分项。比如商家确认预约后给用户推送一条“预约成功通知”用户到店前一天推送一条“明日服务提醒”。实现方式在微信公众平台申请订阅消息模板拿到模板ID。用户在小程序端授权订阅wx.requestSubscribeMessage({ tmplIds: [模板ID] })。后端调用微信订阅消息接口推送。前端授权代码wx.requestSubscribeMessage({ tmplIds: [模板ID], success(res) { console.log(订阅结果, res); }, });后端推送核心代码public void sendSubscribeMessage(String openid, String templateId, String page, MapString, Object data) { String accessToken getAccessToken(); JSONObject body new JSONObject(); body.put(touser, openid); body.put(template_id, templateId); body.put(page, page); body.put(data, data); // 调用微信接口推送 String url https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token accessToken; restTemplate.postForObject(url, body, String.class); }注意订阅消息是一次性订阅用户同意一次只能推一条所以如果希望“预约确认”、“到店提醒”、“售后回访”都推用户就需要多次授权。这个业务限制要提前想清楚不然测试的时候会发现消息推不出去。3.5 轮播图、富文本与图片上传的常见处理美容服务小程序对图片的要求很高轮播图、服务项目封面、技师头像都要优雅。图片存储的方式有两种一是上传到云存储如阿里云OSS、腾讯云COS二是上传到本地服务器目录。毕设很多时候没有云存储的预算我建议直接把图片存到后端项目的某个静态目录同时给Spring Boot配置静态资源映射这样图片URL就是http://服务器IP:8080/images/xxx.jpg图片上传接口直接存文件。上传接口示例PostMapping(/upload) public Result upload(RequestParam(file) MultipartFile file) { if (file.isEmpty()) { return Result.error(文件为空); } String originalFilename file.getOriginalFilename(); String suffix originalFilename.substring(originalFilename.lastIndexOf(.)); // 生成唯一文件名防止冲突 String fileName UUID.randomUUID().toString().replace(-, ) suffix; File dest new File(uploadPath fileName); try { file.transferTo(dest); } catch (IOException e) { e.printStackTrace(); return Result.error(上传失败); } return Result.success(/images/ fileName); }这里有两个容易踩的坑一是Linux服务器上容易因为目录不存在报FileNotFoundException记得先dest.getParentFile().mkdirs()二是小程序里wx.uploadFile的name参数要和后端RequestParam(file)保持一致否则会报“Required part file is not present”之类的错。4. LW文档毕设论文的结构与撰写技巧4.1 LW文档到底是什么、要写多长很多学生搞不清LW文档具体指什么其实LW就是论文的拼音缩写。计算机毕设的LW文档通常要求在8000到15000字之间包含选题背景、需求分析、系统设计、数据库设计、功能实现、系统测试、总结与展望等章节。注意学校要求的是“论文 源码”论文要能体现你对系统的理解和设计思路而不是把代码贴在Word里就算数。4.2 论文目录结构参考这里给一个我验证过、结合多所高校毕业设计模板的目录结构摘要含关键词Abstract英文摘要如有要求第一章 绪论1.1 研究背景与意义1.2 国内外研究现状1.3 本文主要工作1.4 论文结构安排第二章 相关技术介绍2.1 微信小程序开发技术2.2 Spring Boot框架2.3 MySQL数据库2.4 MyBatis Plus框架第三章 系统需求分析3.1 系统可行性分析3.2 系统功能需求分析含用例图3.3 系统非功能需求分析第四章 系统设计4.1 系统总体架构设计4.2 系统功能模块设计4.3 数据库设计含ER图、核心表结构第五章 系统实现5.1 用户端功能实现5.2 商家端功能实现5.3 关键功能实现细节第六章 系统测试6.1 测试环境6.2 功能测试用例6.3 性能测试如接口响应时间6.4 测试结论第七章 总结与展望参考文献致谢写论文时最大的误区是“copy代码”。论文里放代码片段可以但更重要的是写清楚“为什么这么设计”。比如数据库表为什么要把用户和订单分开、为什么要用状态字段而不是直接删除、预约并发怎么解决——这些才是老师看重的思考过程。4.3 如何快速绘制系统架构图、用例图、ER图画图工具建议用ProcessOn或draw.io不要用Visio很多学校机房里没有导出图片也不方便。系统架构图至少要有三层表现层小程序端/管理后台、业务逻辑层Spring Boot服务、数据层MySQL。用例图要区分用户、商家两个角色。ER图把核心表的关联关系画清楚即可不需要画所有表。有个偷懒技巧是画一张“系统功能结构图”把用户端、商家端的所有功能模块用树状图列出来这张图可以复用在整个论文的第三章、第四章甚至答辩PPT里。一张图用三遍效率翻倍。4.4 答辩高频问题与回答思路做这个项目答辩老师大概率会从下面几个方向提问提前准备好现场就不会卡壳问为什么选择微信小程序而不是原生App答微信小程序开发成本低、无需安装、生态完善对于美容服务这类低频但刚需的场景小程序用户触达路径最短商家也更容易做推广。问预约时间段重复/冲突怎么处理答通过预约配置表的库存字段做原子扣减并发时只有一条SQL能成功更新避免了多个用户同时约同一个时段。问用户不来了怎么办答设计了一个“过期”状态定时任务或查询时动态判断已过期订单自动置为过期后续还可以扩展“爽约”信用扣分机制。问如何保证用户数据安全答数据库密码加密存储MD5加盐或BCrypt接口层做参数校验敏感接口如管理员接口通过Token验证身份。问这个系统如何实际落地运营答初次上线可以由美容院公众号菜单入口进入配合朋友圈广告投放会员卡充值可以做“充500送100”的营销活动。5. 常见问题与避坑指南5.1 微信开发者工具与基础库版本不匹配“开发版小程序已过期请在开发者工具重新扫码”这个问题很多人在开发中期突然遇到以为项目出bug了其实只是开发版的有效期问题。解决方法是在微信开发者工具右上角点“预览”按钮重新生成二维码或者用“真机调试”模式跑一下。如果多次遇到注意检查基础库版本一般建议在project.config.json里设置一个稳定的基础库版本不要选“最新版本”。5.2 后端接口报错域名不在合法域名列表中小程序真机调试时如果你不是通过“不校验合法域名”的方式运行任何不在微信后台配置的request域名都会被拦下来。开发阶段可以直接在开发者工具里勾选“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”但在提交上线前必须配置合法域名并且要求后端接口使用HTTPS协议、有备案域名。很多学生倒在上线这一步就是因为嫌麻烦没用HTTPS。5.3 数据库时间慢8小时问题MySQL默认时区是中国标准时间吗不一定。如果你后端配置里没设置serverTimezone连接MySQL时可能出现时间比正常慢8小时的情况。建议JDBC连接串上加serverTimezoneAsia/Shanghai同时数据库连接里也设置时区参数。如果用了Spring Boot 2.x以上还要注意LocalDateTime的JSON序列化格式统一返回yyyy-MM-dd HH:mm:ss不然小程序端解析出来是一长串数字。5.4 MyBatis Plus自动填充不生效做了create_time、update_time自动填充后记得在实体类字段上加TableField(fill FieldFill.INSERT)和TableField(fill FieldFill.INSERT_UPDATE)注解同时在配置类里实现MetaObjectHandler接口重写insertFill和updateFill方法。不动不行这个几乎是每个用MyBatis Plus的人都会踩一次的坑。Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }5.5 小程序图片跨域与上传踩坑小程序里wx.uploadFile上传图片时如果报“上传文件失败”优先检查后端接口是否开启了Multipart配置以及上传目录是否有写权限。另一个问题是小程序端显示图片时如果后端返回的是本地路径http://localhost:8080/xxx.jpg真机上肯定显示不出来——因为手机访问不了你的localhost。所以测试时要么用电脑的局域网IP要么直接把图片放到一个有公网地址的服务器上。5.6 如何优雅地准备演示数据答辩前一定要准备一批“看起来真实”的测试数据至少10个美容服务项目分3-4个分类、5个技师、20个用户、30条以上预约记录覆盖不同状态、几张会员卡充值记录。这样演示时点任何一个页面都有内容可展示而不是一片空白。测试数据的SQL可以放在sql/beauty.sql里运行一次就能把所有表填满答辩前再跑一遍即可。6. 项目部署上线与后期扩展方向6.1 从开发到演示的部署清单如果没有自己的服务器建议本地跑起来做演示就够了但如果你想让老师扫码就能在手机上体验那就要部署到云服务器。部署清单如下买一台云服务器2核4G起步操作系统选Ubuntu 20.04或CentOS 7。安装JDK 8或11、MySQL 5.7/8.0、Nginx。将后端项目打成jar包用nohup java -jar beauty.jar logs/beauty.log 21 后台运行。Nginx配置反向代理把/api转发到localhost:8080同时配置HTTPS证书。将小程序前端项目在微信开发者工具里上传提交审核个人主体的小程序无法开通微信支付这一点提前确认。域名备案国内服务器必须。整个部署过程我建议至少提前一周开始因为域名备案通常要3到7天小程序审核也经常被打回修改留足时间余量才是王道。6.2 这个项目还能怎么扩展出彩如果你的时间充裕或者想让毕设“更有说头”下面几个扩展方向按性价比排序会员营销模块增加分销裂变、优惠券、积分体系。这是美容行业最关心的运营需求做好了整个项目的商业价值直接拉满。消息推送与提醒用微信订阅消息做预约成功通知、服务前一天提醒、会员余额不足提醒。技术难度不大但用户体感非常强。数据可视化看板商家端首页用ECharts画几个图比如近7日营业额趋势、项目销量占比、用户增长曲线。答辩时全场效果最直观。多商家平台化把单店模式改为平台模式支持多商家入驻每个商家维护自己的项目和排班。这是“由一个系统变成一个平台”的跨越工作量大很多但收益也最大。最后再分享一个小技巧无论你最终选哪个毕设题目在做之前先花半小时把“给谁用、解决什么问题、核心业务流程是什么”三个问题写在纸上然后照着业务流程去倒推功能模块和数据库表。你会发现所谓毕业设计其实就是一个“把业务翻译成技术”的过程。美容服务小程序这篇文章里讲的所有内容你只要把“美容”替换成“运动私教”“宠物洗护”“家政保洁”整个系统照样成立——这就是掌握了设计方法之后的好处。如果你正在做这个题目或者打算做类似的小程序项目在实际开发中遇到任何卡壳的地方欢迎在评论区留言我会尽量回复。祝大家毕设顺利答辩一次就过。
返回列表