SpringBoot2+Vue3+MyBatis-Plus构建图书管理系统实战

1. 项目技术栈解析与选型考量

这套图书管理系统采用了当前Java Web开发中最主流的技术组合:SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0。这种技术选型不是偶然的,而是经过实际项目验证的黄金组合。

后端选择Spring Boot 2.x而非3.x版本,主要考虑到企业环境的稳定性需求。虽然Spring Boot 3.x已经发布,但很多企业级组件(如某些安全框架)的兼容性仍在完善中。Spring Boot 2.7.x作为长期支持版本,具有以下实战优势:

  • 自动配置机制大幅减少了XML配置,一个基础的REST控制器只需3个注解即可运行
  • 内嵌Tomcat服务器使得部署异常简单,打包成单一JAR文件即可运行
  • Actuator端点提供/health、/metrics等监控接口,方便运维
  • 与MyBatis-Plus的starter完美集成,几乎零配置即可使用CRUD接口

前端选用Vue 3的组合式API,相比选项式API有显著优势:

javascript复制// 组合式API示例 - 图书列表功能
import { ref, onMounted } from 'vue'
import { getBookList } from '@/api/book'

export default {
  setup() {
    const books = ref([])
    const loading = ref(false)
    
    const fetchData = async () => {
      loading.value = true
      try {
        books.value = await getBookList()
      } finally {
        loading.value = false
      }
    }
    
    onMounted(fetchData)
    
    return { books, loading }
  }
}

这种写法将相关逻辑集中在一起,比分散在data/methods中的代码更易维护。

数据库层采用MySQL 8.0而非5.7,主要看中其:

  • 窗口函数等高级SQL特性
  • JSON字段类型的完善支持
  • 性能提升(官方基准测试显示8.0比5.7快2倍)
  • 更好的Unicode支持(默认utf8mb4字符集)

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 系统架构设计与核心模块

2.1 分层架构实现

系统采用经典的三层架构,但每层都有现代框架的优化实现:

表现层:

  • Vue 3处理视图渲染
  • Axios封装了RESTful API调用
  • Vue Router管理前端路由
  • Pinia替代Vuex进行状态管理

业务逻辑层:

  • Spring Boot控制器使用@RestController注解
  • 服务层采用接口+实现类的模式
  • 自定义异常处理(@ControllerAdvice)
  • 参数校验(Hibernate Validator)

数据访问层:

  • MyBatis-Plus通用Mapper实现基础CRUD
  • 动态SQL通过@SelectProvider实现
  • 分页插件自动处理PageHelper转换

2.2 关键业务流程实现

以图书借阅流程为例,展示多模块协作:

  1. 前端Vue组件触发借阅动作:
javascript复制const handleBorrow = async (bookId) => {
  await borrowBook({ 
    bookId,
    userId: store.user.id 
  })
  await fetchBookList() // 刷新列表
}
  1. 后端Spring Boot控制器处理请求:
java复制@PostMapping("/borrow")
public R borrow(@Valid @RequestBody BorrowDTO dto) {
    Book book = bookService.getById(dto.getBookId());
    if (book.getStock() <= 0) {
        throw new BusinessException("该图书已无库存");
    }
    return R.ok(borrowService.createBorrow(dto));
}
  1. MyBatis-Plus执行库存扣减:
java复制public boolean deductStock(Long bookId) {
    return update(new UpdateWrapper<Book>()
        .setSql("stock = stock - 1")
        .eq("id", bookId)
        .gt("stock", 0));
}

这种设计保证了:

  • 前端轻量化,只负责数据展示和用户交互
  • 业务逻辑集中在服务层,便于单元测试
  • 数据访问通过Mapper接口,与具体实现解耦

3. 关键技术实现细节

3.1 MyBatis-Plus高级应用

项目充分利用了MyBatis-Plus的特性来简化开发:

  1. 自动填充功能处理创建/更新时间:
java复制@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
  1. 逻辑删除配置:
yaml复制mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-not-delete-value: 0
      logic-delete-value: 1
  1. 多租户SQL解析器(适用于SaaS场景):
java复制public class TenantSqlParser implements ISqlParser {
    @Override
    public SqlInfo processParser(TableName tableName, String sql) {
        if (!"sys_tenant".equals(tableName.getTableName())) {
            String newSql = sql + " WHERE tenant_id = " + getTenantId();
            return SqlInfo.newInstance().setSql(newSql);
        }
        return null;
    }
}

3.2 Vue3组合式API实践

前端采用