Files
nanxiisletAdmin/src/api/database.ts
2026-01-27 20:29:40 +08:00

365 lines
7.1 KiB
TypeScript
Raw 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.

/**
* 数据库管理 API
* 通过1Panel管理数据库
*/
import { request } from '@/utils/request'
// ==================== 类型定义 ====================
/**
* 应用安装状态
*/
export interface AppInstallStatus {
isExist: boolean
name: string
app: string
version: string
status: string
createdAt: string
lastBackupAt: string
appInstallId: number
containerName: string
installPath: string
httpPort: number
httpsPort: number
}
/**
* 数据库记录
*/
export interface DatabaseRecord {
id: number
createdAt: string
name: string
from: string
mysqlName: string
format: string
username: string
password: string
permission: string
isDelete: boolean
description: string
showPassword?: boolean // 前端控制是否显示密码
}
/**
* 数据库列表响应
*/
export interface DatabaseListResponse {
total: number
items: DatabaseRecord[]
}
/**
* 创建数据库参数
*/
export interface CreateDatabaseParams {
serverId: number
name: string
username: string
password: string
format?: string // 字符集 format
collation?: string // 排序规则 collation (可选后端接口没明确提到但通常MySQL需要)
permission?: string
permissionIPs?: string
type: string // 数据库类型如mysql
database: string // 数据库名称如mysql
from?: string // 固定 'local'
description?: string
}
/**
* 删除数据库参数
*/
export interface DeleteDatabaseParams {
serverId: number
id: number
type: string // 数据库类型如mysql
database: string // 数据库名称/应用类型
deleteBackup?: boolean
forceDelete?: boolean
}
/**
* 修改密码参数
*/
export interface ChangePasswordParams {
serverId: number
id: number
value: string // 新密码 (Base64)
type: string // 数据库类型
database: string // 数据库名称
from: string // 固定 'local'
}
/**
* 更新描述参数
*/
export interface UpdateDescriptionParams {
serverId: number
id: number
description: string
}
/**
* 操作应用参数
*/
export interface OperateAppParams {
serverId: number
operate: 'start' | 'stop' | 'restart'
installId: number
[key: string]: any
}
// ==================== API 方法 ====================
/**
* 检查应用安装状态MySQL/PostgreSQL/Redis等
*/
export async function checkAppInstalled(
serverId: number,
key: string,
name: string
): Promise<AppInstallStatus> {
const res = await request.post<AppInstallStatus>('/platform/database/app/check', {
serverId,
key,
name
})
return res.data.data
}
/**
* 查询数据库列表
*/
export async function searchDatabases(
serverId: number,
database: string,
page: number = 1,
pageSize: number = 20
): Promise<DatabaseListResponse> {
const res = await request.post<DatabaseListResponse>('/platform/database/search', {
serverId,
database,
page,
pageSize
})
return res.data.data
}
/**
* 创建数据库
*/
export async function createDatabase(params: CreateDatabaseParams): Promise<void> {
await request.post('/platform/database/create', params)
}
/**
* 删除数据库
*/
export async function deleteDatabase(params: DeleteDatabaseParams): Promise<void> {
await request.post('/platform/database/delete', params)
}
/**
* 更新数据库描述
*/
export async function updateDatabaseDescription(params: UpdateDescriptionParams): Promise<void> {
await request.post('/platform/database/description/update', params)
}
/**
* 修改数据库密码
*/
export async function changeDatabasePassword(params: ChangePasswordParams): Promise<void> {
await request.post('/platform/database/password/change', params)
}
/**
* 操作应用(启动/停止/重启)
*/
export async function operateApp(params: OperateAppParams): Promise<void> {
await request.post('/platform/database/app/operate', params)
}
/**
* 获取数据库字符集排序规则选项
*/
export async function getFormatOptions(
serverId: number,
type: string,
database: string,
format?: string
): Promise<string[]> {
const res = await request.post<string[]>('/platform/database/format/options', {
serverId,
type,
database,
format
})
return res.data.data
}
/**
* 应用信息
*/
export interface AppInfo {
id: number
name: string
key: string
shortDescZh: string
shortDescEn: string
description: string
icon: string
type: string
status: string
website: string
github: string
document: string
versions: string[]
installed: boolean
[key: string]: any
}
/**
* 应用版本详情
*/
export interface AppDetail {
id: number
appId: number
version: string
dockerCompose: string
status: string
enable: boolean
params: {
formFields: Array<{
default: any
envKey: string
label: Record<string, string>
labelEn: string
labelZh: string
required: boolean
type: string
random?: boolean
rule?: string
}>
}
[key: string]: any
}
/**
* 安装应用参数
*/
export interface InstallAppParams {
serverId: number
appDetailId: number
name: string
version: string
params: Record<string, any>
dockerCompose: string
taskID: string // 任务ID用于查询安装日志
// 高级设置
advanced?: boolean
containerName?: string
allowPort?: boolean
specifyIP?: string
restartPolicy?: string
cpuQuota?: number
memoryLimit?: number
memoryUnit?: string
pullImage?: boolean
editCompose?: boolean
gpuConfig?: boolean
appID?: string
format?: string
collation?: string
}
/**
* 安装应用返回结果
*/
export interface InstallAppResult {
id: number
name: string
appId: number
appDetailId: number
version: string
status: string
containerName: string
httpPort: number
[key: string]: any
}
/**
* 任务日志响应
*/
export interface TaskLogResponse {
end: boolean
path: string
total: number
taskStatus: string
lines: string[]
totalLines: number
}
/**
* 获取应用信息如Redis
*/
export async function getAppInfo(
serverId: number,
appKey: string
): Promise<AppInfo> {
const res = await request.post<AppInfo>('/platform/database/app/info', {
serverId,
appKey
})
return res.data.data
}
/**
* 获取应用版本详情
*/
export async function getAppDetail(
serverId: number,
appId: number,
version: string
): Promise<AppDetail> {
const res = await request.post<AppDetail>('/platform/database/app/detail', {
serverId,
appId,
version
})
return res.data.data
}
/**
* 安装应用
*/
export async function installApp(params: InstallAppParams): Promise<InstallAppResult> {
const { serverId, ...restParams } = params
const res = await request.post<InstallAppResult>('/platform/database/app/install', {
serverId,
...restParams
})
return res.data.data
}
/**
* 读取任务日志
*/
export async function readTaskLog(
serverId: number,
taskId: string,
page: number = 1,
pageSize: number = 500
): Promise<TaskLogResponse> {
const res = await request.post<TaskLogResponse>('/platform/database/task/log', {
serverId,
taskId,
page,
pageSize
})
return res.data.data
}