1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-01-19 08:19:15 +08:00

pref: Adjust node editing logic (#7217)

This commit is contained in:
ssongliu 2024-11-30 19:42:41 +08:00 committed by GitHub
parent 9b0916f0ed
commit 841d1a31bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 404 additions and 278 deletions

View File

@ -65,3 +65,25 @@ func (b *BaseApi) Upgrade(c *gin.Context) {
}
helper.SuccessWithData(c, nil)
}
// @Tags System Setting
// @Summary Upgrade
// @Description 系统回滚
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Router /core/settings/rollback [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"upgrade_logs","output_column":"old_version","output_value":"version"}],"formatZH":"回滚系统 => [version]","formatEN":"rollback system => [version]"}
func (b *BaseApi) Rollback(c *gin.Context) {
var req dto.OperateByID
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := upgradeService.Rollback(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, nil)
}

View File

@ -8,17 +8,17 @@ import (
type LauncherRepo struct{}
type ILauncherRepo interface {
Get(opts ...DBOption) (model.AppLauncher, error)
List(opts ...DBOption) ([]model.AppLauncher, error)
Get(opts ...global.DBOption) (model.AppLauncher, error)
List(opts ...global.DBOption) ([]model.AppLauncher, error)
Create(launcher *model.AppLauncher) error
Delete(opts ...DBOption) error
Delete(opts ...global.DBOption) error
}
func NewILauncherRepo() ILauncherRepo {
return &LauncherRepo{}
}
func (u *LauncherRepo) Get(opts ...DBOption) (model.AppLauncher, error) {
func (u *LauncherRepo) Get(opts ...global.DBOption) (model.AppLauncher, error) {
var launcher model.AppLauncher
db := global.DB
for _, opt := range opts {
@ -27,7 +27,7 @@ func (u *LauncherRepo) Get(opts ...DBOption) (model.AppLauncher, error) {
err := db.First(&launcher).Error
return launcher, err
}
func (u *LauncherRepo) List(opts ...DBOption) ([]model.AppLauncher, error) {
func (u *LauncherRepo) List(opts ...global.DBOption) ([]model.AppLauncher, error) {
var ops []model.AppLauncher
db := global.DB.Model(&model.AppLauncher{})
for _, opt := range opts {
@ -41,7 +41,7 @@ func (u *LauncherRepo) Create(launcher *model.AppLauncher) error {
return global.DB.Create(launcher).Error
}
func (u *LauncherRepo) Delete(opts ...DBOption) error {
func (u *LauncherRepo) Delete(opts ...global.DBOption) error {
db := global.DB
for _, opt := range opts {
db = opt(db)

View File

@ -8,19 +8,19 @@ import (
type BackupRepo struct{}
type IBackupRepo interface {
Get(opts ...DBOption) (model.BackupAccount, error)
List(opts ...DBOption) ([]model.BackupAccount, error)
Page(limit, offset int, opts ...DBOption) (int64, []model.BackupAccount, error)
Get(opts ...global.DBOption) (model.BackupAccount, error)
List(opts ...global.DBOption) ([]model.BackupAccount, error)
Page(limit, offset int, opts ...global.DBOption) (int64, []model.BackupAccount, error)
Create(backup *model.BackupAccount) error
Save(backup *model.BackupAccount) error
Delete(opts ...DBOption) error
Delete(opts ...global.DBOption) error
}
func NewIBackupRepo() IBackupRepo {
return &BackupRepo{}
}
func (u *BackupRepo) Get(opts ...DBOption) (model.BackupAccount, error) {
func (u *BackupRepo) Get(opts ...global.DBOption) (model.BackupAccount, error) {
var backup model.BackupAccount
db := global.DB
for _, opt := range opts {
@ -30,7 +30,7 @@ func (u *BackupRepo) Get(opts ...DBOption) (model.BackupAccount, error) {
return backup, err
}
func (u *BackupRepo) Page(page, size int, opts ...DBOption) (int64, []model.BackupAccount, error) {
func (u *BackupRepo) Page(page, size int, opts ...global.DBOption) (int64, []model.BackupAccount, error) {
var ops []model.BackupAccount
db := global.DB.Model(&model.BackupAccount{})
for _, opt := range opts {
@ -42,7 +42,7 @@ func (u *BackupRepo) Page(page, size int, opts ...DBOption) (int64, []model.Back
return count, ops, err
}
func (u *BackupRepo) List(opts ...DBOption) ([]model.BackupAccount, error) {
func (u *BackupRepo) List(opts ...global.DBOption) ([]model.BackupAccount, error) {
var ops []model.BackupAccount
db := global.DB.Model(&model.BackupAccount{})
for _, opt := range opts {
@ -60,7 +60,7 @@ func (u *BackupRepo) Save(backup *model.BackupAccount) error {
return global.DB.Save(backup).Error
}
func (u *BackupRepo) Delete(opts ...DBOption) error {
func (u *BackupRepo) Delete(opts ...global.DBOption) error {
db := global.DB
for _, opt := range opts {
db = opt(db)

View File

@ -3,25 +3,28 @@ package repo
import (
"github.com/1Panel-dev/1Panel/core/app/model"
"github.com/1Panel-dev/1Panel/core/global"
"gorm.io/gorm"
)
type CommandRepo struct{}
type ICommandRepo interface {
List(opts ...DBOption) ([]model.Command, error)
Page(limit, offset int, opts ...DBOption) (int64, []model.Command, error)
List(opts ...global.DBOption) ([]model.Command, error)
Page(limit, offset int, opts ...global.DBOption) (int64, []model.Command, error)
Create(command *model.Command) error
Update(id uint, vars map[string]interface{}) error
UpdateGroup(group, newGroup uint) error
Delete(opts ...DBOption) error
Get(opts ...DBOption) (model.Command, error)
Delete(opts ...global.DBOption) error
Get(opts ...global.DBOption) (model.Command, error)
WithByInfo(info string) global.DBOption
}
func NewICommandRepo() ICommandRepo {
return &CommandRepo{}
}
func (u *CommandRepo) Get(opts ...DBOption) (model.Command, error) {
func (u *CommandRepo) Get(opts ...global.DBOption) (model.Command, error) {
var command model.Command
db := global.DB
for _, opt := range opts {
@ -31,7 +34,7 @@ func (u *CommandRepo) Get(opts ...DBOption) (model.Command, error) {
return command, err
}
func (u *CommandRepo) Page(page, size int, opts ...DBOption) (int64, []model.Command, error) {
func (u *CommandRepo) Page(page, size int, opts ...global.DBOption) (int64, []model.Command, error) {
var users []model.Command
db := global.DB.Model(&model.Command{})
for _, opt := range opts {
@ -43,7 +46,7 @@ func (u *CommandRepo) Page(page, size int, opts ...DBOption) (int64, []model.Com
return count, users, err
}
func (u *CommandRepo) List(opts ...DBOption) ([]model.Command, error) {
func (u *CommandRepo) List(opts ...global.DBOption) ([]model.Command, error) {
var commands []model.Command
db := global.DB.Model(&model.Command{})
for _, opt := range opts {
@ -64,10 +67,19 @@ func (h *CommandRepo) UpdateGroup(group, newGroup uint) error {
return global.DB.Model(&model.Command{}).Where("group_id = ?", group).Updates(map[string]interface{}{"group_id": newGroup}).Error
}
func (u *CommandRepo) Delete(opts ...DBOption) error {
func (u *CommandRepo) Delete(opts ...global.DBOption) error {
db := global.DB
for _, opt := range opts {
db = opt(db)
}
return db.Delete(&model.Command{}).Error
}
func (c *CommandRepo) WithByInfo(info string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(info) == 0 {
return g
}
return g.Where("name like ? or command like ?", "%"+info+"%", "%"+info+"%")
}
}

View File

@ -4,22 +4,24 @@ import (
"fmt"
"github.com/1Panel-dev/1Panel/core/constant"
"github.com/1Panel-dev/1Panel/core/global"
"gorm.io/gorm"
)
type DBOption func(*gorm.DB) *gorm.DB
type ICommonRepo interface {
WithByID(id uint) DBOption
WithByIDs(ids []uint) DBOption
WithByName(name string) DBOption
WithLikeName(name string) DBOption
WithByType(ty string) DBOption
WithByKey(key string) DBOption
WithOrderBy(orderStr string) DBOption
WithByStatus(status string) DBOption
WithByID(id uint) global.DBOption
WithByGroupID(id uint) global.DBOption
WithOrderRuleBy(orderBy, order string) DBOption
WithByName(name string) global.DBOption
WithByType(ty string) global.DBOption
WithByKey(key string) global.DBOption
WithOrderBy(orderStr string) global.DBOption
WithByStatus(status string) global.DBOption
WithByGroupBelong(group string) global.DBOption
WithByIDs(ids []uint) global.DBOption
WithOrderRuleBy(orderBy, order string) global.DBOption
}
type CommonRepo struct{}
@ -28,57 +30,56 @@ func NewICommonRepo() ICommonRepo {
return &CommonRepo{}
}
func (c *CommonRepo) WithByID(id uint) DBOption {
func (c *CommonRepo) WithByID(id uint) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id = ?", id)
}
}
func (c *CommonRepo) WithByIDs(ids []uint) DBOption {
func (c *CommonRepo) WithByGroupID(id uint) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("group_id = ?", id)
}
}
func (c *CommonRepo) WithByIDs(ids []uint) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id in (?)", ids)
}
}
func (c *CommonRepo) WithByName(name string) DBOption {
func (c *CommonRepo) WithByName(name string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(name) == 0 {
return g
}
return g.Where("`name` = ?", name)
}
}
func (c *CommonRepo) WithLikeName(name string) DBOption {
func (c *CommonRepo) WithByType(ty string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(name) == 0 {
return g
}
return g.Where("name like ? or command like ?", "%"+name+"%", "%"+name+"%")
}
}
func (c *CommonRepo) WithByType(ty string) DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(ty) == 0 {
return g
}
return g.Where("`type` = ?", ty)
}
}
func (c *CommonRepo) WithByKey(key string) DBOption {
func (c *CommonRepo) WithByKey(key string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("key = ?", key)
}
}
func (c *CommonRepo) WithByStatus(status string) DBOption {
func (c *CommonRepo) WithByStatus(status string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("status = ?", status)
}
}
func (c *CommonRepo) WithOrderBy(orderStr string) DBOption {
func (c *CommonRepo) WithByGroupBelong(group string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("group_belong = ?", group)
}
}
func (c *CommonRepo) WithOrderBy(orderStr string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Order(orderStr)
}
}
func (c *CommonRepo) WithOrderRuleBy(orderBy, order string) DBOption {
func (c *CommonRepo) WithOrderRuleBy(orderBy, order string) global.DBOption {
switch order {
case constant.OrderDesc:
order = "desc"

View File

@ -9,16 +9,13 @@ import (
type GroupRepo struct{}
type IGroupRepo interface {
Get(opts ...DBOption) (model.Group, error)
GetList(opts ...DBOption) ([]model.Group, error)
Get(opts ...global.DBOption) (model.Group, error)
GetList(opts ...global.DBOption) ([]model.Group, error)
Create(group *model.Group) error
Update(id uint, vars map[string]interface{}) error
Delete(opts ...DBOption) error
Delete(opts ...global.DBOption) error
WithByID(id uint) DBOption
WithByGroupID(id uint) DBOption
WithByGroupType(ty string) DBOption
WithByDefault(isDefalut bool) DBOption
WithByDefault(isDefalut bool) global.DBOption
CancelDefault(groupType string) error
}
@ -26,31 +23,13 @@ func NewIGroupRepo() IGroupRepo {
return &GroupRepo{}
}
func (c *GroupRepo) WithByID(id uint) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id = ?", id)
}
}
func (c *GroupRepo) WithByGroupID(id uint) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("group_id = ?", id)
}
}
func (c *GroupRepo) WithByGroupType(ty string) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("`type` = ?", ty)
}
}
func (c *GroupRepo) WithByDefault(isDefalut bool) DBOption {
func (c *GroupRepo) WithByDefault(isDefalut bool) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("is_default = ?", isDefalut)
}
}
func (u *GroupRepo) Get(opts ...DBOption) (model.Group, error) {
func (u *GroupRepo) Get(opts ...global.DBOption) (model.Group, error) {
var group model.Group
db := global.DB
for _, opt := range opts {
@ -60,7 +39,7 @@ func (u *GroupRepo) Get(opts ...DBOption) (model.Group, error) {
return group, err
}
func (u *GroupRepo) GetList(opts ...DBOption) ([]model.Group, error) {
func (u *GroupRepo) GetList(opts ...global.DBOption) ([]model.Group, error) {
var groups []model.Group
db := global.DB.Model(&model.Group{})
for _, opt := range opts {
@ -78,7 +57,7 @@ func (u *GroupRepo) Update(id uint, vars map[string]interface{}) error {
return global.DB.Model(&model.Group{}).Where("id = ?", id).Updates(vars).Error
}
func (u *GroupRepo) Delete(opts ...DBOption) error {
func (u *GroupRepo) Delete(opts ...global.DBOption) error {
db := global.DB
for _, opt := range opts {
db = opt(db)

View File

@ -9,25 +9,25 @@ import (
type HostRepo struct{}
type IHostRepo interface {
Get(opts ...DBOption) (model.Host, error)
GetList(opts ...DBOption) ([]model.Host, error)
Page(limit, offset int, opts ...DBOption) (int64, []model.Host, error)
Get(opts ...global.DBOption) (model.Host, error)
GetList(opts ...global.DBOption) ([]model.Host, error)
Page(limit, offset int, opts ...global.DBOption) (int64, []model.Host, error)
Create(host *model.Host) error
Update(id uint, vars map[string]interface{}) error
UpdateGroup(group, newGroup uint) error
Delete(opts ...DBOption) error
Delete(opts ...global.DBOption) error
WithByInfo(info string) DBOption
WithByPort(port uint) DBOption
WithByUser(user string) DBOption
WithByAddr(addr string) DBOption
WithByInfo(info string) global.DBOption
WithByPort(port uint) global.DBOption
WithByUser(user string) global.DBOption
WithByAddr(addr string) global.DBOption
}
func NewIHostRepo() IHostRepo {
return &HostRepo{}
}
func (h *HostRepo) Get(opts ...DBOption) (model.Host, error) {
func (h *HostRepo) Get(opts ...global.DBOption) (model.Host, error) {
var host model.Host
db := global.DB
for _, opt := range opts {
@ -37,7 +37,7 @@ func (h *HostRepo) Get(opts ...DBOption) (model.Host, error) {
return host, err
}
func (h *HostRepo) GetList(opts ...DBOption) ([]model.Host, error) {
func (h *HostRepo) GetList(opts ...global.DBOption) ([]model.Host, error) {
var hosts []model.Host
db := global.DB.Model(&model.Host{})
for _, opt := range opts {
@ -47,7 +47,7 @@ func (h *HostRepo) GetList(opts ...DBOption) ([]model.Host, error) {
return hosts, err
}
func (h *HostRepo) Page(page, size int, opts ...DBOption) (int64, []model.Host, error) {
func (h *HostRepo) Page(page, size int, opts ...global.DBOption) (int64, []model.Host, error) {
var users []model.Host
db := global.DB.Model(&model.Host{})
for _, opt := range opts {
@ -59,7 +59,7 @@ func (h *HostRepo) Page(page, size int, opts ...DBOption) (int64, []model.Host,
return count, users, err
}
func (h *HostRepo) WithByInfo(info string) DBOption {
func (h *HostRepo) WithByInfo(info string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(info) == 0 {
return g
@ -69,29 +69,21 @@ func (h *HostRepo) WithByInfo(info string) DBOption {
}
}
func (h *HostRepo) WithByPort(port uint) DBOption {
func (h *HostRepo) WithByPort(port uint) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("port = ?", port)
}
}
func (h *HostRepo) WithByUser(user string) DBOption {
func (h *HostRepo) WithByUser(user string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("user = ?", user)
}
}
func (h *HostRepo) WithByAddr(addr string) DBOption {
func (h *HostRepo) WithByAddr(addr string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("addr = ?", addr)
}
}
func (h *HostRepo) WithByGroup(group string) DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(group) == 0 {
return g
}
return g.Where("group_belong = ?", group)
}
}
func (h *HostRepo) Create(host *model.Host) error {
return global.DB.Create(host).Error
@ -105,7 +97,7 @@ func (h *HostRepo) UpdateGroup(group, newGroup uint) error {
return global.DB.Model(&model.Host{}).Where("group_id = ?", group).Updates(map[string]interface{}{"group_id": newGroup}).Error
}
func (h *HostRepo) Delete(opts ...DBOption) error {
func (h *HostRepo) Delete(opts ...global.DBOption) error {
db := global.DB
for _, opt := range opts {
db = opt(db)

View File

@ -11,16 +11,15 @@ type LogRepo struct{}
type ILogRepo interface {
CleanLogin() error
CreateLoginLog(user *model.LoginLog) error
PageLoginLog(limit, offset int, opts ...DBOption) (int64, []model.LoginLog, error)
PageLoginLog(limit, offset int, opts ...global.DBOption) (int64, []model.LoginLog, error)
CleanOperation() error
CreateOperationLog(user *model.OperationLog) error
PageOperationLog(limit, offset int, opts ...DBOption) (int64, []model.OperationLog, error)
PageOperationLog(limit, offset int, opts ...global.DBOption) (int64, []model.OperationLog, error)
WithByIP(ip string) DBOption
WithByStatus(status string) DBOption
WithByGroup(group string) DBOption
WithByLikeOperation(operation string) DBOption
WithByIP(ip string) global.DBOption
WithBySource(source string) global.DBOption
WithByLikeOperation(operation string) global.DBOption
}
func NewILogRepo() ILogRepo {
@ -35,7 +34,7 @@ func (u *LogRepo) CreateLoginLog(log *model.LoginLog) error {
return global.DB.Create(log).Error
}
func (u *LogRepo) PageLoginLog(page, size int, opts ...DBOption) (int64, []model.LoginLog, error) {
func (u *LogRepo) PageLoginLog(page, size int, opts ...global.DBOption) (int64, []model.LoginLog, error) {
var ops []model.LoginLog
db := global.DB.Model(&model.LoginLog{})
for _, opt := range opts {
@ -55,7 +54,7 @@ func (u *LogRepo) CreateOperationLog(log *model.OperationLog) error {
return global.DB.Create(log).Error
}
func (u *LogRepo) PageOperationLog(page, size int, opts ...DBOption) (int64, []model.OperationLog, error) {
func (u *LogRepo) PageOperationLog(page, size int, opts ...global.DBOption) (int64, []model.OperationLog, error) {
var ops []model.OperationLog
db := global.DB.Model(&model.OperationLog{})
for _, opt := range opts {
@ -67,7 +66,7 @@ func (u *LogRepo) PageOperationLog(page, size int, opts ...DBOption) (int64, []m
return count, ops, err
}
func (c *LogRepo) WithByStatus(status string) DBOption {
func (c *LogRepo) WithByStatus(status string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(status) == 0 {
return g
@ -75,23 +74,21 @@ func (c *LogRepo) WithByStatus(status string) DBOption {
return g.Where("status = ?", status)
}
}
func (c *LogRepo) WithByGroup(group string) DBOption {
func (c *LogRepo) WithBySource(source string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(group) == 0 {
if len(source) == 0 {
return g
}
return g.Where("source = ?", group)
return g.Where("source = ?", source)
}
}
func (c *LogRepo) WithByIP(ip string) DBOption {
func (c *LogRepo) WithByIP(ip string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(ip) == 0 {
return g
}
return g.Where("ip LIKE ?", "%"+ip+"%")
}
}
func (c *LogRepo) WithByLikeOperation(operation string) DBOption {
func (c *LogRepo) WithByLikeOperation(operation string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(operation) == 0 {
return g

View File

@ -8,8 +8,8 @@ import (
type SettingRepo struct{}
type ISettingRepo interface {
List(opts ...DBOption) ([]model.Setting, error)
Get(opts ...DBOption) (model.Setting, error)
List(opts ...global.DBOption) ([]model.Setting, error)
Get(opts ...global.DBOption) (model.Setting, error)
Create(key, value string) error
Update(key, value string) error
}
@ -18,7 +18,7 @@ func NewISettingRepo() ISettingRepo {
return &SettingRepo{}
}
func (u *SettingRepo) List(opts ...DBOption) ([]model.Setting, error) {
func (u *SettingRepo) List(opts ...global.DBOption) ([]model.Setting, error) {
var settings []model.Setting
db := global.DB.Model(&model.Setting{})
for _, opt := range opts {
@ -36,7 +36,7 @@ func (u *SettingRepo) Create(key, value string) error {
return global.DB.Create(setting).Error
}
func (u *SettingRepo) Get(opts ...DBOption) (model.Setting, error) {
func (u *SettingRepo) Get(opts ...global.DBOption) (model.Setting, error) {
var settings model.Setting
db := global.DB.Model(&model.Setting{})
for _, opt := range opts {

View File

@ -13,20 +13,20 @@ type TaskRepo struct {
type ITaskRepo interface {
Save(ctx context.Context, task *model.Task) error
GetFirst(opts ...DBOption) (model.Task, error)
Page(page, size int, opts ...DBOption) (int64, []model.Task, error)
GetFirst(opts ...global.DBOption) (model.Task, error)
Page(page, size int, opts ...global.DBOption) (int64, []model.Task, error)
Update(ctx context.Context, task *model.Task) error
WithByID(id string) DBOption
WithResourceID(id uint) DBOption
WithOperate(taskOperate string) DBOption
WithByID(id string) global.DBOption
WithResourceID(id uint) global.DBOption
WithOperate(taskOperate string) global.DBOption
}
func NewITaskRepo() ITaskRepo {
return &TaskRepo{}
}
func getTaskDb(opts ...DBOption) *gorm.DB {
func getTaskDb(opts ...global.DBOption) *gorm.DB {
db := global.TaskDB
for _, opt := range opts {
db = opt(db)
@ -34,7 +34,7 @@ func getTaskDb(opts ...DBOption) *gorm.DB {
return db
}
func getTaskTx(ctx context.Context, opts ...DBOption) *gorm.DB {
func getTaskTx(ctx context.Context, opts ...global.DBOption) *gorm.DB {
tx, ok := ctx.Value("db").(*gorm.DB)
if ok {
for _, opt := range opts {
@ -45,19 +45,19 @@ func getTaskTx(ctx context.Context, opts ...DBOption) *gorm.DB {
return getTaskDb(opts...)
}
func (t TaskRepo) WithByID(id string) DBOption {
func (t TaskRepo) WithByID(id string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id = ?", id)
}
}
func (t TaskRepo) WithOperate(taskOperate string) DBOption {
func (t TaskRepo) WithOperate(taskOperate string) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("operate = ?", taskOperate)
}
}
func (t TaskRepo) WithResourceID(id uint) DBOption {
func (t TaskRepo) WithResourceID(id uint) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("resource_id = ?", id)
}
@ -67,7 +67,7 @@ func (t TaskRepo) Save(ctx context.Context, task *model.Task) error {
return getTaskTx(ctx).Save(&task).Error
}
func (t TaskRepo) GetFirst(opts ...DBOption) (model.Task, error) {
func (t TaskRepo) GetFirst(opts ...global.DBOption) (model.Task, error) {
var task model.Task
db := getTaskDb(opts...).Model(&model.Task{})
if err := db.First(&task).Error; err != nil {
@ -76,7 +76,7 @@ func (t TaskRepo) GetFirst(opts ...DBOption) (model.Task, error) {
return task, nil
}
func (t TaskRepo) Page(page, size int, opts ...DBOption) (int64, []model.Task, error) {
func (t TaskRepo) Page(page, size int, opts ...global.DBOption) (int64, []model.Task, error) {
var tasks []model.Task
db := getTaskDb(opts...).Model(&model.Task{})
count := int64(0)

View File

@ -9,22 +9,20 @@ import (
type UpgradeLogRepo struct{}
type IUpgradeLogRepo interface {
Get(opts ...DBOption) (model.UpgradeLog, error)
List(opts ...DBOption) ([]model.UpgradeLog, error)
Get(opts ...global.DBOption) (model.UpgradeLog, error)
List(opts ...global.DBOption) ([]model.UpgradeLog, error)
Create(log *model.UpgradeLog) error
Page(limit, offset int, opts ...DBOption) (int64, []model.UpgradeLog, error)
Delete(opts ...DBOption) error
Page(limit, offset int, opts ...global.DBOption) (int64, []model.UpgradeLog, error)
Delete(opts ...global.DBOption) error
WithByNodeID(nodeID uint) DBOption
WithByIDs(ids []uint) DBOption
WithByID(id uint) DBOption
WithByNodeID(nodeID uint) global.DBOption
}
func NewIUpgradeLogRepo() IUpgradeLogRepo {
return &UpgradeLogRepo{}
}
func (u *UpgradeLogRepo) Get(opts ...DBOption) (model.UpgradeLog, error) {
func (u *UpgradeLogRepo) Get(opts ...global.DBOption) (model.UpgradeLog, error) {
var log model.UpgradeLog
db := global.DB
for _, opt := range opts {
@ -34,7 +32,7 @@ func (u *UpgradeLogRepo) Get(opts ...DBOption) (model.UpgradeLog, error) {
return log, err
}
func (u *UpgradeLogRepo) List(opts ...DBOption) ([]model.UpgradeLog, error) {
func (u *UpgradeLogRepo) List(opts ...global.DBOption) ([]model.UpgradeLog, error) {
var logs []model.UpgradeLog
db := global.DB
for _, opt := range opts {
@ -56,7 +54,7 @@ func (u *UpgradeLogRepo) Save(log *model.UpgradeLog) error {
return global.DB.Save(log).Error
}
func (u *UpgradeLogRepo) Delete(opts ...DBOption) error {
func (u *UpgradeLogRepo) Delete(opts ...global.DBOption) error {
db := global.DB
for _, opt := range opts {
db = opt(db)
@ -64,7 +62,7 @@ func (u *UpgradeLogRepo) Delete(opts ...DBOption) error {
return db.Delete(&model.UpgradeLog{}).Error
}
func (u *UpgradeLogRepo) Page(page, size int, opts ...DBOption) (int64, []model.UpgradeLog, error) {
func (u *UpgradeLogRepo) Page(page, size int, opts ...global.DBOption) (int64, []model.UpgradeLog, error) {
var ops []model.UpgradeLog
db := global.DB.Model(&model.UpgradeLog{})
for _, opt := range opts {
@ -76,18 +74,8 @@ func (u *UpgradeLogRepo) Page(page, size int, opts ...DBOption) (int64, []model.
return count, ops, err
}
func (c *UpgradeLogRepo) WithByNodeID(nodeID uint) DBOption {
func (c *UpgradeLogRepo) WithByNodeID(nodeID uint) global.DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("node_id = ?", nodeID)
}
}
func (c *UpgradeLogRepo) WithByID(id uint) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id = ?", id)
}
}
func (c *UpgradeLogRepo) WithByIDs(ids []uint) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("id in (?)", ids)
}
}

View File

@ -2,8 +2,8 @@ package service
import (
"github.com/1Panel-dev/1Panel/core/app/dto"
"github.com/1Panel-dev/1Panel/core/app/repo"
"github.com/1Panel-dev/1Panel/core/constant"
"github.com/1Panel-dev/1Panel/core/global"
"github.com/jinzhu/copier"
"github.com/pkg/errors"
)
@ -66,15 +66,15 @@ func (u *CommandService) SearchForTree(req dto.OperateByType) ([]dto.CommandTree
}
func (u *CommandService) SearchWithPage(req dto.SearchCommandWithPage) (int64, interface{}, error) {
options := []repo.DBOption{
options := []global.DBOption{
commonRepo.WithOrderRuleBy(req.OrderBy, req.Order),
commonRepo.WithByType(req.Type),
}
if len(req.Info) != 0 {
options = append(options, commonRepo.WithLikeName(req.Info))
options = append(options, commandRepo.WithByInfo(req.Info))
}
if req.GroupID != 0 {
options = append(options, groupRepo.WithByGroupID(req.GroupID))
options = append(options, commonRepo.WithByGroupID(req.GroupID))
}
total, commands, err := commandRepo.Page(req.Page, req.PageSize, options...)
if err != nil {

View File

@ -3,14 +3,15 @@ package service
import "github.com/1Panel-dev/1Panel/core/app/repo"
var (
hostRepo = repo.NewIHostRepo()
commandRepo = repo.NewICommandRepo()
commonRepo = repo.NewICommonRepo()
settingRepo = repo.NewISettingRepo()
backupRepo = repo.NewIBackupRepo()
logRepo = repo.NewILogRepo()
groupRepo = repo.NewIGroupRepo()
launcherRepo = repo.NewILauncherRepo()
hostRepo = repo.NewIHostRepo()
commandRepo = repo.NewICommandRepo()
commonRepo = repo.NewICommonRepo()
settingRepo = repo.NewISettingRepo()
backupRepo = repo.NewIBackupRepo()
logRepo = repo.NewILogRepo()
groupRepo = repo.NewIGroupRepo()
launcherRepo = repo.NewILauncherRepo()
upgradeLogRepo = repo.NewIUpgradeLogRepo()
taskRepo = repo.NewITaskRepo()
)

View File

@ -7,9 +7,9 @@ import (
"github.com/1Panel-dev/1Panel/core/app/dto"
"github.com/1Panel-dev/1Panel/core/app/model"
"github.com/1Panel-dev/1Panel/core/app/repo"
"github.com/1Panel-dev/1Panel/core/buserr"
"github.com/1Panel-dev/1Panel/core/constant"
"github.com/1Panel-dev/1Panel/core/global"
httpUtils "github.com/1Panel-dev/1Panel/core/utils/http"
"github.com/1Panel-dev/1Panel/core/utils/xpack"
"github.com/jinzhu/copier"
@ -30,11 +30,13 @@ func NewIGroupService() IGroupService {
}
func (u *GroupService) List(req dto.OperateByType) ([]dto.GroupInfo, error) {
options := []repo.DBOption{
commonRepo.WithByType(req.Type),
options := []global.DBOption{
commonRepo.WithOrderBy("is_default desc"),
commonRepo.WithOrderBy("created_at desc"),
}
if len(req.Type) != 0 {
options = append(options, commonRepo.WithByType(req.Type))
}
var (
groups []model.Group
err error

View File

@ -6,8 +6,8 @@ import (
"github.com/1Panel-dev/1Panel/core/app/dto"
"github.com/1Panel-dev/1Panel/core/app/model"
"github.com/1Panel-dev/1Panel/core/app/repo"
"github.com/1Panel-dev/1Panel/core/constant"
"github.com/1Panel-dev/1Panel/core/global"
"github.com/1Panel-dev/1Panel/core/utils/encrypt"
"github.com/1Panel-dev/1Panel/core/utils/ssh"
"github.com/jinzhu/copier"
@ -151,12 +151,12 @@ func (u *HostService) GetHostInfo(id uint) (*model.Host, error) {
}
func (u *HostService) SearchWithPage(req dto.SearchHostWithPage) (int64, interface{}, error) {
var options []repo.DBOption
var options []global.DBOption
if len(req.Info) != 0 {
options = append(options, commonRepo.WithLikeName(req.Info))
options = append(options, hostRepo.WithByInfo(req.Info))
}
if req.GroupID != 0 {
options = append(options, groupRepo.WithByGroupID(req.GroupID))
options = append(options, commonRepo.WithByGroupID(req.GroupID))
}
total, hosts, err := hostRepo.Page(req.Page, req.PageSize, options...)
if err != nil {

View File

@ -74,12 +74,19 @@ func (u *LogService) ListSystemLogFile() ([]string, error) {
}
func (u *LogService) PageLoginLog(req dto.SearchLgLogWithPage) (int64, interface{}, error) {
options := []global.DBOption{
commonRepo.WithOrderBy("created_at desc"),
}
if len(req.IP) != 0 {
options = append(options, logRepo.WithByIP(req.IP))
}
if len(req.Status) != 0 {
options = append(options, commonRepo.WithByStatus(req.Status))
}
total, ops, err := logRepo.PageLoginLog(
req.Page,
req.PageSize,
logRepo.WithByIP(req.IP),
logRepo.WithByStatus(req.Status),
commonRepo.WithOrderBy("created_at desc"),
options...,
)
var dtoOps []dto.LoginLog
for _, op := range ops {
@ -97,13 +104,21 @@ func (u *LogService) CreateOperationLog(operation *model.OperationLog) error {
}
func (u *LogService) PageOperationLog(req dto.SearchOpLogWithPage) (int64, interface{}, error) {
options := []global.DBOption{
commonRepo.WithOrderBy("created_at desc"),
logRepo.WithByLikeOperation(req.Operation),
}
if len(req.Source) != 0 {
options = append(options, logRepo.WithBySource(req.Source))
}
if len(req.Status) != 0 {
options = append(options, commonRepo.WithByStatus(req.Status))
}
total, ops, err := logRepo.PageOperationLog(
req.Page,
req.PageSize,
logRepo.WithByGroup(req.Source),
logRepo.WithByLikeOperation(req.Operation),
logRepo.WithByStatus(req.Status),
commonRepo.WithOrderBy("created_at desc"),
options...,
)
var dtoOps []dto.OperationLog
for _, op := range ops {

View File

@ -2,7 +2,7 @@ package service
import (
"github.com/1Panel-dev/1Panel/core/app/dto"
"github.com/1Panel-dev/1Panel/core/app/repo"
"github.com/1Panel-dev/1Panel/core/global"
)
type TaskLogService struct{}
@ -16,7 +16,7 @@ func NewITaskService() ITaskLogService {
}
func (u *TaskLogService) Page(req dto.SearchTaskLogReq) (int64, []dto.TaskDTO, error) {
opts := []repo.DBOption{
opts := []global.DBOption{
commonRepo.WithOrderBy("created_at desc"),
}
if req.Status != "" {

View File

@ -11,6 +11,7 @@ import (
"time"
"github.com/1Panel-dev/1Panel/core/app/dto"
"github.com/1Panel-dev/1Panel/core/app/model"
"github.com/1Panel-dev/1Panel/core/constant"
"github.com/1Panel-dev/1Panel/core/global"
"github.com/1Panel-dev/1Panel/core/utils/cmd"
@ -23,6 +24,7 @@ type UpgradeService struct{}
type IUpgradeService interface {
Upgrade(req dto.Upgrade) error
Rollback(req dto.OperateByID) error
LoadNotes(req dto.Upgrade) (string, error)
SearchUpgrade() (*dto.UpgradeInfo, error)
}
@ -127,6 +129,9 @@ func (u *UpgradeService) Upgrade(req dto.Upgrade) error {
_ = settingRepo.Update("SystemStatus", "Free")
return
}
itemLog := model.UpgradeLog{NodeID: 0, OldVersion: global.CONF.System.Version, NewVersion: req.Version, BackupFile: originalDir}
_ = upgradeLogRepo.Create(&itemLog)
global.LOG.Info("backup original data successful, now start to upgrade!")
if err := files.CopyItem(false, true, path.Join(tmpDir, "1panel*"), "/usr/local/bin"); err != nil {
@ -161,6 +166,15 @@ func (u *UpgradeService) Upgrade(req dto.Upgrade) error {
return nil
}
func (u *UpgradeService) Rollback(req dto.OperateByID) error {
log, _ := upgradeLogRepo.Get(commonRepo.WithByID(req.ID))
if log.ID == 0 {
return constant.ErrRecordNotFound
}
u.handleRollback(log.BackupFile, 3)
return nil
}
func (u *UpgradeService) handleBackup(originalDir string) error {
if err := files.CopyItem(false, true, "/usr/local/bin/1panel*", originalDir); err != nil {
return err

View File

@ -26,3 +26,5 @@ var (
BackupAccountTokenEntryID cron.EntryID
)
type DBOption func(*gorm.DB) *gorm.DB

View File

@ -168,7 +168,7 @@ var InitHost = &gormigrate.Migration{
return err
}
host := model.Host{
Name: "localhost", Addr: "127.0.0.1", User: "root", Port: 22, AuthMode: "password", GroupID: hostGroup.ID,
Name: "local", Addr: "127.0.0.1", User: "root", Port: 22, AuthMode: "password", GroupID: hostGroup.ID,
}
if err := tx.Create(&host).Error; err != nil {
return err

View File

@ -32,69 +32,26 @@
<span>({{ $t('setting.upgradeCheck') }})</span>
</el-button>
<el-tag v-if="version === 'Waiting'" round style="margin-left: 10px">{{ $t('setting.upgrading') }}</el-tag>
<Upgrade ref="upgradeRef" @search="search" />
</div>
<el-drawer
:close-on-click-modal="false"
:close-on-press-escape="false"
:key="refresh"
v-model="drawerVisible"
size="50%"
append-to-body
>
<template #header>
<DrawerHeader :header="$t('commons.button.upgrade')" :back="handleClose" />
</template>
<div class="panel-MdEditor">
<el-alert :closable="false">
<span class="line-height">{{ $t('setting.versionHelper') }}</span>
<li class="line-height">{{ $t('setting.versionHelper1') }}</li>
<li class="line-height">{{ $t('setting.versionHelper2') }}</li>
</el-alert>
<div class="default-theme" style="margin-left: 20px">
<h2 class="inline-block">{{ $t('app.version') }}</h2>
</div>
<el-radio-group class="inline-block tag" v-model="upgradeVersion" @change="changeOption">
<el-radio v-if="upgradeInfo.newVersion" :value="upgradeInfo.newVersion">
{{ upgradeInfo.newVersion }}
</el-radio>
<el-radio v-if="upgradeInfo.latestVersion" :value="upgradeInfo.latestVersion">
{{ upgradeInfo.latestVersion }}
</el-radio>
<el-radio v-if="upgradeInfo.testVersion" :value="upgradeInfo.testVersion">
{{ upgradeInfo.testVersion }}
</el-radio>
</el-radio-group>
<MdEditor v-model="upgradeInfo.releaseNote" previewOnly :theme="isDarkTheme ? 'dark' : 'light'" />
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="drawerVisible = false">{{ $t('commons.button.cancel') }}</el-button>
<el-button type="primary" @click="onUpgrade">{{ $t('setting.upgradeNow') }}</el-button>
</span>
</template>
</el-drawer>
</template>
<script setup lang="ts">
import DrawerHeader from '@/components/drawer-header/index.vue';
import { getSettingInfo, loadReleaseNotes, loadUpgradeInfo, upgrade } from '@/api/modules/setting';
import MdEditor from 'md-editor-v3';
import { getSettingInfo, loadUpgradeInfo } from '@/api/modules/setting';
import Upgrade from '@/components/system-upgrade/upgrade/index.vue';
import i18n from '@/lang';
import 'md-editor-v3/lib/style.css';
import { MsgSuccess } from '@/utils/message';
import { onMounted, ref } from 'vue';
import { GlobalStore } from '@/store';
import { ElMessageBox } from 'element-plus';
import { storeToRefs } from 'pinia';
const globalStore = GlobalStore();
const { isDarkTheme } = storeToRefs(globalStore);
const upgradeRef = ref();
const version = ref<string>('');
const isProductPro = ref();
const loading = ref(false);
const drawerVisible = ref(false);
const upgradeInfo = ref();
const refresh = ref();
const upgradeVersion = ref();
const props = defineProps({
footer: {
@ -108,10 +65,6 @@ const search = async () => {
version.value = res.data.systemVersion;
};
const handleClose = () => {
drawerVisible.value = false;
};
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
@ -135,7 +88,6 @@ const onLoadUpgradeInfo = async () => {
loading.value = false;
if (res.data.testVersion || res.data.newVersion || res.data.latestVersion) {
upgradeInfo.value = res.data;
drawerVisible.value = true;
if (upgradeInfo.value.newVersion) {
upgradeVersion.value = upgradeInfo.value.newVersion;
return;
@ -148,6 +100,7 @@ const onLoadUpgradeInfo = async () => {
upgradeVersion.value = upgradeInfo.value.testVersion;
return;
}
upgradeRef.value.acceptParams({ upgradeInfo: upgradeInfo.value, upgradeVersion: upgradeVersion.value });
} else {
MsgSuccess(i18n.global.t('setting.noUpgrade'));
return;
@ -158,26 +111,6 @@ const onLoadUpgradeInfo = async () => {
});
};
const changeOption = async () => {
const res = await loadReleaseNotes(upgradeVersion.value);
upgradeInfo.value.releaseNote = res.data;
};
const onUpgrade = async () => {
ElMessageBox.confirm(i18n.global.t('setting.upgradeHelper', i18n.global.t('commons.button.upgrade')), {
confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info',
}).then(async () => {
globalStore.isLoading = true;
await upgrade(upgradeVersion.value);
globalStore.isOnRestart = true;
drawerVisible.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
search();
});
};
onMounted(() => {
isProductPro.value = globalStore.isProductPro;
search();

View File

@ -0,0 +1,127 @@
<template>
<el-drawer
:close-on-click-modal="false"
:close-on-press-escape="false"
:key="refresh"
v-model="drawerVisible"
size="50%"
append-to-body
>
<template #header>
<DrawerHeader :header="$t('commons.button.upgrade')" :back="handleClose" />
</template>
<div class="panel-MdEditor">
<el-alert :closable="false">
<span class="line-height">{{ $t('setting.versionHelper') }}</span>
<li class="line-height">{{ $t('setting.versionHelper1') }}</li>
<li class="line-height">{{ $t('setting.versionHelper2') }}</li>
</el-alert>
<div class="default-theme" style="margin-left: 20px">
<h2 class="inline-block">{{ $t('app.version') }}</h2>
</div>
<el-radio-group class="inline-block tag" v-model="upgradeVersion" @change="changeOption">
<el-radio v-if="upgradeInfo.newVersion" :value="upgradeInfo.newVersion">
{{ upgradeInfo.newVersion }}
</el-radio>
<el-radio v-if="upgradeInfo.latestVersion" :value="upgradeInfo.latestVersion">
{{ upgradeInfo.latestVersion }}
</el-radio>
<el-radio v-if="upgradeInfo.testVersion" :value="upgradeInfo.testVersion">
{{ upgradeInfo.testVersion }}
</el-radio>
</el-radio-group>
<MdEditor v-model="upgradeInfo.releaseNote" previewOnly :theme="isDarkTheme ? 'dark' : 'light'" />
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="drawerVisible = false">{{ $t('commons.button.cancel') }}</el-button>
<el-button type="primary" @click="onUpgrade">{{ $t('setting.upgradeNow') }}</el-button>
</span>
</template>
</el-drawer>
</template>
<script setup lang="ts">
import DrawerHeader from '@/components/drawer-header/index.vue';
import { loadReleaseNotes, upgrade } from '@/api/modules/setting';
import MdEditor from 'md-editor-v3';
import i18n from '@/lang';
import 'md-editor-v3/lib/style.css';
import { MsgSuccess } from '@/utils/message';
import { ref } from 'vue';
import { GlobalStore } from '@/store';
import { ElMessageBox } from 'element-plus';
import { storeToRefs } from 'pinia';
const globalStore = GlobalStore();
const { isDarkTheme } = storeToRefs(globalStore);
const drawerVisible = ref(false);
const upgradeInfo = ref();
const refresh = ref();
const upgradeVersion = ref();
interface DialogProps {
upgradeInfo: number;
upgradeVersion: string;
}
const acceptParams = (params: DialogProps): void => {
console.log(params);
upgradeInfo.value = params.upgradeInfo;
upgradeVersion.value = params.upgradeVersion;
drawerVisible.value = true;
};
const emit = defineEmits(['search']);
const handleClose = () => {
drawerVisible.value = false;
};
const changeOption = async () => {
const res = await loadReleaseNotes(upgradeVersion.value);
upgradeInfo.value.releaseNote = res.data;
};
const onUpgrade = async () => {
ElMessageBox.confirm(i18n.global.t('setting.upgradeHelper', i18n.global.t('commons.button.upgrade')), {
confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info',
}).then(async () => {
globalStore.isLoading = true;
await upgrade(upgradeVersion.value);
globalStore.isOnRestart = true;
drawerVisible.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
});
};
defineExpose({
acceptParams,
});
</script>
<style lang="scss" scoped>
.line-height {
line-height: 25px;
}
.panel-MdEditor {
height: calc(100vh - 330px);
.tag {
margin-top: -6px;
margin-left: 20px;
vertical-align: middle;
}
:deep(.md-editor-preview) {
font-size: 14px;
}
:deep(.default-theme h2) {
color: var(--dark-gold-base-color);
margin: 13px, 0;
padding: 0;
font-size: 16px;
}
}
</style>

View File

@ -985,6 +985,8 @@ const message = {
fanSpeed: 'Fan Speed',
},
terminal: {
local: 'Local',
localHelper: 'The `local` name is used only for system local identification',
conn: 'connection',
connLocalErr: 'Unable to automatically authenticate, please fill in the local server login information!',
testConn: 'Test connection',

View File

@ -940,6 +940,8 @@ const message = {
fanSpeed: '風扇轉速',
},
terminal: {
local: '本機',
localHelper: 'local 名稱僅用於系統本機標識',
conn: '連接',
connLocalErr: '無法自動認證請填寫本地服務器的登錄信息',
testConn: '連接測試',

View File

@ -941,6 +941,8 @@ const message = {
fanSpeed: '风扇转速',
},
terminal: {
local: '本机',
localHelper: 'local 名称仅用于系统本机标识',
conn: '连接',
connLocalErr: '无法自动认证请填写本地服务器的登录信息',
testConn: '连接测试',
@ -1499,7 +1501,7 @@ const message = {
rollbackHelper:
'即将回滚本次恢复回滚将替换所有本次恢复的文件过程中可能需要重启 Docker 以及 1Panel 服务是否继续',
upgradeRecord: '升级记录',
upgradeRecord: '更新记录',
upgrading: '正在升级中请稍候...',
upgradeHelper: '升级操作需要重启 1Panel 服务是否继续',
noUpgrade: '当前已经是最新版本',

View File

@ -2,10 +2,7 @@
<DrawerPro v-model="drawerVisible" :header="$t('terminal.host')" :back="handleClose" size="large">
<el-form ref="hostInfoRef" label-position="top" :model="dialogData.rowData" :rules="rules" v-loading="loading">
<el-form-item :label="$t('terminal.ip')" prop="addr">
<el-tag v-if="dialogData.rowData!.addr === '127.0.0.1' && dialogData.title === 'edit'">
{{ dialogData.rowData!.addr }}
</el-tag>
<el-input @change="isOK = false" v-else clearable v-model.trim="dialogData.rowData!.addr" />
<el-input @change="isOK = false" clearable v-model.trim="dialogData.rowData!.addr" />
</el-form-item>
<el-form-item :label="$t('commons.login.username')" prop="user">
<el-input @change="isOK = false" clearable v-model="dialogData.rowData!.user" />
@ -53,11 +50,18 @@
</el-form-item>
<el-form-item :label="$t('commons.table.group')" prop="groupID">
<el-select filterable v-model="dialogData.rowData!.groupID" clearable style="width: 100%">
<el-option v-for="item in groupList" :key="item.id" :label="item.name" :value="item.id" />
<div v-for="item in groupList" :key="item.id">
<el-option
v-if="item.name === 'default'"
:label="$t('commons.table.default')"
:value="item.id"
/>
<el-option v-else :label="item.name" :value="item.id" />
</div>
</el-select>
</el-form-item>
<el-form-item :label="$t('commons.table.title')" prop="name">
<el-input clearable v-model="dialogData.rowData!.name" />
<el-form-item :label="$t('commons.table.name')" prop="name">
<el-input :disabled="itemName === 'local'" clearable v-model="dialogData.rowData!.name" />
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description">
<el-input clearable type="textarea" v-model="dialogData.rowData!.description" />
@ -98,6 +102,7 @@ const drawerVisible = ref(false);
const dialogData = ref<DialogProps>({
title: '',
});
const itemName = ref();
const groupList = ref();
const acceptParams = (params: DialogProps): void => {
@ -119,7 +124,14 @@ const rules = reactive({
port: [Rules.requiredInput, Rules.port],
user: [Rules.requiredInput],
authMode: [Rules.requiredSelect],
name: [{ validator: checkName, trigger: 'blur' }],
});
function checkName(rule: any, value: any, callback: any) {
if (value === 'local') {
return callback(new Error(i18n.global.t('terminal.localHelper')));
}
callback();
}
const loadGroups = async () => {
const res = await GetGroupList('host');

View File

@ -10,8 +10,7 @@
type="warning"
/>
<el-form-item :label="$t('terminal.ip')" prop="addr">
<el-input @change="isOK = false" v-if="!isLocal" clearable v-model.trim="hostInfo.addr" />
<el-tag v-if="isLocal">{{ hostInfo.addr }}</el-tag>
<el-input @change="isOK = false" clearable v-model.trim="hostInfo.addr" />
</el-form-item>
<el-form-item :label="$t('commons.login.username')" prop="user">
<el-input @change="isOK = false" clearable v-model="hostInfo.user" />
@ -43,8 +42,17 @@
<el-form-item class="mt-2.5" :label="$t('commons.table.port')" prop="port">
<el-input @change="isOK = false" clearable v-model.number="hostInfo.port" />
</el-form-item>
<el-form-item :label="$t('commons.table.title')" prop="name">
<el-input clearable v-model="hostInfo.name" />
<el-form-item :label="$t('commons.table.group')" prop="groupID">
<el-select filterable v-model="hostInfo.groupID" clearable style="width: 100%">
<div v-for="item in groupList" :key="item.id">
<el-option
v-if="item.name === 'default'"
:label="$t('commons.table.default')"
:value="item.id"
/>
<el-option v-else :label="item.name" :value="item.id" />
</div>
</el-select>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description">
<el-input clearable v-model="hostInfo.description" />
@ -72,12 +80,15 @@ import { addHost, testByInfo } from '@/api/modules/terminal';
import i18n from '@/lang';
import { reactive, ref } from 'vue';
import { MsgError, MsgSuccess } from '@/utils/message';
import { GetGroupList } from '@/api/modules/group';
const dialogVisible = ref();
const isOK = ref(false);
type FormInstance = InstanceType<typeof ElForm>;
const hostRef = ref<FormInstance>();
const groupList = ref();
let hostInfo = reactive<Host.HostOperate>({
id: 0,
name: '',
@ -122,6 +133,7 @@ const acceptParams = (props: DialogProps) => {
hostInfo.addr = '127.0.0.1';
hostInfo.user = 'root';
}
loadGroups();
dialogVisible.value = true;
};
@ -163,6 +175,17 @@ const submitAddHost = (formEl: FormInstance | undefined, ops: string) => {
});
};
const loadGroups = async () => {
const res = await GetGroupList('host');
groupList.value = res.data;
for (const item of groupList.value) {
if (item.isDefault) {
hostInfo.groupID = item.id;
break;
}
}
};
defineExpose({
acceptParams,
});