vertx-pj/README.md

278 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

闲暇时编写,问题较多,仅供参考。
# Vert.x 快速开发模板
这是一个基于 Vert.x 库的后端快速开发模板,采用 Kotlin 语言和协程实现高性能异步编程。本项目提供了完整的开发框架,能够帮助开发者快速搭建响应式、模块化、高性能的后端服务。
## 技术栈
- **核心框架**: Vert.x 4.5.x (响应式、事件驱动框架)
- **编程语言**: Kotlin 1.9.x (协程支持)
- **依赖注入**: Google Guice 7.0.0
- **数据库**: PostgreSQL, (不支持MySQL)
- **缓存**: Redis
- **认证**: JWT
- **构建工具**: Gradle with Kotlin DSL
- **代码规范**: Spotless, ktlint
## 项目结构
项目采用模块化设计,主要分为两个模块:
### vertx-fw (框架核心)
提供基础架构和通用功能:
- 依赖注入配置
- 路由管理
- 认证与授权
- 数据库操作封装
- 事务管理
- 全局异常处理
- 通用工具类
### vertx-demo (应用示例)
包含示例应用代码:
- 控制器实现示例
- 服务层实现
- 数据访问层
- 实体类定义
- 配置文件
## 主要特性
### 1. 注解驱动的路由
通过简单的注解即可定义 API 路由和参数绑定:
```kotlin
@D("测试1:测试")
@Controller
class Demo1Controller @Inject constructor(
private val accountService: AccountService,
private val accountRepository: AccountRepository
) {
@AllowAnonymous
@D("参数测试", "详细说明......")
suspend fun test1(
@D("name", "姓名") name: String?,
@D("age", "年龄") age: Int?,
@D("list", "列表") list: List<String>?,
@D("status", "状态-0正常,1禁用,2删除") status: Status?,
@D("account", "账号") account: Account?
) {
// 业务逻辑
}
}
```
### 2. 据库支持
#### Repository 模式
```kotlin
interface AccountRepository : Repository<Long, Account> {
suspend fun getByName(name: String): Account?
suspend fun getUserList(userName: String?, phone: String?): List<Account>
}
```
#### 事务管理
```kotlin
suspend fun testTransaction() {
withTransaction {
accountRepository.update(1L, mapOf("avatar" to "test0001"))
// 嵌套事务
try {
withTransaction {
accountRepository.update(1L, mapOf("avatar" to "test002"))
throw Meta.error("test transaction", "test transaction")
}
} catch (e: Exception) {
logger.info { "内层事务失败已处理: ${e.message}" }
}
}
}
```
#### 数据库迁移
支持通过实体类注解自动生成数据库变更脚本,遵循版本化管理。
### 3. 安全与认证
- JWT 认证
- 基于角色的权限控制
- 自定义安全注解: `@AllowAnonymous`, `@CheckRole`, `@CheckPermission`
### 4. API 文档生成
自动生成 OpenAPI 规范文档,支持与 ApiFox 等 API 工具集成。
### 5. 统一响应处理
标准化的 JSON 响应格式:
```json
{
"code": 200,
"message": "Success",
"data": { ... },
"requestId": "1899712678486753280"
}
```
### 6. 全局异常处理
统一捕获和处理异常,转换为友好的 API 响应。
### 7. 配置管理
支持 YAML 配置,环境变量和系统属性覆盖,多环境配置。
## 快速开始
### 环境要求
- JDK 17+
- PostgreSQL 数据库
- Redis (可选)
### 构建与运行
1. **克隆项目**
```bash
git clone https://github.com/yourusername/vertx-pj.git
cd vertx-pj
```
2. **配置数据库**
编辑 `vertx-demo/src/main/resources/config/application-database.yml`
```yaml
databases:
name: vertx-demo
host: 127.0.0.1
port: 5432
username: your_username
password: your_password
```
3. **构建项目**
```bash
./gradlew clean build
```
4. **运行项目**
```bash
./gradlew :vertx-demo:run
```
## 创建新API
1. 创建实体类
```kotlin
@TableName("users")
class User : BaseEntity() {
@TableId(type = IdType.ASSIGN_ID)
var userId: Long = 0L
@TableField("user_name")
var userName: String? = ""
var status: Status? = Status.ACTIVE
}
```
2. 创建Repository
```kotlin
interface UserRepository : Repository<Long, User> {
suspend fun findByName(name: String): User?
}
```
3. 创建Service
```kotlin
class UserService @Inject constructor(
private val userRepository: UserRepository
) {
suspend fun getUserByName(name: String): User? {
return userRepository.findByName(name)
}
}
```
4. 创建Controller
```kotlin
@D("用户管理")
@Controller("/users")
class UserController @Inject constructor(
private val userService: UserService
) {
@D("通过用户名获取用户")
suspend fun getByName(
@D("name", "用户名") name: String
): User? {
return userService.getUserByName(name)
}
}
```
---
## 快速开发注解说明
### @AllowAnonymous
允许匿名访问注解
标记在Controller类上时表示该类下所有接口都不需要鉴权。
标记在Controller类中的方法上时表示该接口不需要鉴权。
### @Controller
自定义Controller注解用于路由注册
- 启动时使用反射获取所有标记了@Controller注解的类
- 获取类中所有方法将其统一注册到router中
- 可选参数`prefix`:定义请求路径前缀
- 不填时默认使用类名(去除"Controller"后首字母小写)作为前缀
### @D
文档生成注解,可用于以下位置:
1. 类上为Controller类添加说明
2. 方法上:为方法添加说明
3. 方法参数上:格式如 `@D("age", "年龄") age: Int?`
- name: 参数名用于从query或body中自动获取参数
- value: 参数说明,用于文档生成
> 注:参数类型后的`?`表示可为空,不带`?`表示必填。框架会根据此进行参数校验。
### 权限相关注解
仿sa-token实现的权限控制
- `@CheckRole()`:角色检查
- `@CheckPermission()`:权限检查
### 请求响应相关注解
#### @CustomizeRequest
请求方式定制
- 全局默认使用POST请求
- 使用`@CustomizeRequest("get")`可将方法改为GET请求
#### @CustomizeResponse
响应方式定制
- 全局默认返回JSON格式
- 使用`@CustomizeResponse`可获取response对象自定义返回内容