# quickstart **Repository Path**: feizns/quickstart ## Basic Information - **Project Name**: quickstart - **Description**: 一个以实用、优雅、易用为目标的现代 Java 开发工具组件库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: http://doc.quickstart.ls-mxinfo.cn - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 2 - **Created**: 2022-09-19 - **Last Updated**: 2026-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QuickStart
**一个以实用、优雅、易用为目标的现代 Java 开发工具组件库** [![Java](https://img.shields.io/badge/Java-17-blue.svg)](https://www.java.com) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5.15-brightgreen.svg)](https://spring.io/projects/spring-boot) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
--- QuickStart 是一套现代 Java 开发工具组件库,按需引入,提供 Bean 操作、类型转换、声明式连表、通用查询 DSL、Web 增强、数据校验等基础能力,以及多种第三方服务集成。 📖 **[在线文档](http://doc.quickstart.ls-mxinfo.cn/)** --- ## 📖 简介 ### 项目定位 QuickStart 对 Spring Boot、MyBatis-Flex 等常用框架进行增强,封装样板代码、提供默认契约和自动配置,覆盖基础能力、ORM、Web、Redis、第三方集成等多个场景,能够极大地提高开发效率和开发体验。 ### 核心特征 - **轻量** — 只做增强,不做改变。基于常用框架构建,不替换底层实现 - **实用** — 围绕真实开发场景设计,提供声明式连表、通用查询 DSL、统一响应等企业级能力 - **优雅** — API 设计追求直观和一致性,`@Relate` 一行搞定关联查询,`Entities.getById()` 比手写 SQL 更清晰 - **易用** — 开箱即用,约定优于配置。引入 starter 即可自动装配 - **强大** — 6 种连表策略、30+ 查询操作符、关系表操作,各种复杂查询需求都能轻松驾驭 - **可扩展** — 基于 SPI 机制,ORM 实现、缓存策略、加密算法等均可插拔替换 ### 适用场景 - 中后台管理系统(ERP、CRM、OA 等) - RESTful API 服务开发 - 需要统一查询协议的前后端分离项目 - 需要快速集成支付宝、OSS 等第三方服务的项目 - 基于 MyBatis-Flex 的数据密集型应用 --- ## 🚀 快速开始 ### 环境要求 - JDK 17+ - Maven 3.6+ - MySQL 5.7+ ### 场景 1:REST 响应与异常 纯 Web 场景,无数据库依赖。展示统一响应格式、业务错误码声明、异常抛出与自动转换。 **依赖** ```xml com.gitee.feizns quickstart-web-spring-boot-starter 3.0.2-RELEASE ``` **代码** ```java // 声明业务错误码常量 public class Codes { public static final ResponseStatus USERNAME_EXISTS = Ret.ok().code(10001).msg("用户名已存在"); public static final ResponseStatus EMAIL_EXISTS = Ret.status(HttpStatus.BAD_REQUEST).code(10002).msg("邮箱已存在"); } @RestController @RequestMapping("/api/user") public class UserController { @GetMapping("/{id}") public Ret getById(@PathVariable Long id) { User user = userService.findById(id); if (user == null) throw new NotFoundException("用户不存在"); // HTTP 异常 → 404 return Ret.ok(userService.toVo(user)); } @PostMapping public Ret create(@Validated @RequestBody UserCreateAo ao) { if (userService.existsByUsername(ao.getUsername())) throw new BusinessException(Codes.USERNAME_EXISTS); // 业务异常 → 自定义错误码 return Ret.ok(userService.create(ao)); } } ``` **说明** - `Ret.ok(data)` → `{code: 200, msg: "ok", data: ...}`,HTTP 200 - **自定义错误码**:常量类定义 `ResponseStatus` 常量,传入 `BusinessException` - **HTTP 异常**:`NotFoundException` → 404,`BadRequestException` → 400 等,自动映射HTTP状态码 详见 [统一响应](docs/guide/unified-response.md) | [全局异常](docs/guide/unified-exception.md) --- ### 场景 2:Web + 数据库 CRUD `Entities` 是实体操作门面,可直接在任意地方使用,无需注入。底层通过 `EntitiesService` 接口针对不同持久层框架抽象常规操作,示例中由 `quickstart-mybatis-flex-spring-boot-starter` 提供实现。 **依赖** ```xml com.gitee.feizns quickstart-web-spring-boot-starter 3.0.2-RELEASE com.gitee.feizns quickstart-mybatis-flex-spring-boot-starter 3.0.2-RELEASE ``` **代码** ```java @Validated @RestController @RequestMapping("/api/user") public class UserController { @GetMapping public Ret> page(QueryAo ao) { return Ret.ok(Entities.page(User.class, ao, UserVo.class)); } @GetMapping("/{id}") public Ret getById(@PathVariable Long id) { return Ret.ok(Entities.getById(User.class, id, UserVo.class)); } @PostMapping public Ret create(@Validated @RequestBody UserCreateAo ao) { return Ret.ok(Entities.save(User.class, ao)); } @PatchMapping("/{id}") public Ret patchById(@PathVariable Long id, @Validated @RequestBody UserPatchByIdAo ao) { return Ret.ok(Entities.updateById(id, Beans.copy(ao, User.class))); } @DeleteMapping("/{id}") public Ret deleteById(@PathVariable Long id) { return Ret.ok(Entities.deleteById(User.class, id)); } } ``` **说明** - 支持 findById / getById / page / save / updateById / deleteById 等操作 - 动态查询:`QueryAo` 自动解析 URL 参数(GET)或请求体(POST),详见 [查询 DSL](#-查询-dsl) - 推荐使用 [代码生成器](#-代码生成器) 一键生成 Controller / Service / Mapper / Ao / Vo 详见 [Entities](docs/guide/entities.md) | [快速开始](docs/guide/getting-started.md) --- ## 📦 核心功能 ### 基础能力 提供 Bean 操作、反射增强、类型转换、缓存、加解密、异常处理、日期时间、树形构建等基础能力。 **核心工具示例** ```java // Bean 复制 UserDTO dto = Beans.copy(user, UserDTO.class); // 类型转换 int num = Converts.convert("12", int.class); List list = Converts.asList(List.of("1", "2"), Integer.class); // 本地缓存:缓存用户,5分钟过期,miss 时自动从数据库加载 CacheMap cache = Caches.builder() .expireAfterWrite(Duration.ofMinutes(5)) .loader(key -> userService.getById(key)) .build(); // 异常捕获与重试 Try.run(() -> upload()) .ifSucceeded(result -> log.info("上传成功")) .ifFailed(e -> log.error("上传失败", e)) .ifFailedRetry(3, IOException.class) .get(); ``` **工具清单** | 工具 | 说明 | |------|------| | `Reflects` / `Methods` / `Fields` | 基于 MethodHandle 的高性能反射,Lambda 类型安全 | | `Beans` / `Bean` | 高性能 Bean 元数据框架,支持 Lambda、泛型保留、Map 互转 | | `Converts` | 类型转换系统,内置 30+ 转换器,支持泛型和自定义扩展 | | `Caches` / `CacheMap` | 缓存工厂与带过期时间的缓存 Map | | `Hashes` / `Aes` / `Rsa` | 加解密工具(MD5/SHA/AES/RSA) | | `Trees` | 树形构建(平面列表 → 树 / 递归遍历 / 展平) | | `Try` / `RetryPolicy` | 异常捕获 + 声明式重试 | | `Times` / `Dates` | 日期时间工具(智能解析、周期边界计算) | | `Maps` / `Lists` / `Strings` | 集合、字符串、数值工具 | | `Regexps` | 常用正则表达式(手机号、身份证、邮箱、IP 等) | 详见 [基础能力概述](docs/guide/core-overview.md) | [Bean 操作](docs/guide/bean-operations.md) | [反射增强](docs/guide/reflection.md) | [类型转换](docs/guide/type-conversion.md) --- ### 查询 DSL 提供 30+ MongoDB 风格操作符,GET 和 POST 使用统一的查询语法。GET 请求支持扁平化 URL 参数,前端友好。 **查询示例** ``` // 条件查询(扁平语法) GET /api/user?name[$ct]=张&age[$gt]=18 → name LIKE '%张%' AND age > 18 // 条件查询(JSON 查询) GET /api/user?name={"$ct":"张"}&age={"$gt":18} → name LIKE '%张%' AND age > 18 // 排序 GET /api/user?$sort=name,-createTime → ORDER BY name ASC, create_time DESC // 分页 GET /api/user?$current=1&$size=10 → LIMIT 0, 10 ``` **常用操作符** | 分类 | 操作符 | 示例 | |------|--------|------| | 比较 | `$eq` `$ne` `$gt` `$ge` `$lt` `$le` | `{"age": {"$ge": 18}}` | | 集合 | `$in` | `{"status": {"$in": [1,2]}}` | | 范围 | `$bt` | `{"age": {"$bt": [18,60]}}` | | 字符串 | `$ct` `$sw` `$ew` `$rgx` | `{"name": {"$ct": "admin"}}` | | 日期 | `$year` `$month` `$day` 等 | `{"createTime[$year]": 2026}` | | 逻辑 | `$and` `$or` `$not` | `{"$or": [{"age":18},{"age":20}]}` | | 配置 | `$sort` `$limit` `$skip` `$f` `$q` | `{"$sort": ["name", "-age"]}` | **GET 请求扁平化语法** | URL 参数 | 解析结果 | |---------|---------| | `?name=foo` | `{"name": "foo"}`(自动 `$eq`) | | `?tags=a,b,c` | `{"tags": ["a", "b", "c"]}`(自动拆分) | | `?age[$gt]=18` | `{"age": {"$gt": 18}}`(方括号操作符) | | `?createTime[$year]=2026` | `{"createTime": {"$year": 2026}}` | 详见 [查询 DSL 概述](docs/guide/query-dsl.md) | [查询对象](docs/guide/query-dsl-query-ao.md) | [操作符一览](docs/guide/query-dsl-operators.md) --- ### Web 增强 提供统一响应、全局异常处理、限流防重、加解密等 Web 开发常用功能。 **统一响应 Ret<T>** ```java return Ret.ok(data); return Ret.ok(() -> userService.findAll()); // 使用 Supplier 返回数据 return Ret.ok().code(10001).msg("操作成功").data(result); Ret.badRequest("参数错误"); // 400 Ret.unauthorized("未认证"); // 401 Ret.forbidden("无权限"); // 403 Ret.notFound("资源不存在"); // 404 Ret.error("系统异常"); // 500 ``` **全局异常处理** - **异常链匹配**:递归遍历异常链(cause 优先匹配),而非仅匹配表面异常 - **继承体系查找**:在异常继承链中查找处理器 - **可注册自定义处理器** ```java // 注册自定义异常处理器 handler.registry(CustomException.class, ex -> Ret.error(ex.getMessage())); ``` **限流 & 防重** ```java @RateLimit(qps = 60) // 每秒 60 次 @RepeatGuard(interval = 3) // 3 秒内防重复提交 ``` 详见 [Web 概述](docs/guide/web-overview.md) | [统一响应](docs/guide/unified-response.md) | [全局异常](docs/guide/unified-exception.md) | [限流防重](docs/guide/rate-limiting.md) --- ### 数据校验 提供 13 个自定义校验注解和编程式校验能力。 **自定义校验注解** | 注解 | 说明 | |------|------| | `@Identifier` | 标识符格式(中文/字母/数字/下划线/连字符) | | `@JavaIdentifier` | Java 标识符格式 | | `@Phone` | 手机号格式 | | `@IdCard` | 身份证号格式 | | `@EnumValue` | 值必须在指定枚举中 | | `@DictValue` | 值在字典中 | | `@DateRange` | 日期范围(支持字段级和类级) | | `@Verify` | 触发 Verifiable 接口校验 | | `@VerifyWith` | 触发外部 Validator 校验 | | `@NoWhitespace` | 不允许空白字符 | | `@NoNullElements` | 集合中不允许 null 元素 | | `@Words` / `@ProvidedWords` | 值在静态/动态词库中 | **@DateRange 用法** ```java // 字段级:日期在范围内 @DateRange(min = "2024-01-01", max = "2024-12-31") private LocalDate eventDate; // 类级:start 字段早于 end 字段 @DateRange(start = "startDate", end = "endDate") public class EventDto { private LocalDate startDate; private LocalDate endDate; } ``` **Verifiable — 编程式校验** ```java @Data @Verify public class UserCreateAo implements Verifiable { private String name; private Integer age; private String password; private String confirmPassword; @Override public void validate(Rejects rejects) { rejects.when(this.age < 0, "年龄不能为负数"); rejects.when(!this.password.equals(this.confirmPassword), "confirmPassword", "两次密码不一致"); rejects.ifNull(this.name, "name", "用户名不能为空"); } } ``` **Validator — 外部验证器** ```java // 定义验证器 public class PasswordMatchValidator implements Validator { @Override public void validate(Rejects rejects, PasswordDto value) { if (!Objects.equals(value.getPassword(), value.getConfirmPassword())) rejects.reason("confirmPassword", "两次密码不一致"); } } // 使用 @VerifyWith 引用 @Data @VerifyWith(PasswordMatchValidator.class) public class PasswordDto { private String password; private String confirmPassword; } ``` **国际化支持** 校验消息自动支持国际化,默认英文,中文通过 `ValidationMessages_zh_CN.properties` 配置。 使用 `Messages` 工具类在业务代码中获取国际化消息: ```java // 使用当前 Locale String msg = Messages.get("error.user.notFound"); // 指定 Locale(后台任务、邮件发送等) String msg = Messages.get(Locale.CHINA, "error.user.notFound"); ``` 详见 [校验概述](docs/guide/validation-overview.md) | [校验注解](docs/guide/validation-annotations.md) | [编程式校验](docs/guide/programmatic-validation.md) --- ### MyBatis-Flex 提供 `quickstart-orm` 的 MyBatis-Flex 实现,包括 Entities 门面、@Relate 声明式连表、Relation 关系表、DDL 自动建表等。 **Entities — 统一数据库访问** ```java // 静态方式 User user = Entities.getById(User.class, 1L); List users = Entities.list(User.class, queryAo); PageRecordsVo page = Entities.page(User.class, queryAo); // 实例方式(推荐) Entity userEntity = Entities.of(User.class); User user = userEntity.getById(1L); userEntity.updateById(1L, u -> u.setStatus("active")); // Lambda 查询 String name = Entities.find(User::getName) .eq(User::getStatus, 1) .gt(User::getAge, 18) .first(); ``` **@Relate 声明式连表** 在 VO 字段上标注 `@Relate`,自动根据注解声明的关系查询并组装关联数据。支持 6 种查询策略(AUTO / LEFT_JOIN / INNER_JOIN / SUBQUERY / SEPARATE / COUNT)。配合 `$f` 操作符可按需加载关联字段,未指定的关联不生成 SQL,显著提升性能。 ```java public class UserVo { // 一对一:查询创建者(默认 LEFT JOIN) @Relate(selfKey = "creatorId", target = Admin.class) private Admin creator; // 一对多(中间表):通过 admin_role 关联表查角色(默认 SEPARATE) @Relate(target = Role.class) @With(through = AdminRole.class, selfKey = "adminId", targetKey = "roleId") private List roles; // 计数 @Relate(target = Role.class, strategy = RelateStrategy.COUNT) @With(through = AdminRole.class, selfKey = "adminId", targetKey = "roleId") private int roleCount; } // 全量查询(加载所有关联字段) Entities.getById(User.class, 1L, UserVo.class); // 按需查询:只加载基础字段和 creator,不加载 roles QueryAo ao = QueryAo.builder().$f("id", "name", "creator").build(); Entities.list(User.class, ao, UserVo.class); ``` **Relation — 关系表操作** ```java Relation relation = Relations.of(AdminRole::getAdminId, AdminRole::getRoleId); relation.add(adminId, List.of(roleId1, roleId2)); // 添加(自动去重) relation.reset(adminId, newRoleIds); // 智能同步(差异对比) relation.clear(adminId); // 清空 relation.remove(adminId, List.of(roleId1)); // 删除指定 relation.list(adminId); // 查询关系列表 relation.list(adminId, Role.class); // 查询关联角色 relation.copy(srcAdminId, tgtAdminId); // 复制关系 ``` 详见 [MyBatis-Flex 概述](docs/modules/mybatis-flex.md) | [Entities](docs/guide/entities.md) | [@Relate](docs/guide/relate-deep-dive.md) | [Relation](docs/guide/relation-api.md) | [DDL](docs/guide/ddl-auto.md) --- ### Jackson 增强 提供 Jackson JSON 处理的增强功能,包括工具类、自定义注解、JsonValue 接口等。 **核心功能** - `Jacksons` 工具类 — 简化 JSON 序列化/反序列化 - `@JsonArrayAsObject` — 数组转对象 - `@JsonDeduplicate` — JSON 去重 - `JsonValue` 接口 — 枚举值映射 详见 [Jackson 概述](docs/guide/jackson-overview.md) | [Jacksons 工具](docs/guide/jacksons-tool.md) | [JSON 注解](docs/guide/json-annotations.md) --- ### Redis 封装 提供 Redis 命令式 API、分布式锁、Hash/Set/SortedSet 结构化封装。 **核心功能** - **静态 API** — 简化 Redis 操作 - **分布式锁** — 基于 Redis 的分布式锁实现 - **集合接口** — RedisHashMap / HashSet / RedisSortedSet,用 Java 的方式操作 Redis 详见 [Redis 概述](docs/guide/redis-overview.md) | [静态 API](docs/guide/redis-static-api.md) | [分布式锁](docs/guide/redis-lock.md) | [集合接口](docs/guide/redis-collections.md) --- ### 开发工具 提供代码生成器、Excel 处理、文件存储、二维码、验证码、规则引擎等开发工具。 **代码生成器** 从一个 POJO 生成 Controller / Service / Mapper / Ao / Vo 全套代码: ```java @Comment("用户") public class User { @Comment("用户名") private String username; @Comment("年龄") private Integer age; public static void main(String[] args) { CodeGenerator.of(User.class) .register(Templates.springboot3MybatisFlex(Methods.crudById())) .generate(); // 自动生成:Controller、Service、ServiceImpl、Mapper、CreateAo、PatchByIdAo、Vo(共 7 个文件) } } ``` **其他工具** | 工具 | 说明 | |------|------| | `quickstart-easyexcel` | Excel 处理(支持 LocalDate/LocalDateTime) | | `quickstart-file-storage` | 统一文件存储抽象 | | `quickstart-zxing` | 二维码/条形码生成 | | `quickstart-easy-captcha` | 验证码生成(数字/字符/中文/算术等 6 种) | | `quickstart-ql-express` | 阿里规则引擎 QLExpress 封装 | | `quickstart-javacv` | JavaCV 音视频处理 | | `quickstart-graalvm-js` | GraalVM JavaScript 引擎 | 详见 [代码生成器](docs/modules/code-generator.md) | [EasyExcel](docs/modules/easyexcel.md) | [文件存储](docs/modules/file-storage.md) --- ### 第三方集成 提供支付宝、阿里云 OSS、MQTT、宝塔面板等第三方服务集成。 | 模块 | 说明 | |------|------| | `quickstart-alipay` | 支付宝 SDK(App 支付、网站支付、单笔转账) | | `quickstart-aliyun-oss` | 阿里云 OSS(上传、下载、签名 URL) | | `quickstart-mqtt` | MQTT 消息队列(发布、订阅、连接管理) | | `quickstart-bt` | 宝塔面板 SDK(文件管理、Java 项目部署) | 详见 [支付宝](docs/modules/alipay.md) | [阿里云 OSS](docs/modules/aliyun-oss.md) | [MQTT](docs/modules/mqtt.md) | [宝塔](docs/modules/bt.md) --- ### 其他模块 | 模块 | 说明 | |------|------| | `quickstart-domain` | 通用领域模型(Id、Coded、TreeNode) | | `quickstart-log` | 日志增强(@Log 业务操作日志、LogContext 日志上下文、LogListener 监听器) | | `quickstart-mustache` | Mustache 模板引擎 | | `quickstart-ddl-annotation` | DDL 注解、自动建表 | | `quickstart-spring` | Spring 容器工具 | | `quickstart-spring-expression` | Spring 表达式增强 | --- ## 📋 模块一览 | 分类 | 模块 | 功能 | 适用场景 | |------|------|------|---------| | **基础** | [quickstart-core](quickstart-core/) | Bean 元数据、类型转换、反射、缓存 Map、加解密、Try 重试、树形构建 | 所有项目 | | | [quickstart-domain](quickstart-domain/) | Coded 契约、Id 标识、TreeNode 通用模型 | Web / ORM | | | [quickstart-dsl](quickstart-dsl/) | QueryAo 查询 DSL(30+ 操作符)、PageAo 分页模型 | 查询 / 分页 | | | [quickstart-orm](quickstart-orm/) | Entities 门面、@Relate 声明式连表、Relation 关系表 | ORM 抽象层 | | | [quickstart-spring](quickstart-spring/) / [quickstart-spring-expression](quickstart-spring-expression/) | Spring 容器工具、表达式增强 | Spring 项目 | | **数据** | [quickstart-mybatis-flex](quickstart-mybatis-flex/) | MyBatis-Flex 实现、实体基类、自动建表、JSON 类型处理器 | MyBatis-Flex | | | [quickstart-redis](quickstart-redis/) | Redis 命令式 API、分布式锁、Hash/Set/SortedSet 结构化封装 | 缓存 / 分布式 | | **Web** | [quickstart-web](quickstart-web/) | Ret 统一响应、异常体系、QueryAo 参数解析、@RateLimit / @RepeatGuard / @CryptoBody | Web API | | | [quickstart-validation](quickstart-validation/) | @Phone / @IdCard / @DateRange / @EnumValue 等 13 个校验注解、Verifiable 编程式校验、Validator 外部验证器、国际化支持 | 数据校验 | | | [quickstart-log](quickstart-log/) | @Log 业务操作日志、LogContext 日志上下文、LogListener 监听器 | 日志 | | **JSON** | [quickstart-jackson](quickstart-jackson/) | @JsonArrayAsObject、@JsonDeduplicate | JSON 处理 | | **工具** | [quickstart-code-generator](quickstart-code-generator/) | 代码生成器,POJO → Controller / Service / Ao / Vo 全套 | 快速开发 | | | [quickstart-easyexcel](quickstart-easyexcel/) | Excel 处理(支持 LocalDate / LocalDateTime) | 导入导出 | | | [quickstart-easy-captcha](quickstart-easy-captcha/) / [quickstart-zxing](quickstart-zxing/) | 验证码 / 二维码 | 通用 | | | [quickstart-file-storage](quickstart-file-storage/) | 统一文件存储抽象 | 文件管理 | | | [quickstart-ql-express](quickstart-ql-express/) / [quickstart-graalvm](quickstart-graalvm/) / [quickstart-graalvm-js](quickstart-graalvm-js/) | 规则引擎 / 多语言脚本 | 动态逻辑 | | | [quickstart-javacv](quickstart-javacv/) | 音视频处理 | 媒体 | | | [quickstart-ddl-annotation](quickstart-ddl-annotation/) | DDL 注解、自动建表 | 数据库 | | **第三方** | [quickstart-alipay](quickstart-alipay/) / [quickstart-aliyun-oss](quickstart-aliyun-oss/) / [quickstart-mqtt](quickstart-mqtt/) / [quickstart-bt](quickstart-bt/) | 支付宝 / OSS / MQTT / 宝塔 | 第三方集成 | | **Starter** | 各 `*-spring-boot-starter` | web / mybatis-flex / redis / validation / log / mqtt / jackson 自动配置 | 按需引入 | --- ## 📚 最佳实践 - **代码生成实战** — 从 POJO 到完整 CRUD 的最佳实践 - **生产部署指南** — 生产环境配置、性能优化、监控建议 - **性能优化** — 缓存策略、查询优化、批量操作技巧 详见 [代码生成实战](docs/best-practices/code-generation.md) | [生产部署](docs/best-practices/deployment.md) | [性能优化](docs/best-practices/performance.md) --- ## 📄 许可证 QuickStart 采用 Apache License 2.0 开源协议。详情参见 [LICENSE](LICENSE) 文件。 --- ## 📬 联系方式 - **作者**:feizns - **Gitee**:https://gitee.com/feizns/quickstart - **在线文档**:http://doc.quickstart.ls-mxinfo.cn/ --- > 模块按需引入,不依赖全部加载,每一层都可独立使用。