1. 项目概述
这个基于Spring Boot和大数据技术的诗词信息系统是一个面向高校计算机专业学生的毕业设计项目。作为一个全栈开发项目,它整合了现代Web开发的主流技术栈,包括Spring Boot后端框架、Vue.js前端框架和MySQL数据库,同时融入了大数据处理技术。
在实际开发过程中,我发现这类文化类信息系统有几个关键特点:首先,诗词数据具有结构化特征(如标题、作者、朝代、内容等),非常适合用关系型数据库管理;其次,随着数据量增长,传统数据库查询性能会下降,这正是引入大数据技术的原因;最后,系统需要提供良好的用户体验,包括响应式界面和高效的数据检索功能。
2. 技术架构设计
2.1 整体架构设计
系统采用典型的三层架构设计:
- 表现层:基于Vue.js构建的用户界面,负责数据展示和用户交互
- 业务逻辑层:Spring Boot实现的核心业务处理,包括诗词数据的CRUD操作
- 数据访问层:MyBatis Plus作为ORM框架,连接MySQL数据库
这种分层架构的最大优势是职责分离,每层只需关注自己的核心功能,降低了系统耦合度。我在实际开发中发现,清晰的层级划分使得后期功能扩展和维护变得非常方便。
2.2 技术选型考量
选择Spring Boot作为后端框架主要基于以下几点考虑:
- 快速开发:Spring Boot的自动配置和起步依赖大大减少了样板代码
- 内嵌服务器:无需额外部署Tomcat,简化了部署流程
- 丰富的生态系统:与MyBatis、Shiro等框架集成简单
前端选择Vue.js是因为:
- 渐进式框架,学习曲线平缓
- 组件化开发,代码复用率高
- 响应式数据绑定,开发效率高
数据库选择MySQL 8.0版本,主要看中其:
- 成熟的ACID特性
- JSON数据类型支持
- 良好的性能表现
3. 核心功能实现
3.1 诗词数据管理模块
这是系统的核心模块,实现了诗词数据的增删改查功能。在实现过程中,我特别注意了几个关键点:
- 数据模型设计:
java复制@Entity
@Table(name = "poetry")
public class Poetry {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title; // 诗词标题
private String author; // 作者
private String dynasty; // 朝代
private String content; // 正文内容
private String annotation; // 注释
private String translation; // 译文
private String analysis; // 赏析
// 省略getter/setter
}
- 分页查询优化:
java复制@GetMapping("/list")
public Page<Poetry> listPoetry(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String keyword) {
Page<Poetry> pageInfo = PageRequest.of(page - 1, size);
QueryWrapper<Poetry> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(keyword)) {
wrapper.like("title", keyword)
.or().like("author", keyword)
.or().like("content", keyword);
}
return poetryService.page(pageInfo, wrapper);
}
注意:大数据量下分页查询的性能问题。当数据量超过10万条时,传统的LIMIT offset, size方式性能会急剧下降。解决方案是使用"上一页最后一条记录的ID"作为游标进行分页。
3.2 用户认证与授权
系统采用Shiro框架实现安全控制,主要功能包括:
- 用户认证流程:
java复制public class UserRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
return new SimpleAuthenticationInfo(
user, user.getPassword(), getName());
}
// 省略授权相关代码
}
- 密码安全存储:
java复制public class PasswordUtils {
private static final int HASH_ITERATIONS = 1024;
private static final int SALT_SIZE = 8;
public static String encryptPassword(String password) {
byte[] salt = Digests.generateSalt(SALT_SIZE);
byte[] hashPassword = Digests.sha1(password.getBytes(), salt, HASH_ITERATIONS);
return Encodes.encodeHex(salt) + Encodes.encodeHex(hashPassword);
}
}
安全提示:永远不要明文存储用户密码。即使使用MD5也不安全,建议使用SHA-256或bcrypt等更安全的哈希算法,并配合随机盐值。
4. 大数据技术集成
4.1 诗词数据分析
随着诗词数据量的增长(系统初始数据集包含约5万首诗词),传统关系型数据库的查询性能开始下降。为此,我引入了Elasticsearch作为辅助搜索引擎:
- Elasticsearch集成配置:
java复制@Configuration
public class ElasticsearchConfig {
@Value("${spring.elasticsearch.rest.uris}")
private String[] uris;
@Bean
public RestHighLevelClient client() {
return new RestHighLevelClient(
RestClient.builder(
new HttpHost(uris[0], 9200, "http")
)
);
}
}
- 诗词数据索引:
java复制public void indexPoetry(Poetry poetry) {
IndexRequest request = new IndexRequest("poetry_index")
.id(poetry.getId().toString())
.source(JSON.toJSONString(poetry), XContentType.JSON);
try {
client.index(request, RequestOptions.DEFAULT);
} catch (IOException e) {
log.error("索引诗词失败", e);
}
}
4.2 热门诗词分析
使用Redis实现热门诗词排行榜:
java复制public List<Poetry> getHotPoetries(int limit) {
Set<String> poetryIds = redisTemplate.opsForZSet()
.reverseRange("hot:poetry", 0, limit - 1);
return poetryIds.stream()
.map(id -> poetryService.getById(Long.parseLong(id)))
.collect(Collectors.toList());
}
public void incrementPoetryViewCount(Long poetryId) {
redisTemplate.opsForZSet()
.incrementScore("hot:poetry", poetryId.toString(), 1);
}
5. 系统部署与优化
5.1 部署架构
系统采用Docker容器化部署方案,主要包含以下服务:
- Web应用服务(Spring Boot)
- MySQL数据库服务
- Redis缓存服务
- Elasticsearch搜索服务
- Nginx反向代理
使用docker-compose编排:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
- elasticsearch
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: poetry_db
redis:
image: redis:6.0
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
environment:
- discovery.type=single-node
5.2 性能优化措施
-
数据库优化:
- 为常用查询字段建立索引
- 使用连接池(HikariCP)
- 合理设计表结构,避免过度规范化
-
缓存策略:
- 热点数据缓存(Redis)
- 页面静态化(Vue SSR)
- HTTP缓存头设置
-
JVM调优:
bash复制java -jar -Xms512m -Xmx1024m -XX:+UseG1GC poetry-system.jar
6. 开发经验与教训
6.1 开发过程中的挑战
-
大数据量下的分页问题:
最初使用MyBatis Plus的常规分页方法,当数据量超过10万条时,页面加载时间超过3秒。解决方案是改用基于游标的分页方式,响应时间降至200ms以内。 -
全文搜索准确度:
直接使用MySQL的LIKE查询无法满足复杂的搜索需求。引入Elasticsearch后,不仅支持模糊匹配,还能实现同义词扩展、拼音搜索等高级功能。 -
前后端分离的跨域问题:
开发阶段频繁遇到跨域请求被拦截的情况。最终解决方案是在后端配置全局CORS过滤器:
java复制@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
6.2 值得分享的技巧
- MyBatis Plus的灵活使用:
java复制// 复杂条件查询示例
LambdaQueryWrapper<Poetry> wrapper = new LambdaQueryWrapper<>();
wrapper.like(Poetry::getTitle, keyword)
.or().like(Poetry::getAuthor, keyword)
.orderByDesc(Poetry::getCreateTime);
List<Poetry> list = poetryService.list(wrapper);
- Vue组件化开发:
vue复制<template>
<div class="poetry-card">
<h3>{{ poetry.title }}</h3>
<p class="author">{{ poetry.author }} · {{ poetry.dynasty }}</p>
<div class="content" v-html="formatContent(poetry.content)"></div>
</div>
</template>
<script>
export default {
props: {
poetry: {
type: Object,
required: true
}
},
methods: {
formatContent(content) {
return content.replace(/\n/g, '<br>');
}
}
}
</script>
- 接口文档自动化:
使用Swagger UI自动生成API文档:
java复制@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.poetry.system.controller"))
.paths(PathSelectors.any())
.build();
}
}
7. 项目扩展方向
这个诗词信息系统还有很大的扩展空间,以下是几个可能的改进方向:
-
诗词推荐系统:
基于用户浏览历史和偏好,使用协同过滤算法实现个性化推荐 -
社交功能:
增加用户评论、收藏、分享功能,构建诗词爱好者社区 -
移动端适配:
开发微信小程序或React Native应用,拓展移动端用户 -
数据分析可视化:
使用ECharts展示诗词朝代分布、作者作品数量等统计信息 -
AI辅助创作:
集成自然语言处理模型,提供诗词续写、风格模仿等智能功能
在实际开发这类系统时,我深刻体会到良好的架构设计和技术选型对项目成功的重要性。特别是在处理文化类数据时,既要考虑技术实现的合理性,也要尊重文化内容的特性。这个项目不仅锻炼了我的全栈开发能力,也让我对大数据技术的实际应用有了更深入的理解。