尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于SpringBoot+SSM的校园防诈骗宣传平台设计与实现

基于SpringBoot+SSM的校园防诈骗宣传平台设计与实现 2. 核心功能模块设计用户端与管理员端2.1 用户端功能拆解从“被动看”到“主动防”用户端是整个平台的流量入口也是防骗教育真正落地的场景。在设计时我把它拆成四大块资讯浏览、案例学习、在线答题、留言反馈。每一块都有明确的业务目标。资讯浏览模块承担的是“日常渗透”的功能。平台定期发布最新骗局预警、高发案例通报、防骗知识科普学生在刷手机的时候就能看到。这里要注意一个细节资讯列表默认按发布时间倒序排列但我会在首页专门划出一个“紧急预警”栏目置顶显示最新诈骗手法通报。因为反诈宣传时效性极强晚一天发布可能就多一个学生上当。案例学习模块是平台的核心价值所在。我把案例按诈骗类型分类刷单返利、冒充客服、校园贷注销、虚假兼职、游戏交易、杀猪盘每一类案例都以“作案手法拆解 真实对话记录 警方提示”的结构呈现。这种结构化的呈现方式比单纯转发新闻稿效果好得多学生能清楚看到骗子每一步在做什么下次遇到直接对号入座。在线答题模块解决的是“看了就忘”的痛点。每隔一段时间更新题库学生可以自测也可以参加学院组织的线上防骗知识竞赛。答题结果自动生成成绩单学院可以导出作为安全教育学时凭证。留言反馈模块则是学生和学校之间的交互窗口。学生遇到疑似诈骗情况可以匿名留言求助管理员端收到消息后分类处理紧急情况直接联系辅导员介入。2.2 管理员端功能设计内容管理、用户管理、数据统计管理员端的核心目标是让运营人员老师或学生干部不写代码也能管理整个平台。功能设计遵循一个原则操作路径越短越好数据呈现越直观越好。内容管理方面管理员可以发布、编辑、下架资讯和案例支持富文本编辑器和图片上传。这里我踩过一个坑富文本编辑器保存的内容很容易被XSS攻击利用因为用户提交的HTML不会被浏览器过滤。解决方法是后端加了一层白名单过滤器只允许特定的HTML标签和属性通过脚本代码一律拦截。用户管理方面管理员可以查看注册用户列表管理用户状态正常、禁用也可以批量导入学生信息。我设计的批量导入是Excel模板方式管理员按模板填好姓名、学号、学院一键导入就能批量生成学生账号初始密码统一设为学号后6位并强制首次登录修改。这个功能对提升平台使用率非常有帮助不然让每个学生自己注册推广成本太高。数据统计模块用来衡量平台效果。首页展示总访问量、总用户数、今日新增资讯数、答题参与人数等核心指标。这些数据一方面用于学校层面的工作总结和汇报另一方面可以分析哪些类型的诈骗案例阅读量最高、哪些学院的答题参与率偏低从而调整宣传重点。3. 技术选型解析SpringBoot与SSM到底什么关系3.1 为什么选SpringBoot而不是纯SSM手写配置很多同学在做毕设的时候会纠结一个问题选SpringBoot还是SSM其实这俩不是对立关系。SSM指的是Spring SpringMVC MyBatis这三大框架的组合而SpringBoot是一个快速开发框架它对Spring生态做了大量的自动化配置本身就包含了SpringMVC的核心能力也能很方便地整合MyBatis。更准确地说“SpringBoot SSM”是指SpringBoot作为项目基底整合SSM框架体系中的SpringMVC和MyBatis。相当于你在SpringBoot里继续使用Controller、Service、Mapper这套分层架构但省掉了以往SSM项目里那一大堆让人头疼的XML配置文件。我见过太多SSM毕设项目卡在第一步applicationContext.xml配置、spring-mvc.xml配置、web.xml配置、数据源配置、事务配置一个文件写错就启动失败。SpringBoot最大的价值就是把这些大量重复的配置变成了“约定大于配置”——你只需要一个application.yml剩下的交给自动装配。这个选择在防诈骗宣传平台这个场景下特别合适。平台本身业务并不复杂核心就是资讯内容的管理和展示属于典型的CRUD密集型项目。用SpringBoot可以把精力集中在业务功能的实现上而不是跟配置死磕。3.2 核心依赖与MySQL数据表设计项目的核心依赖选型上我用了Spring Boot 2.5.5搭配MyBatis Starter 2.1.4Java版本是1.8。这里特别说明一下为什么不用Spring Boot 3.x3.x最低要求JDK 17而且javax包改为jakarta包很多毕设环境和网上教程还停留在2.x遇到问题也不好查。做毕设首要目标就是顺利跑通没必要跟版本较劲。数据表设计是数据模型落地的第一步。我快速在家族树数据表上用一个路径枚举来简化遍历逻辑同时在表里冗余了名称和性别字段避免每次递归去查资料表。平台涉及的数据表主要如下。表名用途关键字段user用户表id, username, password, name, role, phonearticle资讯/案例表id, title, content, type, cover, viewscomment留言反馈表id, user_id, article_id, content, statusquestion题目表id, title, options, answer, scoreanswer_record答题记录表id, user_id, score, create_time我在设计时特别加了两个容易被忽略的字段article表的summary字段用于列表页显示摘要避免每次都要截取content正文user表的status字段用于用户状态管理管理员可以把恶意用户禁言或封禁。4. 核心功能实操登录拦截、分页查询、防重复提交4.1 基于Session的用户登录与拦截器实现防诈骗平台的权限控制相对简单不需要引入Spring Security或者Shiro这种重量级框架用Session配合拦截器就够了。登录逻辑是这样的用户提交用户名和密码Service层先按用户名查询用户再用MD5加密后的密码与数据库比对。比对成功就放入Session中保存用户信息同时更新最后登录时间。这里要吐槽一个常见问题很多毕设的密码是明文存储的这是极其危险的。一旦数据库泄露所有用户的账号都暴露了。MD5本身已经被证实不安全但应付毕设够用如果想更规范一些可以加盐处理。拦截器的写法如下public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); User user (User) session.getAttribute(user); // 未登录跳转到登录页 if (user null) { response.sendRedirect(request.getContextPath() /login); return false; } return true; } }然后在WebConfig里注册拦截器并设置排除拦截的路径登录页、注册页、CSS/JS/图片等静态资源首页的访问不需要登录。管理员相关的路径单独设置一个AdminInterceptor校验用户的role是否为1管理员。4.2 资讯列表分页与模糊搜索的完美搭档资讯列表页是用户访问最多的页面不做分页的话数据量大了页面会非常卡。我使用PageHelper插件实现分页它用起来确实很方便PageHelper.startPage(pageNum, pageSize); ListArticle articles articleMapper.selectByCondition(title, type); PageInfoArticle pageInfo new PageInfo(articles);这里有一个使用时很容易踩的坑PageHelper的调用必须紧跟Mapper方法中间不能有任何其他SQL操作否则分页就会失效。我当时在这个问题上debug了大半天最后发现是在调用Mapper之前查了一下用户信息导致PageHelper的拦截器把分页加到了错误的SQL上。模糊搜索通过MyBatis的CONCAT实现select idselectByCondition resultMapArticleResultMap SELECT * FROM article where if testtitle ! null and title ! AND title LIKE CONCAT(%, #{title}, %) /if if testtype ! null and type ! AND type #{type} /if /where ORDER BY create_time DESC /select4.3 用户留言防重复提交与数据校验学生提交留言反馈时最常见的异常操作是快速连点提交按钮导致同一内容被插入多条记录。防重复提交有两种思路前端为按钮设置disable状态提交后置灰1秒后端在插入前检查最近一条留言的创建时间如果间隔小于5秒就拒绝返回提示信息。只做前端是不够的碰上网络慢或者用户恶意请求还是能绕过限制所以后端校验必须加上。数据校验方面后端拿到的留言内容要先做空值和长度校验10-500个字符。只用前端校验不够绕过前端直接发请求垃圾数据就入库了。Hibernate Validator的NotBlank和Length注解可以用起来简单高效。4.4 数据展示浏览量统计与答题成绩的实现浏览次数这个数据的更新我采用的是“进入详情页时UPDATE一次”的方式。一开始我用的是“查出当前浏览量加一再写回”这种读改写方式在并发情况下会丢失更新。后来改成直接在SQL里累加UPDATE article SET views views 1 WHERE id #{id}一句SQL就搞定了并发问题而且性能比先查后写好得多。答题模块的数据处理也踩了坑。阅卷逻辑要保证判分准确、防作弊具体实测下来其准确性和稳定性让我印象深刻。判分逻辑是前端把用户答案选项编号数组提交到后端后端遍历正确答案表逐题比对最后统计总分。这里注意不要在前端判分因为前端判分可以被篡改而且成绩存库前必须经过后端校验才算数。5. 前端页面搭建首页轮播、资讯卡片与数据渲染5.1 页面整体布局与技术选型前端我一开始考虑过前后端分离用Vue Element UI。但后来考虑到项目演示和答辩的稳定性改成了服务端渲染的Thymeleaf模板引擎。原因很简单前后端分离意味着要启动前端服务器部署到演示环境时还需要处理跨域问题对毕设来说多了一层不稳定因素。而Thymeleaf直接把动态数据渲染到HTML中打包成一个jar包就能跑省心多了。页面整体布局采用后台管理系统的经典结构顶部导航栏 左侧菜单栏 主内容区。顶部放用户头像、消息通知和退出按钮左侧是功能菜单根据登录用户的角色动态显示不同菜单项右侧主内容区是页面主体部分。整个布局用Bootstrap就能搞定不引入太重的前端UI框架。5.2 首页核心区实现要点首页的视觉设计很重要毕竟防诈骗宣传平台要吸引学生持续使用不能做得像纯后台系统那么素。首页分三个区域轮播banner、紧急预警栏、资讯卡片流。轮播banner用Bootstrap Carousel实现后台配置了3张宣传图点击可以跳转到对应的预警文章。紧急预警栏固定在banner下方用红色高亮显示最新一条预警信息后面加一个“新”图标角标看起来更有紧迫感。资讯卡片流用了一个带分页的列表每页12条。卡片上展示封面图、标题、摘要、浏览量和发布时间。这里我用了Thymeleaf的th:each循环渲染浏览量超过1万显示为“1.2万”这种格式化方式视觉上更舒服。数据渲染时的小技巧为了提升页面响应速度列表页只查询summary字段做摘要显示不把完整的content字段查出来。这样数据库传输的数据量大大减少页面打开速度可以提升不少。6. 常见问题与排查技巧数据库连接、前端调试、端口冲突6.1 数据库连接失败与驱动版本问题很多同学在环境搭建时会遇到应用能启动但数据库连接失败的报错。这类问题我总结了一个快速排查流程首先检查MySQL服务是否启动其次检查用户名密码是否正确再者确认URL中数据库名存在。另外最常见的坑有两个一是Spring Boot 2.x默认使用mysql-connector-java 8.0版本驱动类名是com.mysql.cj.jdbc.Driver如果配置里写的还是com.mysql.jdbc.Driver在新版本下会报警告甚至直接报错二是MySQL 8.0默认使用UTC时区而本地数据库用的东八区时间连接字符串里必须加上serverTimezoneAsia/Shanghai否则时间字段的读写会差8个小时。6.2 MyBatis Mapper绑定异常与XML文件排查“Invalid bound statement (not found)”这个报错几乎每个用MyBatis的人都会遇到。原因通常是Mapper接口和XML文件没有正确关联。排查思路如下确认XML文件放在resources目录下与接口相同的包路径中确认application.yml里的mapper-locations配置指向正确确认MapperScan扫描的是Mapper接口所在包确认XML中的namespace写的接口全限定名。我习惯把mybatis配置设为mybatis.mapper-locations: classpath:mapper/*.xml并且命名规范是MapperName.xml一眼就能对应上。不少同学把XML放在java目录下但没配置build-helper打包时就漏掉了XML文件这种问题通过检查编译后的target目录就能定位。6.3 端口被占用与浏览器缓存调试问题SpringBoot默认端口是8080开发时经常遇到端口被占用的报错。处理办法有两个找到占用进程强制杀掉或者在配置里指定新端口。IDEA中建议直接改application.yml的server.port对排查问题也很有帮助。浏览器缓存对前端调试的影响有时候很隐蔽。有时候后台已经修改了CSS和JS文件刷新页面却不生效甚至页面看起来是旧的改代码半天发现没用其实就是浏览器缓存搞的鬼。按下CtrlF5强制刷新可以解决90%的问题如果还不行可以在浏览器开发者工具的Network标签里勾选Disable cache。6.4 页面数据渲染异常与Thymeleaf语法细节使用Thymeleaf时有个高频问题页面显示正常的静态内容但是动态数据的位置却弹出Exception evaluating SpringEL expression的报错。这通常是因为模板中写错了字段名或表达式。比如我在渲染资讯类型时最开始写的${article.type eq warning}语法少写了个等号直接报错。页面上调试无头绪时建议优先看后端控制台的完整异常信息它会告诉你是哪一行的表达式解析失败。7. 项目部署一键打包运行全流程7.1 Maven打包与外部Tomcat部署部署环节我的建议是使用SpringBoot内嵌的Tomcat打成jar包直接运行不折腾外部Tomcat。mvn clean package -DskipTests java -jar target/anti-fraud-platform-1.0.0.jar如果要在服务器上后台运行用nohup方式nohup java -jar -Xms512m -Xmx1024m target/anti-fraud-platform-1.0.0.jar /dev/null 21 数据库初始化方面我在项目里放置了一个init.sql脚本执行后可以自动建库建表并插入管理员账号和基础数据。首次部署时按顺序执行即可不用手工一条条建表。7.2 环境配置与演示注意事项演示前要检查的东西我列一个清单数据库密码是否与application.yml一致服务器防火墙是否放行对应端口项目中的数据是否准备充分至少要有10篇以上防骗案例、20道以上测试题、几个不同角色的用户。这些准备工作做好了演示时才不会出洋相。还有一点很关键演示机的浏览器分辨率。有些同学做了响应式布局但在投影仪低分辨率下页面错乱很影响观感。建议提前在大屏幕上测试一下页面缩放效果。8. 最后说点实在的这个平台做下来我最大的感触是技术上的挑战其实不多真正的功夫花在业务理解和功能设计上。防诈骗宣传平台看似就是一个校园资讯网站但你把这个“资讯”做成了分类型的案例库加上了答题验“防骗指数”的功能从“看”到“练”形成闭环它就从一个普通毕设变成了有实际应用价值的作品。后续想扩展的话可以接一个AI反诈问答机器人把常见诈骗话术整理成知识库做成自动回复的对话框这样学生遇到疑似骗局可以先“问一问”。也可以考虑对接学校统一身份认证学生用学号直接登录省去注册流程提升使用率。做毕设的过程本质上是一次“从需求到交付”的完整训练。代码能不能跑通很重要但更重要的是你有没有真正想明白“这个平台是给谁用的、要解决什么问题”。把这两件事想清楚了答辩的时候你就胸有成竹。
返回列表