1. 项目概述
作为一名拥有多年全栈开发经验的工程师,我最近完成了一个基于SpringBoot的个人网站项目。这个项目不仅满足了我个人展示的需求,也让我深入实践了现代Web开发的完整流程。个人网站已经成为数字时代个人品牌建设的重要工具,无论是求职展示、作品集呈现还是知识分享,一个专业的个人网站都能带来显著优势。
这个项目采用前后端分离架构,后端使用SpringBoot框架,前端采用Thymeleaf模板引擎结合Vue.js,数据库选用MySQL。整个开发周期约两个月,从需求分析到最终部署上线,涵盖了完整的软件开发流程。下面我将详细分享这个项目的技术实现细节和开发经验。
2. 技术选型与架构设计
2.1 后端技术栈
SpringBoot是我选择的核心框架,版本为2.7.3。选择SpringBoot主要基于以下几个考虑:
- 快速开发:自动配置和起步依赖大大减少了样板代码
- 生态丰富:拥有庞大的社区支持和成熟的解决方案
- 易于集成:与MyBatis、Redis等常用技术无缝集成
数据库方面,MySQL 8.0提供了良好的性能和可靠性。考虑到个人网站的数据量不会太大,但需要频繁的读写操作,我做了以下优化:
- 使用InnoDB引擎保证事务完整性
- 为常用查询字段建立合适索引
- 采用UTF8MB4字符集支持完整emoji
2.2 前端技术方案
前端采用Thymeleaf+HTML5+CSS3+JavaScript的基础组合,同时引入Vue.js 2.6实现部分页面的动态交互。这种混合方案的选择基于:
- Thymeleaf可以方便地与SpringBoot集成,简化模板渲染
- Vue.js为需要复杂交互的页面提供响应式支持
- Element UI组件库加速了管理后台的开发
响应式设计采用Bootstrap 5的栅格系统实现,确保在手机、平板和桌面设备上都能良好显示。CSS预处理使用Sass,提高了样式代码的可维护性。
3. 核心功能实现
3.1 用户系统设计
用户模块采用经典的RBAC(基于角色的访问控制)模型,分为普通用户和管理员两种角色。密码存储使用BCrypt加密算法,这是目前最安全的密码哈希算法之一。
java复制// 用户注册核心代码
@PostMapping("/register")
public ResponseEntity<?> register(@Valid @RequestBody UserRegisterDTO dto) {
if(userRepository.existsByUsername(dto.getUsername())) {
return ResponseEntity.badRequest().body("用户名已存在");
}
User user = new User();
user.setUsername(dto.getUsername());
user.setPassword(passwordEncoder.encode(dto.getPassword()));
user.setEmail(dto.getEmail());
user.setRole(Role.USER);
userRepository.save(user);
return ResponseEntity.ok("注册成功");
}
3.2 博客模块实现
博客系统支持Markdown格式的内容编辑,前端使用Editor.md作为编辑器。为提高性能,我实现了:
- 文章内容分表存储
- Redis缓存热门文章
- 懒加载评论列表
数据库设计方面,采用多表关联:
- 文章表(article)存储基本信息
- 文章内容表(article_content)存储大文本
- 分类表(category)支持多级分类
- 标签表(tag)实现灵活的内容标记
3.3 相册功能优化
相册模块支持多图片上传和相册分类。为提高用户体验,我实现了:
- 图片压缩:使用Thumbnailator在服务端生成缩略图
- 懒加载:滚动到可视区域再加载图片
- 瀑布流布局:适应不同尺寸的图片
图片存储采用本地文件系统+CDN的方案,核心上传代码如下:
java复制@PostMapping("/upload")
public ResponseEntity<UploadResult> uploadImage(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResponseEntity.badRequest().build();
}
String originalFilename = file.getOriginalFilename();
String fileExtension = FilenameUtils.getExtension(originalFilename);
String newFilename = UUID.randomUUID() + "." + fileExtension;
Path path = Paths.get(uploadDir, newFilename);
try {
Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
// 生成缩略图
Thumbnails.of(path.toFile())
.size(300, 300)
.toFile(Paths.get(uploadDir, "thumb_" + newFilename).toFile());
return ResponseEntity.ok(new UploadResult(newFilename));
} catch (IOException e) {
log.error("文件上传失败", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
4. 性能优化实践
4.1 数据库优化
通过EXPLAIN分析慢查询,我优化了几个关键点:
- 为常用查询条件添加复合索引
- 避免SELECT *,只查询必要字段
- 合理使用JOIN,避免笛卡尔积
- 对大文本字段进行分表存储
4.2 缓存策略
使用Redis作为缓存层,主要缓存:
- 首页内容(有效期5分钟)
- 热门文章列表(每日更新)
- 用户会话信息(30分钟过期)
缓存更新采用"先更新数据库,再删除缓存"的策略,避免缓存一致性问题。
4.3 前端性能优化
- 静态资源合并与压缩:使用Webpack打包JS/CSS
- 图片懒加载:Intersection Observer API实现
- 异步加载非关键资源:defer和async属性
- 服务端渲染首屏内容,提高SEO
5. 安全防护措施
5.1 常见攻击防护
- SQL注入:使用预编译语句(MyBatis默认支持)
- XSS攻击:对用户输入进行转义处理
- CSRF防护:Spring Security默认启用
- 文件上传:限制文件类型和大小
5.2 安全配置
Spring Security配置核心代码:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/")
.and()
.logout()
.logoutSuccessUrl("/")
.and()
.rememberMe()
.tokenValiditySeconds(86400)
.and()
.csrf().disable(); // 仅限API关闭,生产环境应开启
}
}
6. 部署与运维
6.1 服务器环境
项目部署在阿里云ECS上,配置为:
- CPU: 2核
- 内存: 4GB
- 系统: Ubuntu 20.04 LTS
- JDK: OpenJDK 11
6.2 持续集成
使用GitHub Actions实现CI/CD流程:
- 代码推送触发构建
- 运行单元测试
- 构建Docker镜像
- 部署到测试环境
- 人工确认后发布生产
6.3 监控方案
- Spring Boot Actuator提供健康检查
- Prometheus + Grafana监控系统指标
- ELK收集和分析日志
- 自定义异常报警机制
7. 开发经验总结
7.1 技术决策反思
在技术选型上,有几点值得反思:
- Thymeleaf+Vue.js的混合模式虽然灵活,但也增加了复杂度
- 初期数据库设计考虑不够全面,后期修改表结构代价较大
- 缓存策略可以更精细化,按内容类型设置不同过期时间
7.2 性能优化建议
对于类似项目,我建议:
- 尽早引入性能监控,不要等问题出现
- 数据库设计要预留扩展空间
- 前端资源要合理分块,避免单一文件过大
- 静态资源一定要走CDN
7.3 项目扩展方向
这个个人网站未来可以考虑:
- 增加多语言支持
- 实现内容协同编辑功能
- 接入第三方登录(GitHub、微信等)
- 开发移动端APP版本
整个项目开发过程中,我深刻体会到全栈开发的挑战与乐趣。从数据库设计到前端交互,从安全防护到性能优化,每个环节都需要仔细考量。这个项目不仅提升了我的技术水平,也让我对软件工程有了更全面的认识。