mirror of
https://github.com/acepanel/panel.git
synced 2026-02-05 06:57:19 +08:00
feat: 优化数据库信息获取
This commit is contained in:
@@ -6,16 +6,10 @@ import (
|
||||
|
||||
type DatabaseStatus string
|
||||
|
||||
const (
|
||||
DatabaseStatusValid DatabaseStatus = "valid"
|
||||
DatabaseStatusInvalid DatabaseStatus = "invalid"
|
||||
)
|
||||
|
||||
type Database struct {
|
||||
Name string `json:"name"`
|
||||
ServerID uint `json:"server_id"`
|
||||
Status DatabaseStatus `json:"status"`
|
||||
Remark string `json:"remark"`
|
||||
Name string `json:"name"`
|
||||
Server string `json:"server"`
|
||||
Encoding string `json:"encoding"`
|
||||
}
|
||||
|
||||
type DatabaseRepo interface {
|
||||
|
||||
@@ -2,6 +2,7 @@ package data
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"slices"
|
||||
|
||||
"github.com/samber/do/v2"
|
||||
|
||||
@@ -30,11 +31,11 @@ func (r databaseRepo) List(page, limit uint) ([]*biz.Database, int64, error) {
|
||||
mysql, err := db.NewMySQL(server.Username, server.Password, fmt.Sprintf("%s:%d", server.Host, server.Port))
|
||||
if err == nil {
|
||||
if databases, err := mysql.Databases(); err == nil {
|
||||
for _, name := range databases {
|
||||
for item := range slices.Values(databases) {
|
||||
database = append(database, &biz.Database{
|
||||
Name: name,
|
||||
ServerID: server.ID,
|
||||
Status: biz.DatabaseStatusValid,
|
||||
Name: item.Name,
|
||||
Server: server.Name,
|
||||
Encoding: item.CharSet,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -43,11 +44,11 @@ func (r databaseRepo) List(page, limit uint) ([]*biz.Database, int64, error) {
|
||||
postgres, err := db.NewPostgres(server.Username, server.Password, server.Host, server.Port)
|
||||
if err == nil {
|
||||
if databases, err := postgres.Databases(); err == nil {
|
||||
for _, item := range databases {
|
||||
for item := range slices.Values(databases) {
|
||||
database = append(database, &biz.Database{
|
||||
Name: item.Name,
|
||||
ServerID: server.ID,
|
||||
Status: biz.DatabaseStatusValid,
|
||||
Server: server.Name,
|
||||
Encoding: item.Encoding,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package db
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
@@ -134,7 +133,7 @@ func (m *MySQL) UserPrivileges(user, host string) (map[string][]string, error) {
|
||||
for rows.Next() {
|
||||
var grant string
|
||||
if err = rows.Scan(&grant); err != nil {
|
||||
return nil, fmt.Errorf("failed to scan grant: %w", err)
|
||||
return nil, err
|
||||
}
|
||||
if !strings.HasPrefix(grant, "GRANT ") {
|
||||
continue
|
||||
@@ -199,24 +198,35 @@ func (m *MySQL) Users() ([]types.MySQLUser, error) {
|
||||
return users, nil
|
||||
}
|
||||
|
||||
func (m *MySQL) Databases() ([]string, error) {
|
||||
rows, err := m.Query("SHOW DATABASES")
|
||||
func (m *MySQL) Databases() ([]types.MySQLDatabase, error) {
|
||||
query := `
|
||||
SELECT
|
||||
SCHEMA_NAME,
|
||||
DEFAULT_CHARACTER_SET_NAME,
|
||||
DEFAULT_COLLATION_NAME
|
||||
FROM INFORMATION_SCHEMA.SCHEMATA
|
||||
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')
|
||||
`
|
||||
|
||||
rows, err := m.Query(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var databases []string
|
||||
var databases []types.MySQLDatabase
|
||||
for rows.Next() {
|
||||
var database string
|
||||
if err := rows.Scan(&database); err != nil {
|
||||
continue
|
||||
var db types.MySQLDatabase
|
||||
if err = rows.Scan(&db.Name, &db.CharSet, &db.Collation); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if slices.Contains([]string{"information_schema", "performance_schema", "mysql", "sys"}, database) {
|
||||
continue
|
||||
}
|
||||
databases = append(databases, database)
|
||||
databases = append(databases, db)
|
||||
}
|
||||
|
||||
if err = rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return databases, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package db
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
@@ -128,7 +129,7 @@ func (r *Postgres) UserPrivileges(user string) (map[string][]string, error) {
|
||||
|
||||
rows, err := r.Query(query, user)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to query database privileges: %w", err)
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
@@ -136,8 +137,8 @@ func (r *Postgres) UserPrivileges(user string) (map[string][]string, error) {
|
||||
|
||||
for rows.Next() {
|
||||
var db, privilegeStr string
|
||||
if err := rows.Scan(&db, &privilegeStr); err != nil {
|
||||
return nil, fmt.Errorf("failed to scan row: %w", err)
|
||||
if err = rows.Scan(&db, &privilegeStr); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
privileges[db] = strings.Split(privilegeStr, ",")
|
||||
@@ -236,6 +237,9 @@ func (r *Postgres) Databases() ([]types.PostgresDatabase, error) {
|
||||
if err := rows.Scan(&db.Name, &db.Owner, &db.Encoding); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if slices.Contains([]string{"template0", "template1", "postgres"}, db.Name) {
|
||||
continue
|
||||
}
|
||||
databases = append(databases, db)
|
||||
}
|
||||
|
||||
|
||||
@@ -5,3 +5,9 @@ type MySQLUser struct {
|
||||
Host string `json:"host"`
|
||||
Grants []string `json:"grants"`
|
||||
}
|
||||
|
||||
type MySQLDatabase struct {
|
||||
Name string `json:"name"`
|
||||
CharSet string `json:"char_set"`
|
||||
Collation string `json:"collation"`
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ const columns: any = [
|
||||
]
|
||||
|
||||
const { loading, data, page, total, pageSize, pageCount, refresh } = usePagination(
|
||||
(page, pageSize) => database.serverList(page, pageSize),
|
||||
(page, pageSize) => database.list(page, pageSize),
|
||||
{
|
||||
initialData: { total: 0, list: [] },
|
||||
total: (res: any) => res.total,
|
||||
@@ -5,8 +5,8 @@ defineOptions({
|
||||
|
||||
import CreateDatabaseModal from '@/views/database/CreateDatabaseModal.vue'
|
||||
import CreateDatabaseServerModal from '@/views/database/CreateServerModal.vue'
|
||||
import DatabaseListView from '@/views/database/DatabaseListView.vue'
|
||||
import ServerListView from '@/views/database/ServerListView.vue'
|
||||
import DatabaseListView from '@/views/database/DatabaseList.vue'
|
||||
import ServerListView from '@/views/database/ServerList.vue'
|
||||
import { NButton } from 'naive-ui'
|
||||
|
||||
const currentTab = ref('database')
|
||||
|
||||
5
web/src/views/database/UserList.vue
Normal file
5
web/src/views/database/UserList.vue
Normal file
@@ -0,0 +1,5 @@
|
||||
<script setup lang="ts"></script>
|
||||
|
||||
<template></template>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
Reference in New Issue
Block a user