Skip to content

后端快速开始

快速了解后端项目结构和开发流程。

项目结构

vben-boot/
├── vben-admin/          # 核心业务模块(主启动模块)
├── vben-common/         # 公共模块(工具类、注解等)
├── vben-system/         # 系统管理模块
├── vben-generator/      # 代码生成模块
├── vben-quartz/         # 定时任务模块
├── sql/                 # 数据库脚本
└── pom.xml             # 主 POM 文件

技术栈

  • Spring Boot 3.2.5 - 核心框架
  • MyBatis-Plus 3.5.6 - ORM 框架
  • Sa-Token 1.38.0 - 权限认证
  • EasyExcel 3.3.4 - Excel 处理
  • Redis - 缓存和分布式锁
  • Hutool - 工具类库
  • Lombok - 简化代码
  • Swagger - API 文档

快速开始

1. 环境准备

确保已安装:

  • JDK 17+
  • Maven 3.8+
  • MySQL 5.7+
  • Redis 6.0+

2. 数据库初始化

bash
# 创建数据库
CREATE DATABASE vben_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 导入 SQL 脚本
# 执行 sql/common_vben_sql.sql
# 执行 sql/sys_region.sql

3. 配置文件

编辑 vben-admin/src/main/resources/application.yml

yaml
spring:
  # 数据源配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/vben_admin?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: your_password
  
  # Redis 配置
  redis:
    host: localhost
    port: 6379
    password: 
    database: 0
    timeout: 5000
    lettuce:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0

# MyBatis-Plus 配置
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  type-aliases-package: com.vben.**.entity
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# Sa-Token 配置
sa-token:
  token-name: Authorization
  timeout: 2592000
  activity-timeout: -1
  is-concurrent: true
  is-share: true
  token-style: uuid
  is-log: false

4. 启动项目

bash
cd vben-boot/vben-admin
mvn spring-boot:run
bash
# 使用 IDEA 或 Eclipse
# 运行 VbenApplication.java
bash
mvn clean package -DskipTests
java -jar target/vben-admin.jar

启动成功后访问:

开发流程

1. 创建实体类

java
package com.vben.system.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("sys_user")
public class User {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String username;
    
    private String password;
    
    private String nickname;
    
    private String phone;
    
    private String email;
    
    private Integer status;
    
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    
    @TableLogic
    private Integer deleted;
}

2. 创建 Mapper

java
package com.vben.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vben.system.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 继承 BaseMapper 即可使用基础 CRUD
    // 可以添加自定义方法
}

3. 创建 Service

java
package com.vben.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.vben.system.entity.User;

public interface UserService extends IService<User> {
    // 自定义业务方法
    User getUserByUsername(String username);
}
java
package com.vben.system.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vben.system.entity.User;
import com.vben.system.mapper.UserMapper;
import com.vben.system.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    
    @Override
    public User getUserByUsername(String username) {
        return lambdaQuery()
            .eq(User::getUsername, username)
            .one();
    }
}

4. 创建 Controller

java
package com.vben.system.controller;

import com.vben.common.result.R;
import com.vben.system.entity.User;
import com.vben.system.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "用户管理")
@RestController
@RequestMapping("/api/system/user")
@RequiredArgsConstructor
public class UserController {
    
    private final UserService userService;
    
    @Operation(summary = "用户列表")
    @GetMapping("/list")
    public R<List<User>> list() {
        return R.ok(userService.list());
    }
    
    @Operation(summary = "用户详情")
    @GetMapping("/{id}")
    public R<User> getById(@PathVariable Long id) {
        return R.ok(userService.getById(id));
    }
    
    @Operation(summary = "新增用户")
    @PostMapping
    public R<Void> save(@RequestBody User user) {
        userService.save(user);
        return R.ok();
    }
    
    @Operation(summary = "更新用户")
    @PutMapping
    public R<Void> update(@RequestBody User user) {
        userService.updateById(user);
        return R.ok();
    }
    
    @Operation(summary = "删除用户")
    @DeleteMapping("/{id}")
    public R<Void> delete(@PathVariable Long id) {
        userService.removeById(id);
        return R.ok();
    }
}

常用功能

分页查询

java
@GetMapping("/page")
public R<Page<User>> page(@RequestParam(defaultValue = "1") Integer current,
                          @RequestParam(defaultValue = "10") Integer size) {
    Page<User> page = new Page<>(current, size);
    return R.ok(userService.page(page));
}

条件查询

java
@GetMapping("/search")
public R<List<User>> search(@RequestParam String keyword) {
    List<User> users = userService.lambdaQuery()
        .like(User::getUsername, keyword)
        .or()
        .like(User::getNickname, keyword)
        .list();
    return R.ok(users);
}

批量操作

java
@PostMapping("/batch")
public R<Void> batchSave(@RequestBody List<User> users) {
    userService.saveBatch(users);
    return R.ok();
}

@DeleteMapping("/batch")
public R<Void> batchDelete(@RequestBody List<Long> ids) {
    userService.removeByIds(ids);
    return R.ok();
}

事务处理

java
@Transactional(rollbackFor = Exception.class)
@PostMapping("/register")
public R<Void> register(@RequestBody User user) {
    // 保存用户
    userService.save(user);
    
    // 分配默认角色
    userRoleService.saveUserRole(user.getId(), defaultRoleId);
    
    return R.ok();
}

统一返回结果

java
package com.vben.common.result;

import lombok.Data;

@Data
public class R<T> {
    private Integer code;
    private String message;
    private T data;
    
    public static <T> R<T> ok() {
        return ok(null);
    }
    
    public static <T> R<T> ok(T data) {
        R<T> r = new R<>();
        r.setCode(200);
        r.setMessage("success");
        r.setData(data);
        return r;
    }
    
    public static <T> R<T> fail(String message) {
        R<T> r = new R<>();
        r.setCode(500);
        r.setMessage(message);
        return r;
    }
}

统一异常处理

java
package com.vben.common.exception;

import com.vben.common.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(BusinessException.class)
    public R<Void> handleBusinessException(BusinessException e) {
        log.error("业务异常:{}", e.getMessage());
        return R.fail(e.getMessage());
    }
    
    @ExceptionHandler(Exception.class)
    public R<Void> handleException(Exception e) {
        log.error("系统异常:", e);
        return R.fail("系统异常,请联系管理员");
    }
}

配置文件说明

application.yml

主配置文件,包含数据源、Redis、MyBatis-Plus 等配置。

application-dev.yml

开发环境配置:

yaml
server:
  port: 8080

logging:
  level:
    com.vben: debug

application-prod.yml

生产环境配置:

yaml
server:
  port: 8080

logging:
  level:
    com.vben: info
  file:
    name: logs/vben-admin.log

常用注解

MyBatis-Plus 注解

  • @TableName - 指定表名
  • @TableId - 指定主键
  • @TableField - 指定字段
  • @TableLogic - 逻辑删除

Sa-Token 注解

  • @SaCheckLogin - 登录校验
  • @SaCheckRole - 角色校验
  • @SaCheckPermission - 权限校验

自定义注解

  • @RateLimit - 限流
  • @Desensitize - 脱敏
  • @DataPermission - 数据权限

开发建议

最佳实践

  1. 使用 Lombok 简化代码
  2. 使用 MyBatis-Plus 的 Lambda 查询
  3. 合理使用缓存提高性能
  4. 添加适当的日志记录
  5. 编写单元测试
  6. 使用 Swagger 生成 API 文档

注意事项

  1. 敏感信息不要硬编码
  2. 数据库连接池合理配置
  3. 事务范围不要过大
  4. 避免 N+1 查询问题
  5. 注意 SQL 注入防护

下一步

相关链接

MIT License