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

逆向工程与二次开发:从一个 Java 大作业项目的改造之旅

(1)项目来源

本次二次开发的项目是来自朋友的一份Java课程设计大作业——「个人事件与照片管理系统」。

这是一个基于Spring Boot + Thymeleaf的Web应用,核心功能是帮助用户管理个人事件,并为每个事件关联上传照片,整体架构清晰、功能完整,是一份非常典型的学生课程实践作品。

项目亮点
(1)架构清晰:采用经典的MVC分层结构,Controller/Service/Repository职责分明,代码易读性高。
(2)功能完整:覆盖了用户登录注册、事件增删改查、照片上传管理等核心场景。
(3)界面友好:前端使用了响应式设计,在不同设备上都能有不错的视觉体验。

(2)运行环境与运行结果截图

运行环境

  • JDK版本:JDK 17
  • 框架:Spring Boot 3.x + Thymeleaf
  • 数据库:MySQL 8.0
  • 开发工具:IntelliJ IDEA

运行截图

  1. 登录页面:
    image

  2. 事件列表页:
    image

(3)主要问题列表与改善思路

在对项目进行逆向分析和测试后,我发现了以下几个核心问题,并针对性地提出了改善思路:

| 序号 | 问题描述 | 改善/重构思路 |
| 1 | 密码明文存储:用户密码直接以明文形式存入数据库,存在严重的安全隐患。 | 引入BCrypt或MD5加密,对密码进行加密存储和校验,提升系统安全性。 |
| 2 | 返回按钮无响应:在创建事件页面,点击“返回”按钮无任何反应,用户体验差。 | 修改按钮的跳转逻辑,直接指向事件列表页 /events,确保能正常返回。 |
| 3 | 文本溢出显示混乱:事件内容或标题过长时,页面布局被撑破,显示异常。 | 添加CSS文本溢出截断样式,保证页面布局的整洁和可读性。 |
| 4 | 搜索范围单一且对关键字没有标注:原系统仅支持按事件标题搜索,无法精准定位内容。 | 扩展搜索范围,支持同时按“标题”和“内容”进行模糊匹配,关键字标红。 |
| 5 | 操作无反馈提示:用户完成创建、删除、编辑等操作后,没有任何成功/失败提示,容易产生操作困惑。 | 引入轻量级提示框,在操作后给出明确的成功或失败反馈。 |

(4)核心修改代码

  1. 密码加密(UserService)

package com.demo.springbooteventphoto.service;

import com.demo.springbooteventphoto.entity.User;
import com.demo.springbooteventphoto.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BryptPasswordEncoder;
import org.springframework.stereotype.Service;

@Service
public class UserService {
@Autowired
private UserRepository userRepository;

// 注入BCrypt密码加密器
@Autowired
private BCryptPasswordEncoder passwordEncoder;// 用户登录验证:密码加密校验
public User login(String username, String password) {User user = userRepository.findByUsername(username);if (user != null && passwordEncoder.matches(password, user.getPassword())) {return user;}return null;
}// 用户注册(密码加密存储)
public User register(User user) {// 检查用户名是否已存在if (userRepository.findByUsername(user.getUsername()) != null) {return null;}// 密码加密后再存储user.setPassword(passwordEncoder.encode(user.getPassword()));return userRepository.save(user);
}// 根据用户名查询用户
public User findByUsername(String username) {return userRepository.findByUsername(username);
}

}

  1. 返回按钮修复(createEvent.html)
返回
  1. 文本溢出截断(eventList.html)

/* 文本溢出截断 */
.text-truncate {
max-width: 300px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<!--截断 -->

  1. 扩展搜索范围(EventRepository)

@Query("SELECT e FROM Event e WHERE e.user = :user AND " +
"(:keyword IS NULL OR e.title LIKE %:keyword% OR e.content LIKE %:keyword%) AND " +
"(:startTime IS NULL OR e.eventTime >= :startTime) AND " +
"(:endTime IS NULL OR e.eventTime <= :endTime) " +
"ORDER BY e.eventTime DESC")
Page searchEventsByPage(
@Param("user") User user,
@Param("keyword") String keyword,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime,
Pageable pageable);

  1. 操作反馈提示(EventController + eventList.html)

后端代码(EventController):
// 新增事件成功后
eventService.saveEvent(event);
return "redirect:/events?successMsg=事件创建成功!";

// 删除事件成功后
eventService.deleteEventById(id);
return "redirect:/events?successMsg=事件删除成功!";

前端代码(eventList.html):

(5)重构后的软件测试截图

  1. 密码加密后注册:
    注册新用户后,数据库中存储的是加密后的密码字符串,

  2. 返回按钮修复后:
    点击“返回”按钮,成功跳转到事件列表页。
    image

  3. 文本溢出截断效果:
    长文本自动显示为“...”,页面布局不再混乱。
    image

  4. 关键词搜索范围扩大,关键字标注:
    搜索关键词后,标题和内容中的匹配项都会显示。
    image

  5. 操作成功提示:
    操作事件成功后,页面上弹出提示框,让用户确认操作成功。
    image

(6)总结:难点、耗时与逆向工程思考

难点与耗时

  1. 密码加密:

    • 难点:初次引入Spring Security时,由于版本不兼容导致大量报错,一度陷入困境。
    • 耗时:约1个半小时,最终通过直接实例化BCryptPasswordEncoder和添加配置类解决。
  2. 操作反馈提示:

    • 难点:重定向导致model传值失效,以及Thymeleaf模板引入的语法坑。
    • 耗时:约2小时,最终采用URL传参的兜底方案才稳定实现。
  3. 前端样式兼容:

    • 难点:提示框样式被页面原有样式覆盖,导致无法显示。
    • 耗时:约1小时,通过添加!important强制样式生效才解决。

逆向软件工程的思考

  1. 理解优先于修改:在修改任何代码前,必须先理解原有代码的逻辑和架构,否则很容易引入新的问题。
  2. 最小改动原则:尽量只修改核心问题点,避免大面积重构,降低维护成本和出错概率。
  3. 用户体验至上:即使是课程作业,也应从用户角度出发,优化操作反馈、布局等细节,这才是软件的核心价值。
  4. 安全意识:作为开发者,必须时刻将安全放在首位,像密码加密这样的基础安全措施,绝不能因为是“作业”就忽视。

通过这次二次开发,我不仅提升了自己的代码调试和问题解决能力,更深刻理解了“逆向工程”的内涵——它不仅仅是修改代码,更是对原有设计的反思与重构,是从“会用”到“会造”的关键一步。

http://www.jsqmd.com/news/440477/

相关文章:

  • 基于Simulink模块搭建下4-DPSK通过AWGN下的误码率和误比特率仿真(源码+lw+部署文档+讲解等)
  • 提示工程架构师的AI上下文工程长短期记忆机制设计秘籍大公开
  • 对使用的屏幕的整理
  • 多径衰落信道下OFDM传输信道估计算法误码率比较(源码+lw+部署文档+讲解等)
  • 搜维尔科技:Manus数据手套登录人工智能大会-构建下一代远程操控基础
  • ollama本地模型使用
  • 探索大数据领域数据产品的发展前景
  • BISHI92 【模板】前缀函数(kmp)
  • 2026年角钢厂家实力推荐榜:镀锌角钢/S355J0/AH36/Q355B/5#角钢/S275/Q420/电钢角钢/欧标日标角钢,精选源头工厂,坚固耐用的结构之选! - 品牌企业推荐师(官方)
  • 2024智能家居Agentic AI技术白皮书解读:提示工程架构师划重点
  • 告别“美丽刑具”!2026职场女性“久穿不累”高跟鞋选购全攻略 - 数字营销分析
  • 虚拟环境工具下创建独立的 3.11 环境 - yi
  • 旺旺的零食健康吗?从爱至尊、Want Power、FixXBody,看旺旺如何布局“更轻负担”零食 - Top品牌推荐官
  • jenkins对接gitlab
  • Flutter 三方库 vane 的鸿蒙化适配指南 - 构建工业级 Dart 服务端、中间件驱动的高性能 API、鸿蒙全栈开发实战
  • 阿里oceanbase-ce:纯纯手工创建实例、初始化 ...
  • C#静态构造函数真的总是最先执行吗?
  • 每日一题:什么是限流?.NET 中如何实现?
  • 前后端交互中时间的格式化与解析,将会面临哪些问题?
  • yolo go onnx
  • 2026.3.5总结 安装claude code 并在vscode上调用
  • gcsfuse中的锁与偏序理论
  • 大模型训练的硬件基础:GPU内存层级、分块与并行策略
  • 2026新春零食囤货推荐:《旺旺大礼包》种类多性价比高的新年限定年味零食大礼包 - Top品牌推荐官
  • 2026全国最新纯磷虾油品牌推荐 - 十大品牌榜
  • 在云主机上安装openclaw
  • 笔耕不辍,聊聊 7 种实现异步编程的方式
  • 静态链接程序的执行流程分析
  • “政务场景AI落地”并非替代人力,而是通过技术赋能,让政务工作者更专注于需要判断力、共情力与协调力的核心职责
  • Agentic AI提示工程设计的关键性能指标:架构师该关注哪些?