@devflow-cc/react
Version:
一个功能强大的React库,用于构建数据驱动的应用程序,支持实时通信、身份验证和数据库操作
627 lines (494 loc) • 16.9 kB
Markdown
# @devflow-cc/react
一个功能强大的 React 库,用于构建数据驱动的应用程序,支持实时通信、身份验证和数据库操作。
## 🏗️ 模块架构
DevFlow 采用模块化设计,提供清晰的功能分离:
### 核心模块
- **`devflow.auth`** - 认证模块(登录、注册、用户信息管理)
- **`devflow.users`** - 用户管理模块(管理员功能)
- **`devflow.data`** - 数据操作模块(CRUD 操作)
- **`devflow.table`** - 表管理模块(表结构管理)
- **`devflow.audit`** - 审计日志模块(操作记录)
- **`devflow.websocket`** - 实时通信模块(WebSocket)
### 简化接口
- **`devflow.from()`** - 数据操作简化写法
- **`devflow.schema`** - 表管理简化写法(兼容旧版本)
## 🔧 最新更新
### v1.2.1
- ✅ **参数传递统一**: 统一使用 request_body 传递所有参数,包括分页参数
- ✅ **后端 API 优化**: 移除 Query 参数,简化后端代码逻辑
- ✅ **前端删除方法增强**: 支持 hard_delete 参数,支持软删除和硬删除
- ✅ **API 文档更新**: 更新参数传递方式说明,确保前后端对齐
### v1.2.0
- ✅ **TypeScript 重构**: 完全使用 TypeScript 重写,提供完整的类型安全
- ✅ **模块化架构**: 将大型文件拆分为小的模块,提高代码可维护性
- ✅ **数据模块优化**: 合并 DataModule 和 QueryBuilder,简化架构
- ✅ **客户端架构优化**: 合并 DevFlowClient 和 Factory,简化文件结构
- ✅ **文件命名优化**: 重命名 devflow-client.ts 为 client.ts,更简洁
- ✅ **文件结构优化**: 重命名 http-client.ts 为 http.ts,client.ts 提升到 src 根目录
- ✅ **Context 优化**: 重命名 context 目录为 provider,提供 React Provider 支持
- ✅ **Token 存储优化**: 支持自定义 token 存储键名,默认使用 localStorage 和'devflow-token'
- ✅ **新增用户管理模块**: 支持完整的用户 CRUD 操作
- ✅ **新增用户列表查询、激活/停用、角色设置功能**
- ✅ **分离认证模块和用户管理模块**: 避免功能冲突
- ✅ **新增管理员创建用户、重置密码等功能**
- ✅ **优化 API 设计**: 区分用户自己的操作和管理员操作
- ✅ **新增审计日志模块**: 支持完整的审计功能
- ✅ **新增表管理功能**: 支持表名验证和前缀配置
- ✅ **完善用户管理参数说明和响应格式**
- ✅ **新增 WebSocket 实时通信功能**
- ✅ **统一表结构管理 API 命名规范**
## 📦 安装
```bash
npm install @devflow-cc/react
```
## 🚀 快速开始
### 基础使用
```javascript
import { createClient, devflow } from "@devflow-cc/react";
const client = createClient({
baseURL: "http://localhost:8000",
apiVersion: "v1",
timeout: 10000,
language: "zh",
});
// 使用数据操作
const result = await client.data.from("users").eq("status", "active").select();
```
### 关于 baseURL 与 apiVersion
- baseURL 仅填写服务根地址(协议+主机+端口),不要包含 `/api` 路径。
- 实际请求地址由库自动拼接:`{baseURL}/api/{apiVersion}`。
- 示例:当 `baseURL = 'http://114.55.144.154'` 且 `apiVersion = 'v1'` 时,请求会发往 `http://114.55.144.154/api/v1`。
```javascript
// 正确
devflow.setConfig({ baseURL: "http://114.55.144.154", apiVersion: "v1" });
// 不推荐(会导致路径变为 http://.../api/v1/api/v1)
// devflow.setConfig({ baseURL: 'http://114.55.144.154/api/v1' });
```
### 运行时动态更新配置(即时生效)
`devflow.setConfig()` 现在会在任何配置更新后,自动重建内部 HTTP 客户端与模块,确保如 `baseURL`、`apiVersion`、`headers`、`timeout` 等变更立即生效。
```javascript
// 初始化后可随时切换后端地址或版本
devflow.setConfig({ baseURL: "http://localhost:8000" });
// ... 一段时间后
devflow.setConfig({ baseURL: "http://114.55.144.154", apiVersion: "v2" });
```
### Token 存储配置
DevFlow 默认将 token 存储在 localStorage 中,键名为 `devflow-token`。你可以通过 `tokenKey` 配置自定义键名:
### 错误处理配置
DevFlow 提供了强大的错误处理机制,支持自定义错误处理器和自动重试功能:
```javascript
import { createClient } from "@devflow-cc/react";
// 自定义错误处理器
const customErrorHandler = (error) => {
console.error("请求错误:", {
message: error.detail,
code: error.error_code,
status: error.status_code,
timestamp: error.timestamp,
});
// 根据错误类型执行不同处理逻辑
switch (error.status_code) {
case 401:
// 处理未授权错误
console.log("需要重新登录");
break;
case 403:
// 处理权限不足错误
console.log("权限不足");
break;
case 500:
// 处理服务器错误
console.log("服务器错误,请稍后重试");
break;
default:
console.log("其他错误");
}
};
const client = createClient({
baseURL: "http://localhost:8000",
apiVersion: "v1",
timeout: 10000,
language: "zh",
errorHandler: {
onError: customErrorHandler,
retry: 3, // 自动重试3次
},
});
// 动态更新错误处理器
client.config.setErrorHandler((error) => {
console.log("新的错误处理器:", error.detail);
}, 2);
// 清除错误处理器
client.config.clearErrorHandler();
```
**错误处理特性:**
- ✅ **自定义错误处理器**: 可以设置自定义的错误处理函数
- ✅ **自动重试机制**: 支持配置重试次数,使用指数退避策略
- ✅ **错误分类处理**: 根据 HTTP 状态码执行不同的处理逻辑
- ✅ **动态更新**: 可以在运行时动态更新错误处理器
- ✅ **错误信息国际化**: 支持多语言错误消息
```javascript
// 创建客户端时配置
const client = createClient({
baseURL: "http://localhost:8000",
tokenKey: "myapp-auth-token", // 自定义token键名
});
// 或者动态更新配置
devflow.setConfig({
tokenKey: "custom-token-key",
});
```
### React Provider 使用
```jsx
import { DevFlowProvider, useDevFlow } from "@devflow-cc/react";
function App() {
return (
<DevFlowProvider
config={{
baseURL: "http://localhost:8000",
tokenKey: "myapp-token",
}}
>
<MyComponent />
</DevFlowProvider>
);
}
function MyComponent() {
const { client } = useDevFlow();
const handleLogin = async () => {
const result = await client.auth.signInWithPassword({
username: "user",
password: "password",
});
};
return <button onClick={handleLogin}>登录</button>;
}
```
### 2. 身份验证
```typescript
// 登录
const { data, error } = await devflow.auth.signInWithPassword({
username: "your-username",
password: "your-password",
});
if (data) {
console.log("登录成功:", data.user);
} else {
console.error("登录失败:", error);
}
// 注册
const { data, error } = await devflow.auth.signUp({
username: "new-user",
email: "user@example.com",
password: "password123",
full_name: "New User",
});
// 获取当前用户信息
const { data, error } = await devflow.auth.getUser();
// 更新自己的用户信息
const { data, error } = await devflow.auth.updateUser({
full_name: "Updated Name",
bio: "Updated bio",
});
// 修改密码
const { data, error } = await devflow.auth.changePassword({
current_password: "oldpassword",
new_password: "newpassword",
});
```
### 3. 用户管理(管理员功能)
```typescript
// 获取用户列表
const { items, total, page, page_size } = await devflow.users.getUsers({
page: 1,
page_size: 20,
search: "john",
is_active: true,
role: "user",
});
// 获取用户详情
const { data, error } = await devflow.users.getUser("user-id");
// 管理员创建用户
const { data, error } = await devflow.users.createUser({
username: "newuser",
email: "newuser@example.com",
password: "password123",
full_name: "New User",
is_active: true,
});
// 管理员更新用户
const { data, error } = await devflow.users.updateUser("user-id", {
full_name: "Updated Name",
is_active: false,
bio: "Updated bio",
});
// 删除用户
const { error } = await devflow.users.deleteUser("user-id");
// 激活用户
const { data, error } = await devflow.users.activateUser("user-id");
// 停用用户
const { data, error } = await devflow.users.deactivateUser("user-id");
// 设置用户角色
const { data, error } = await devflow.users.setUserRoles("user-id", [
"admin",
"user",
]);
// 重置用户密码
const { data, error } = await devflow.users.resetUserPassword(
"user-id",
"newpassword"
);
```
### 4. 审计日志模块
```typescript
// 获取审计日志列表
const { data, error } = await devflow.audit.getLogs({
user_id: "user-id",
action: "user_login",
resource_type: "user",
status: "success",
page: 1,
page_size: 20,
});
// 获取我的审计日志
const { data, error } = await devflow.audit.getMyLogs({
days: 30,
action: "data_insert",
page: 1,
page_size: 20,
});
// 获取用户活动摘要
const { data, error } = await devflow.audit.getActivitySummary({
user_id: "user-id",
days: 30,
});
// 获取系统审计统计
const { data, error } = await devflow.audit.getSystemStats({
days: 7,
});
```
### 5. 数据操作
DevFlow 提供了两种数据操作方式:
#### 方式一:简化写法(推荐)
```typescript
// 基础查询
const { items, total, page, pageSize } = await devflow
.from("users")
.eq("status", "active")
.order("created_at", "desc")
.select(["id", "name", "email"]);
// 分页查询
const { items, total, page, pageSize } = await devflow
.from("users")
.eq("status", "active")
.order("created_at", "desc")
.page(1, 10)
.select();
// 获取单条记录
const { data, error } = await devflow.from("users").get("user-id");
// 插入数据
const { data, error } = await devflow.from("users").insert({
username: "newuser",
email: "newuser@example.com",
full_name: "New User",
});
// 更新数据
const { data, error } = await devflow.from("users").eq("id", "user-id").update({
full_name: "Updated Name",
});
// 删除数据(软删除)
const { data, error } = await devflow
.from("users")
.eq("status", "deleted")
.delete();
// 删除数据(硬删除)
const { data, error } = await devflow
.from("users")
.eq("status", "deleted")
.delete(false, true); // confirmAll=false, hardDelete=true
```
#### 方式二:模块化写法
```typescript
// 使用数据模块
const { items, total } = await devflow.data
.from("users")
.eq("status", "active")
.select(["id", "name", "email"]);
// 插入数据
const { data, error } = await devflow.data.from("users").insert({
username: "newuser",
email: "newuser@example.com",
});
// 更新数据
const { data, error } = await devflow.data
.from("users")
.eq("id", "user-id")
.update({
full_name: "Updated Name",
});
// 删除数据(软删除)
const { data, error } = await devflow.data
.from("users")
.eq("status", "deleted")
.delete();
// 删除数据(硬删除)
const { data, error } = await devflow.data
.from("users")
.eq("status", "deleted")
.delete(false, true); // confirmAll=false, hardDelete=true
```
**操作方法(终止方法)**:
- `insert()` - 插入数据
- `update()` - 更新数据
- `delete(confirmAll?, hardDelete?)` - 删除数据(支持软删除和硬删除)
- `select()` - 查询数据
- `get()` - 获取单条记录
### 6. 表结构管理
```typescript
// 创建表
const { data, error } = await devflow.table.createTable({
name: "products",
columns: [
{ name: "id", type: "uuid", primary_key: true },
{ name: "name", type: "varchar", length: 255, not_null: true },
{ name: "price", type: "decimal", precision: 10, scale: 2 },
{ name: "category_id", type: "uuid", foreign_key: "categories.id" },
],
});
// 获取表列表
const { data, error } = await devflow.table.getTables({
page: 1,
page_size: 20,
search: "user",
});
// 获取表信息
const { data, error } = await devflow.table.getTableInfo("users");
// 更新表结构
const { data, error } = await devflow.table.updateTable("users", {
add_columns: [{ name: "avatar", type: "varchar", length: 500 }],
modify_columns: [{ name: "email", type: "varchar", length: 100 }],
});
// 删除表
const { data, error } = await devflow.table.deleteTable("temp_table");
// 获取表统计信息
const { data, error } = await devflow.table.getTableStats("users");
// 验证表名是否合法
const { data, error } = await devflow.table.validateTableName("my_table");
// 获取表前缀配置信息
const { data, error } = await devflow.table.getTablePrefixInfo();
```
### 7. WebSocket 实时通信
```typescript
// 建立WebSocket连接
const ws = devflow.websocket.connect({
token: "your-jwt-token",
onMessage: (data) => {
console.log("收到实时数据:", data);
},
onError: (error) => {
console.error("WebSocket错误:", error);
},
onClose: () => {
console.log("WebSocket连接已关闭");
},
});
// 订阅表变更
ws.subscribe("users", (data) => {
console.log("users表数据变更:", data);
});
// 取消订阅
ws.unsubscribe("users");
// 关闭连接
ws.close();
```
## 🏗️ 架构设计
### 模块化结构
```
src/
├── core/ # 核心模块
│ ├── config.ts # 配置管理
│ └── http-client.ts # HTTP客户端
├── modules/ # 功能模块
│ ├── auth.ts # 认证模块
│ ├── users.ts # 用户管理模块
│ ├── audit.ts # 审计日志模块
│ ├── query-builder.ts # 数据查询构建器
│ ├── table.ts # 表管理模块
│ └── websocket.ts # WebSocket模块
├── client/ # 客户端
│ ├── devflow-client.ts # 主客户端类
│ └── factory.ts # 工厂函数和单例
├── types/ # 类型定义
│ └── index.ts # 所有类型定义
└── index.ts # 主入口文件
```
### 核心特性
1. **TypeScript 支持**: 完整的类型安全,提供优秀的开发体验
2. **模块化设计**: 每个功能模块独立,便于维护和扩展
3. **智能过滤**: 自动忽略空值条件,提高代码简洁性
4. **标准字段管理**: 自动管理标准字段,避免用户误操作
5. **国际化支持**: 内置多语言支持
6. **错误处理**: 统一的错误处理机制
7. **实时通信**: WebSocket 实时数据推送
8. **审计日志**: 完整的操作审计功能
## 🧪 测试
```bash
# 运行所有测试
npm test
# 运行单元测试
npm run test:unit
# 运行集成测试
npm run test:integration
# 运行端到端测试
npm run test:e2e
# 运行真实API测试
npm run test:real-api
```
## 📦 构建
```bash
# 开发模式构建
npm run dev
# 生产模式构建
npm run build
# 类型检查
npm run type-check
```
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
### 🚀 新功能
- **TypeScript 重构**: 完全使用 TypeScript 重写,提供完整的类型安全
- **模块化架构**: 将大型文件拆分为小的模块,提高代码可维护性
- **用户管理模块**: 添加完整的用户 CRUD 操作
- **审计日志模块**: 添加完整的审计功能
- **表管理模块**: 添加完整的表结构管理功能
- **WebSocket 模块**: 添加实时通信功能
### 📊 测试统计
- **总测试用例**: 111 个
- **语句覆盖率**: 98.37%
- **分支覆盖率**: 92.85%
- **函数覆盖率**: 95.74%
- **行覆盖率**: 99.14%
### 🔧 重要 API 变更
- **统一 API 设计**: 所有操作方法都采用前置调用方式,条件在前,操作在后
- **select 作为终止方法**: 将 `select()` 改为终止方法,移除 `query()` 方法
- **链式调用规则**: `insert()`, `update()`, `delete()`, `select()`, `get()` 必须在链式调用最后调用
- **错误消息格式**: 统一错误消息格式,包含 HTTP 状态码
## 📄 许可证
MIT License
## 🔗 相关链接
- [GitHub 仓库](https://github.com/wss-git/devflowbase)
- [问题反馈](https://github.com/wss-git/devflowbase/issues)
- [文档](https://github.com/wss-git/devflowbase#readme)
## �� 支持
如果你遇到任何问题或有疑问,请:
1. 查看[问题反馈](https://github.com/wss-git/devflowbase/issues)
2. 创建新的 Issue
3. 联系作者: wssgryx@163.com
## 📋 标准字段列表
- `id` - 主键 ID(自动生成)
- `created_by` - 创建者 ID(自动设置)
- `created_at` - 创建时间(自动设置)
- `updated_by` - 更新者 ID(自动设置)
- `updated_at` - 更新时间(自动设置)
- `deleted_by` - 删除者 ID(软删除时自动设置)
- `deleted_at` - 删除时间(软删除时自动设置)