From cd742b0933e33b8dcaa97f970e9b2e3345990593 Mon Sep 17 00:00:00 2001 From: ssongliu Date: Mon, 24 Jul 2023 11:24:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=9C=E7=A8=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=A2=9E=E5=8A=A0=E9=BB=98=E8=AE=A4=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/repo/remote_db.go | 7 ++ backend/app/service/database_mysql.go | 71 ++++++------------- backend/init/migration/migrations/init.go | 38 +++++++++- .../views/database/mysql/password/index.vue | 2 +- 4 files changed, 67 insertions(+), 51 deletions(-) diff --git a/backend/app/repo/remote_db.go b/backend/app/repo/remote_db.go index a49270760..3adf4e1f5 100644 --- a/backend/app/repo/remote_db.go +++ b/backend/app/repo/remote_db.go @@ -15,6 +15,7 @@ type IRemoteDBRepo interface { Update(id uint, vars map[string]interface{}) error Delete(opts ...DBOption) error Get(opts ...DBOption) (model.RemoteDB, error) + WithByFrom(from string) DBOption WithoutByFrom(from string) DBOption } @@ -54,6 +55,12 @@ func (u *RemoteDBRepo) GetList(opts ...DBOption) ([]model.RemoteDB, error) { return databases, err } +func (c *RemoteDBRepo) WithByFrom(from string) DBOption { + return func(g *gorm.DB) *gorm.DB { + return g.Where("`from` != ?", from) + } +} + func (c *RemoteDBRepo) WithoutByFrom(from string) DBOption { return func(g *gorm.DB) *gorm.DB { return g.Where("`from` != ?", from) diff --git a/backend/app/service/database_mysql.go b/backend/app/service/database_mysql.go index d9a82cbd0..e2fcc4068 100644 --- a/backend/app/service/database_mysql.go +++ b/backend/app/service/database_mysql.go @@ -82,46 +82,31 @@ func (u *MysqlService) Create(ctx context.Context, req dto.MysqlDBCreate) (*mode return nil, errors.WithMessage(constant.ErrStructTransform, err.Error()) } - if req.Username == "root" { + if req.From == "local" && req.Username == "root" { return nil, errors.New("Cannot set root as user name") } - - dbInfo := client.DBInfo{ - From: req.From, - Timeout: 300, + if req.From == "127.0.0.1" { + return nil, errors.New("Cannot set 127.0.0.1 as address") } - version := "" + + cli, version, err := loadClientByFrom(req.From) + if err != nil { + return nil, err + } + if req.From == "local" { app, err := appInstallRepo.LoadBaseInfo("mysql", "") if err != nil { return nil, err } - mysqlData, _ := mysqlRepo.Get(commonRepo.WithByName(req.Name)) - if mysqlData.ID != 0 { - return nil, constant.ErrRecordExist - } - dbInfo.Address = app.ContainerName - dbInfo.Username = "root" - dbInfo.Password = app.Password - version = app.Version createItem.MysqlName = app.Name } else { - mysqlData, err := remoteDBRepo.Get(commonRepo.WithByName(req.From)) + mysqlData, err := remoteDBRepo.Get(remoteDBRepo.WithByFrom(req.From)) if err != nil { return nil, err } - dbInfo.Address = mysqlData.Address - dbInfo.Port = mysqlData.Port - dbInfo.Username = mysqlData.Username - dbInfo.Password = mysqlData.Password - version = mysqlData.Version createItem.MysqlName = mysqlData.Name } - - cli, err := mysql.NewMysqlClient(dbInfo) - if err != nil { - return nil, err - } defer cli.Close() if err := cli.Create(client.CreateInfo{ Name: req.Name, @@ -169,15 +154,15 @@ func (u *MysqlService) DeleteCheck(id uint) ([]string, error) { } func (u *MysqlService) Delete(ctx context.Context, req dto.MysqlDBDelete) error { - cli, version, err := loadClientByID(req.ID) - if err != nil { - return err - } - defer cli.Close() db, err := mysqlRepo.Get(commonRepo.WithByID(req.ID)) if err != nil && !req.ForceDelete { return err } + cli, version, err := loadClientByFrom(db.From) + if err != nil { + return err + } + defer cli.Close() if err := cli.Delete(client.DeleteInfo{ Name: db.Name, Version: version, @@ -218,7 +203,7 @@ func (u *MysqlService) ChangePassword(info dto.ChangeDBInfo) error { if cmd.CheckIllegal(info.Value) { return buserr.New(constant.ErrCmdIllegal) } - cli, version, err := loadClientByID(info.ID) + cli, version, err := loadClientByFrom(info.From) if err != nil { return err } @@ -281,7 +266,7 @@ func (u *MysqlService) ChangeAccess(info dto.ChangeDBInfo) error { if cmd.CheckIllegal(info.Value) { return buserr.New(constant.ErrCmdIllegal) } - cli, version, err := loadClientByID(info.ID) + cli, version, err := loadClientByFrom(info.From) if err != nil { return err } @@ -546,25 +531,15 @@ func updateMyCnf(oldFiles []string, group string, param string, value interface{ return newFiles } -func loadClientByID(id uint) (mysql.MysqlClient, string, error) { +func loadClientByFrom(from string) (mysql.MysqlClient, string, error) { var ( - mysqlData model.DatabaseMysql - dbInfo client.DBInfo - version string - err error + dbInfo client.DBInfo + version string + err error ) - dbInfo.From = "local" - if id != 0 { - mysqlData, err = mysqlRepo.Get(commonRepo.WithByID(id)) - if err != nil { - return nil, "", err - } - dbInfo.From = mysqlData.From - } - - if dbInfo.From != "local" { - databaseItem, err := remoteDBRepo.Get(commonRepo.WithByName(mysqlData.From)) + if from != "local" { + databaseItem, err := remoteDBRepo.Get(remoteDBRepo.WithByFrom(from)) if err != nil { return nil, "", err } diff --git a/backend/init/migration/migrations/init.go b/backend/init/migration/migrations/init.go index f7d65bcd2..61362df70 100644 --- a/backend/init/migration/migrations/init.go +++ b/backend/init/migration/migrations/init.go @@ -1,6 +1,8 @@ package migrations import ( + "encoding/json" + "errors" "fmt" "strings" "time" @@ -481,9 +483,41 @@ var EncryptHostPassword = &gormigrate.Migration{ } var AddRemoteDB = &gormigrate.Migration{ - ID: "20230720-add-remote-db", + ID: "20230724-add-remote-db", Migrate: func(tx *gorm.DB) error { - if err := tx.AutoMigrate(&model.RemoteDB{}); err != nil { + if err := tx.AutoMigrate(&model.RemoteDB{}, &model.DatabaseMysql{}); err != nil { + return err + } + var ( + app model.App + appInstall model.AppInstall + ) + if err := global.DB.Where("key = ?", "mysql").First(&app).Error; err != nil { + return err + } + if err := global.DB.Where("app_id = ?", app.ID).First(&appInstall).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil + } + return err + } + envMap := make(map[string]interface{}) + if err := json.Unmarshal([]byte(appInstall.Env), &envMap); err != nil { + return err + } + password, ok := envMap["PANEL_DB_ROOT_PASSWORD"].(string) + if !ok { + return errors.New("error password in app env") + } + if err := tx.Create(&model.RemoteDB{ + Name: "local", + Type: "mysql", + Version: appInstall.Version, + From: "local", + Address: "127.0.0.1", + Username: "root", + Password: password, + }).Error; err != nil { return err } return nil diff --git a/frontend/src/views/database/mysql/password/index.vue b/frontend/src/views/database/mysql/password/index.vue index f3cf4c388..2c24ac695 100644 --- a/frontend/src/views/database/mysql/password/index.vue +++ b/frontend/src/views/database/mysql/password/index.vue @@ -109,7 +109,7 @@ const acceptParams = (params: DialogProps): void => { ? i18n.global.t('database.changePassword') : i18n.global.t('database.permission'); changeForm.id = params.id; - changeForm.from = params.from === 'local' ? 'local' : 'remote'; + changeForm.from = params.from; changeForm.mysqlName = params.mysqlName; changeForm.userName = params.username; changeForm.password = params.password;