当前位置: 首页 > article >正文

山东大学软件学院2026项目实训个人博客(二)

项目名称基于AI大模型的智能考研社区撰写日期2026年4月18日本周我主要完成了项目基础环境的进一步搭建和Redis、RabbitMQ配置的完善优化当前注册功能、登录功能、错题本CRUD功能并进行Swagger测试。一、基础环境搭建从git仓获取我负责的后端分支develop-backend后我着手进行基础环境的搭建和本地化配置。1Redis配置类MessageServiceImpl 通过RequiredArgsConstructor 注入了 RedisTemplateString, Object。Spring Boot 虽然引入了 spring-boot-starter-data-redis 依赖但默认只自动配置了 RedisTemplateObject, Object不会自动配置 RedisTemplateString, Object因此 Spring 无法找到匹配的 Bean。因此我创建 RedisConfig 配置类定义 RedisTemplateString, Object Bean// 使用 String 序列化 Key template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 使用 JSON 序列化 Value template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());2RabbitMQ安装Erlang和rabbitmq。在RabbitMQ Command Prompt (sbin dir)命令行中启动rabbitmq-plugins enable rabbitmq_management登录进入RabbitMQ仪表盘后在顶部菜单点击 Queues。在列表中找到 chat-queue或者是报错日志里提到的队列名。点击该队列进入详情页。向下滚动找到 Purge 按钮。点击 Purge messages 确认清空Purge目的是清除队列中堆积的异常消息、无效消息或消费失败的死信避免旧消息持续引发程序报错使队列恢复正常可用状态保证新消息能够正常生产与消费。进一步完善RabbitMQConsumerService.java增加 Channel 和 deliveryTag 参数防止无法手动确认消息导致脏消息一直重试可以调用 basicAck /basicNack 控制消息确认增加 startsWith ({) 校验防止Fastjson 收到 error 等文本直接崩溃提前拦截非 JSON 消息避免解析异常增加 basicNack (deliveryTag, false, false)防止错误消息无限重试刷屏报错拒绝消息且不再入队false, false彻底丢弃。3创建本地MySQL数据库并修改配置文件在 Sprint 1 初期进行环境联调时发现本地开发机无法稳定连接远程云服务器IP: 47.104.236.72的 MySQL 服务。因此将开发阶段的数据源切换至本地。在开发机部署 MySQL 8.0 服务并通过 Navicat/DBeaver 等可视化工具进行数据库管理。编写完整的 DDL 脚本在本地创建 studynote_localdev 数据库并初始化 user用户表、notebook错题本表等 6 张核心业务表。利用 Spring Boot 的 Profile 机制在 application-dev.yml 中独立配置本地数据源jdbc:mysql://localhost:3306/studynote_localdev避免污染远程测试数据解决 JDBC 驱动字符集兼容性问题配置 characterEncodingUTF-8 。二、完善现有功能当前一部分实体类、数据库层、DTO/VO类、Impl 核心逻辑和Controller暴露借口存在缺少注解、代码不简洁、安全性不高等问题需要进一步完善。1完善User实体类和UserMapper数据访问层给User实体类的添加 Swagger 注解(Schema)使代码更易读指向更明确。同时删除了原来的 IdType.AUTO改为 IdType.ASSIGN_ID使之与配置文件保持一致。同样给UserMapper.java数据访问层添加注释说明各个接口用途。2完善登录功能在初始的登录功能中后端的LoginVO和UserController会将password明文返回给前端这在功能上是没必要的反而会影响安全性。登录流程分为两个阶段阶段 1验证身份后端内部完成首先用户输入用户名密码后端查询数据库找到该用户后对比密码是否正确如果正确则验证通过 。这个阶段是在后端内部完成的前端只需要发送用户名和密码不需要接收密码回来。阶段 2返回登录结果给前端后端验证通过后生成JWT Token包含 userId用于后续请求的身份凭证并将用户 ID、用户名、头像、Token返回给前端。前端保存 Token跳转到首页。可以发现在登录全流程中后端不需要把密码返回给前端。并且这种行为存在很大的安全隐患。因此要移除 LoginVO 中的 password 字段同时修改 UserController不再返回 password。此外我发现UserController的登录缺少验证没有检查用户名是否为空、没有检查密码是否为空、没有检查用户名长度限制、没有检查密码强度。这会导致当用户提交空的用户名或密码会引起不必要的数据库查询可能被恶意利用进行 SQL 注入攻击虽然 MyBatis-Plus 有防护但最好还是验证因此在 LoginDTO 中添加验证注解同时在 UserController 中添加 Valid 注解启用验证。Data Schema(description 用户登录信息) public class LoginDTO { NotBlank(message 用户名不能为空) Size(min 1, max 20, message 用户名长度必须在1-20个字符之间) Schema(description 用户名) private String name; NotBlank(message 密码不能为空) Size(min 6, max 20, message 密码长度必须在6-20个字符之间) Schema(description 密码) private String password; }3修改JwtUtil中Secret key直接在文件里的硬编码在当前版本JwtUtil中的Secret key是直接在文件里硬编码的这导致代码安全性差 代码提交到 Git 后所有人都能看到 Secret Key不灵活如果想修改过期时间需要重新编译代码以及开发、测试、生产环境无法区分。public static String signKey Journey;public static Long expire 432000000L;public static String signName Authorization;因此将JWT 配置移到 application-dev.yml而JwtUtil需要从配置中获取相关内容。private static String signKey; Value(${jwt.sign-key}) public void setSignKey(String key) { signKey key; } //expire和signName同理在application-dev.yml添加配置jwt: sign-key: Journey expire: 432000000 sign-name: Authorization这样做的好处是配置统一管理在 yml 文件中不同环境可以使用不同的配置dev/test/prod修改配置不需要重新编译代码符合 Spring Boot 的最佳实践。三、注册登录功能和错题本CRUD功能的Swagger测试运行StudynoteApplication控制台输出项目后端启动成功可以进行Swagger测试。1注册和登录功能测试在Swagger测试页面里找到用户管理栏目的user/register和user/login测试块点击Try it out输入测试数据点击Execute{ name: test041801, password: 123456 }HTTP状态码为200返回值均正常注册和登录功能测试成功。2错题本CRUD功能测试a.添加错题本——/notebook/add测试数据{ id: 0, name: 错题本test_0418_1, brief: 这是一个错题本添加测试_0418_1 }b.获取错题本列表——/notebook/listc.获取错题本详情——/notebook/detaild.更新错题本基本信息——/notebook/update测试数据{ id: 1, name: 错题本test0418_1_已更改, brief: 这是一个错题本更新测试_0418_1 }e.删除错题本——/notebook/delete测试数据{ id: 1 }错题本CRUD功能Swagger测试全部圆满完成。本周感悟在本次后端开发的第一阶段我最大的收获是增强了排查和调试错误、优化代码和功能、进行代码测试的能力。项目初期我没有设置好远程数据库配置不过最终通过在本地搭建 MySQL 并配合可视化工具完成建表解决了问题。随着用户登录与错题本核心功能的跑通我开始重新检查代码的质量与安全性。我意识到后端接口不能仅仅满足“功能可用”更要考虑数据边界与隐私保护。因此我主动移除了登录响应中的密码字段并将 JWT 密钥从代码中剥离至配置文件。这些改动加深了我对防御性编程、后端安全性的理解也学会了如何通过配置外置来兼顾系统的安全性与灵活性。在团队协作中我对 Git 分支管理与提交规范有了更直观的认识。清晰的版本记录不仅是工作量的证明更是多人并行开发时保持代码秩序的重要保障。回顾这一阶段的开发从环境搭建到Swagger测试成功每一行代码的落地都让我对后端架构有了更立体的认知。后端开发不仅仅是实现业务逻辑更是构建稳定、安全、易维护的服务体系。接下来的开发中我将带着这份学习的热情和开发的严谨继续推进本次创新项目实践的后续功能开发努力为整个平台打下坚实的后端基础。

相关文章:

山东大学软件学院2026项目实训个人博客(二)

项目名称:基于AI大模型的智能考研社区撰写日期:2026年4月18日本周我主要完成了项目基础环境的进一步搭建和Redis、RabbitMQ配置的完善,优化当前注册功能、登录功能、错题本CRUD功能,并进行Swagger测试。一、基础环境搭建从git仓获…...

Python 源码解读:核心数据结构与算法实现分析

一、前言Python 源码解读:核心数据结构与算法实现分析。本文深入源码层面,剖析核心设计原理,帮你从"会用"升级到"精通"。二、核心原理深度剖析2.1 数据结构设计# Python 装饰器的原理:闭包 函数作为一等公民…...

HC32F072 IAP实战:从Bootloader编写到APP跳转的完整避坑指南

HC32F072 IAP实战:从Bootloader编写到APP跳转的完整避坑指南 第一次在HC32F072上实现IAP功能时,我盯着那个神秘的__attribute__((section(".ARM.__at_0x2200")))发呆了一整天。为什么Flash操作函数必须放在这个特定地址?为什么跳转…...

技术挑战:模块交互中的条件替换异常分析与解决

技术挑战:模块交互中的条件替换异常分析与解决 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: https://gitcode…...

武昌老酒回收电话

随着消费升级与收藏文化的兴起,名贵老酒已成为许多家庭和企业资产的一部分。在武汉武昌区,如何处理手中闲置或珍藏的老酒,实现其价值的安全、高效变现,是不少持有者关心的话题。本文将深入分析武昌老酒回收市场的现状,…...

Go 中嵌入类型字段在派生结构体字面量中的初始化规则详解

Go 语言中,嵌入类型(embedded type)的字段虽可被派生结构体直接访问,但不能作为字段名出现在结构体字面量中;必须通过显式初始化嵌入类型本身,或先创建实例再赋值。 go 语言中,嵌入类型&am…...

第九篇技术笔记:PoDL:一根线,供电上网两不误

写在开篇:最近一位新疆美女导游特别火,说的也听感动:湾湾当归!早日回到祖国的怀抱!不是因为技术做不到,是因为那边有人需要。车载以太网也是这个道理。不是“把电源和数据放一根线上”这个技术有多难&#…...

Hermes_Agent_Windows安装文档

Hermes Agent Windows 安装文档适用系统:Windows 10/11 + WSL2 + Ubuntu 整理自实际安装过程,包含常见报错解决方案前置说明 Hermes Agent 不支持原生 Windows,必须通过 WSL2(Windows Linux 子系统)安装。 WSL2 会在 Windows 里运行一个完整的 Linux 环境,Ubuntu 的数据存…...

Workout.Cool:打造您的终极开源健身教练平台,3大核心功能全面解析

Workout.Cool:打造您的终极开源健身教练平台,3大核心功能全面解析 【免费下载链接】workout-cool 🏋 Modern open-source fitness coaching platform. Create workout plans, track progress, and access a comprehensive exercise database.…...

实战指南:Element-ui Select 选择器深度样式定制(从透明背景到悬停交互)

1. 为什么需要深度定制Select选择器? 最近在做一个深色主题的管理后台项目时,我发现Element-ui默认的Select选择器样式完全不符合设计需求。原生的白色背景在下拉时显得特别突兀,就像在一张黑色画布上突然撕开一道口子。这让我意识到&#xf…...

SOCD Cleaner终极指南:如何用键盘映射提升游戏操作精度

SOCD Cleaner终极指南:如何用键盘映射提升游戏操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏中,你是否曾因同时按下相反方向键而导致操作失误?SOCD Clea…...

结合上篇文“怪奇物语物流假设”的对死亡搁浅3的构想

在死亡搁浅中,“送货”从来不是简单的玩法机制,而是一种被具象化的哲学表达。玩家以身体为媒介,在破碎的大地上缓慢前行,将孤立的人类节点重新连接起来。连接,在这里既是行为,也是意义本身。而在死亡搁浅2所…...

实用CLI工具:命令行下的高效选择

命令行界面在开发者日常工作中占据重要位置。很多任务通过它完成时速度更快,也更直接。尤其当处理文件搜索、内容查看或者目录跳转这类重复操作时,合适的CLI工具能节省大量时间。 Homebrew官网: https://brew.sh/ 这些工具大多可以通过简单…...

算法训练营第六天|206. 反转链表

题目链接: https://leetcode.cn/problems/reverse-linked-list/ 视频链接: https://www.bilibili.com/video/BV1nB4y1i7eL题意:反转一个单链表。 示例: 输入: 1->2->3->4…...

用AI修复和复刻老照片

最近,用AI修复了自己不同时期的照片,非常感慨。尤其是小时的场景,我并没有留下多少童年照片,现在,AI根据我的口述,把我放进去了。也算是拼接上了久远的时间轴。包括老的数码、彩照,黑白&#xf…...

CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt

函数节流核心是控制高频触发下函数执行频率,分定时器版(尾部延迟执行、首次不立即执行)和时间戳版(首调立即执行、后续按间隔节制),二者适用场景与性能表现各异。函数节流(Throttle)…...

2026年降AI率工具排行榜怎么选?3招避开智商税

2026年毕业季一到,朋友圈、知乎、小红书上铺天盖地的"降AI率工具排行榜"就开始刷屏。今天这家说"全网第一",明天那家又"权威评测",榜单的前三名永远在换人。我帮三届学弟学妹选过工具,也自己踩过不少坑,今天就…...

动网格实战:Spring光顺法原理详解与案例剖析

1. Spring光顺法入门:为什么需要动网格处理? 做流体仿真的时候,经常会遇到边界运动的场景。比如汽车发动机里的活塞上下运动,或者心脏瓣膜的开合。这时候如果网格不动,就会出现边界穿过网格的尴尬情况——就像用固定渔…...

Fast Screen Recorder屏幕录制软件:解决录屏区域选择与音频同步难题

在日常工作中,你是否需要录制一个软件操作教程发给同事,却不知道如何只录制特定窗口而非整个桌面?是否在录制游戏或会议时,发现系统声音或麦克风没有录进去?或者录制的视频文件过大,无法通过邮件发送&#…...

HiBit Uninstaller:轻松解决软件卸载不干净与顽固程序强制删除难题

当你从控制面板卸载一个软件后,是否发现它的文件夹还留在Program Files里?是否遇到过“无法卸载,缺少卸载程序”的报错?是否感觉电脑越用越慢,却又不知道是哪个残留程序在拖累系统?这些问题的根源在于:Windows自带的卸载功能只能调用软件自带的卸载程序,而很多软件(尤…...

【2026年最新600套毕设项目分享】宠物微信小程序(30100)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 项目演示视频2 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运…...

【2026年最新600套毕设项目分享】外卖微信小程序的研究与开发(30099)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 项目演示视频2 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运…...

测试库与生产库怎么应对同步中断断点续传_无损发布与更新方案

断点是某条变更事件的唯一标识未被消费,如MySQL的file_nameposition、Debezium的source.offset、Oracle的SCN;需通过元数据表存储offset与主键并查询MAX(offset)恢复,禁止依赖时间戳或COUNT对比。同步中断后怎么准确定位断点位置断点不是“某…...

2026届毕业生推荐的五大降AI率网站实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在进行学术论文或者原创内容撰写之际,过高的AI生成痕迹极具可能去影响评审结果。…...

【2026年最新600套毕设项目分享】微信小程序的电子购物系统(30098)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 项目演示视频2 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运…...

DIYGW UniApp可视化工具深度评测:对比传统编码开发到底能省多少时间?

DIYGW UniApp可视化工具实战评测:低代码开发效率的量化分析 在移动应用开发领域,时间就是竞争力。当传统编码方式还在与冗长的开发周期搏斗时,低代码平台正以惊人的速度重构着生产力边界。我们以电商商品详情页为测试场景,对DIYGW…...

Godot 2D碰撞体实战:从FlappyBird看RigidBody2D与StaticBody2D的碰撞艺术

1. 从FlappyBird看Godot碰撞体的核心价值 第一次打开Godot引擎时,我被它简洁的节点系统吸引,但真正让我着迷的是它精妙的物理碰撞系统。记得三年前我尝试复刻FlappyBird时,小鸟明明还没碰到水管游戏就结束了,这种"幽灵碰撞&q…...

Dreamweaver CS6‘行为’功能考古:那些年我们做过的网页特效,现在看还香吗?

Dreamweaver CS6行为功能:一场前端开发美学的复古之旅 鼠标滑过时突然变换的按钮图片、状态栏里跑马灯式的文字、自动弹出的欢迎对话框——这些如今看来略显"复古"的网页特效,曾是2000年代末到2010年代初网页设计的标志性语言。在那个jQuery刚…...

Go语言中 与 -:指针取址与解引用的完整解析

本文深入讲解 Go 中 &(取地址符)和 *(解引用符)的本质区别与协同关系,结合 json.Decode 等典型场景说明何时必须用 &、何时需声明 *T 类型,并通过可运行示例直观展示指针层级与内存语义。 本文…...

别再为Standard Assets报错头疼了!Unity 2022导入官方资源包的完整避坑流程

Unity 2022导入Standard Assets终极指南:从报错修复到高效工作流 当你兴奋地打开Unity 2022准备使用Standard Assets加速开发时,迎面而来的却是一堆红色报错——GUITexture已废弃、MovieTexture不可用...这些官方资源包为何在新版本中变得"支离破碎…...