后端快速开始
快速了解后端项目结构和开发流程。
项目结构
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.sql3. 配置文件
编辑 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: false4. 启动项目
bash
cd vben-boot/vben-admin
mvn spring-boot:runbash
# 使用 IDEA 或 Eclipse
# 运行 VbenApplication.javabash
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: debugapplication-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- 数据权限
开发建议
最佳实践
- 使用 Lombok 简化代码
- 使用 MyBatis-Plus 的 Lambda 查询
- 合理使用缓存提高性能
- 添加适当的日志记录
- 编写单元测试
- 使用 Swagger 生成 API 文档
注意事项
- 敏感信息不要硬编码
- 数据库连接池合理配置
- 事务范围不要过大
- 避免 N+1 查询问题
- 注意 SQL 注入防护