diff --git a/web/src/views/database/ServerList.vue b/web/src/views/database/ServerList.vue
index 78180cdd..2c0ad021 100644
--- a/web/src/views/database/ServerList.vue
+++ b/web/src/views/database/ServerList.vue
@@ -4,6 +4,7 @@ import { NButton, NInput, NInputGroup, NPopconfirm, NTag } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import database from '@/api/panel/database'
+import PtyTerminalModal from '@/components/common/PtyTerminalModal.vue'
import { formatDateTime } from '@/utils'
import UpdateServerModal from '@/views/database/UpdateServerModal.vue'
@@ -11,6 +12,34 @@ const { $gettext } = useGettext()
const updateModal = ref(false)
const updateID = ref(0)
+// 终端弹窗
+const terminalModal = ref(false)
+const terminalTitle = ref('')
+const terminalCommand = ref('')
+
+// 打开数据库终端
+const openTerminal = (row: any) => {
+ if (row.type === 'mysql') {
+ // MySQL 使用 mysql 命令行
+ terminalTitle.value = `MySQL - ${row.name}`
+ terminalCommand.value = `mysql -u'${row.username}' -p'${row.password}' -h'${row.host}' -P'${row.port}'`
+ } else if (row.type === 'postgresql') {
+ // PostgreSQL 判断是否有密码
+ terminalTitle.value = `PostgreSQL - ${row.name}`
+ if (row.password) {
+ // 有密码时使用 PGPASSWORD 环境变量
+ terminalCommand.value = `PGPASSWORD='${row.password}' psql -U '${row.username}' -h '${row.host}' -p '${row.port}'`
+ } else {
+ // 无密码时切换到 postgres 用户
+ terminalCommand.value = `su - postgres -c 'psql'`
+ }
+ } else {
+ window.$message.error($gettext('Unsupported database type'))
+ return
+ }
+ terminalModal.value = true
+}
+
const columns: any = [
{
title: $gettext('Type'),
@@ -133,10 +162,21 @@ const columns: any = [
{
title: $gettext('Actions'),
key: 'actions',
- width: 300,
+ width: 350,
hideInExcel: true,
render(row: any) {
return [
+ h(
+ NButton,
+ {
+ size: 'small',
+ type: 'info',
+ onClick: () => openTerminal(row)
+ },
+ {
+ default: () => $gettext('Terminal')
+ }
+ ),
h(
NPopconfirm,
{
@@ -158,7 +198,8 @@ const columns: any = [
NButton,
{
size: 'small',
- type: 'success'
+ type: 'success',
+ style: 'margin-left: 15px;'
},
{
default: () => $gettext('Sync')
@@ -278,6 +319,12 @@ onUnmounted(() => {
}"
/>
+
+