ARTICLE DETAIL

资讯详情

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

SSM+微信小程序学生成绩查询项目实战:部署与二次开发

SSM+微信小程序学生成绩查询项目实战:部署与二次开发 简介面向计算机相关专业毕业设计、课程设计与小白进阶场景这套Java项目基于SSM和微信小程序实现学生成绩查询涵盖教师端与小程序端常见交互流程适合学生、教师或企业开发者直接部署、学习或二次改造。压缩包共1218个文件大小20.17MB内部含Java后端、JSP页面、微信小程序wxml/wxss、HTML/CSS/JS、SQL与DB数据库脚本以及使用文档前端页面、逻辑代码、配置和建表数据齐全按目录分组便于定位和研读。项目已在macOS与Windows10/11环境运行验证作者标注为答辩评审95分的高分优秀项目同时附有数据库和部署说明可直接用于毕设、课设或初期立项演示。当前已有92人学习参考尤其适合想快速掌握SSM小程序整合流程、并在此框架上扩展成绩分析或通知功能的学习者。1. 这个SSM微信小程序学生成绩查询项目到底值不值得下载每年毕设季都能看到大量学生成绩管理系统但大部分要么是纯Web端、要么用了很重的框架真正把SSM后端 微信小程序前端打通、还附完整数据库和文档的并不多。这套基于SSM的开发源码后台管理用Spring MVC处理请求、MyBatis操作数据库前端是原生微信小程序学生端查成绩、教师端管理成绩覆盖了一个完整毕设该有的闭环。它适合三类人一是正在做毕设、需要一套能跑通且能讲清原理的Java后端项目二是想学SSM框架整合、但不想从零搭环境的人三是准备课程设计或项目初期演示、需要一个带界面带数据的成品打底的人。这个项目源码结构完整有数据库脚本和使用文档能省下大量整理和排错时间下面把启动步骤、核心配置文件和小程序对接细节逐一拆开。2. 项目骨架与运行链路先看懂SSM三件套和小程序的通信方式2.1 技术栈选型为什么是SSM而不是SpringBoot现在很多毕设直接用SpringBoot因为内嵌Tomcat、配置简单。但这套项目用了传统SSMSpring SpringMVC MyBatis从学习角度反而更值得拆一遍Spring管理Bean、SpringMVC负责路由分发、MyBatis操作数据库每一层都显式配置你能清楚看到请求是怎么从浏览器走到数据库再返回的。用SpringBoot的话这些细节往往被自动配置遮住。从答辩角度讲SSM也是经典组合评审老师对这套架构的提问点非常固定——IOC容器、AOP事务、Mapper接口与XML绑定、DispatcherServlet流程。这些在项目里都有对应代码答起来有依据。从运行方式看SpringBoot项目打成jar直接跑而SSM项目通常是war包丢进Tomcat。这套源码自带.classpath等Eclipse工程文件也兼容IDEA导入但需要手动配置Tomcat。这个差异会在第三章具体处理。2.2 后端工程结构每个目录是干什么的拿到源码后第一步不是急着点运行而是先看包结构。SSM项目有个典型约定controller层写接口、service层写业务逻辑、dao或mapper层写数据库访问。这套项目里还带了entity或pojo包放实体类对应数据库表结构。src/main/java ├── com.xxx.controller # 接收前端请求返回JSON或页面 ├── com.xxx.service # 业务逻辑层事务注解在这里 ├── com.xxx.dao # MyBatis的Mapper接口 ├── com.xxx.entity # 实体类字段对应数据库列 └── com.xxx.util # 工具类比如返回结果封装 src/main/resources ├── mapper # MyBatis的XML映射文件 ├── spring-mvc.xml # SpringMVC配置 ├── spring-mybatis.xml # Spring整合MyBatis └── jdbc.properties # 数据库连接配置 src/main/webapp ├── WEB-INF/web.xml # 配置DispatcherServlet ├── static # 后台管理页面的css/js └── pages # JSP页面关键点在于spring-mybatis.xml里配置了SqlSessionFactoryBean它会把mapper目录下的XML全部加载进来。如果这个路径配错启动时不会立刻报错但第一次调用接口时会提示Invalid bound statement (not found)。这个坑在第五章细说。2.3 小程序与后端的接口对接方式小程序端和传统浏览器访问的区别在于小程序不允许直接访问任意域名必须在微信公众平台配置request合法域名或者在开发者工具里勾选不校验合法域名。开发阶段一般勾选后者上线前必须换成HTTPS域名。这套项目的小程序端应该有一个utils/request.js或类似封装核心逻辑是const request (url, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: getApp().globalData.baseUrl url, method: method, data: data, header: { Content-Type: application/json }, success: (res) { // 约定后端返回 { code: 200, data: ... } 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 };这里的baseUrl一般写在app.js的globalData里格式类似http://192.168.1.100:8080/项目名。注意后面要带项目上下文路径否则请求会404。wx.request的url必须是完整路径不能像axios那样写相对路径去拼接。后端Controller接收时如果用了RequestBody小程序端Content-Type要满足Spring的JSON解析要求如果后端是RequestParam小程序端直接拼在query里即可。这套项目如果是按传统SSM写法大概率是RequestParam和PathVariable混用所以调用前先看一下对应Controller的入参注解再决定传参方式。3. 本地跑起来从导入工程到打开小程序的三步流程3.1 环境版本对照表SSM项目的版本兼容性是个大问题网上很多报错其实是版本不匹配。先列一份我实际跑过的对照表JDK、Tomcat、Maven尽量按这个来组件推荐版本说明JDK1.8很多SSM老项目用了JDK 7语法但JDK8完全兼容Tomcat8.5或9.0不能用Tomcat 10Jakarta命名空间会冲突Maven3.6.x3.8也没问题但镜像建议配阿里云MySQL5.7或8.08.0需要改驱动包和时区配置微信开发者工具稳定版调试基础库2.x即可如果项目里没有pom.xml而是纯lib包方式那就跳过Maven直接把lib加入构建路径。打开.classpath看一眼就能判断。带pom.xml的版本更推荐依赖管理省心很多。3.2 后端启动完整步骤以IDEA为例先File → Open选择项目根目录等待Maven导入依赖。如果依赖下载极慢或失败在settings.xml里加阿里云镜像mirror idaliyunmaven/id mirrorOf*/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror依赖加载完修改jdbc.properties里的数据库连接jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/score_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的数据库密码注意MySQL 8.0的驱动类是com.mysql.cj.jdbc.DriverURL必须带serverTimezone否则会报时区错误。5.7可以用老驱动但建议统一用cj驱动兼容性更好。然后配置TomcatRun → Edit Configurations → 添加Tomcat Server → LocalDeployment里添加war explodedApplication context填项目名比如/score。启动后访问http://localhost:8080/score能看到后台登录页就说明后端通了。如果项目没有pom.xml、是传统lib目录那步骤变成Project Structure → Libraries → 添加lib目录 → 重新构建其他步骤不变。3.3 微信开发者工具导入小程序前端小程序源码通常是项目下的miniprogram或mini目录。打开微信开发者工具选择导入项目目录选到小程序代码所在位置AppID可以先选测试号开发阶段不影响。导入后第一件事是改app.js里的baseUrlglobalData: { baseUrl: http://localhost:8080/score // 本地调试时 }如果你用真机预览这个地址要改成电脑的局域网IP比如http://192.168.1.100:8080/score同时要保证手机和电脑在同一网络下。在详情 → 本地设置里勾选不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书这样wx.request才能访问HTTP地址。这一步不做请求会直接fail报错是url not in domain list。4. 数据库与核心表设计成绩数据是怎么存怎么查的4.1 核心表结构解读数据库脚本一般在db或sql目录下命名类似score_db.sql。导入方式很直接mysql -u root -p score_db.sql或者用Navicat新建数据库score_db字符集选utf8mb4然后右键运行SQL文件。一个学生成绩查询系统核心表至少应该有这几张student学生表、course课程表、score成绩表、teacher教师表。它们的关系是典型的多对多——一个学生选多门课一门课被多个学生选成绩表就是关联表。建表语句大概长这样CREATE TABLE student ( id INT(11) NOT NULL AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, password VARCHAR(100) DEFAULT NULL COMMENT 登录密码, class_name VARCHAR(50) DEFAULT NULL COMMENT 班级, PRIMARY KEY (id), UNIQUE KEY uk_student_no (student_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE score ( id INT(11) NOT NULL AUTO_INCREMENT, student_id INT(11) NOT NULL, course_id INT(11) NOT NULL, score DECIMAL(5,2) DEFAULT NULL COMMENT 成绩保留两位小数, exam_time VARCHAR(20) DEFAULT NULL COMMENT 考试时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;成绩字段用DECIMAL(5,2)而不是FLOAT是为了避免浮点误差这个在答辩时可以主动提一句。student_id和course_id建议加外键约束但很多毕设项目为了导入方便会省略外键逻辑上用索引保证关联。4.2 成绩查询的SQL写法与MyBatis映射小程序端查询成绩走的是学生输入学号 → 后端按学号查成绩 → 返回课程和分数列表。这个查询涉及三张表联查对应的MapperXML写法select idfindScoresByStudentNo resultTypemap SELECT s.name AS studentName, s.student_no AS studentNo, c.name AS courseName, sc.score AS score, sc.exam_time AS examTime FROM student s JOIN score sc ON s.id sc.student_id JOIN course c ON sc.course_id c.id WHERE s.student_no #{studentNo} ORDER BY sc.exam_time DESC /selectMapper接口对应方法是ListMapString, Object findScoresByStudentNo(Param(studentNo) String studentNo);Service层只做一件事——把DAO查出来的结果包成统一的返回格式。我这里一般会用Result类封装public Result getScoreList(String studentNo) { ListMapString, Object list scoreMapper.findScoresByStudentNo(studentNo); if (list null || list.isEmpty()) { return Result.error(该学号暂无成绩记录); } return Result.success(list); }Controller接收小程序请求然后返回JSONRestController RequestMapping(/api/score) public class ScoreController { Autowired private ScoreService scoreService; GetMapping(/list) public Result list(RequestParam(studentNo) String studentNo) { return scoreService.getScoreList(studentNo); } }这里有个容易被忽略的细节如果项目用RestController返回的Result对象会被Jackson自动转成JSON如果用的是老式Controller就必须在方法上加ResponseBody否则SpringMVC会尝试找名称为Result的JSP页面直接报404。5. 踩坑与排查SSM项目最常见的五个翻车现场5.1 现象Tomcat启动后访问页面报404控制台没有任何错误原因很大概率是web.xml里DispatcherServlet的url-pattern配置问题或者contextConfigLocation指向的Spring配置文件路径不对。另一个常见原因是mvc:resources没有放行静态资源导致css/js全部加载不出来页面样式全丢。解决先看web.xml确认有这段配置servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mapping如果能进登录页但样式乱了在spring-mvc.xml里加静态资源映射mvc:resources mapping/static/** location/static//5.2 现象小程序请求后端一直转圈什么响应都没有原因几个方向——请求地址里的baseUrl填了localhost但真机访问不了后端Tomcat没启动request合法域名没关校验最容易忽略的是Tomcat的server.xml里没有配置crossOrigin属性小程序WebView环境跨域时后端没放行。解决先看后端日志如果后端收到了请求就是跨域问题。在SpringMVC里加过滤器public class CorsFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { HttpServletResponse response (HttpServletResponse) res; response.setHeader(Access-Control-Allow-Origin, *); response.setHeader(Access-Control-Allow-Methods, GET, POST, PUT, DELETE, OPTIONS); response.setHeader(Access-Control-Allow-Headers, Content-Type, Authorization); chain.doFilter(req, res); } }在web.xml里注册这个过滤器并把url-pattern设为/*。SSM项目很多默认不带跨域支持这是联调时第一个要排查的点。5.3 现象数据库密码带特殊字符导致连接失败报Access denied for user原因jdbc.properties里密码如果带了、:等字符会被配置文件解析器截断。解决把密码做URL编码或者用spring-mybatis.xml里propertyPlaceholder的systemPropertiesMode参数规避。最简单的方法密码换成纯字母数字组合这不算作弊本地开发足够用。5.4 现象查询结果中文乱码页面显示???原因JDBC连接URL没指定characterEncodingutf8或者数据库表本身是latin1。解决改jdbc.properties里的URL加上characterEncodingutf8同时重建数据库表时指定utf8mb4。如果已经导入了数据可以用ALTER语句改表字符集ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;5.5 现象启动时Port 8080 already in use原因之前启动过的Tomcat没有正常关闭或者别的程序占了端口。解决Windows下查找占用进程netstat -ano | findstr 8080 taskkill /PID 端口对应的PID /FMac/Linux下是lsof -i:8080 kill -9 PID改Tomcat端口也是个临时方案在conf/server.xml里把8080改8081但这只能应急不要养成改端口的习惯。6. 二次开发把登录校验和成绩导出做成能答辩的亮点很多拿到这个项目的人第一反应是能跑就行。但答辩时老师最常问的一句话是这个系统你自己改了哪些功能所以拿到源码后动手改两个小地方比原封不动交上去有价值得多。第一个改动我建议做登录校验加密。原项目大概率是明文密码存数据库你可以在student表里加一列salt然后在Service层用MD5加盐加密。代码不复杂但讲得出思路public String encryptPassword(String password, String salt) { String input password salt; MessageDigest md MessageDigest.getInstance(MD5); byte[] bytes md.digest(input.getBytes(UTF-8)); StringBuilder sb new StringBuilder(); for (byte b : bytes) { String hex Integer.toHexString(b 0xff); if (hex.length() 1) sb.append(0); sb.append(hex); } return sb.toString(); }注册时生成随机salt保存登录时拿用户输入的密码salt加密后和库里的对比。这种改动小但能体现你对安全的理解。第二个改动是给教师端加成绩Excel导出。SSM项目里POI是个老搭档在pom.xml加依赖dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version3.17/version /dependency导出方法核心代码只需要十几行HSSFWorkbook workbook new HSSFWorkbook(); HSSFSheet sheet workbook.createSheet(成绩表); HSSFRow header sheet.createRow(0); header.createCell(0).setCellValue(学号); header.createCell(1).setCellValue(姓名); header.createCell(2).setCellValue(课程); header.createCell(3).setCellValue(成绩); int rowIndex 1; for (ScoreVO vo : scoreList) { HSSFRow row sheet.createRow(rowIndex); row.createCell(0).setCellValue(vo.getStudentNo()); row.createCell(1).setCellValue(vo.getStudentName()); row.createCell(2).setCellValue(vo.getCourseName()); row.createCell(3).setCellValue(vo.getScore()); }然后设置响应头让浏览器下载文件而不是在JSON里返回。改造完老师会让写使用说明这时把第四章的数据库脚本、第三章的启动步骤整理成文档整个交付就完整了——从那以后我每次跑SSM项目都会强制走一遍基础检查配置文件里有没有serverTimezone、跨域过滤器有没有配、mybatis的mapper-locations路径和实际目录对不对这三项过了基本就稳了。希望帮到你。本文还有配套的精品资源点击获取
返回列表