/** * 数据库管理 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 { const res = await request.post('/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 { const res = await request.post('/platform/database/search', { serverId, database, page, pageSize }) return res.data.data } /** * 创建数据库 */ export async function createDatabase(params: CreateDatabaseParams): Promise { await request.post('/platform/database/create', params) } /** * 删除数据库 */ export async function deleteDatabase(params: DeleteDatabaseParams): Promise { await request.post('/platform/database/delete', params) } /** * 更新数据库描述 */ export async function updateDatabaseDescription(params: UpdateDescriptionParams): Promise { await request.post('/platform/database/description/update', params) } /** * 修改数据库密码 */ export async function changeDatabasePassword(params: ChangePasswordParams): Promise { await request.post('/platform/database/password/change', params) } /** * 操作应用(启动/停止/重启) */ export async function operateApp(params: OperateAppParams): Promise { await request.post('/platform/database/app/operate', params) } /** * 获取数据库字符集排序规则选项 */ export async function getFormatOptions( serverId: number, type: string, database: string, format?: string ): Promise { const res = await request.post('/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 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 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 { const res = await request.post('/platform/database/app/info', { serverId, appKey }) return res.data.data } /** * 获取应用版本详情 */ export async function getAppDetail( serverId: number, appId: number, version: string ): Promise { const res = await request.post('/platform/database/app/detail', { serverId, appId, version }) return res.data.data } /** * 安装应用 */ export async function installApp(params: InstallAppParams): Promise { const { serverId, ...restParams } = params const res = await request.post('/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 { const res = await request.post('/platform/database/task/log', { serverId, taskId, page, pageSize }) return res.data.data }