这个基于Spring Boot的个人博客网站项目是我最近完成的一个计算机毕业设计案例。作为一个有10年开发经验的程序员,我想分享一下这个项目的完整实现过程和技术细节。这个系统不仅实现了基本的博客功能,还整合了生活记录、知识分享和作品展示三大核心模块,是一个功能全面的个人门户网站。
在实际开发中,我采用了目前主流的技术栈:Spring Boot作为后端框架,Vue.js负责前端交互,MySQL存储数据,MyBatis Plus简化数据库操作。整个项目从需求分析到最终上线测试,前后历时约3个月,期间解决了诸多技术难题,积累了不少实战经验。
系统采用标准的MVC设计模式,将应用分为以下几个层次:
视图层(View):使用Vue.js构建用户界面,通过组件化开发实现页面复用。我特别设计了响应式布局,确保在不同设备上都能良好显示。
控制器层(Controller):Spring Boot的@RestController处理HTTP请求,负责参数校验和响应返回。这里我实现了统一的异常处理机制,避免将服务器错误直接暴露给用户。
服务层(Service):包含核心业务逻辑,如用户认证、博客发布、评论管理等。我采用了接口与实现分离的方式,便于后期扩展和维护。
数据访问层(DAO):使用MyBatis Plus简化CRUD操作,通过注解方式实现对象关系映射,避免了繁琐的SQL编写。
在选择技术栈时,我主要考虑了以下几个因素:
开发效率:Spring Boot的自动配置和起步依赖大大减少了样板代码,Vue的组件化开发提高了前端复用性。
性能需求:MySQL作为成熟的关系型数据库,能够满足博客系统的数据存储和查询需求。对于热点数据,我额外添加了Redis缓存。
学习曲线:这套技术栈社区资源丰富,遇到问题容易找到解决方案,也方便团队成员快速上手。
扩展性:前后端分离的架构使得后期可以独立扩展前端或后端功能,不会相互影响。
用户系统是博客的基础,我实现了完整的注册、登录、权限管理功能:
密码安全:使用BCrypt加密存储密码,即使数据库泄露也不会直接暴露用户密码。
会话管理:采用JWT(JSON Web Token)实现无状态认证,减轻服务器压力。
权限控制:基于RBAC模型,用户-角色-权限三级控制,灵活管理不同用户的访问权限。
关键代码示例:
java复制// 用户登录逻辑
@PostMapping("/login")
public Result login(@RequestBody User user) {
User dbUser = userService.getByUsername(user.getUsername());
if(dbUser == null || !passwordEncoder.matches(user.getPassword(), dbUser.getPassword())) {
return Result.error("用户名或密码错误");
}
String token = JwtUtil.generateToken(dbUser);
return Result.success(token);
}
博客功能是系统的核心,我实现了以下特性:
富文本编辑:集成Editor.md Markdown编辑器,支持代码高亮、图片上传等功能。
分类标签:每篇博客可以设置分类和多个标签,便于内容组织和检索。
草稿箱:支持保存未完成的博客草稿,避免内容丢失。
定时发布:可以预设发布时间,系统会自动发布到前台。
数据库表设计:
sql复制CREATE TABLE `blog` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` longtext NOT NULL,
`cover_image` varchar(255) DEFAULT NULL,
`category_id` int DEFAULT NULL,
`user_id` bigint NOT NULL,
`view_count` int DEFAULT '0',
`status` tinyint DEFAULT '0' COMMENT '0-草稿 1-已发布',
`publish_time` datetime DEFAULT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
这个模块让用户可以记录日常生活点滴:
时间轴展示:按时间倒序排列生活记录,支持添加图片和位置信息。
隐私设置:每条记录可以设置为公开、仅自己可见或指定好友可见。
天气标记:集成天气API,自动记录发布时的天气状况。
前端组件实现:
vue复制<template>
<div class="life-record">
<el-timeline>
<el-timeline-item
v-for="record in records"
:key="record.id"
:timestamp="formatDate(record.createTime)">
<el-card>
<div v-html="record.content"></div>
<div class="images" v-if="record.images">
<el-image
v-for="(img, index) in record.images"
:key="index"
:src="img"
:preview-src-list="record.images">
</el-image>
</div>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</template>
缓存策略:使用Redis缓存热门博客和用户信息,减少数据库压力。
静态资源CDN:将图片、CSS、JS等静态资源上传到CDN,加快加载速度。
数据库索引:为常用查询字段添加索引,如博客表的category_id和user_id。
前端懒加载:图片和长列表采用懒加载技术,提升首屏渲染速度。
XSS防护:前端使用vue-sanitize过滤HTML,后端对用户输入进行转义处理。
CSRF防护:虽然采用JWT认证,但仍添加了CSRF Token双重保护。
SQL注入防护:MyBatis Plus使用预编译语句,避免拼接SQL字符串。
API限流:使用Guava RateLimiter对登录等敏感接口进行限流,防止暴力破解。
系统采用Docker容器化部署,主要包含以下服务:
Nginx:作为反向代理和负载均衡,处理静态资源请求。
Spring Boot应用:运行业务逻辑,通过多实例实现高可用。
MySQL数据库:使用主从复制保证数据安全。
Redis:缓存服务和会话存储。
部署脚本示例:
bash复制# 启动MySQL容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
# 启动Redis容器
docker run --name redis -p 6379:6379 -d redis
# 构建Spring Boot应用镜像
docker build -t blog-system .
# 启动应用容器
docker run --name blog -p 8080:8080 --link mysql:mysql --link redis:redis -d blog-system
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
properties复制spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/blog?useSSL=false&serverTimezone=Asia/Shanghai
java复制@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.blog.controller"))
.paths(PathSelectors.any())
.build();
}
}
java复制private static final Logger logger = LoggerFactory.getLogger(UserController.class);
public Result login(User user) {
logger.debug("登录请求: {}", user.getUsername());
try {
// 登录逻辑
} catch (Exception e) {
logger.error("登录异常", e);
throw e;
}
}
java复制public class DateUtils {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String formatDate(Date date) {
return date == null ? "" : sdf.format(date);
}
public static Date parseDate(String str) {
try {
return str == null ? null : sdf.parse(str);
} catch (ParseException e) {
return null;
}
}
}
这个博客系统虽然已经实现了基本功能,但仍有不少可以扩展的方向:
社交功能:增加关注、私信、点赞互动等功能,提升用户粘性。
数据分析:集成Google Analytics或自建统计系统,分析用户行为和内容受欢迎程度。
SEO优化:为博客内容生成SEO友好的URL和元标签,提高搜索引擎排名。
多端适配:开发微信小程序、APP等客户端,覆盖更多用户场景。
内容推荐:基于用户浏览历史和标签,实现个性化内容推荐。
第三方登录:集成微信、微博等社交账号登录,降低注册门槛。
实现这些扩展功能时,建议采用渐进式开发策略,先做MVP验证需求,再逐步完善细节。同时要注意保持代码的可维护性,为后续迭代留下空间。