connection.js 2.24 KB
import { Router } from 'express'
import { getConnections, addConnection, removeConnection, testConnection, getPool } from '../db.js'

const router = Router()

// 获取所有连接
router.get('/', (req, res) => {
  const connections = getConnections()
  // 隐藏密码
  const safe = connections.map(c => ({ ...c, password: '******' }))
  res.json({ success: true, data: safe })
})

// 新增连接
router.post('/', async (req, res) => {
  try {
    const { name, host, port, user, password, database } = req.body
    if (!name || !host || !user || !database) {
      return res.json({ success: false, message: '缺少必填字段' })
    }
    // 先测试连接
    const testResult = await testConnection({ host, port, user, password, database })
    if (!testResult.success) {
      return res.json({ success: false, message: `连接测试失败: ${testResult.message}` })
    }
    const conn = addConnection({ name, host, port, user, password, database })
    res.json({ success: true, data: { ...conn, password: '******' } })
  } catch (e) {
    res.json({ success: false, message: e.message })
  }
})

// 测试连接
router.post('/test', async (req, res) => {
  try {
    const { host, port, user, password, database } = req.body
    const result = await testConnection({ host, port, user, password, database })
    res.json({ success: result.success, message: result.message })
  } catch (e) {
    res.json({ success: false, message: e.message })
  }
})

// 删除连接
router.delete('/:id', (req, res) => {
  removeConnection(req.params.id)
  res.json({ success: true })
})

// 获取连接的数据库列表
router.get('/:id/databases', async (req, res) => {
  try {
    const pool = getPool(req.params.id)
    const [rows] = await pool.query('SHOW DATABASES')
    res.json({ success: true, data: rows.map(r => r.Database) })
  } catch (e) {
    res.json({ success: false, message: e.message })
  }
})

// 获取连接的表列表
router.get('/:id/tables', async (req, res) => {
  try {
    const pool = getPool(req.params.id)
    const [rows] = await pool.query('SHOW TABLES')
    const key = Object.keys(rows[0] || {})[0]
    res.json({ success: true, data: rows.map(r => r[key]) })
  } catch (e) {
    res.json({ success: false, message: e.message })
  }
})

export default router