mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-05 01:20:07 +00:00
refactor: 整合仪表盘功能到监控模块,清理冗余代码
- 移除原监控仪表盘独立模块,将相关功能合并到在线监控模块 - 重构租户配置字段名,统一使用logo_url和name替代tenant_logo/tenant_name - 优化搜索工具函数,移除重复导入 - 调整参数配置模型字段长度限制,移除config_value的max_length约束 - 清理冗余的常量定义和导入语句 - 修复批量状态设置接口的redis依赖注入 - 增强OAuth登录安全性,添加租户默认归属和state一次性消费 - 优化资源目录缓存逻辑,减少重复计算 - 新增API Token模块基础框架 - 完善用户token版本管理,支持主动失效JWT - 调整AI模型配置缓存过期时间 - 修复菜单类型字段索引,提升查询性能 - 简化前端刷新token调用逻辑 - 新增滑块验证完成接口和忘记密码验证码校验 - 调整系统配置默认值,添加操作日志保留天数和接口白名单配置 - 限制Mock支付回调仅在开发环境可用 - 重构websocket认证方式,支持更安全的subprotocol传参
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/monitor/dashboard";
|
||||
const API_PATH = "/monitor/online";
|
||||
|
||||
export interface RecentLoginItem {
|
||||
username: string;
|
||||
|
||||
@@ -68,62 +68,12 @@ const TenantAPI = {
|
||||
});
|
||||
},
|
||||
|
||||
/** 套餐变更影响预览 */
|
||||
getPackageChangePreview(tenantId: number, newPackageId: number) {
|
||||
/** 套餐变更预览 */
|
||||
previewPackageChange(packageId: number) {
|
||||
return request<ApiResponse<PackageChangePreview>>({
|
||||
url: `${API_PATH}/${tenantId}/package-change-preview`,
|
||||
url: `${API_PATH}/package/preview`,
|
||||
method: "get",
|
||||
params: { new_package_id: newPackageId },
|
||||
});
|
||||
},
|
||||
|
||||
getTenantUsers(tenantId: number) {
|
||||
return request<ApiResponse<TenantUser[]>>({
|
||||
url: `${API_PATH}/${tenantId}/users`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
addTenantUser(tenantId: number, body: TenantUserAddForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/${tenantId}/users`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
removeTenantUser(tenantId: number, userId: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/${tenantId}/users/${userId}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
/** 公开接口:无需登录即可获取租户配置(用于登录页等场景) */
|
||||
getTenantConfigInfo(tenantId: number) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config/info`,
|
||||
method: "get",
|
||||
headers: {
|
||||
Authorization: NO_AUTH_FLAG,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
/** 获取租户个性化配置 */
|
||||
getTenantConfig(tenantId: number) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 批量更新租户个性化配置 */
|
||||
updateTenantConfig(tenantId: number, body: TenantConfigItem[]) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config`,
|
||||
method: "put",
|
||||
data: body,
|
||||
params: { target_package_id: packageId },
|
||||
});
|
||||
},
|
||||
|
||||
@@ -135,12 +85,14 @@ const TenantAPI = {
|
||||
});
|
||||
},
|
||||
|
||||
/** 套餐变更预览 */
|
||||
previewPackageChange(packageId: number) {
|
||||
return request<ApiResponse<PackageChangePreview>>({
|
||||
url: `${API_PATH}/package/preview`,
|
||||
/** 公开接口:无需登录即可获取租户配置(用于登录页等场景) */
|
||||
getTenantConfigInfo(tenantId: number) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config/info`,
|
||||
method: "get",
|
||||
params: { target_package_id: packageId },
|
||||
headers: {
|
||||
Authorization: NO_AUTH_FLAG,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
@@ -291,40 +243,6 @@ export interface TenantUpdateForm extends BaseFormType {
|
||||
description?: string;
|
||||
}
|
||||
|
||||
/** 套餐变更影响预览 */
|
||||
export interface PackageChangePreview {
|
||||
new_package_id: number;
|
||||
new_package_name: string;
|
||||
affected_roles: Record<string, unknown>[];
|
||||
removed_menus: Record<string, unknown>[];
|
||||
added_menus: Record<string, unknown>[];
|
||||
quota_changes: Record<string, unknown>;
|
||||
total_affected_users: number;
|
||||
}
|
||||
|
||||
export interface TenantUser {
|
||||
id: number;
|
||||
user_id: number;
|
||||
tenant_id: number;
|
||||
role: string;
|
||||
is_default: number;
|
||||
create_time?: string;
|
||||
username: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface TenantUserAddForm {
|
||||
user_id: number;
|
||||
role: string;
|
||||
is_default: number;
|
||||
}
|
||||
|
||||
/** 租户配置项 */
|
||||
export interface TenantConfigItem {
|
||||
config_key: string;
|
||||
config_value: string | null;
|
||||
}
|
||||
|
||||
export interface AvailablePackage {
|
||||
id: number;
|
||||
name: string;
|
||||
@@ -340,6 +258,12 @@ export interface AvailablePackage {
|
||||
available_actions: string[];
|
||||
}
|
||||
|
||||
/** 租户配置项 */
|
||||
export interface TenantConfigItem {
|
||||
config_key: string;
|
||||
config_value: string | null;
|
||||
}
|
||||
|
||||
export interface PackageChangePreview {
|
||||
current_package: string;
|
||||
target_package: string;
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/token";
|
||||
|
||||
const ApiTokenAPI = {
|
||||
/** 创建 API Token */
|
||||
createToken(body: ApiTokenCreateForm) {
|
||||
return request<ApiResponse<ApiTokenCreatedSchema>>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 分页列表 */
|
||||
listToken(query: ApiTokenPageQuery) {
|
||||
return request<ApiResponse<PageResult<ApiTokenTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
/** 详情 */
|
||||
detailToken(id: number) {
|
||||
return request<ApiResponse<ApiTokenTable>>({
|
||||
url: `${API_PATH}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 重置 token */
|
||||
resetToken(id: number, body: { name?: string; description?: string }) {
|
||||
return request<ApiResponse<ApiTokenCreatedSchema>>({
|
||||
url: `${API_PATH}/${id}/reset`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 启用/禁用 */
|
||||
setTokenStatus(id: number, body: { status: number }) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/${id}/status`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 删除 */
|
||||
deleteToken(id: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/${id}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
/** 查看明文(二次验证) */
|
||||
revealToken(id: number, body: { password: string }) {
|
||||
return request<ApiResponse<ApiTokenRevealSchema>>({
|
||||
url: `${API_PATH}/${id}/reveal`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default ApiTokenAPI;
|
||||
|
||||
export interface ApiTokenPageQuery extends PageQuery {
|
||||
name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface ApiTokenTable extends BaseType {
|
||||
name?: string;
|
||||
token_prefix?: string;
|
||||
scopes?: string[];
|
||||
expires_at?: string;
|
||||
rate_limit?: number;
|
||||
status?: number;
|
||||
last_used_at?: string;
|
||||
used_count?: number;
|
||||
description?: string;
|
||||
tenant_id?: number;
|
||||
}
|
||||
|
||||
export interface ApiTokenCreateForm extends BaseFormType {
|
||||
name: string;
|
||||
scopes?: string[];
|
||||
expires_at?: string;
|
||||
rate_limit?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface ApiTokenCreatedSchema {
|
||||
id: number;
|
||||
name: string;
|
||||
token_prefix: string;
|
||||
/** 创建时完整返回,请立即保存 */
|
||||
token_plain: string;
|
||||
expires_at?: string;
|
||||
}
|
||||
|
||||
export interface ApiTokenRevealSchema {
|
||||
id: number;
|
||||
token_plain: string;
|
||||
expires_at?: string;
|
||||
}
|
||||
@@ -22,11 +22,11 @@ const AuthAPI = {
|
||||
});
|
||||
},
|
||||
|
||||
refreshToken(body: RefreshToekenBody) {
|
||||
refreshToken(refreshToken: string) {
|
||||
return request<ApiResponse<JWTOut>>({
|
||||
url: `${API_PATH}/token/refresh`,
|
||||
method: "post",
|
||||
data: body,
|
||||
data: refreshToken,
|
||||
});
|
||||
},
|
||||
|
||||
@@ -104,6 +104,32 @@ const AuthAPI = {
|
||||
params: { domain },
|
||||
});
|
||||
},
|
||||
|
||||
/** 搜索租户(根据关键字模糊搜索编码或名称) */
|
||||
tenantSearch(q: string) {
|
||||
return request<ApiResponse<TenantOption[]>>({
|
||||
url: `${API_PATH}/tenant-search`,
|
||||
method: "get",
|
||||
params: { q },
|
||||
});
|
||||
},
|
||||
|
||||
/** 获取所有活跃租户选项,用于登录页下拉选择 */
|
||||
getTenantOptions() {
|
||||
return request<ApiResponse<TenantOption[]>>({
|
||||
url: `${API_PATH}/tenant-options`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 滑块验证完成后端标记 */
|
||||
sliderComplete(captchaKey: string) {
|
||||
return request<ApiResponse<{ captcha_key: string; verified: boolean }>>({
|
||||
url: `${API_PATH}/captcha/slider/complete`,
|
||||
method: "post",
|
||||
data: { captcha_key: captchaKey },
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default AuthAPI;
|
||||
@@ -132,7 +158,6 @@ export interface TenantRegisterResult {
|
||||
export interface LoginFormData {
|
||||
username: string;
|
||||
password: string;
|
||||
captcha?: string;
|
||||
captcha_key?: string;
|
||||
remember?: boolean;
|
||||
login_type?: string;
|
||||
@@ -151,11 +176,6 @@ export interface LoginResult extends JWTOut {
|
||||
tenants?: TenantOption[];
|
||||
}
|
||||
|
||||
/** 刷新 Token 请求体 */
|
||||
export interface RefreshToekenBody {
|
||||
refresh_token: string;
|
||||
}
|
||||
|
||||
/** 退出登录请求体 */
|
||||
export interface LogoutBody {
|
||||
token: string;
|
||||
|
||||
Reference in New Issue
Block a user