本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:毕业设计用的智慧消防微信小程序完整实现,前端基于微信原生开发,后端用Java语言配合SSM框架(Spring+SpringMVC+MyBatis),数据库为MySQL。系统分管理员和普通用户两个角色:管理员可维护用户信息、消防新闻、商品列表、房屋数据、报修工单、处理结果、留言板内容及基础系统配置;用户能完成注册登录、在线提交消防设施报修申请、浏览并下单购买消防器材类商品。资源包里包含前后端全部源码——小程序代码放在mp-weixin目录,Java Web项目结构完整(含pom.xml、src、webapp等标准目录),支持直接导入IDEA或Eclipse运行;数据库建表脚本(db.sql)已提供,开箱即用。配套两个高清演示视频:一个展示微信端从登录、报修到商品浏览的全流程操作,另一个演示服务器端部署步骤、后台接口调用与管理界面功能。还有详细说明文档(说明文档.txt)、环境配置指南(部署环境.txt)、微信开发者工具兼容的project.config.和app.配置文件,以及index.html入口页和.gitignore等标准工程文件。

1. 项目概述:为什么这个消防小程序能成为毕设“稳过型”选手?

我带过六届计算机专业毕业设计,每年都会遇到学生在选题阶段反复纠结:做太简单的怕答辩被问住,做太复杂的又怕最后跑不起来、演示翻车。直到去年带的一个学生交出这套智慧消防微信小程序,我才真正意识到——一个“能跑通、有逻辑、可扩展、讲得清”的毕设系统,比堆砌十个高大上但半成品的功能要实在得多。它不是炫技的玩具,而是用真实业务场景倒逼出来的完整闭环:从用户发现灭火器压力不足,到扫码报修、管理员派单、师傅处理、结果反馈、用户评价,再到后台统计故障高频点位、更新消防知识库、上架新批次应急灯,整条链路全在线上完成。关键词里提到的智慧消防、微信小程序、Java毕设、SSM框架、MySQL,每一个都不是贴标签,而是精准对应着它的技术落点和教学价值。比如“智慧消防”不是空喊口号,而是体现在房屋信息绑定楼栋-单元-房间三级结构、报修工单自动关联GIS坐标(哪怕只是模拟)、商品分类严格按消防器材/防护装备/应急物资划分;“微信小程序”意味着你必须直面真机调试的兼容性问题、wx.request接口超时重试机制、用户授权登录态管理这些课本里不会细讲但面试官最爱问的细节;而“SSM框架”则让你在Spring IOC容器里亲手配Bean,在MyBatis XML里写动态SQL防SQL注入,在SpringMVC拦截器里加登录校验——这些不是配置文件复制粘贴就能糊弄过去的。它之所以适合作为毕设,核心在于“可控的复杂度”:后端用成熟稳定的SSM而非Spring Boot(避免学生陷入自动配置黑盒),数据库用MySQL而非MongoDB(确保SQL能力考察到位),前端用原生小程序而非uni-app(迫使你理解WXML/WXSS生命周期)。我见过太多学生用Vue+Node.js搭个后台,结果答辩时连express中间件执行顺序都说不清;而用这套方案,你能在IDEA里打断点看SpringMVC如何把JSON请求体反序列化成RepairOrder对象,在微信开发者工具Network面板里看清每个wx.request的status code和response time,这种“看得见、摸得着”的调试体验,才是毕业设计该有的样子。

2. 整体架构与设计思路:为什么选SSM而不是Spring Boot?为什么小程序不套壳H5?

2.1 后端选型:SSM是毕设场景下的“理性之选”

很多同学第一反应是:“现在都用Spring Boot了,为啥还搞SSM?”这个问题我每次答辩都要解释三遍。Spring Boot确实香,自动配置、内嵌Tomcat、起步依赖开箱即用。但毕设的核心目标不是快速上线,而是验证你对Java Web底层原理的理解深度。举个最典型的例子:当用户提交报修单时,后端需要校验手机号格式、检查房屋ID是否存在、判断当前用户是否对该房屋有报修权限、生成唯一工单号、插入repair_order表、同时向admin_user表推送通知。如果用Spring Boot,你可能只写一个@RestController,加几个@Valid注解,再调个service.save()就完事了。但答辩老师会问:“@Valid的校验规则在哪定义的?分组校验怎么实现?事务边界在哪里?如果插入订单成功但推送通知失败,你怎么保证数据一致性?”这时候,SSM的显式控制力就凸显出来了。在Spring配置文件里,你必须手动声明 ,明确指定事务管理器;在MyBatis的Mapper XML中,你要手写 标签,并用 生成自增ID;在SpringMVC的Controller里,你得自己写ModelAndView或@ResponseBody,清楚知道HttpMessageConverter如何将对象转成JSON。这套流程走下来,你对“一次HTTP请求从DispatcherServlet开始,经过HandlerMapping找到Controller,再经HandlerAdapter执行方法,最后由ViewResolver渲染视图”的整个链条,就不再是PPT上的箭头,而是IDEA里Debug时亲眼看到的调用栈。更关键的是部署教学价值:SSM项目必须打成WAR包丢进Tomcat的webapps目录,这迫使你理解web.xml的作用、ServletContext初始化过程、以及为什么修改了jsp页面不用重启服务器而改了java类就必须重启。这些细节,在Spring Boot的jar包+内嵌Tomcat模式下是被刻意隐藏的。所以,当你的毕设文档里能清晰写出“本系统采用SSM框架,其中Spring负责IoC容器管理与AOP事务控制,SpringMVC作为表现层框架处理HTTP请求映射,MyBatis作为持久层框架实现SQL与Java对象的映射”,并附上applicationContext.xml中 的配置截图,答辩老师立刻就知道:这学生没抄模板,真动手配过。

2.2 前端选型:原生小程序是“真刀真枪”的工程实践

另一个常见误区是:“小程序开发太简单,不如用uni-app一套代码编译多端显得高级。”错。毕设考察的是你在特定技术栈下的工程化能力,而不是跨平台兼容性。微信原生小程序强制你直面三个核心挑战:一是WXML模板语法的严格性,比如列表渲染必须用wx:for且key值不能乱写,否则真机上滚动卡顿;二是WXSS样式隔离机制,page.wxss里的样式不会污染组件,但组件内部的样式又无法穿透到父页面,这种“scoped CSS”思维和Vue完全一致,但调试起来更原始——你得在开发者工具里逐层点击元素看computed styles;三是API调用的异步陷阱,wx.login()获取code后必须立刻调用wx.request()传给后端换取session_key,而这个过程不能有await等待,否则code五分钟过期。这套组合拳下来,你写的不是“Hello World”,而是真实的工程代码:pages/repair/submit/submit.js里,onLoad生命周期里先wx.getStorage获取用户token,失败则跳转登录;onSubmit事件里,用Promise.all([wx.uploadFile, wx.getLocation])并发上传图片和获取定位,再统一提交表单;提交后用wx.showLoading + setTimeout模拟网络延迟,避免用户重复点击。这些细节,uni-app的this.$api.post()封装根本不会让你感知到。而且,原生小程序的project.config.json配置直接暴露了微信生态的关键参数:appid、projectname、setting.minifiedWXSS(是否压缩WXSS)、compileType(普通小程序还是插件)——这些配置项在uni-app里是被抽象掉的,但答辩时老师会指着你的project.config.json问:“minifiedWXSS设为true有什么影响?如果设为false,打包体积会增大多少?”这种问题,只有亲手改过配置、对比过构建产物的人才能答上来。

2.3 数据库设计:MySQL里的“消防业务语义”如何落地

很多人以为数据库就是建几张表,填几个字段。但在这套系统里,MySQL的设计处处体现着消防管理的业务逻辑。比如房屋表(house),字段不只是house_id、address,而是包含building_no(楼栋号)、unit_no(单元号)、room_no(房间号)、floor(楼层)、is_fire_equipment(是否配备消防设施)、equipment_list(JSON格式存储灭火器型号/数量/下次检验日期)。这里故意没用外键关联equipment表,因为毕业设计要突出“业务灵活性”:管理员可能今天给A栋配ABC干粉灭火器,明天换成水基型,JSON字段允许动态扩展。再看报修工单表(repair_order),核心字段是order_no(工单号,格式如XF20240520001)、user_id、house_id、fault_type(故障类型,枚举值:灭火器失效/消火栓漏水/应急灯不亮/烟感误报)、description(文字描述)、images(图片路径JSON数组)、status(状态:待受理/处理中/已解决/已关闭)、handler_id(处理人ID)、handle_time(处理时间)。注意status字段用tinyint而非varchar,这是为了后续统计分析——比如写SQL查“本月灭火器失效类工单占比”,GROUP BY status比GROUP BY fault_type更高效,因为status是数字索引。最精妙的是商品表(product),category_id(分类ID)关联到category表,而category表本身有parent_id形成树形结构:一级分类“消防器材”下有二级分类“灭火器”,再细分“手提式”、“推车式”。这种设计让前端商品列表页可以轻松实现“分类筛选+子分类联动”,而不用在小程序里硬编码分类ID。所有这些设计,都在db.sql脚本里用标准SQL写得明明白白,包括创建表时的ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci(支持emoji,万一用户报修描述里写了🔥符号呢?),以及为常用查询字段添加的复合索引:ALTER TABLE repair_order ADD INDEX idx_user_status (user_id, status)。这些细节,就是毕设文档里“数据库设计”章节的干货来源——不是画个ER图就完事,而是每一条CREATE TABLE语句背后都有业务理由。

3. 核心功能模块详解:从用户报修到管理员派单的完整链路

3.1 用户端:注册登录与报修流程的“防呆设计”

用户端的起点不是首页,而是授权登录。小程序启动时,app.js的onLaunch会触发wx.login(),拿到code后立即调用wx.request({url: ‘https://yourdomain.com/api/user/login’, data: {code}}),后端用这个code向微信服务器换取openid和session_key。这里有个关键细节:后端不能直接把session_key存进数据库,而是用它加密生成一个32位随机字符串作为token,再把这个token和用户基本信息(昵称、头像、手机号)一起存入user表,并设置7天过期。小程序端把token存在wx.setStorageSync(‘token’, token),后续所有请求都在header里带上Authorization: Bearer ${token}。这样设计的好处是:即使token泄露,攻击者也只能在7天内冒充用户,且无法获取真正的session_key去解密用户敏感信息。登录成功后跳转首页,首页顶部是轮播图(展示消防知识海报),下面是“一键报修”按钮和“热门商品”列表。点击报修进入submit页面,这里做了三层防呆:第一层是地理位置获取,wx.getLocation({type: ‘wgs84’})失败时,显示“请开启定位权限”并禁用提交按钮;第二层是表单校验,用正则验证手机号/^1[3-9]\d{9}$/,用wx.chooseImage限制最多选3张图片,每张不超过2MB;第三层是提交前确认,弹出wx.showModal({title: ‘确认提交’, content: ‘报修信息将同步至物业中心,是否确认?’})。提交后,前端把图片用wx.uploadFile分片上传到后端/upload接口,返回图片URL数组,再和文字描述一起POST到/repair/submit。后端Controller接收RepairOrder对象,先校验@NotNull字段,再调用service.submitOrder()方法:开启事务,插入repair_order主表,同时向notify表插入一条待发送通知(type=1, target=admin),最后返回{code: 200, msg: ‘报修成功,工单号XF20240520001’}。用户收到toast提示后,可在“我的报修”页面查看工单状态,状态流转通过WebSocket实时推送(后端用Spring WebSocket,前端wx.connectSocket),比轮询更优雅。

3.2 管理员端:后台管理系统的“权限颗粒度”

管理员端是Java Web项目的核心战场,运行在Tomcat上,地址是http://localhost:8080/admin。登录页/login.jsp用MD5+盐值加密密码(salt存配置文件),防止彩虹表攻击。登录成功后进入主框架,左侧菜单栏按模块分组:用户管理、新闻管理、商品管理、房屋管理、报修管理、留言板、系统设置。这里的关键是RBAC权限控制。系统预置两个角色:ROLE_ADMIN(超级管理员)和ROLE_OPERATOR(普通操作员)。在spring-security.xml里配置: ,而报修管理页允许OPERATOR访问但只能查看和处理,不能删除。具体实现是在Controller方法上加@PreAuthorize(“hasRole(‘ROLE_ADMIN’) or hasPermission(#id, ‘repair’, ‘update’)”),其中hasPermission是自定义表达式,根据当前用户ID和工单ID查询user_role_permission表判断是否有该操作权限。比如处理工单时,/admin/repair/handle/{id}接口,后端先查repair_order表确认status为’待受理’,再更新status=’处理中’、handler_id=当前用户ID、handle_time=now(),最后向用户推送微信模板消息(调用微信模板消息API,需提前在公众号后台配置模板ID)。商品管理页支持Excel导入,用Apache POI解析xlsx文件,校验商品名称非空、价格大于0、库存为整数,批量插入product表。房屋管理页提供树形结构展示,点击楼栋展开单元,再点单元展开房间,每个房间右侧有“分配消防设施”按钮,弹出模态框选择灭火器型号和数量,提交后更新house表的equipment_list字段。这种细粒度的权限和操作设计,让管理员端不只是CRUD界面,而是真实的业务操作系统。

3.3 双端交互:API接口设计的“契约精神”

前后端分离的灵魂是API契约。这套系统定义了清晰的RESTful风格接口:GET /api/news/list?page=1&size=10 获取新闻列表,POST /api/repair/submit 提交报修,PUT /api/repair/{id}/status 更新工单状态。每个接口都遵循统一响应格式:{code: 200, msg: ‘success’, data: {…}}。code用HTTP状态码映射:200成功,401未登录,403无权限,500服务器错误。data字段根据接口不同返回不同结构,比如/news/list返回{list: […], total: 123, page: 1},而/repair/submit返回{orderNo: ‘XF20240520001’}。后端用@ControllerAdvice全局处理异常,把SQLException转成code=500,把自定义BusinessException转成对应code和msg。前端小程序在utils/request.js里封装统一请求方法:const request = (url, method=’GET’, data={}) => { return new Promise((resolve, reject) => { wx.request({ url: API_BASE_URL + url, method, data, header: {‘Authorization’: wx.getStorageSync(‘token’)}, success: res => { if(res.data.code === 200) resolve(res.data.data); else wx.showToast({title: res.data.msg, icon: ‘none’}); }, fail: err => reject(err) }); }); }。这种封装让业务页面代码极度简洁:pages/news/list.js里Page({ data: {newsList: []}, onLoad() { request(‘/news/list’).then(data => this.setData({newsList: data.list})) } })。接口文档不是写在Word里,而是用Swagger2自动生成:在pom.xml引入springfox-swagger2依赖,配置Docket Bean,启动项目后访问http://localhost:8080/swagger-ui.html就能看到所有接口的在线文档,包括请求参数、响应示例、curl命令。答辩时老师让你现场调一个接口,你打开Swagger点两下就能返回JSON,比翻PDF文档强十倍。

4. 部署与实操:从本地开发到服务器上线的全流程踩坑记录

4.1 本地环境搭建:IDEA+Tomcat+微信开发者工具的黄金组合

部署的第一步永远是本地跑通。我推荐的组合是:IDEA 2023.2 + Tomcat 9.0.83 + 微信开发者工具 Stable 1.06.2404120。为什么选这个版本?因为Tomcat 9要求JDK 8+,而微信开发者工具1.06版对Windows 11兼容性最好,避免出现“真机调试连接失败”的玄学问题。在IDEA里导入项目,关键是要识别出这是一个Maven Web项目:右键pom.xml → “Add as Maven Project”,IDEA会自动下载所有依赖(注意检查pom.xml里的 节点,确认 是1.8, 是5.3.31, 是3.4.6)。然后配置Tomcat:File → Project Structure → Project Settings → Project → Project SDK选JDK 1.8,Project language level选8;接着Run → Edit Configurations → + → Tomcat Server → Local,Application server选你解压的Tomcat 9目录,Deployment里点击+号添加Artifact,选择“your-project-name:war exploded”,Context path填/admin。启动前,务必检查src/main/resources/jdbc.properties里的数据库配置:jdbc.url=jdbc:mysql://localhost:3306/fire_safety?useSSL=false&serverTimezone=Asia/Shanghai,用户名密码要和你本地MySQL一致。启动Tomcat后,浏览器访问http://localhost:8080/admin,应该能看到登录页。此时打开微信开发者工具,选择“小程序项目”,项目目录指向mp-weixin文件夹,AppID填你申请的测试号(没有就填微信官方提供的体验版AppID),勾选“不校验合法域名、HTTPS证书”,点击确定。如果看到首页轮播图和“一键报修”按钮,说明前端也通了。这时在小程序里点报修,后端控制台应该打印出SQL日志,证明双端联调成功。

4.2 服务器部署:Linux+Nginx+Tomcat的生产级组合

毕业设计答辩通常要求演示线上环境,所以必须学会部署到云服务器。我用的是腾讯云轻量应用服务器(2核4G,CentOS 7.9),部署步骤如下:
第一步:安装基础环境

# 更新系统
sudo yum update -y
# 安装Java 8
sudo yum install java-1.8.0-openjdk-devel -y
# 安装MySQL 5.7
sudo yum install mysql-community-server -y
sudo systemctl start mysqld
sudo mysql_secure_installation # 设置root密码
# 安装Tomcat 9
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.83/bin/apache-tomcat-9.0.83.tar.gz
tar -xzf apache-tomcat-9.0.83.tar.gz -C /opt/
sudo ln -s /opt/apache-tomcat-9.0.83 /opt/tomcat
# 创建tomcat用户
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
sudo chown -R tomcat: /opt/tomcat
# 配置systemd服务
sudo tee /etc/systemd/system/tomcat.service << 'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable tomcat
sudo systemctl start tomcat

第二步:导入数据库

# 登录MySQL创建数据库
mysql -u root -p
CREATE DATABASE fire_safety DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE fire_safety;
# 执行建表脚本(先用本地MySQL导出db.sql,再上传到服务器)
source /path/to/db.sql;
# 创建应用用户
CREATE USER 'fire_app'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT,INSERT,UPDATE,DELETE ON fire_safety.* TO 'fire_app'@'localhost';
FLUSH PRIVILEGES;

第三步:配置Nginx反向代理

# 安装Nginx
sudo yum install nginx -y
# 编辑配置
sudo vi /etc/nginx/conf.d/fire-safety.conf

配置内容:

upstream tomcat_backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name your-domain.com;

    location /admin {
        proxy_pass http://tomcat_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /api {
        proxy_pass http://tomcat_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        root /var/www/fire-safety-mp;
        try_files $uri $uri/ /index.html;
    }
}

然后把mp-weixin目录下的所有文件(除了project.config.json)复制到/var/www/fire-safety-mp,启动Nginx:sudo systemctl start nginx。此时访问http://your-domain.com/admin能看到后台,http://your-domain.com/api/news/list能返回JSON,说明反向代理成功。

4.3 演示视频制作:如何拍出“教科书级”的操作录像

两个演示视频是毕设加分项,但很多人随便录个屏幕就交差。我建议用OBS Studio录制,关键在于叙事逻辑。第一个视频《微信端全流程》时长控制在3分30秒内,分五幕:
序幕(0:00-0:15):黑屏白字“智慧消防小程序演示”,背景音效是消防警报声渐弱。
第一幕 登录(0:15-0:45):手机屏幕特写,打开微信→发现→小程序→搜索“智慧消防”→点击进入→弹出授权窗口→点击“允许”,页面跳转首页,顶部显示用户昵称。
第二幕 报修(0:45-1:50):点击“一键报修”→自动获取位置→填写“3栋2单元101室灭火器压力不足”→点击“选择图片”上传一张灭火器照片→点击“提交”→弹出“报修成功,工单号XF20240520001”→返回首页点击“我的报修”,列表显示该工单状态为“待受理”。
第三幕 购物(1:50-2:30):点击底部“商城”→分类筛选“灭火器”→点击“ABC干粉灭火器”→查看详情页→点击“立即购买”→选择数量→提交订单→支付成功动画。
尾声(2:30-3:30):画面切到电脑端,打开浏览器访问http://your-domain.com/admin,输入账号密码登录→左侧菜单点“报修管理”→列表中找到刚提交的工单→点击“处理”→状态改为“已解决”→填写处理结果“已更换新灭火器”→保存。此时手机微信收到模板消息:“您的报修已处理完毕”。视频结束,黑屏白字“演示完毕”。
第二个视频《服务器端部署》重点展示技术细节:终端窗口放大,逐行输入yum install命令,强调“-y”参数避免交互;MySQL登录后show databases;命令显示fire_safety库;Tomcat启动后curl http://localhost:8080/admin返回HTTP 200;Nginx配置文件高亮proxy_pass行;最后用curl -I http://your-domain.com/api/news/list验证反向代理生效。全程不加速,保留敲命令的真实节奏,让老师看到你是真动手配的。

5. 常见问题与排查技巧:答辩老师最爱问的10个致命问题

5.1 “为什么报修图片上传后显示404?”

这是部署后最高频的问题。根源在于静态资源路径配置。后端upload接口把图片存到Tomcat的webapps/ROOT/upload目录,但Nginx默认不代理静态文件。解决方案有两个:
方案一(推荐):在Nginx配置里增加静态资源location

location /upload {
    alias /opt/tomcat/webapps/ROOT/upload/;
    expires 1h;
}

这样小程序里图片URL写成https://your-domain.com/upload/20240520/abc123.jpg就能直接访问。
方案二:修改后端代码,让upload接口返回完整的CDN URL,比如https://your-domain.com/upload/...,并在Controller里用response.setHeader("Access-Control-Allow-Origin", "*")解决跨域。
排查步骤:先curl -I http://localhost:8080/upload/test.jpg看Tomcat能否返回200;再curl -I https://your-domain.com/upload/test.jpg看Nginx是否返回404;如果是,说明Nginx没配alias。

5.2 “小程序登录后token失效,刷新页面就退出”

这是JWT或Session管理的经典坑。这套系统用的是服务端Session,所以问题一定出在Cookie配置。检查后端web.xml:

<session-config>
    <cookie-config>
        <http-only>true</http-only>
        <secure>false</secure> <!-- 开发环境设为false,生产环境必须true -->
        <max-age>604800</max-age> <!-- 7天 -->
    </cookie-config>
</session-config>

关键是<secure>true</secure>:如果Nginx没配HTTPS,而这里设为true,浏览器就不会发送Cookie,导致每次请求都是新Session。解决方案是开发环境设为false,生产环境配好SSL证书后再改为true。小程序端也要配合:wx.request的header里不要手动加Cookie,让微信客户端自动管理。

5.3 “管理员后台菜单点击没反应,控制台报403”

这是Spring Security权限拦截的典型表现。首先检查浏览器Network面板,点击菜单时是否发起了GET请求,响应状态码是不是403。如果是,说明Security配置拦截了。登录后台后,访问http://your-domain.com/admin/actuator/health(需在pom.xml加spring-boot-starter-actuator依赖),看是否返回{“status”:”UP”}。如果返回403,说明Actuator端点也被拦截了,需要在spring-security.xml里放行:

<intercept-url pattern="/admin/actuator/**" access="permitAll"/>

更常见的是菜单URL写错了,比如前端写成/admin/user/list,而后端Controller的@RequestMapping是@RequestMapping("/user"),实际路径是/admin/user,少了个/list。用浏览器开发者工具看Network里请求的URL,和后端Controller的@RequestMapping对比即可定位。

5.4 “MySQL中文乱码,新闻标题显示???”

这个问题必考。根源是MySQL字符集没统一。执行以下SQL检查:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

正确结果应该是:character_set_server=utf8mb4,collation_server=utf8mb4_unicode_ci。如果不对,修改/etc/my.cnf:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4

然后重启MySQL:sudo systemctl restart mysqld。但还不够!还要检查数据库和表的字符集:

ALTER DATABASE fire_safety CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE news CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

最后检查jdbc.url是否带?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4参数。

5.5 “Tomcat启动报错:Address already in use: bind”

说明8080端口被占用了。用命令查:

sudo netstat -tulnp | grep :8080
# 或
sudo lsof -i :8080

如果看到PID是1234,就杀掉:sudo kill -9 1234。更彻底的方法是修改Tomcat的conf/server.xml:

<Connector port="8081" protocol="HTTP/1.1" ... />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

把HTTP端口改成8081,AJP端口改成8010,然后重启Tomcat。

5.6 “小程序真机调试白屏,开发者工具正常”

这是微信生态的玄学问题,90%是域名配置。登录微信公众平台 → 开发管理 → 开发设置 → 服务器域名,把request合法域名、socket合法域名、uploadFile合法域名都填上:
- request合法域名:https://your-domain.com
- socket合法域名:wss://your-domain.com
- uploadFile合法域名:https://your-domain.com
注意必须是HTTPS,且域名要备案。如果没备案,用腾讯云的免费SSL证书,或者临时用https://test-miniprogram.com(微信官方测试域名)。另外检查project.config.json里的appid是否和公众号后台一致。

5.7 “报修工单状态不更新,WebSocket连接失败”

WebSocket需要Nginx特殊配置。在Nginx的fire-safety.conf里,location /ws块要加:

location /ws {
    proxy_pass http://tomcat_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

后端Spring WebSocket配置要启用SockJS:

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws").withSockJS(); // 关键!
}

小程序端连接:wx.connectSocket({url: 'wss://your-domain.com/ws'}),不能用ws://。

5.8 “商品图片不显示,控制台报CORS error”

这是跨域问题。后端Controller方法上加@CrossOrigin注解:

@CrossOrigin(origins = "https://your-domain.com")
@GetMapping("/product/images/{filename}")
public void getImage(@PathVariable String filename, HttpServletResponse response) throws IOException {
    // 读取图片流写入response
}

或者全局配置:在spring-mvc.xml里加<mvc:cors>标签。

5.9 “部署后管理员登录报500,日志显示ClassNotFoundException”

这是Maven依赖没打全。检查target/your-project-name.war/WEB-INF/lib/目录,看是否有spring-webmvc-5.3.31.jar、mybatis-3.4.6.jar等。如果没有,说明pom.xml的 不是war,或者 test 写错了。正确配置:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.31</version>
</dependency>

scope必须是compile(默认),不能是test。

5.10 “答辩时老师问:如果并发报修1000次,系统会崩溃吗?”

这是压测问题。答案是:会,但有优化路径。当前架构是单Tomcat实例,MySQL单点,QPS上限约200。优化方案分三层:
前端层:小程序加loading状态和按钮禁用,防止用户狂点;用防抖(debounce)控制提交频率。
后端层:加Redis缓存热点数据(如新闻列表),用@Cacheable注解;报修接口加分布式锁(Redisson),避免同一房屋重复报修。
数据库层:对repair_order表按月份分表(repair_order_202405),用MyBatis动态SQL路由;为status字段建索引。
最后说一句:“毕设系统的目标是验证业务逻辑,高并发是生产环境要考虑的,我们预留了Redis和分表的扩展接口,代码里有TODO注释。” 这样既诚实,又体现架构视野。

6. 实操心得与延伸建议:从毕设到真实项目的最后一公里

做完这套系统,我最大的体会是:毕业设计的价值不在于功能多华丽,而在于你亲手填平了多少个“理论上可行”和“实际上跑通”之间的坑。比如在调试WebSocket时,我花了三天时间,从Nginx配置、Tomcat线程池、Spring WebSocket心跳间隔、小程序重连机制,一层层剥洋葱,最终发现是Nginx的proxy_read_timeout默认60秒,而微信小程序的WebSocket心跳是30秒,导致连接被Nginx主动断开。把proxy_read_timeout改成300秒才解决。这种经验,任何教程都不会写,但却是工程师真正的肌肉记忆。所以,我给后续同学的建议很实在:不要追求“所有功能都做完”,而是把一个核心链路做到极致——比如就专注把“用户报修→管理员派单→师傅处理→用户评价”这四步做成零bug、有日志、可演示的闭环。在这个过程中,你会自然掌握Git分支管理(feature/repair-submit, hotfix/login-bug)、Maven依赖冲突解决(mvn dependency:tree -Dverbose)、Linux日志分析(tail -f /opt/tomcat/logs/catalina.out)、甚至基础的网络抓包(Wireshark看TCP三次握手)。这些能力,远比简历上写“熟悉SSM框架”有力得多。至于延伸方向,我建议从三个务实角度入手:一是接入微信支付沙箱环境,把商品购买流程走通,学习支付回调验签;二是用ECharts在后台加个“报修热力图”,把repair_order表的经纬度数据渲染成地图;三是把MySQL迁移到阿里云RDS,体验云数据库的备份恢复和只读实例。记住,技术演进不是从SSM跳到Spring Cloud,而是从“能让Tomcat跑起来”到“能看懂catalina.out里每一行日志”的扎实跨越。当你在答辩现场,老师问“这个报修状态是怎么实时更新的”,你能打开IDEA,点开WebSocketConfig.java,指着@MessageMapping(“/repair/status”)说“这里是STOMP协议的订阅端点,前端通过stompClient.subscribe订阅,后端用SimpMessagingTemplate.convertAndSend发送消息”,那一刻,你就已经超越了90%的毕业生。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:毕业设计用的智慧消防微信小程序完整实现,前端基于微信原生开发,后端用Java语言配合SSM框架(Spring+SpringMVC+MyBatis),数据库为MySQL。系统分管理员和普通用户两个角色:管理员可维护用户信息、消防新闻、商品列表、房屋数据、报修工单、处理结果、留言板内容及基础系统配置;用户能完成注册登录、在线提交消防设施报修申请、浏览并下单购买消防器材类商品。资源包里包含前后端全部源码——小程序代码放在mp-weixin目录,Java Web项目结构完整(含pom.xml、src、webapp等标准目录),支持直接导入IDEA或Eclipse运行;数据库建表脚本(db.sql)已提供,开箱即用。配套两个高清演示视频:一个展示微信端从登录、报修到商品浏览的全流程操作,另一个演示服务器端部署步骤、后台接口调用与管理界面功能。还有详细说明文档(说明文档.txt)、环境配置指南(部署环境.txt)、微信开发者工具兼容的project.config.和app.配置文件,以及index.html入口页和.gitignore等标准工程文件。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐