生产管理系统 - 2种角色的登录
This commit is contained in:
127
crop-x/src/lib/api/README.md
Normal file
127
crop-x/src/lib/api/README.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# API SDK 使用指南
|
||||
|
||||
## 🚀 概述
|
||||
|
||||
本项目提供了两种API调用方式:
|
||||
|
||||
1. **原始SDK** (`sdk.gen.ts`) - 直接API调用,无认证
|
||||
2. **认证SDK** (`authenticated-sdk.ts`) - 自动添加Token的API调用
|
||||
|
||||
## 📝 使用方法
|
||||
|
||||
### 1. 无认证的API调用(如登录、获取验证码)
|
||||
|
||||
```typescript
|
||||
import { api } from '@/lib/api/authenticated-sdk';
|
||||
|
||||
// 获取验证码 - 不需要token
|
||||
const captchaResponse = await api.getCaptcha();
|
||||
|
||||
// 用户登录 - 不需要token
|
||||
const loginResponse = await api.login({
|
||||
body: {
|
||||
identifier: 'admin',
|
||||
password: 'password123',
|
||||
captcha_id: 'captcha-id',
|
||||
captcha_text: 'ABCD'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### 2. 需要认证的API调用
|
||||
|
||||
```typescript
|
||||
import { authenticatedSdk } from '@/lib/api/authenticated-sdk';
|
||||
|
||||
// 获取当前用户信息 - 自动添加token
|
||||
const userResponse = await authenticatedSdk.getCurrentUser();
|
||||
|
||||
// 获取用户列表 - 自动添加token
|
||||
const usersResponse = await authenticatedSdk.getUsers({
|
||||
query: { page: 1, size: 10 }
|
||||
});
|
||||
|
||||
// 创建用户 - 自动添加token
|
||||
const createResponse = await authenticatedSdk.createUser({
|
||||
body: {
|
||||
username: 'newuser',
|
||||
email: 'user@example.com'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 🔧 核心特性
|
||||
|
||||
### 自动Token管理
|
||||
- 自动从localStorage获取token
|
||||
- 自动添加到请求头 `Authorization: Bearer {token}`
|
||||
- 请求日志记录
|
||||
|
||||
### 401错误处理
|
||||
- 检测401响应自动清除本地认证信息
|
||||
- 自动跳转到登录页面
|
||||
|
||||
### 类型安全
|
||||
- 完整的TypeScript类型支持
|
||||
- 智能代码提示
|
||||
|
||||
## 📋 API方法列表
|
||||
|
||||
### 认证相关
|
||||
- `api.getCaptcha()` - 获取验证码
|
||||
- `api.login(options)` - 用户登录
|
||||
- `api.logout(options)` - 用户登出
|
||||
- `authenticatedSdk.getCurrentUser()` - 获取当前用户
|
||||
- `authenticatedSdk.refreshToken()` - 刷新token
|
||||
|
||||
### 用户管理
|
||||
- `authenticatedSdk.getUsers()` - 获取用户列表
|
||||
- `authenticatedSdk.getUser(options)` - 获取单个用户
|
||||
- `authenticatedSdk.createUser(options)` - 创建用户
|
||||
- `authenticatedSdk.updateUser(options)` - 更新用户
|
||||
- `authenticatedSdk.deleteUser(options)` - 删除用户
|
||||
|
||||
### 部门管理
|
||||
- `authenticatedSdk.getDepartments()` - 获取部门列表
|
||||
- `authenticatedSdk.getDepartment(options)` - 获取单个部门
|
||||
- `authenticatedSdk.createDepartment(options)` - 创建部门
|
||||
- `authenticatedSdk.updateDepartment(options)` - 更新部门
|
||||
- `authenticatedSdk.deleteDepartment(options)` - 删除部门
|
||||
|
||||
### 租户管理
|
||||
- `authenticatedSdk.getTenants()` - 获取租户列表
|
||||
- `authenticatedSdk.getTenant(options)` - 获取单个租户
|
||||
- `authenticatedSdk.getCurrentTenant()` - 获取当前租户信息
|
||||
|
||||
## ⚠️ 重要说明
|
||||
|
||||
1. **API生成覆盖**: `sdk.gen.ts` 和 `client.gen.ts` 会被 `npm run api:generate` 覆盖
|
||||
2. **安全文件**: `authenticated-sdk.ts` 不会被覆盖,可安全使用
|
||||
3. **Token存储**: Token存储在localStorage的user对象中
|
||||
4. **代理配置**: 所有请求通过Next.js代理到真实API地址
|
||||
|
||||
## 🔄 迁移指南
|
||||
|
||||
### 从原始SDK迁移到认证SDK
|
||||
|
||||
```typescript
|
||||
// ❌ 旧方式 - 可能缺少认证
|
||||
import { getUsersApiV1UsersGet } from '@/lib/api/sdk.gen';
|
||||
const response = await getUsersApiV1UsersGet();
|
||||
|
||||
// ✅ 新方式 - 自动添加认证
|
||||
import { authenticatedSdk } from '@/lib/api/authenticated-sdk';
|
||||
const response = await authenticatedSdk.getUsers();
|
||||
```
|
||||
|
||||
### 混合使用场景
|
||||
|
||||
```typescript
|
||||
import { api, authenticatedSdk } from '@/lib/api/authenticated-sdk';
|
||||
|
||||
// 登录 - 不需要认证
|
||||
const loginResponse = await api.login({ body: loginData });
|
||||
|
||||
// 登录成功后,获取用户信息 - 需要认证
|
||||
const userInfo = await authenticatedSdk.getCurrentUser();
|
||||
```
|
||||
108
crop-x/src/lib/api/authenticated-sdk.ts
Normal file
108
crop-x/src/lib/api/authenticated-sdk.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* 认证API SDK包装器
|
||||
* 为所有API调用自动添加Token,不会被API生成工具覆盖
|
||||
*/
|
||||
|
||||
import { client } from './client.gen';
|
||||
import * as api from './sdk.gen';
|
||||
import type { Options } from './sdk.gen';
|
||||
|
||||
// 获取存储的token
|
||||
const getAuthToken = (): string | null => {
|
||||
try {
|
||||
const storedUser = localStorage.getItem('user');
|
||||
const user = storedUser ? JSON.parse(storedUser) : null;
|
||||
return user?.token || null;
|
||||
} catch (error) {
|
||||
console.error('获取token失败:', error);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
// 创建带认证的客户端选项
|
||||
const createAuthenticatedOptions = <TData = any, ThrowOnError extends boolean = false>(
|
||||
originalOptions: Options<TData, ThrowOnError> = {} as Options<TData, ThrowOnError>
|
||||
): Options<TData, ThrowOnError> => {
|
||||
const token = getAuthToken();
|
||||
|
||||
const authenticatedOptions: Options<TData, ThrowOnError> = {
|
||||
...originalOptions,
|
||||
client: client
|
||||
};
|
||||
|
||||
// 如果有token,添加到请求头
|
||||
if (token) {
|
||||
authenticatedOptions.headers = {
|
||||
...originalOptions.headers,
|
||||
Authorization: `Bearer ${token}`
|
||||
};
|
||||
console.log('🔑 为API请求添加Token:', (originalOptions as any).url || 'unknown endpoint');
|
||||
} else {
|
||||
console.log('🚫 无Token,API请求可能未授权:', (originalOptions as any).url || 'unknown endpoint');
|
||||
}
|
||||
|
||||
return authenticatedOptions;
|
||||
};
|
||||
|
||||
// 包装所有API方法,自动添加认证
|
||||
export const authenticatedSdk = {
|
||||
// 认证相关
|
||||
getCaptcha: (options?: Options) => api.getCaptchaApiV1AuthCaptchaGet(options),
|
||||
login: (options: Options) => api.loginApiV1AuthLoginPost(options),
|
||||
logout: (options?: Options) => api.logoutApiV1AuthLogoutPost(createAuthenticatedOptions(options)),
|
||||
getCurrentUser: (options?: Options) => api.getCurrentUserInfoApiV1AuthMeGet(createAuthenticatedOptions(options)),
|
||||
refreshToken: (options?: Options) => api.refreshTokenApiV1AuthRefreshPost(createAuthenticatedOptions(options)),
|
||||
|
||||
// 用户管理
|
||||
getUsers: (options?: Options) => api.getUsersApiV1UsersGet(createAuthenticatedOptions(options)),
|
||||
getUser: (options: Options) => api.getUserApiV1UsersUserIdGet(createAuthenticatedOptions(options)),
|
||||
createUser: (options: Options) => api.createUserApiV1UsersPost(createAuthenticatedOptions(options)),
|
||||
updateUser: (options: Options) => api.updateUserApiV1UsersUserIdPut(createAuthenticatedOptions(options)),
|
||||
deleteUser: (options: Options) => api.deleteUserApiV1UsersUserIdDelete(createAuthenticatedOptions(options)),
|
||||
|
||||
// 系统用户管理
|
||||
getSystemUsers: (options?: Options) => api.listSystemUsersApiV1UsersSystemUsersGet(createAuthenticatedOptions(options)),
|
||||
getSystemUser: (options: Options) => api.getSystemUserApiV1UsersSystemUsersUserIdGet(createAuthenticatedOptions(options)),
|
||||
createSystemUser: (options: Options) => api.createSystemUserApiV1UsersSystemUsersPost(createAuthenticatedOptions(options)),
|
||||
updateSystemUser: (options: Options) => api.updateSystemUserApiV1UsersSystemUsersUserIdPut(createAuthenticatedOptions(options)),
|
||||
deleteSystemUser: (options: Options) => api.deleteSystemUserApiV1UsersSystemUsersUserIdDelete(createAuthenticatedOptions(options)),
|
||||
|
||||
// 部门管理
|
||||
getDepartments: (options?: Options) => api.getDepartmentsApiV1DepartmentsDepartmentsGet(createAuthenticatedOptions(options)),
|
||||
getDepartment: (options: Options) => api.getDepartmentApiV1DepartmentsDepartmentsDepartmentIdGet(createAuthenticatedOptions(options)),
|
||||
createDepartment: (options: Options) => api.createDepartmentApiV1DepartmentsDepartmentsPost(createAuthenticatedOptions(options)),
|
||||
updateDepartment: (options: Options) => api.updateDepartmentApiV1DepartmentsDepartmentsDepartmentIdPut(createAuthenticatedOptions(options)),
|
||||
deleteDepartment: (options: Options) => api.deleteDepartmentApiV1DepartmentsDepartmentsDepartmentIdDelete(createAuthenticatedOptions(options)),
|
||||
getDepartmentTree: (options?: Options) => api.getDepartmentTreeApiV1DepartmentsDepartmentsTreeGet(createAuthenticatedOptions(options)),
|
||||
|
||||
// 租户管理
|
||||
getTenants: (options?: Options) => api.listTenantsApiV1TenantsGet(createAuthenticatedOptions(options)),
|
||||
getTenant: (options: Options) => api.getTenantApiV1TenantsTenantIdGet(createAuthenticatedOptions(options)),
|
||||
createTenant: (options: Options) => api.createTenantApiV1TenantsPost(createAuthenticatedOptions(options)),
|
||||
updateTenant: (options: Options) => api.updateTenantApiV1TenantsTenantIdPut(createAuthenticatedOptions(options)),
|
||||
deleteTenant: (options: Options) => api.deleteTenantApiV1TenantsTenantIdDelete(createAuthenticatedOptions(options)),
|
||||
getCurrentTenant: (options?: Options) => api.getCurrentTenantApiV1TenantsMeGet(createAuthenticatedOptions(options)),
|
||||
|
||||
// 消息管理
|
||||
sendMessage: (options: Options) => api.sendMessageApiV1MessagesSendPost(createAuthenticatedOptions(options)),
|
||||
scheduleMessage: (options: Options) => api.scheduleMessageApiV1MessagesSchedulePost(createAuthenticatedOptions(options)),
|
||||
getMessageLogs: (options?: Options) => api.listMessageLogsApiV1MessagesLogsMessageLogsGet(createAuthenticatedOptions(options)),
|
||||
getMessageReceipts: (options: Options) => api.getMessageReceiptsApiV1MessagesLogsMessageLogsMessageIdReceiptsGet(createAuthenticatedOptions(options)),
|
||||
|
||||
// 系统信息
|
||||
getSystemInfo: (options?: Options) => api.getSystemInfoApiV1SystemInfoGet(createAuthenticatedOptions(options)),
|
||||
getSystemStats: (options?: Options) => api.getSystemStatsApiV1SystemStatsGet(createAuthenticatedOptions(options)),
|
||||
getSystemMetrics: (options?: Options) => api.getSystemMetricsApiV1SystemMetricsGet(createAuthenticatedOptions(options)),
|
||||
healthCheck: (options?: Options) => api.healthCheckApiV1HealthGet(createAuthenticatedOptions(options)),
|
||||
|
||||
// 日志管理
|
||||
getLoginLogs: (options?: Options) => api.getLoginLogsApiV1LogsLogsLoginGet(createAuthenticatedOptions(options)),
|
||||
getOperationLogs: (options?: Options) => api.getOperationLogsApiV1LogsLogsOperationGet(createAuthenticatedOptions(options)),
|
||||
getNetworkLogs: (options?: Options) => api.getNetworkLogsApiV1LogsLogsNetworkGet(createAuthenticatedOptions(options)),
|
||||
};
|
||||
|
||||
// 导出原始API以供特殊情况使用(如登录)
|
||||
export { api };
|
||||
|
||||
// 导出类型
|
||||
export type { Options };
|
||||
Reference in New Issue
Block a user