365 lines
7.1 KiB
TypeScript
365 lines
7.1 KiB
TypeScript
/**
|
||
* 数据库管理 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
|
||
}
|
||
|