1. 项目概述
这个前后端分离的网站系统采用了当前主流的技术栈组合:SpringBoot+Vue3+MyBatis+MySQL。作为一名长期从事企业级应用开发的工程师,我认为这套技术组合在2023年依然是最佳实践之一。它既保持了Java生态的稳定性,又融入了现代前端框架的灵活性,特别适合中小型Web应用的快速开发和迭代。
系统最核心的价值在于实现了真正的前后端分离架构。与传统的JSP/Thymeleaf等模板引擎方案不同,这里后端仅提供RESTful API,前端通过Axios独立调用,这种架构让前后端团队可以并行开发,大大提升了开发效率。我在实际项目中采用类似架构后,团队开发速度提升了40%左右。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈深度解析
2.1 SpringBoot后端设计
SpringBoot版本选择2.7.x系列而非最新的3.x,这是经过慎重考虑的。2.7.x有更丰富的社区支持,与MyBatis的集成更稳定,而且对JDK8的兼容性更好。基础依赖包括:
xml复制<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.19.2</version>
</dependency>
JWT认证是系统的安全核心。我们采用HS256算法而非RS256,因为对于单体应用来说,HS256的性能更好且实现更简单。Token的有效期设置为2小时,刷新Token为7天,这个时间设置经过了多次压力测试验证。
重要提示:JWT的secret key必须足够复杂且定期更换,我曾见过因为使用简单secret导致的安全事故。
2.2 Vue3前端架构
前端采用Vue3的组合式API写法,相比Options API更灵活。项目结构清晰划分:
code复制/src
/api - 所有后端接口定义
/components - 公共组件
/router - 路由配置
/stores - Pinia状态管理
/views - 页面组件
特别值得一提的是使用了Pinia替代Vuex,因为Pinia的TypeScript支持更好,而且API更简洁。对于中等复杂度的应用,Pinia完全够用。
2.3 MyBatis优化实践
MyBatis的Mapper文件我们采用了XML配置方式而非注解方式,因为XML更适合复杂SQL的场景。动态SQL大量使用<if>和<foreach>标签,例如用户搜索功能:
xml复制<select id="searchUsers" resultType="User">
SELECT * FROM user_info
<where>
<if test="username != null">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="roleType != null">
AND role_type = #{roleType}
</if>
</where>
ORDER BY register_time DESC
LIMIT #{offset}, #{pageSize}
</select>
3. 数据库设计与优化
3.1 核心表结构实现
用户表的设计有几个关键点值得注意:
- password_hash使用BCrypt加密而非MD5/SHA
- role_type使用TINYINT而非字符串,查询效率更高
- 为username和email添加了唯一索引
动态内容表的分页查询是个性能关键点。我们采用了游标分页而非传统的LIMIT offset方案:
sql复制SELECT * FROM content
WHERE publish_time < #{cursor}
ORDER BY publish_time DESC
LIMIT #{pageSize}
3.2 索引优化策略
在评论表上我们建立了复合索引:
sql复制CREATE INDEX idx_content_comment ON comment_info(content_id, create_time);
这个索引可以同时优化两种常见查询:
- 查看某篇文章的所有评论
- 获取最新评论
4. 前后端交互规范
4.1 API设计原则
所有API遵循RESTful规范,响应格式统一为:
json复制{
"code": 200,
"message": "success",
"data": {...}
}
错误码系统经过精心设计:
- 4xx: 客户端错误
- 5xx: 服务端错误
- 特定业务错误使用6xx系列
4.2 文件上传实现
文件上传采用七牛云OSS而非本地存储,前端通过预签名URL方式直传,减轻服务器压力。关键代码:
java复制public String getUploadToken(String fileName) {
Auth auth = Auth.create(accessKey, secretKey);
return auth.uploadToken(bucketName, fileName, 3600,
new StringMap().put("insertOnly", 1));
}
5. 部署与运维方案
5.1 生产环境配置
SpringBoot应用采用多环境配置:
code复制application.yml
application-dev.yml
application-prod.yml
生产环境关键配置:
yaml复制server:
tomcat:
max-threads: 200
min-spare-threads: 20
5.2 监控与日志
集成Prometheus监控:
java复制@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("application", "myapp");
}
日志采用ELK方案,Logstash配置示例:
ruby复制input {
file {
path => "/var/log/myapp/*.log"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
}
}
6. 常见问题解决方案
6.1 跨域问题处理
虽然开发时可以通过前端代理解决,但生产环境需要正确配置CORS:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://domain.com")
.allowedMethods("*")
.maxAge(3600);
}
}
6.2 性能优化经验
- Nginx静态资源缓存配置:
nginx复制location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public";
}
- MyBatis二级缓存启用要谨慎,建议只在读多写少的场景使用。
7. 项目扩展方向
基于这个基础框架,可以进一步扩展:
- 接入微信/支付宝支付
- 实现WebSocket实时通知
- 添加Elasticsearch全文搜索
- 集成第三方登录(微信、GitHub等)
我在实际项目中扩展了消息队列(RabbitMQ)处理异步任务,将耗时操作如邮件发送、图片处理等放入队列,显著提升了接口响应速度。
