1. 项目概述:基于SpringBoot的网络日记本系统
这个网络日记本系统是我在指导计算机专业毕业设计时反复打磨的一个经典案例,已经帮助30多名学生拿到了优秀论文评价。系统采用SpringBoot+MyBatis+MySQL技术栈实现,包含完整的用户管理、日记CRUD、数据统计等功能模块。
为什么选择日记本系统作为毕业设计选题?首先它的业务逻辑清晰完整但又不失技术深度,既包含常规的增删改查操作,又能延伸出富文本编辑、数据可视化、安全防护等进阶功能点。其次,这类系统在技术选型上非常灵活,你可以根据自身技术储备选择不同的实现方案——从基础的Servlet+JSP到主流的SpringBoot,甚至尝试Vue+SpringCloud的微服务架构。
提示:毕业设计切忌贪大求全,一个功能完整、代码规范的中小型系统远比功能庞杂但漏洞百出的"大系统"更容易获得导师青睐。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统核心技术解析
2.1 SpringBoot的自动装配魔法
这个项目的核心框架SpringBoot通过自动装配机制大幅简化了配置工作。以数据库连接为例,传统SSM项目需要手动配置DataSource、SqlSessionFactory等bean,而在本项目中只需简单三步:
- pom.xml引入starter依赖:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- application.yml配置数据源:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/diary_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
- 在Mapper接口添加@Mapper注解:
java复制@Mapper
public interface DiaryMapper {
@Select("SELECT * FROM diary WHERE user_id=#{userId}")
List<Diary> findByUserId(Integer userId);
}
这种约定优于配置的理念让开发者可以更专注于业务逻辑实现。我在项目中特别设计了配置中心类AppConfig,用来统一管理系统参数:
java复制@Configuration
public class AppConfig {
@Value("${app.page-size}")
private int pageSize;
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor interceptor = new PaginationInterceptor();
interceptor.setLimit(pageSize);
return interceptor;
}
}
2.2 富文本编辑器的技术选型
日记系统区别于普通博客的关键在于富文本编辑体验。经过对比测试,我最终选用WangEditor作为前端编辑器,主要考虑因素包括:
- 轻量级(核心JS仅200KB)
- 支持图片上传和粘贴
- 简洁的中文文档
- 良好的移动端适配
后端需要特殊处理HTML内容的安全过滤,我使用Jsoup进行XSS防御:
java复制public String filterHtml(String content) {
Whitelist whitelist = Whitelist.basicWithImages()
.addAttributes("img", "style")
.addProtocols("img", "src", "data");
return Jsoup.clean(content, whitelist);
}
踩坑记录:初期直接存储原始HTML导致数据库出现大量无效样式标签,后来通过定义白名单解决了这个问题,同时保留了必要的图文混排效果。
2.3 数据统计可视化实现
优秀的毕业设计需要体现数据分析能力。我在系统中集成了ECharts实现以下统计图表:
- 日记字数趋势折线图
- 写作时段分布雷达图
- 情绪标签词云图
核心统计SQL示例:
sql复制SELECT
DATE_FORMAT(create_time,'%H') AS hour,
COUNT(*) AS count
FROM diary
WHERE user_id=#{userId}
GROUP BY hour
ORDER BY hour
前端通过axios异步获取数据:
javascript复制axios.get('/diary/stats/hourly').then(response => {
const option = {
radar: {
indicator: response.data.map(item => {
return { name: item.hour+'时', max: 10 }
})
},
series: [{
data: [{ value: response.data.map(item => item.count) }]
}]
};
chart.setOption(option);
});
3. 数据库设计与优化
3.1 核心表结构设计
系统主要包含三张核心表,字段设计如下:
用户表(user)
sql复制CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(64) NOT NULL COMMENT 'SHA256加密',
`avatar` varchar(255) DEFAULT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
日记表(diary)
sql复制CREATE TABLE `diary` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
`weather` varchar(10) DEFAULT NULL,
`mood` varchar(10) DEFAULT NULL,
`is_private` tinyint(1) NOT NULL DEFAULT '1',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
标签表(tag)
sql复制CREATE TABLE `tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`user_id` int(11) NOT NULL,
`color` varchar(7) DEFAULT '#1890ff',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_tag` (`user_id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 性能优化实践
在项目演进过程中,我们针对性地解决了几个性能瓶颈:
- 日记列表分页优化:
java复制// 错误做法:先查询全部数据再内存分页
List<Diary> all = diaryMapper.selectAll();
List<Diary> pageList = all.stream()
.skip((pageNum-1)*pageSize)
.limit(pageSize)
.collect(Collectors.toList());
// 正确做法:数据库层面分页
@Select("SELECT * FROM diary WHERE user_id=#{userId} ORDER BY id DESC LIMIT #{offset},#{pageSize}")
List<Diary> selectByPage(@Param("userId") Integer userId,
@Param("offset") Integer offset,
@Param("pageSize") Integer pageSize);
- 标签统计缓存策略:
java复制@Cacheable(value = "tagStats", key = "#userId")
public List<TagStat> getTagStats(Integer userId) {
return tagMapper.countDiaryByTag(userId);
}
- 连接池配置调优:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
4. 安全防护方案
4.1 认证与授权控制
系统采用JWT进行无状态认证,关键实现点包括:
- 登录成功后生成token:
java复制public String generateToken(User user) {
return Jwts.builder()
.setSubject(user.getUsername())
.claim("userId", user.getId())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
- 自定义拦截器验证token:
java复制public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String token = request.getHeader("Authorization");
try {
Claims claims = Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody();
request.setAttribute("userId", claims.get("userId"));
return true;
} catch (Exception e) {
response.setStatus(401);
return false;
}
}
4.2 常见Web安全防护
- CSRF防护:
java复制@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
- SQL注入防护:
- 始终使用MyBatis的参数绑定
- 禁止拼接SQL语句
- 定期使用SQLMap进行漏洞扫描
- XSS防护:
java复制@Bean
public FilterRegistrationBean<XssFilter> xssFilter() {
FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new XssFilter());
registration.addUrlPatterns("/*");
return registration;
}
5. 项目部署与监控
5.1 多环境部署方案
通过profile实现环境隔离:
yaml复制# application-dev.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/diary_dev
# application-prod.yml
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-db:3306/diary_prod
username: ${DB_USER}
password: ${DB_PASS}
启动时指定profile:
bash复制java -jar diary-system.jar --spring.profiles.active=prod
5.2 监控端点配置
开启SpringBoot Actuator监控:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always
自定义健康检查指标:
java复制@Component
public class DiaryHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check();
if (errorCode != 0) {
return Health.down()
.withDetail("Error Code", errorCode)
.build();
}
return Health.up().build();
}
private int check() {
// 实现自定义检查逻辑
}
}
6. 论文写作要点
6.1 技术章节撰写技巧
优秀论文的技术章节应该包含以下要素:
- 架构图(使用PlantUML绘制):
plantuml复制@startuml
component "前端" as front
component "SpringBoot" as backend
component "MySQL" as db
front -> backend : HTTP API
backend -> db : JDBC
@enduml
- 核心算法伪代码:
code复制算法1:日记情感分析
输入:日记内容text
输出:情感极性sentiment(positive/neutral/negative)
1. 加载预训练的情感词典D
2. words ← 分词(text)
3. score ← 0
4. for word in words do
5. if word in D then
6. score ← score + D[word]
7. end if
8. end for
9. if score > 0.5 then
10. return "positive"
11. else if score < -0.5 then
12. return "negative"
13. else
14. return "neutral"
15. end if
- 性能对比表格:
| 优化措施 | 平均响应时间(ms) | 错误率(%) |
|---|---|---|
| 未优化 | 450 | 1.2 |
| 添加索引 | 220 | 0.8 |
| 引入缓存 | 150 | 0.5 |
| SQL优化 | 80 | 0.3 |
6.2 答辩常见问题准备
根据往年经验,答辩委员会常关注以下问题:
-
系统安全性如何保障?
- 准备演示XSS过滤和SQL注入防护代码
- 解释JWT的刷新机制
-
与传统日记本相比的创新点?
- 情感分析功能
- 多维度数据统计
- 移动端适配方案
-
遇到的最大技术挑战?
- 富文本内容的安全存储与渲染
- 大数据量下的列表性能优化
-
系统的扩展可能性?
- 增加社交功能
- 接入AI写作助手
- 多端同步方案
建议提前录制3分钟的系统演示视频,重点展示:
- 用户登录流程
- 日记创建与编辑
- 数据统计查看
- 移动端适配效果
7. 源码结构与使用说明
项目采用标准的Maven多模块结构:
code复制diary-system
├── diary-common -- 通用工具类
├── diary-mapper -- 数据访问层
├── diary-service -- 业务逻辑层
├── diary-web -- 控制层
└── diary-frontend -- 前端页面
快速启动步骤:
- 创建MySQL数据库:
sql复制CREATE DATABASE diary_db CHARACTER SET utf8mb4;
- 修改配置信息:
yaml复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/diary_db
username: root
password: yourpassword
- 启动后端服务:
bash复制mvn spring-boot:run
- 访问前端页面:
code复制http://localhost:8080
测试账号:
- 用户名:test@example.com
- 密码:123456
8. 扩展功能建议
如果想进一步提升项目水准,可以考虑:
-
多端同步:
- 集成WebSocket实现实时同步
- 增加RESTful API版本控制
-
智能分析:
python复制# 使用Python实现情感分析微服务 from transformers import pipeline classifier = pipeline('sentiment-analysis') def analyze(text): result = classifier(text)[0] return { 'label': result['label'], 'score': result['score'] } -
持续集成:
yaml复制# .github/workflows/build.yml name: Java CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK uses: actions/setup-java@v1 with: java-version: '11' - name: Build with Maven run: mvn package -
容器化部署:
dockerfile复制FROM openjdk:11-jre ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
这个项目经过多次迭代已经形成完整的教学体系,包含:
- 可运行的源码(含完整注释)
- 数据库初始化脚本
- 论文写作模板
- 答辩PPT范例
- 系统演示视频
在实际指导过程中,我特别强调代码规范(Checkstyle配置已内置)和测试覆盖率(JaCoCo报告要求≥70%),这些细节往往是获得高分的关键。
