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:
zhangtao
2026-07-13 01:14:20 +08:00
parent 6a5f8cf0dd
commit cf88ab8897
102 changed files with 4078 additions and 3777 deletions
@@ -1,6 +1,6 @@
import { request } from "@utils";
const API_PATH = "/monitor/dashboard";
const API_PATH = "/monitor/online";
export interface RecentLoginItem {
username: string;
+17 -93
View File
@@ -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;
}
+28 -8
View File
@@ -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;