1. 项目概述与选题背景
"红色赣番"门户网站是一个基于Java技术栈开发的红色旅游信息平台,旨在通过数字化手段推广赣州地区的红色旅游资源。作为革命老区,赣州拥有丰富的红色文化遗址和革命历史故事,但很多优质资源尚未被大众充分了解。这个毕业设计项目正是为了解决这一痛点而生。
从技术角度看,项目采用了经典的Java EE三层架构:
- 表现层:使用HTML+CSS+JavaScript构建用户界面
- 业务逻辑层:基于Spring框架实现核心业务
- 数据访问层:通过MyBatis与MySQL数据库交互
这种架构选择主要基于三点考虑:
- 技术成熟度高,社区资源丰富,遇到问题容易找到解决方案
- 分层清晰,便于团队协作和后期维护
- 对本科毕业设计而言,技术难度适中,能在规定时间内完成
提示:选择技术栈时,建议优先考虑自己熟悉的框架,而不是盲目追求新技术。毕业设计的核心是展示解决问题的能力,而非技术的前沿性。
2. 系统架构与技术选型
2.1 后端技术方案
原计划采用SSM框架组合(Spring+SpringMVC+MyBatis),这是Java Web开发的经典组合。Spring框架负责依赖注入和事务管理,SpringMVC处理Web请求路由,MyBatis作为ORM框架简化数据库操作。
在实际开发中,我做了以下调整:
- 将SpringMVC替换为Spring Boot:简化配置,内置Tomcat服务器
- 数据库连接池改用HikariCP:性能优于传统的DBCP
- 密码加密升级为BCrypt:比MD5更安全,自带盐值处理
java复制// BCrypt密码加密示例
String encodedPassword = BCrypt.hashpw(rawPassword, BCrypt.gensalt());
2.2 前端技术演进
最初考虑使用fekit+WebStorm的方案,但经过调研后发现:
- fekit是去哪儿网内部工具,社区支持有限
- WebStorm虽然是专业IDE,但对学生而言授权费用较高
最终采用的技术组合:
- 开发工具:VS Code(免费且插件丰富)
- 前端框架:Vue.js 3.x(组合式API更灵活)
- 构建工具:Vite(开发环境启动速度极快)
- UI组件库:Element Plus(丰富的预制组件)
javascript复制// Vite项目创建命令
npm create vite@latest red-gan-portal --template vue
2.3 数据库设计要点
MySQL数据库设计遵循以下原则:
- 所有表必须包含自增主键id
- 建立适当的索引(特别是外键和搜索字段)
- 文本字段根据实际需求选择VARCHAR或TEXT类型
- 敏感信息如密码必须加密存储
核心表结构示例:
sql复制CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(100) NOT NULL COMMENT 'BCrypt加密',
`phone` VARCHAR(20),
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE INDEX `username_UNIQUE` (`username`)
);
3. 核心功能模块实现
3.1 用户认证系统
用户模块不仅是简单的注册登录,还需要考虑:
- 验证码防护:使用Kaptcha生成图形验证码
- 会话管理:采用Redis存储Session,支持集群部署
- 权限控制:基于RBAC模型实现角色权限分离
安全防护措施:
- 密码强度校验(至少8位,含大小写和特殊字符)
- 登录失败次数限制(5次失败后锁定30分钟)
- 敏感操作二次验证(如手机验证码)
注意:绝对不要在日志中记录用户密码,即使是加密后的密码也不应该记录。
3.2 旅游专题展示系统
专题模块采用两级结构:
-
列表页:支持多种展示方式
- 瀑布流布局(适合图片内容)
- 分页表格(适合数据检索)
- 地图标记(基于高德API)
-
详情页:包含以下要素
- 轮播图展示(使用Swiper组件)
- 3D全景预览(使用PhotoSphereViewer)
- 周边推荐(基于地理位置算法)
性能优化方案:
java复制// 使用MyBatis二级缓存减少数据库查询
@CacheNamespace(implementation = RedisCache.class)
public interface SpecialTourMapper {
@Select("SELECT * FROM special_tour WHERE status = 1")
List<SpecialTour> listAvailable();
}
3.3 社区互动管理系统
内容审核流程设计:
- 用户提交内容 → 2. 系统自动过滤敏感词 → 3. 进入人工审核队列 → 4. 管理员审核 → 5. 发布/驳回
敏感词过滤实现:
java复制public class SensitiveWordFilter {
private static final TrieNode root = new TrieNode();
static {
// 初始化敏感词字典
List<String> words = loadFromDatabase();
for (String word : words) {
insertWord(root, word);
}
}
public static boolean containsSensitive(String text) {
// 实现Trie树查找算法
}
}
4. 开发经验与问题解决
4.1 典型问题排查记录
问题1:N+1查询问题
现象:专题列表加载缓慢,数据库查询次数过多
分析:MyBatis懒加载导致每次访问关联对象都产生新查询
解决:
- 使用@FetchType.EAGER强制立即加载
- 或者编写联合查询SQL,一次性获取所有数据
问题2:Vue组件重复渲染
现象:页面卡顿,控制台警告不断
分析:v-for循环中未使用:key,或key值不稳定
解决:
- 确保为每个循环项提供唯一稳定的key
- 复杂组件使用v-once或shouldComponentUpdate优化
4.2 性能优化实践
-
前端优化:
- 图片懒加载(Intersection Observer API)
- 组件异步加载(defineAsyncComponent)
- CDN引入公共库(Vue、Element等)
-
后端优化:
- 启用Gzip压缩(节省60%传输体积)
- SQL语句优化(使用EXPLAIN分析)
- 热点数据缓存(Redis)
-
数据库优化:
- 合理设置索引(避免过度索引)
- 定期执行ANALYZE TABLE
- 大表考虑分库分表
4.3 测试策略
采用分层测试方案:
- 单元测试(JUnit5):覆盖率>70%
- 集成测试(TestContainers):验证组件交互
- E2E测试(Cypress):模拟用户完整流程
测试数据准备:
java复制@BeforeEach
void setup() {
// 使用Faker生成测试数据
Faker faker = new Faker();
this.testUser = new User()
.setUsername(faker.name().username())
.setPassword(faker.internet().password());
}
5. 项目部署与运维
5.1 持续集成方案
GitHub Actions配置示例:
yaml复制name: Java CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Build with Maven
run: mvn -B package --file pom.xml
5.2 监控方案
- 应用监控:Spring Boot Actuator + Prometheus
- 日志收集:ELK Stack(Elasticsearch+Logstash+Kibana)
- 报警通知:集成钉钉机器人
关键指标监控:
- 接口响应时间(P99 < 500ms)
- 错误率(< 0.1%)
- 系统负载(CPU < 70%)
5.3 安全防护
-
Web安全:
- 启用HTTPS(Let's Encrypt免费证书)
- 添加CSP安全头
- 防止CSRF(Spring Security默认支持)
-
数据安全:
- 定期备份(mysqldump + 异地存储)
- 敏感字段加密(如手机号使用AES加密)
- 操作日志审计(记录关键操作)
在项目开发过程中,最大的收获不是技术本身,而是学会如何做技术决策。比如当发现原定的fekit方案不适用时,能够快速评估替代方案并做出调整。这种能力在实际工作中比掌握某个具体技术更重要。建议学弟学妹们在做毕业设计时,不要害怕修改最初的设计方案,合理的调整恰恰体现了你的工程判断能力。