1. 项目背景与技术选型
光影管理系统是一个典型的Web应用项目,需要同时处理前端展示与后端业务逻辑。选择SpringBoot+Vue的技术栈组合,主要基于以下几个实际考量:
后端选择SpringBoot框架的核心优势在于其"约定优于配置"的理念。我在实际项目中发现,相比传统Spring MVC,SpringBoot可以节省约60%的XML配置时间。特别是在处理数据库连接池、事务管理等基础组件时,starter依赖能自动完成大部分初始化工作。例如,只需引入spring-boot-starter-data-jpa依赖,就自动配置了HikariCP连接池和JPA基础环境。
MyBatis作为持久层框架,在复杂SQL场景下比JPA更灵活。最近一个库存管理项目中,我们遇到需要动态拼接多表关联查询的需求,MyBatis的XML映射文件配合动态SQL标签,比JPA的Criteria API可读性更好。MySQL作为关系型数据库,在事务一致性和复杂查询性能上表现稳定,社区资源丰富,遇到问题容易找到解决方案。
前端选用Vue.js主要考虑其渐进式特性和响应式数据绑定。在最近开发的CMS系统中,Vue的单文件组件(SFC)模式让前端团队可以并行开发不同功能模块。Element UI组件库提供了现成的表格、表单等业务组件,比从零开发节省至少40%的前端工时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 前后端分离架构
采用前后端分离模式,后端提供RESTful API,前端通过axios发起HTTP请求。这种架构的优势在于:
- 开发解耦:前后端可以并行开发,只需约定好API接口规范
- 部署独立:前端静态资源可部署在Nginx,后端服务可集群部署
- 技术栈灵活:未来可替换前端框架而不影响后端逻辑
实际项目中我们使用Swagger UI维护API文档,通过YAPI平台进行接口Mock。一个经验教训是:字段命名风格要前后端统一,我们曾因前端使用camelCase而后端用snake_case导致不必要的转换逻辑。
2.2 后端分层设计
典型的四层架构:
code复制controller(接口层)
↓
service(业务逻辑层)
↓
repository(数据访问层)
↓
model(实体层)
在光影管理系统中,特别要注意事务边界的划分。例如处理图片上传记录时,文件存储操作(非事务性)应该与数据库记录操作(事务性)分离。我们采用如下结构:
java复制@Transactional
public void saveImage(ImageDTO dto) {
// 1. 保存文件到OSS(非事务)
String url = ossService.upload(dto.getFile());
// 2. 保存记录到数据库(事务)
Image image = convertToEntity(dto);
image.setUrl(url);
imageRepository.save(image);
}
3. 关键技术实现
3.1 SpringBoot后端实现
3.1.1 自动配置原理
SpringBoot的自动配置通过@EnableAutoConfiguration实现。以数据库配置为例,当classpath存在DataSource类时,会自动配置Hikari连接池。我们可以通过application.yml自定义参数:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/light_db?useSSL=false
username: root
password: 123456
hikari:
maximum-pool-size: 20
connection-timeout: 30000
3.1.2 MyBatis集成
需要添加依赖:
xml复制<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
Mapper接口建议添加@Repository注解,避免IDEA误报注入警告。动态SQL示例:
xml复制<select id="selectByCondition" resultType="Image">
SELECT * FROM t_image
<where>
<if test="name != null">
AND name LIKE CONCAT('%',#{name},'%')
</if>
<if test="category != null">
AND category = #{category}
</if>
</where>
ORDER BY create_time DESC
</select>
3.2 Vue前端实现
3.2.1 项目初始化
使用Vue CLI创建项目:
bash复制vue create light-manage-frontend
添加Element UI:
bash复制vue add element-plus
3.2.2 核心页面实现
图片列表组件关键代码:
vue复制<template>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="name" label="图片名称" width="180" />
<el-table-column prop="category" label="分类" width="180" />
<el-table-column prop="createTime" label="上传时间" />
<el-table-column label="操作">
<template #default="scope">
<el-button size="small" @click="handlePreview(scope.row)"
>预览</el-button
>
</template>
</el-table-column>
</el-table>
</template>
<script>
import { getImageList } from '@/api/image'
export default {
data() {
return {
tableData: []
}
},
created() {
this.fetchData()
},
methods: {
async fetchData() {
try {
const res = await getImageList()
this.tableData = res.data
} catch (error) {
console.error(error)
}
}
}
}
</script>
4. 开发中的典型问题与解决方案
4.1 跨域问题
开发环境常见跨域问题,解决方案:
- 后端配置CORS(推荐):
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
- 前端配置代理(开发环境):
js复制// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
4.2 文件上传大小限制
SpringBoot默认文件上传限制为1MB,需要调整:
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
前端上传组件实现要点:
vue复制<el-upload
action="/api/upload"
:before-upload="beforeUpload"
:on-success="handleSuccess"
>
<el-button type="primary">点击上传</el-button>
</el-upload>
<script>
export default {
methods: {
beforeUpload(file) {
const isJPG = file.type === 'image/jpeg'
const isLt10M = file.size / 1024 / 1024 < 10
if (!isJPG) {
this.$message.error('只能上传JPG格式图片!')
}
if (!isLt10M) {
this.$message.error('图片大小不能超过10MB!')
}
return isJPG && isLt10M
}
}
}
</script>
5. 项目部署实践
5.1 后端部署
推荐使用Docker部署SpringBoot应用:
dockerfile复制FROM openjdk:11-jre
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
构建并运行:
bash复制docker build -t light-manage .
docker run -d -p 8080:8080 --name light-manage light-manage
5.2 前端部署
生产环境建议使用Nginx:
nginx复制server {
listen 80;
server_name light.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
}
}
6. 性能优化经验
6.1 数据库优化
- 为常用查询字段添加索引:
sql复制ALTER TABLE t_image ADD INDEX idx_category (category);
- MyBatis二级缓存配置:
xml复制<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 在Mapper.xml中 -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
6.2 前端性能优化
- 路由懒加载:
js复制const ImageList = () => import('./views/ImageList.vue')
- 按需引入Element组件:
js复制import { ElButton, ElTable } from 'element-plus'
- 使用webpack分包:
js复制// vue.config.js
configureWebpack: {
optimization: {
splitChunks: {
chunks: 'all'
}
}
}
7. 扩展功能建议
- 图片处理服务:集成Thumbnailator进行缩略图生成
- 权限控制:使用Spring Security实现RBAC模型
- 日志监控:通过ELK收集系统日志
- 消息通知:WebSocket实现实时消息推送
- 数据可视化:ECharts展示图片分类统计
在最近实施的一个类似项目中,我们增加了AI图片标签自动生成功能,使用TensorFlow.js在前端实现简单的图像分类,减少了人工打标签的工作量。这为系统带来了额外的商业价值。
