# LuFramework
**Repository Path**: whiteclouds/luframework
## Basic Information
- **Project Name**: LuFramework
- **Description**: LuFramework
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-06-30
- **Last Updated**: 2026-04-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# LuFramework
企业级领域驱动设计(DDD)框架,助力构建可维护、可扩展的现代化应用
📖 完整文档 ·
快速开始 ·
模块详解
---
## 📖 目录
- [项目简介](#项目简介)
- [核心特性](#核心特性)
- [技术架构](#技术架构)
- [分层架构](#分层架构)
- [模块划分](#模块划分)
- [快速开始](#快速开始)
- [环境要求](#环境要求)
- [添加依赖](#添加依赖)
- [编写第一个API](#编写第一个api)
- [使用分布式锁](#使用分布式锁)
- [领域事件示例](#领域事件示例)
- [模块详解](#模块详解)
- [API层 (framework-api)](#api层-framework-api)
- [应用层 (framework-application)](#应用层-framework-application)
- [领域层 (framework-domain)](#领域层-framework-domain)
- [基础设施层 (framework-infrastructure)](#基础设施层-framework-infrastructure)
- [分布式锁 (tom-lock)](#分布式锁-tom-lock)
- [代码生成器 (framework-generator)](#代码生成器-framework-generator)
- [Spring Boot Starter (framework-spring-boot-starter)](#spring-boot-starter-framework-spring-boot-starter)
- [设计模式与原则](#设计模式与原则)
- [技术栈](#技术栈)
- [开发规范](#开发规范)
- [命名规范](#命名规范)
- [错误处理](#错误处理)
- [日志规范](#日志规范)
- [代码注释](#代码注释)
- [贡献指南](#贡献指南)
- [许可证](#许可证)
---
## 🎯 项目简介
LuFramework(鲁框架)是一个基于**领域驱动设计(DDD)**理念构建的企业级Java开发框架。它采用分层架构和模块化设计,旨在帮助开发者构建可维护、可测试、可扩展的现代化企业应用。
该框架深度整合Spring Boot、MyBatis Plus、Redisson等主流技术栈,提供了完整的DDD实现支持,包括领域实体、聚合根、值对象、领域服务、仓储、领域事件等核心概念。同时内置分布式锁、代码生成器、统一异常处理等实用功能,大幅提高开发效率。
### 适用场景
- ✨ 中大型企业级应用
- 💼 业务逻辑复杂的业务系统
- 🏗️ 需要长期维护和迭代的项目
- 🔒 需要分布式锁和高并发处理的系统
- 📊 数据处理和转换复杂的业务场景
---
## ✨ 核心特性
### 🏗️ 分层架构
- **API层**:处理HTTP请求和响应,参数校验
- **应用层**:编排领域对象,处理事务和应用逻辑
- **领域层**:核心业务逻辑,DDD概念完整实现
- **基础设施层**:数据持久化、缓存、外部服务集成
### 🎯 完整DDD支持
- **聚合根(Aggregate Root)**:业务操作的基本单元
- **实体(Entity)**:具有唯一标识和生命周期的对象
- **值对象(Value Object)**:不可变的描述性对象
- **领域服务(Domain Service)**:跨实体的业务逻辑
- **领域事件(Domain Event)**:发布-订阅的事件驱动机制
- **仓储(Repository)**:聚合的持久化和检索
- **规约(Specification)**:封装业务查询规则
### 🔒 分布式锁
- 基于Redisson的分布式锁实现
- 注解式声明:`@TomLock`, `@XTomLock`
- 支持多种锁模式:方法锁、参数锁、业务签名锁
- 支持SpEL表达式动态计算锁Key
- 可配置超时和过期时间
### 🔧 代码生成器
- 基于MyBatis Plus Generator
- 支持FreeMarker模板
- 自动生成Entity、Mapper、Service、Controller
- 统一仓储配置支持
- 自定义业务签名生成
### 💾 统一数据访问
- MyBatis Plus集成
- 统一仓储模式(UnifiedRepository)
- 多数据源支持
- 数据转换和验证链
- 缓存集成(支持业务签名)
### 📡 事件驱动架构
- 领域事件总线(DomainEventBus)
- 同步/异步事件发布
- 事件重试和修复机制
- 事件存储支持
- 事件调度器
### 🔐 统一响应格式
- 标准化API响应:`ApiResult`
- 统一异常处理
- 全局异常处理器
- 业务异常和系统异常分离
### ⚡ 现代技术栈
- Spring Boot 3.5.8 + Java 21
- MapStruct 对象映射
- Lombok 减少样板代码
- Validation API 参数校验
- MyBatis Plus ORM框架
- Redisson 分布式锁
- Easy-ES Elasticsearch集成
---
## 🏗️ 技术架构
### 分层架构
```
┌─────────────────────────────────────────┐
│ API层 (Presentation) │
│ ┌─────────────────────────────────┐ │
│ │ Controller, Request/Response │ │
│ │ Exception Handling, Validation │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 应用层 (Application) │
│ ┌─────────────────────────────────┐ │
│ │ AppService, Domain Event Pub │ │
│ │ Transaction Management │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 领域层 (Domain) │
│ ┌─────────────────────────────────┐ │
│ │ Aggregate, Entity, ValueObject │ │
│ │ Domain Service, Specification │ │
│ │ Domain Event, Repository IF │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 基础设施层 (Infrastructure) │
│ ┌─────────────────────────────────┐ │
│ │ Repository Impl, Data Access │ │
│ │ Cache, Converter, Lock │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
### 模块依赖关系
```mermaid
graph TD
Starter[framework-spring-boot-starter] --> Api[framework-api]
Starter --> Application[framework-application]
Starter --> Domain[framework-domain]
Starter --> Infrastructure[framework-infrastructure]
Api --> Application
Application --> Domain
Application --> Infrastructure
Domain --> Base[framework-base]
Infrastructure --> Domain
Infrastructure --> Config[framework-config]
Infrastructure --> Constant[framework-constant]
Infrastructure --> Utils[framework-common-utils]
Generator[framework-generator] --> Infrastructure
Generator --> Domain
Generator --> Api
TomLock[tom-lock] --> Utils
TomLock --> Infrastructure
Utils --> Base
Config --> Constant
```
---
## 🚀 快速开始
### 环境要求
- JDK 21或更高版本
- Maven 3.8+
- MySQL 8.0+
- Redis 6.0+(用于分布式锁)
### 添加依赖
在您的Spring Boot项目的`pom.xml`中添加LuFramework依赖:
```xml
com.zijidelu.luframework
framework-spring-boot-starter
1.0-SNAPSHOT
```
### 编写第一个API
#### 1. 定义领域实体(Domain Entity)
```java
package com.yourapp.domain.model.entity;
import com.zijidelu.luframework.domain.model.entity.Entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class Product extends Entity {
private String name;
private BigDecimal price;
private Integer stock;
}
```
#### 2. 创建应用服务(Application Service)
```java
package com.yourapp.application.service;
import com.zijidelu.luframework.application.service.AbstractAppService;
import com.yourapp.domain.model.entity.Product;
import org.springframework.stereotype.Service;
@Service
public class ProductAppService extends AbstractAppService {
@Override
protected void beforeSave(Product product) {
// 保存前的业务校验
if (product.getPrice().compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException("价格不能为负数");
}
}
@Override
protected void afterSave(Product product) {
// 保存后的业务处理
log.info("产品已保存:{}", product.getName());
}
}
```
#### 3. 创建API控制器(API Controller)
```java
package com.yourapp.api.controller;
import com.zijidelu.luframework.api.controller.AbstractCrudController;
import com.yourapp.application.service.ProductAppService;
import com.yourapp.domain.model.entity.Product;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/products")
public class ProductController extends AbstractCrudController {
// CRUD接口已自动实现:
// GET /api/products/query - 查询列表
// GET /api/products/{id} - 查询详情
// POST /api/products/save - 保存数据
// POST /api/products/update - 更新数据
// POST /api/products/deleteByIds - 删除数据
}
```
#### 4. 配置数据源
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/yourdb?useUnicode=true&characterEncoding=utf8
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
```
### 使用分布式锁
#### 方式一:简单注解(基于SpEL表达式)
```java
@Service
public class OrderService {
@TomLock(
desc = "锁定用户订单操作",
domain = "order",
business = "create",
paramExpression = {"#userId", "#orderType"},
timeout = 5000L,
expire = 30000L
)
public void createOrder(Long userId, String orderType, OrderDTO orderDTO) {
// 业务逻辑
// 自动对userId和orderType加锁
}
}
```
#### 方式二:高级注解(方法锁模式)
```java
@Service
public class PaymentService {
@XTomLock(
desc = "支付确认操作锁",
mode = LockMode.METHOD,
expire = 60000L
)
public void confirmPayment(PaymentContext context) {
// 整个方法加锁,基于方法签名
}
}
```
#### 方式三:业务对象锁
```java
@Service
public class InventoryService {
@XTomLock(
desc = "扣减库存锁",
mode = LockMode.METHOD_ARGS
)
public void deductStock(@TomLockParam(resolvers = ProductResolver.class) DeductRequest request) {
// 根据ProductResolver解析的逻辑锁Key进行加锁
}
}
```
### 领域事件示例
#### 1. 定义领域事件
```java
public class OrderCreatedEvent extends AbstractDomainEvent {
private final Long orderId;
private final Long userId;
public OrderCreatedEvent(Long orderId, Long userId) {
super("ORDER_CREATED");
this.orderId = orderId;
this.userId = userId;
}
}
```
#### 2. 创建事件处理器
```java
@Component
public class OrderCreatedHandler implements DomainEventHandler {
@Override
public void handle(OrderCreatedEvent event) {
// 发送通知
notificationService.sendOrderConfirmation(event.getUserId(), event.getOrderId());
// 更新统计
statisticsService.incrementOrderCount();
}
}
```
#### 3. 发布领域事件
```java
@Service
public class OrderAppService extends AbstractAppService {
@Autowired
private DomainEventBus eventBus;
@Override
@Transactional
public boolean save(List orders) {
boolean result = super.save(orders);
// 发布领域事件
orders.forEach(order -> {
eventBus.publish(new OrderCreatedEvent(order.getId(), order.getUserId()));
});
return result;
}
}
```
---
## 📦 模块详解
### API层 (framework-api)
**职责**:处理HTTP请求和响应,参数校验,提供RESTful API接口
**核心组件**:
```java
// 基础控制器
public abstract class AbstractCrudController {
// 提供完整的CRUD接口实现
// - query: 分页查询
// - getById: 根据ID查询
// - save: 保存数据
// - update: 更新数据
// - deleteByIds: 批量删除
}
// 命令控制器(CUD操作)
public interface CommandController {
ApiResult save(ApiRequest> request);
ApiResult update(ApiRequest> request);
ApiResult deleteByIds(ApiRequest> ids);
}
// 查询控制器(查询操作)
public interface QueryController {
ApiResult getById(Long id);
ApiResult> query(ApiRequest> request);
}
```
**特点**:
- 统一响应格式:`ApiResult`
- 全局异常处理器:`DefaultExceptionHandler`, `ControllerExceptionHandler`
- 自动数据转换:请求DTO ↔ 领域实体 ↔ 响应VO
- 内置分页查询支持
- 参数校验集成(Hibernate Validator)
### 应用层 (framework-application)
**职责**:编排领域对象,处理事务边界,发布领域事件
**核心组件**:
```java
// 应用服务接口
public interface AppService {
boolean save(List modelList);
boolean update(List modelList);
boolean deleteById(Collection ids);
}
// 抽象实现,提供生命周期钩子
public abstract class AbstractAppService implements AppService {
protected void beforeSave(D model) { }
protected void afterSave(D model) { }
protected void beforeUpdate(D model) { }
protected void afterUpdate(D model) { }
protected void beforeDelete(D model) { }
protected void afterDelete(D model) { }
}
// 领域事件发布器
@Component
public class DefaultDomainEventBus implements DomainEventBus {
// 支持同步/异步/批量事件发布
// 支持事件重试和修复机制
}
```
**特点**:
- 业务编排,不包含核心业务规则
- 事务管理(支持@Transactional)
- 领域事件发布和调度
- 事件重试和修复机制
### 领域层 (framework-domain)
**职责**:实现核心业务逻辑,业务规则的心脏
**核心概念**:
```java
// 聚合根
public interface AggregateRoot extends Entity {
void initialize();
void destroy();
void validate();
}
// 抽象聚合根实现
public abstract class AbstractAggregateRoot
extends AbstractAggregateCapability implements AggregateRootLifeCycle {
// 封装聚合生命周期管理
// - 事件收集
// - 子实体管理
// - 初始化/销毁逻辑
}
// 实体
public interface Entity extends Serializable {
I getId();
void setId(I id);
}
// 值对象
public interface ValueObject extends Serializable {
boolean validate();
}
// 领域服务
public interface DomainService {
T execute(DomainServiceContext context);
}
// 领域事件
public interface DomainEvent extends Serializable {
String getEventType();
String getEventId();
Long getTimestamp();
}
// 仓储接口
public interface AggregateRepository, I extends Serializable> {
T findById(I id);
void save(T aggregate);
void delete(T aggregate);
}
// 规约
public interface Specification {
boolean isSatisfiedBy(T t);
Specification and(Specification other);
Specification or(Specification other);
}
```
**特点**:
- DDD核心概念完整实现
- 聚合根封装一致性和不变量
- 领域事件解耦业务逻辑
- 规约封装业务规则
- 类型安全设计(泛型大量使用)
### 基础设施层 (framework-infrastructure)
**职责**:技术实现细节,支持领域层和应用层
**核心组件**:
```java
// 统一仓储
public interface UnifiedRepository
extends Repository, DataProcessor, ConverterVault {
// 集成业务签名、数据转换、持久化
}
// 数据仓储
public interface DataRepository extends Repository {
// 支持MyBatis Plus的CRUD操作
}
// 数据处理器
public interface DataProcessor {
boolean save(List modelList);
boolean update(List modelList);
boolean deleteById(Collection ids);
}
// 数据转换器
public interface DataConverter {
E toEntity(D model);
D toModel(E entity);
}
// 持久化上下文
public interface PersistenceContext {
IService getBaseService();
}
// 缓存处理器
public interface CoreCacheHandler {
void cache(D data);
void invalidate(D data);
}
```
**特点**:
- 统一仓储模式(Unified Repository)
- MyBatis Plus深度集成
- 数据转换和验证链
- 缓存集成(支持业务签名)
- 分布式锁基础设施
### 分布式锁 (tom-lock)
**职责**:提供完整分布式锁解决方案
**使用方式**:
```java
// 核心注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TomLock {
String desc(); // 锁描述
String domain(); // 模块名称
String business(); // 业务名称
String[] paramExpression(); // SpEL表达式
long timeout() default -1; // 超时时间
long expire() default -1; // 过期时间
boolean requireSysName() default false; // 是否需要系统名称
}
// 高级注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface XTomLock {
String desc(); // 锁描述
LockMode mode(); // 锁模式
long timeout() default -1; // 超时时间
long expire() default -1; // 过期时间
}
// 锁模式枚举
public enum LockMode {
METHOD, // 方法级锁(基于方法签名)
METHOD_ARGS, // 方法参数级锁(基于参数值)
BUSINESS_SIG // 业务签名锁(基于@TomLockParam)
}
```
**特点**:
- 注解驱动,无侵入式
- 支持Redisson实现
- 多种锁模式选择
- SpEL表达式支持
- 可配置超时和过期时间
- 支持参数级别的细粒度锁
### 代码生成器 (framework-generator)
**职责**:自动化生成CRUD相关代码
**配置示例**:
```java
@Data
public class GeneratorConfig {
private String author = "Your Name"; // 作者
private String commentDate = "yyyy/MM/dd HH:mm"; // 注释日期格式
private String outputDir = System.getProperty("user.dir"); // 输出目录
private boolean enableSwagger = false; // 是否启用Swagger
private boolean enableLombok = true; // 是否启用Lombok
private DataBaseConfig dataBaseConfig = new DataBaseConfig();
private MapperConfig mapperConfig = new MapperConfig();
private EntityConfig entityConfig = new EntityConfig();
private DataModelConfig dataModelConfig = new DataModelConfig();
private UnifiedRepositoryConfig unifiedRepositoryConfig = new UnifiedRepositoryConfig();
}
```
**可生成代码**:
- Entity(实体类)
- Mapper(数据访问层)
- Service(服务层)
- Controller(控制器)
- DTO/VO(数据传输对象)
### Spring Boot Starter (framework-spring-boot-starter)
**职责**:自动配置和集成所有模块
**核心功能**:
```java
@AutoConfiguration
@EnableConfigurationProperties(LuFrameworkProperties.class)
@ComponentScan(
basePackages = "com.zijidelu.luframework",
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = {ControllerAdvice.class, RestControllerAdvice.class})
}
)
public class LuFrameworkAutoConfiguration {
// 自动配置所有模块
// - 数据转换器扫描
// - 聚合根扫描
// - 异常处理器注册
}
```
**特点**:
- Spring Boot自动配置
- 组件自动扫描
- 属性自动绑定
- 与其他Starter无冲突
---
## 🎨 设计模式与原则
### 使用的经典设计模式
1. **工厂模式**:`AggregateRootFactory`
2. **策略模式**:`EventDispatchStrategy`, `RepairStrategy`
3. **观察者模式**:`DomainEventBus`, `DomainEventHandler`
4. **代理模式**:`TomLockInterceptor`(AOP)
5. **模板方法模式**:`AbstractAggregateRoot`, `AbstractAppService`
6. **建造者模式**:`TomLockContext.Builder`
7. **单例模式**:工具类如`CastUtil`
8. **门面模式**:`UnifiedRepository`
### 架构原则
1. **关注点分离**:各层职责清晰,API→应用→领域→基础设施
2. **依赖倒置**:领域层定义接口,基础设施层实现
3. **接口隔离**:细粒度的接口设计
4. **单一职责**:每个类只做一件事
5. **开闭原则**:通过继承和扩展而非修改
6. **里氏代换**:子类可以替换父类
### DDD原则
1. **聚合边界**:聚合根封装一致性和不变量
2. **实体 vs 值对象**:有标识 vs 无标识
3. **领域服务**:跨实体的业务逻辑
4. **领域事件**:解耦和最终一致性
5. **仓储**:聚合持久化抽象
---
## 🛠️ 技术栈
### 核心框架
| 技术 | 版本 | 用途 |
|------|------|------|
| Java | 21 | 编程语言 |
| Spring Boot | 3.5.8 | 应用框架 |
| MyBatis Plus | 3.5.15 | ORM框架 |
### 工具和库
| 技术 | 版本 | 用途 |
|------|------|------|
| Lombok | 1.18.42 | 减少样板代码 |
| MapStruct | 1.5.5.Final | 对象映射 |
| Hibernate Validator | 8.0.1.Final | 参数校验 |
| Redisson | 3.29.0 | 分布式锁 |
| Easy-ES | 2.0.0-beta1 | Elasticsearch集成 |
| RocketMQ | 2.3.1 | 消息队列 |
| Druid | 1.2.18 | 数据库连接池 |
| Hutool | 5.8.42 | 工具类库 |
| Guava | 33.5.0-jre | Google工具库 |
### 代码生成
| 技术 | 版本 | 用途 |
|------|------|------|
| MyBatis Plus Generator | 3.5.15 | 代码生成 |
| FreeMarker | 2.3.34 | 模板引擎 |
| JavaParser | 3.27.1 | Java代码解析 |
| JavaPoet | 1.13.0 | Java代码生成 |
### 测试相关
| 技术 | 版本 | 用途 |
|------|------|------|
| JUnit | Jupiter | 单元测试 |
| Mockito | 4.11.0 | 模拟对象 |
| JMH | 1.37 | 性能基准测试 |
---
## 📋 开发规范
### 命名规范
**类命名**:
- 使用PascalCase(大驼峰)
- 语义清晰,避免缩写
- 示例:`UserService`, `OrderRepository`, `ProductValidator`
**方法命名**:
- 使用camelCase(小驼峰)
- 动词开头,表明操作
- 示例:`saveOrder()`, `validateProduct()`, `publishEvent()`
**变量命名**:
- 使用camelCase(小驼峰)
- 名词或描述性词语
- 示例:`productList`, `orderRepository`
**常量命名**:
- 全部大写,下划线分隔
- 示例:`MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT`
### 错误处理
**自定义异常**:
```java
// 领域层异常
public class DomainBizException extends RuntimeException {
private final String code;
private final String message;
}
// 基础设施层异常
public class RepositoryException extends RuntimeException {
private final String repositoryName;
private final String operation;
}
// 分布式锁异常
public class TomLockException extends RuntimeException {
private final String lockKey;
private final LockMode lockMode;
}
```
**异常处理规范**:
1. 领域层抛领域异常
2. 应用层捕获并转换为业务异常
3. API层统一处理并转换为ApiResult
4. 系统异常打日志,业务异常可不打
### 日志规范
**日志级别使用**:
- `ERROR`:系统异常、需要立即关注
- `WARN`:潜在问题、非关键异常
- `INFO`:业务流程、关键操作
- `DEBUG`:调试信息、开发环境
- `TRACE`:详细追踪、性能调试
**日志规范示例**:
```java
@Slf4j
@Service
public class OrderService {
public void createOrder(Order order) {
log.info("开始创建订单 | userId={} | orderId={}", order.getUserId(), order.getId());
try {
// 业务逻辑
log.debug("订单数据 | order={}", order);
} catch (BusinessException e) {
log.warn("创建订单失败 | userId={} | reason={}", order.getUserId(), e.getMessage());
throw e;
} catch (Exception e) {
log.error("创建订单系统异常 | userId={}", order.getUserId(), e);
throw new SystemException("创建订单失败", e);
}
}
}
```
**日志规范要求**:
1. 使用占位符`{}`而非字符串拼接
2. 关键业务参数必须输出
3. 敏感信息(密码、手机号)必须脱敏
4. 异常必须输出堆栈(最后一个参数传异常)
### 代码注释
**类注释**:
```java
/**
* 订单聚合根。
*
* 封装订单相关业务逻辑,管理订单行项、支付信息等子实体。
* 保证订单业务规则的一致性。
*
* @author ZIJIDELU
* @datetime 2025/10/17 10:54
* @see OrderLineItem
* @see PaymentInfo
*/
```
**方法注释**:
```java
/**
* 创建订单。
*
* 创建前会校验用户状态、商品库存、优惠券有效性。
*
* 前置条件:
*
* - 用户状态正常
* - 商品库存充足
* - 优惠券有效期内
*
*
* 后置条件:
*
* - 订单状态为"待支付"
* - 库存已预占
* - 优惠券已使用
*
*
* @param createOrderRequest 创建订单请求
* @return 创建的订单聚合根
* @throws UserStatusException 用户状态异常
* @throws InsufficientStockException 库存不足
* @throws InvalidCouponException 优惠券无效
*/
```
**注释要求**:
1. 所有公共类和接口必须有注释说明
2. 复杂业务方法必须有详细文档
3. 参数含义必须清楚
4. 可能抛出的异常必须列出
5. 中文注释使用中文标点符号
---
## 🤝 贡献指南
欢迎贡献代码、文档、测试用例等各种形式的贡献!
### 开发环境搭建
1. Fork 本仓库到您的GitHub账号
2. Clone 您的Fork到本地
```bash
git clone https://github.com/YourUsername/lu-framework.git
cd lu-framework
```
3. 创建特性分支
```bash
git checkout -b feature/your-feature-name
# 或
git checkout -b fix/your-bug-fix
```
4. 构建项目
```bash
mvn clean install
```
5. 运行测试(确保所有测试通过)
```bash
mvn test
```
### 提交规范
**Commit Message格式**:
```
():