ARTICLE DETAIL

资讯详情

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

微信小程序+SSM+MySQL设备故障报修系统毕业设计全流程解析

微信小程序+SSM+MySQL设备故障报修系统毕业设计全流程解析 简介设备故障报修小程序毕业设计资源包基于微信小程序SSMMySql开发面向计算机相关专业毕业生及需要快速搭建完整前后端项目的开发者解决高校实验室设备报修、维修管理、经验分享等日常运维痛点。系统涵盖管理员、用户、维修员三个角色支持后台数据管理与小程序端注册、报修、维修报告、留言等功能适合用于毕业设计、课程设计或项目实训。包内共1255个文件包含Java后端源码、Vue管理后台、微信小程序前端wxml/wxss/js、SQL数据库脚本以及大量PNG/JPG界面截图等压缩包约49.98MB目录结构清晰可按模块查阅。目前已有130人学习下载。资源配有完整毕业论文、视频演示及数据库文件从系统分析、可行性分析到功能设计和数据库设计均有覆盖帮助理解微信小程序与SSM框架整合流程可直接参考其角色权限划分、报修状态流转等设计思路是同类毕业设计的高质量范本。1. 为什么毕业设计选这套组合微信小程序、SSM 和 MySQL 到底能做出什么东西如果只给一个题目让毕业生自己选技术栈设备故障报修这种业务最怕的就是“老师觉得太简单自己又做不出来”。微信小程序 SSM MySQL 这个组合恰好卡在一个很舒服的位置前端不用自己搭 App微信开发者工具里一套 WXML 就能出界面后端 SSM 虽然不是最时髦的 Spring Boot但 Controller-Service-Mapper 的分层足够把“报修单流转”这件事讲清楚MySQL 又让成绩评定有了抓手建表、索引、连表查询全是答辩时可问的细节。这套项目做完你手里会有三样实打实的东西能扫码打开的报修小程序、一套可部署的 Java Web 后端、一份能对上代码的毕业论文。本文就围绕这个毕业设计标题把从建库、写接口到小程序端联调的全过程拆开讲代码直接可以抄坑提前给你标出来。2. 把 SSMMySQL 后端先跑起来从依赖到 applicationContext 的关键配置很多毕业设计挂在第一步不是逻辑写不出来而是 SSM 的配置文件把骨架撑不住。SSM 指的是 Spring SpringMVC MyBatisSpring 管对象SpringMVC 管接口路由MyBatis 管 SQL。和 Spring Boot 不同SSM 没有自动配置所有 Bean 都要手动声明这对毕业设计反而是好事因为答辩时老师问“你这个数据库连接在哪配的、事务在哪切的”你能直接指到代码行。2.1 Maven 依赖版本别用太新的 Spring也别用太老的 JDK我一般会在 pom.xml 里把版本统一放在properties里避免依赖之间互相打架。SSM 项目里最常翻车的三对依赖是spring-webmvc、mybatis-spring、mysql-connector-java。Spring 用 5.3.x 这一代就行对应 JDK 8MyBatis 用 3.5.xMySQL 驱动用 8.0.x。注意驱动类名已经变成了com.mysql.cj.jdbc.Driver网上很多老教程写的com.mysql.jdbc.Driver在新驱动下会提示过时但不影响运行。properties spring.version5.3.20/spring.version mybatis.version3.5.10/mybatis.version mysql.version8.0.33/mysql.version /properties dependencies dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${spring.version}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version${spring.version}/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version${mybatis.version}/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.1.0/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version${mysql.version}/version /dependency /dependencies这段配置里最容易被忽略的是mybatis-spring它负责把 MyBatis 的 SqlSessionFactory 交给 Spring 容器管理。如果你只引入了 mybatis 而没有 mybatis-spring运行时会出现org.apache.ibatis.binding.BindingException提示找不到 Mapper 接口的实现类。另一个容易忽略的是 spring-jdbcMyBatis 的事务管理依赖 Spring 的 DataSourceTransactionManager而这个类在 spring-jdbc 里面。只引 spring-webmvc 是不够的。2.2 用 SpringMVC 接管请求web.xml 和 spring-mvc.xml 的配合SSM 没有启动类入口在 web.xml。你要做两件事配置 ContextLoaderListener 加载 Spring 容器配置 DispatcherServlet 拦截所有请求。常见做法是 web.xml 里写一个contextConfigLocation指向classpath:applicationContext.xml再单独写 spring-mvc.xml 给 Controller 层用。web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee version3.1 context-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener servlet servlet-namedispatcher/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcher/servlet-name url-pattern//url-pattern /servlet-mapping /web-app注意url-pattern写的是/而不是*.do这意味着静态资源也会被 DispatcherServlet 接管所以 spring-mvc.xml 里必须配mvc:default-servlet-handler/或者mvc:resources否则小程序传上来的图片会 404。另外JSP 页面如果放在 WEB-INF 下要配 InternalResourceViewResolver如果后端只返回 JSON那这个视图解析器可以不要但 ResponseBody 的 MessageConverter 必须配。2.3 MyBatis 连接 MySQL驱动、连接池和驼峰映射三件事spring-mvc.xml 只管 Controller数据源和事务要放在 applicationContext.xml 里。这里我会用 Druid 连接池因为它自带监控页面答辩时打开 Druid 的统计页给老师看 SQL 执行次数效果很好。context:property-placeholder locationclasspath:db.properties/ bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose property namedriverClassName value${db.driver}/ property nameurl value${db.url}/ property nameusername value${db.username}/ property namepassword value${db.password}/ property nameinitialSize value5/ property namemaxActive value20/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ property nameconfiguration bean classorg.apache.ibatis.session.Configuration property namemapUnderscoreToCamelCase valuetrue/ /bean /property /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.repair.mapper/ /bean bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean tx:annotation-driven transaction-managertransactionManager/db.properties 里最容易出问题的不是用户名密码而是连接串。MySQL 8 的 url 建议写成jdbc:mysql://localhost:3306/repair?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue。如果你漏了serverTimezone启动时会直接报The server time zone value的异常如果漏了allowPublicKeyRetrievaltrue在某些 MySQL 8 版本上会报Public Key Retrieval is not allowed。这两个参数几乎每次都有人踩。3. 设备报修模块的数据库设计一张工单表怎么撑起整个业务流程设备报修的核心不是用户表也不是设备表而是工单表。一张工单表要承载报修人、所属设备、故障描述、处理状态、指派人员、完成时间这些信息。毕业设计里最常见的错误是一上来建二十张表每张表两三个字段结果关联查询写得像蜘蛛网。我的建议是控制在六张表以内用户表、设备表、工单表、工单处理日志表、图片附件表、消息通知表。3.1 用户、设备与工单第一次建表就把状态机定清楚工单状态是整个模块的中枢。我习惯用0-待受理 1-处理中 2-已完成 3-已评价四个状态或者你再加一个4-已关闭。状态不要用中文因为小程序端要按数字去显示对应文案数据库里存中文会让统计 SQL 很难写。设备表要有设备编号、位置、类型、状态用户表注意区分普通用户和维修员角色用一个role字段不要建两张用户表。CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, openid VARCHAR(64) NOT NULL COMMENT 微信openid, name VARCHAR(32) DEFAULT NULL, phone VARCHAR(20) DEFAULT NULL, role TINYINT DEFAULT 0 COMMENT 0普通用户 1维修员 2管理员, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE repair_order ( id INT NOT NULL AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL COMMENT 工单编号, user_id INT NOT NULL, device_id INT NOT NULL, description TEXT COMMENT 故障描述, status TINYINT DEFAULT 0 COMMENT 0待受理 1处理中 2已完成 3已评价, assignee_id INT DEFAULT NULL COMMENT 维修员ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, finish_time DATETIME DEFAULT NULL, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_status (status), CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES user(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有个细节user是 MySQL 的保留字建表时直接写user会报错。正确的做法是加反引号或者把表名改成sys_user。我建议统一用sys_user因为后面写 MyBatis 映射文件时反引号混在 SQL 里很难看也容易漏掉。工单表主键是自增 ID但业务上要有一个单独的order_no给用户看比如BX202506041001否则你在小程序里只能拿自增 ID 当单号用户看不出哪一天报的。3.2 初始化 SQL 与关键字段状态、时间、逻辑删除的默认值毕业设计的数据库脚本如果只建表不造数据演示的时候界面是空的非常尴尬。我一般会在初始化 SQL 里插入一个测试账号和十条工单数据覆盖不同的状态。注意时间字段要用DATETIME不要用TIMESTAMP因为TIMESTAMP的范围只到 2038 年而且受时区影响在 JDBC 连接串和 MySQL 时区不一致时会出现诡异的时间差。逻辑删除也是答辩时的加分点。repair_order加一个deleted字段默认值 0删除操作改成UPDATE repair_order SET deleted1 WHERE id?。这样你在论文里可以写“工单历史可追溯”还能顺便引出 MyBatis 的where动态 SQL 在查询时统一拼接deleted0的做法。别小看这个细节很多毕业生做完项目全部用的物理删除一旦误删数据就得重新跑脚本答辩演示时手一抖就翻车。3.3 用 MyBatis 写一个 Mapper多表关联查询要避开 N1在 SQL 映射文件里查工单列表一定不要先查工单再循环查用户名那个 N1 查询在小程序首屏加载时会直接卡成白屏。正确做法是一次LEFT JOIN把用户和设备信息带出来。select idselectOrderList resultTypecom.example.repair.entity.RepairOrderVO SELECT o.id, o.order_no, o.description, o.status, o.create_time, u.name AS userName, u.phone AS userPhone, d.device_name AS deviceName, d.location AS deviceLocation FROM repair_order o LEFT JOIN sys_user u ON o.user_id u.id LEFT JOIN device d ON o.device_id d.id WHERE o.deleted 0 ORDER BY o.create_time DESC /select这里的resultType我写的是 VO不是实体类。很多新手喜欢直接把实体类返回给前端等于把数据库表结构整个暴露出去而且实体类里的deleted、createTime也会被序列化。我更建议在 entity 包里拆出实体和 VO 两层VO 专门给接口用字段按前端需要来定。MyBatis 的mapUnderscoreToCamelCase配置打开后user_name会自动映射成userName不用写一堆resultMap。4. 微信小程序端从登录到提单请求封装、表单校验和图片上传后端接口调通了接下来就是微信小程序端。这个项目的前端页面不需要多炫核心是四个页面首页展示我的报修列表、报修填写页、工单详情页、个人中心页。小程序端的难点不在页面 UI而在请求封装、登录态维持和图片上传。4.1 wx.request 统一封装基础路径、token 和错误码一次处理好如果每个页面都直接写wx.request等后端接口地址一变你就要全局搜索替换。我习惯在utils/request.js里封装一个 Promise 风格的请求方法。这样所有的页面只用关心业务数据不用反复写success和fail回调。const BASE_URL http://192.168.1.100:8080/repair; function request(path, method, data) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method: method || GET, data: data || {}, header: { Content-Type: application/json, token: wx.getStorageSync(token) }, success(res) { if (res.statusCode 200 res.data.code 0) { resolve(res.data.data); } else if (res.statusCode 401) { wx.removeStorageSync(token); wx.navigateTo({ url: /pages/login/login }); reject(res.data); } else { wx.showToast({ title: res.data.msg || 请求失败, icon: none }); reject(res.data); } }, fail(err) { wx.showToast({ title: 网络异常, icon: none }); reject(err); } }); }); } module.exports { request, BASE_URL };这段封装里有几个刻意为之的地方。code 0表示业务成功和后端返回体约定为{code:0, msg:ok, data:{}}这样小程序不用每次判断 HTTP 状态码。wx.getStorageSync(token)从本地缓存取登录凭证如果后端校验失败返回 401小程序自动清掉 token 并跳到登录页。BASE_URL我直接写成了局域网 IP调试时真机需要和电脑在同一个网段后面避坑章节会细说。4.2 报修页面把设备类型、故障描述和现场照片用表单串起来报修页的表单字段不要太多常见的组合是设备类型选择、具体设备名称、故障描述、图片上传、联系电话。设备类型用微信小程序的picker组件实现比写单选框体验好也少写很多样式代码。故障描述建议用textarea并且限制字数界面上一方面给用户缓冲另一方面防止有人一次性传几 KB 的文本把后端请求体撑爆。图片上传这里有个分水岭你是想一次选择一张还是一次多张。如果是多张wx.chooseMedia的count参数要设置好后端就要对应处理MultipartFile[]数组。我一般先调wx.uploadFile拿到返回的图片 URL再在提交表单时把 URL 字符串拼到请求体里而不是把图片 base64 塞进 JSON。这样做的好处是后端处理简单坏处是用户点提交之前图片已经传上去了会产生垃圾文件需要在接口层做定时清理或者覆盖上传。Page({ data: { deviceTypeIndex: 0, deviceTypes: [办公电脑, 打印机, 空调, 其他], description: , imageUrls: [] }, chooseImage() { const that this; wx.chooseMedia({ count: 3, mediaType: [image], success(res) { const tempFilePaths res.tempFiles.map(item item.tempFilePath); that.uploadImages(tempFilePaths, 0, []); } }); }, uploadImages(paths, index, uploadedUrls) { if (index paths.length) { this.setData({ imageUrls: uploadedUrls }); return; } const that this; wx.uploadFile({ url: BASE_URL /file/upload, filePath: paths[index], name: file, success(res) { const data JSON.parse(res.data); uploadedUrls.push(data.data); that.uploadImages(paths, index 1, uploadedUrls); } }); } });注意这里uploadImages是串行上传每传一张再传下一张避免并发上传时后端临时文件目录写入冲突。页面里还要加一个_uploading的防重标志否则用户连点提交按钮会产生重复工单。逻辑说明wx.chooseMedia返回临时路径临时路径只在本次小程序会话内有效wx.uploadFile必须写绝对路径不能写相对路径上传完成后拿到的data是后端返回的 JSON 字符串不是对象记得JSON.parse。4.3 登录与 openid用 code 换会话不要自己造登录态微信小程序登录已经和以前不一样了现在不推荐直接用wx.getUserInfo拿昵称头像当登录凭证。正规做法是wx.login拿到临时code发给后端后端用code去微信接口换取openid和session_key再把openid作为用户唯一标识落库。接口返回一个自己生成的 token 给小程序后续请求都带这个 token。RestController RequestMapping(/api/auth) public class AuthController { Autowired private UserService userService; PostMapping(/login) public Result login(RequestBody LoginDTO dto) { String openid userService.getOpenidByCode(dto.getCode()); if (openid null) { return Result.error(登录失败); } User user userService.findOrCreateUser(openid); String token UUID.randomUUID().toString().replace(-, ); userService.cacheToken(token, user.getId()); return Result.success(token); } }上面的 Java 代码里getOpenidByCode内部要调微信的jscode2session接口这个接口需要一个secret也就是小程序后台的 AppSecret。答辩时不要泄露这个值写论文的时候可以把 AppSecret 打码。cacheToken我推荐用 Redis 做但如果毕业设计没引入 Redis也可以存到一张user_token表里。用数据库存 token 需要定期清理过期记录比 Redis 麻烦但对单体架构来说也够用。这里要注意微信官方接口返回的session_key不要直接返给前端它属于敏感数据前端不需要知道。5. 设备报修小程序避坑毕业设计里最容易翻车的 5 个现场这一章是每台机器上都会遇到的血泪经验。我把它按最高发概率从高到低排序每一条都遵循“现象、原因、解决”来写。如果你想节约一整天调试时间直接跳到对应小节。5.1 MySQL 连不上2002 socket 错误和“Public Key Retrieval”连环坑现象后端启动时报Communications link failure或者error 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock。本机启动后端时也很常见原因之一是本地没启动 MySQL 服务或者 mysql 命令的 socket 路径和程序连接方式不一致。另一个常见情况是密码用了加密插件MySQL 8 默认的caching_sha2_password会让 JDBC 驱动要求先做 RSA 公钥交换然后报Public Key Retrieval is not allowed。原因前一种多半是 MySQL 服务没起来后一种是连接串缺参数。解决先确认service mysql status或 Windows 服务里 MySQL 是否在运行然后在 JDBC url 上显式加allowPublicKeyRetrievaltrueuseSSLfalse。排查的时候不要只看 Java 后端先用命令行mysql -u root -p试试能不能连上命令行都不行那就是数据库安装配置教程没走完要回头去看 MySQL 的初始化和密码设置。如果命令行能连、程序连不上再去检查db.properties里的driverClassName和url尤其注意 MySQL 端口是不是改过。5.2 后端 404/405项目名、Tomcat 路径和注解扫描不一致现象微信开发者工具里请求http://localhost:8080/repair/api/order/list后端返回 404浏览器直接打开这个地址也 404。还有一种是接口能找到但返回 405页面提示Request method GET not supported。原因404 是请求路径没匹配上。常见于两个点Tomcat 部署的上下文路径不是repair或者spring-mvc.xml里的context:component-scan base-package没有扫到controller包。405 则是请求方式不匹配后端明明写的PostMapping小程序端习惯性地用了 GET。解决IDEA 里看 Tomcat 配置里的Application context和BASE_URL保持一致检查RequestMapping(/api/order)和PostMapping是否覆盖了微信小程序的请求路径。我一般会在后端 Controller 里加一个全局异常处理器把HttpRequestMethodNotSupportedException捕获后返回一个明确提示这样小程序端看到的就不是光秃秃的 405而是“请使用 POST 方式访问”。5.3 时间字段报错Jackson 序列化 LocalDateTime 的兼容问题现象MySQL 里的create_time数据没问题查询接口也能执行但是接口返回 JSON 的时候直接把整个请求打挂了。报错里有InvalidDefinitionException或Java 8 date/time type not supported。原因默认的 Jackson 序列化不认识 Java 8 的LocalDateTime如果你在实体类里用了LocalDateTime而没有引入jackson-datatype-jsr310响应序列化就会炸掉。很多 SSM 老项目实体类还在用java.util.Date虽然不报错但前端处理Date格式的回显也很别扭。解决在 pom 里补上jackson-datatype-jsr310并且在 spring-mvc.xml 里注册JavaTimeModule统一输出格式。mvc:annotation-driven mvc:message-converters bean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter property nameobjectMapper bean classcom.fasterxml.jackson.databind.ObjectMapper property namedateFormat bean classjava.text.SimpleDateFormat constructor-arg valueyyyy-MM-dd HH:mm:ss/ /bean /property property namemodules set bean classcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule/ /set /property /bean /property /bean /mvc:message-converters /mvc:annotation-driven这个配置写完后LocalDateTime会按照yyyy-MM-dd HH:mm:ss格式返回小程序端可以直接用字符串显示不用再new Date()转换。5.4 图片上传后读不出来临时目录和静态资源映射现象图片上传返回成功能拿到一个文件路径但是浏览器里访问这个路径显示 404。用 IDEA 开发时文件明明在 target 目录下存在重启 Tomcat 以后图片又没了。原因MultipartFile.transferTo()如果写的是相对路径会保存到 Tomcat 临时工作目录这个目录在 Tomcat 重启时会被清理。还有一种是后端没有配置静态资源映射上传文件写到了D:/upload/但没有把/upload/**映射到本地磁盘路径。解决上传路径用绝对路径比如D:/repair/upload/在 spring-mvc.xml 里加上资源映射。mvc:resources mapping/upload/** locationfile:D:/repair/upload//这段映射的作用是只要 URL 以/upload/开头就从本地磁盘目录读文件。注意 location 必须以/结尾否则 Spring 会拼路径时出错。另外如果部署在 Linux 服务器上路径写成/var/repair/upload/并且要给这个目录加权限chmod 755是够用的图片目录别设 777安全课上老师会拿这个说事。5.5 真机预览白屏localhost 地址换到手机后要做的事现象微信开发者工具里一切正常扫码真机预览后直接白屏或者请求失败。网络请求打印出来发现是http://localhost:8080/...手机上根本访问不到。原因模拟器里的localhost指电脑真机上的localhost指手机自己所以必须换成电脑的局域网 IP。另外微信小程序正式环境要求后端必须是 HTTPS 域名开发调试阶段可以在开发者工具里点“详情-本地设置-不校验合法域名”但真机预览如果还不行要去看项目是否开了“开发环境不校验请求域名”的选项。解决把 BASE_URL 改成http://你的电脑局域网IP:8080/repair然后在微信开发者工具右上角详情里勾选“不校验合法域名”。手机和电脑连同一个 Wi-Fi注意有些路由器开了 AP 隔离手机连上后访问不到电脑这个问题无解只能换热点或者用流量配合内网穿透。不要试图在毕业论文里绕开这一步直接把局域网联调流程写进去老师反而觉得你考虑完整。6. 验证与交付从接口自测到给导师演示的完整清单拿到源码只是第一步能跑起来、能讲清楚才是毕业设计的价值所在。最后一篇我想聊聊怎么验证这个项目确实可用、怎么给导师做演示不翻车顺便把我自己的习惯交代一下。6.1 用浏览器和 Postman 把接口先钉死微信小程序前端只是一个壳接口稳不稳才是核心。我建议在联调前先拿 Postman 把全部接口过一遍每个接口至少确认三件事返回的 HTTP 状态码、业务 code、关键字段。先测POST /api/auth/login用code换 token再测POST /api/order创建工单然后测GET /api/order/list?userId1查列表最后测POST /api/file/upload传图片。接口顺序就是业务流程顺序后端只要按照这个顺序自测通过小程序端出问题基本只剩传参和渲染的问题。6.2 把设备故障报修流程做成一张“演示脚本”给老师演示的时候最忌讳临时乱点。我会固定一条演示路径输入手机号登录选择设备填写“办公电脑开机蓝屏”的故障描述上传一张现场照片提交生成工单等待状态变化。这个操作用管理员账号去“受理”和“完成”然后切回普通用户页面看到状态从“待受理”变成“已完成”。整个过程不超过两分钟但把报修业务闭环说完了。数据库里预先造好几条不同状态的工单也很重要万一现场卡在某个环节还能打开列表页展示历史数据兜底。6.3 毕业设计和论文配套数据库模型图、核心代码注释与答辩话术这套项目的源码包里通常还有毕业论文和视频演示但你要明白论文不是代码注释的堆叠。老师看论文时最在意的是三处数据库ER图能不能对上建表 SQL、核心业务流程是否用文字描述清楚、会不会因为框架引用不当被判定拼接。写论文时我会把 SSM 的各个层分别画一张调用图并且强调为什么用 MyBatis 而不是直接 JDBC。答辩被问到“为什么选 MySQL”时可以回答项目是毕设场景数据量不大MySQL 轻量、开源、资料多且 Navicat 和 Workbench 工具链成熟故障排查成本低。被问到“能不能改造成微服务”就答单体即可满足当前场景微服务会引入分布式事务问题没必要过度设计。最后交付前我会把 MySQL 初始化脚本放到db/目录后端代码里所有密码都改成环境变量占位并把微信小程序的AppID换成自己申请的绝不把别人的 AppSecret 留进去。这是做完三个毕业设计项目之后养成的习惯。亲手把readme写清楚把数据库初始化命令、后端启动步骤、小程序导入步骤重新走一遍不出错再提交。希望这个从 SSM 后端到微信小程序端的完整拆解能让你做设备故障报修小程序毕业设计时心里有底少走几步弯路。本文还有配套的精品资源点击获取
返回列表