这个前后端分离的网站系统采用了当前主流的技术栈组合:SpringBoot+Vue3+MyBatis+MySQL。作为一名长期从事企业级应用开发的工程师,我认为这套技术组合在2023年依然是最佳实践之一。它既保持了Java生态的稳定性,又融入了现代前端框架的灵活性,特别适合中小型Web应用的快速开发和迭代。
系统最核心的价值在于实现了真正的前后端分离架构。与传统的JSP/Thymeleaf等模板引擎方案不同,这里后端仅提供RESTful API,前端通过Axios独立调用,这种架构让前后端团队可以并行开发,大大提升了开发效率。我在实际项目中采用类似架构后,团队开发速度提升了40%左右。
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导致的安全事故。
前端采用Vue3的组合式API写法,相比Options API更灵活。项目结构清晰划分:
code复制/src
/api - 所有后端接口定义
/components - 公共组件
/router - 路由配置
/stores - Pinia状态管理
/views - 页面组件
特别值得一提的是使用了Pinia替代Vuex,因为Pinia的TypeScript支持更好,而且API更简洁。对于中等复杂度的应用,Pinia完全够用。
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>
用户表的设计有几个关键点值得注意:
动态内容表的分页查询是个性能关键点。我们采用了游标分页而非传统的LIMIT offset方案:
sql复制SELECT * FROM content
WHERE publish_time < #{cursor}
ORDER BY publish_time DESC
LIMIT #{pageSize}
在评论表上我们建立了复合索引:
sql复制CREATE INDEX idx_content_comment ON comment_info(content_id, create_time);
这个索引可以同时优化两种常见查询:
所有API遵循RESTful规范,响应格式统一为:
json复制{
"code": 200,
"message": "success",
"data": {...}
}
错误码系统经过精心设计:
文件上传采用七牛云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));
}
SpringBoot应用采用多环境配置:
code复制application.yml
application-dev.yml
application-prod.yml
生产环境关键配置:
yaml复制server:
tomcat:
max-threads: 200
min-spare-threads: 20
集成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}" }
}
}
虽然开发时可以通过前端代理解决,但生产环境需要正确配置CORS:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://domain.com")
.allowedMethods("*")
.maxAge(3600);
}
}
nginx复制location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public";
}
基于这个基础框架,可以进一步扩展:
我在实际项目中扩展了消息队列(RabbitMQ)处理异步任务,将耗时操作如邮件发送、图片处理等放入队列,显著提升了接口响应速度。