mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-10-11 16:00:35 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f06f487e8a | ||
|
|
42dd668e1e | ||
|
|
6cd00a072d | ||
|
|
8faa3b6e51 | ||
|
|
52198e9c0c | ||
|
|
173e3e9cc1 | ||
|
|
40c751cde2 | ||
|
|
a3bf4513e1 | ||
|
|
4e7350aaae | ||
|
|
9ae935d06a | ||
|
|
b6055eb058 | ||
|
|
0e158ffa2b | ||
|
|
cc7260e121 | ||
|
|
43b3ef47f3 | ||
|
|
21755223e1 | ||
|
|
08f0147d81 |
@@ -153,24 +153,6 @@ type DBBaseInfo struct {
|
||||
Port int64 `json:"port"`
|
||||
}
|
||||
|
||||
type BackupDB struct {
|
||||
MysqlName string `json:"mysqlName" validate:"required"`
|
||||
DBName string `json:"dbName" validate:"required"`
|
||||
}
|
||||
|
||||
type RecoverDB struct {
|
||||
MysqlName string `json:"mysqlName" validate:"required"`
|
||||
DBName string `json:"dbName" validate:"required"`
|
||||
BackupName string `json:"backupName" validate:"required"`
|
||||
}
|
||||
|
||||
type UploadRecover struct {
|
||||
MysqlName string `json:"mysqlName" validate:"required"`
|
||||
DBName string `json:"dbName" validate:"required"`
|
||||
FileName string `json:"fileName"`
|
||||
FileDir string `json:"fileDir"`
|
||||
}
|
||||
|
||||
// redis
|
||||
type ChangeRedisPass struct {
|
||||
Value string `json:"value" validate:"required"`
|
||||
|
||||
@@ -42,6 +42,7 @@ type WebsiteLog struct {
|
||||
Enable bool `json:"enable"`
|
||||
Content string `json:"content"`
|
||||
End bool `json:"end"`
|
||||
Path string `json:"path"`
|
||||
}
|
||||
|
||||
type PHPConfig struct {
|
||||
|
||||
@@ -5,6 +5,14 @@ import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/1Panel-dev/1Panel/backend/app/dto"
|
||||
"github.com/1Panel-dev/1Panel/backend/app/dto/request"
|
||||
"github.com/1Panel-dev/1Panel/backend/app/dto/response"
|
||||
@@ -19,13 +27,6 @@ import (
|
||||
"github.com/1Panel-dev/1Panel/backend/utils/files"
|
||||
http2 "github.com/1Panel-dev/1Panel/backend/utils/http"
|
||||
"gopkg.in/yaml.v3"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type AppService struct {
|
||||
|
||||
@@ -255,7 +255,7 @@ func handleAppRecover(install *model.AppInstall, recoverFile string, isRollback
|
||||
func reCreateDB(dbID uint, app model.AppInstall, oldEnv string) (*model.DatabaseMysql, map[string]interface{}, error) {
|
||||
mysqlService := NewIMysqlService()
|
||||
ctx := context.Background()
|
||||
_ = mysqlService.Delete(ctx, dto.MysqlDBDelete{ID: dbID, Database: app.Name, Type: app.App.Key, DeleteBackup: true, ForceDelete: true})
|
||||
_ = mysqlService.Delete(ctx, dto.MysqlDBDelete{ID: dbID, Database: app.Name, Type: app.App.Key, DeleteBackup: false, ForceDelete: true})
|
||||
|
||||
envMap := make(map[string]interface{})
|
||||
if err := json.Unmarshal([]byte(oldEnv), &envMap); err != nil {
|
||||
|
||||
@@ -150,7 +150,7 @@ func (u *MysqlService) LoadFromRemote(req dto.MysqlLoadDB) error {
|
||||
return err
|
||||
}
|
||||
|
||||
databases, err := mysqlRepo.List(databaseRepo.WithByFrom(req.From))
|
||||
databases, err := mysqlRepo.List(mysqlRepo.WithByMysqlName(req.Database))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -235,11 +235,11 @@ func (u *MysqlService) Delete(ctx context.Context, req dto.MysqlDBDelete) error
|
||||
return err
|
||||
}
|
||||
|
||||
uploadDir := path.Join(global.CONF.System.BaseDir, fmt.Sprintf("1panel/uploads/database/%s/%s/%s", req.Type, req.Database, db.Name))
|
||||
if _, err := os.Stat(uploadDir); err == nil {
|
||||
_ = os.RemoveAll(uploadDir)
|
||||
}
|
||||
if req.DeleteBackup {
|
||||
uploadDir := path.Join(global.CONF.System.BaseDir, fmt.Sprintf("1panel/uploads/database/%s/%s/%s", req.Type, req.Database, db.Name))
|
||||
if _, err := os.Stat(uploadDir); err == nil {
|
||||
_ = os.RemoveAll(uploadDir)
|
||||
}
|
||||
localDir, err := loadLocalDir()
|
||||
if err != nil && !req.ForceDelete {
|
||||
return err
|
||||
@@ -248,9 +248,9 @@ func (u *MysqlService) Delete(ctx context.Context, req dto.MysqlDBDelete) error
|
||||
if _, err := os.Stat(backupDir); err == nil {
|
||||
_ = os.RemoveAll(backupDir)
|
||||
}
|
||||
_ = backupRepo.DeleteRecord(ctx, commonRepo.WithByType(req.Type), commonRepo.WithByName(req.Database), backupRepo.WithByDetailName(db.Name))
|
||||
global.LOG.Infof("delete database %s-%s backups successful", req.Database, db.Name)
|
||||
}
|
||||
_ = backupRepo.DeleteRecord(ctx, commonRepo.WithByType(req.Type), commonRepo.WithByName(req.Database), backupRepo.WithByDetailName(db.Name))
|
||||
|
||||
_ = mysqlRepo.Delete(ctx, commonRepo.WithByID(db.ID))
|
||||
return nil
|
||||
|
||||
@@ -267,6 +267,7 @@ func (u *FirewallService) OperatePortRule(req dto.PortRuleOperate, reload bool)
|
||||
_ = u.addPortRecord(req)
|
||||
}(req)
|
||||
}
|
||||
wg.Wait()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -343,6 +344,7 @@ func (u *FirewallService) OperateAddressRule(req dto.AddrRuleOperate, reload boo
|
||||
_ = u.addAddressRecord(req)
|
||||
}(req)
|
||||
}
|
||||
wg.Wait()
|
||||
if reload {
|
||||
return client.Reload()
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ func snapCompress(snap snapHelper, rootDir string) {
|
||||
_ = snapshotRepo.UpdateStatus(snap.Status.ID, map[string]interface{}{"compress": err.Error()})
|
||||
return
|
||||
}
|
||||
size := common.LoadSizeUnit(float64(stat.Size()))
|
||||
size := common.LoadSizeUnit2F(float64(stat.Size()))
|
||||
global.LOG.Debugf("compress successful! size of file: %s", size)
|
||||
snap.Status.Compress = constant.StatusDone
|
||||
snap.Status.Size = size
|
||||
|
||||
@@ -941,6 +941,7 @@ func (w WebsiteService) OpWebsiteLog(req request.WebsiteLogReq) (*response.Websi
|
||||
return nil, err
|
||||
}
|
||||
res.End = end
|
||||
res.Path = filePath
|
||||
res.Content = strings.Join(lines, "\n")
|
||||
return res, nil
|
||||
case constant.DisableLog:
|
||||
|
||||
@@ -42,6 +42,7 @@ func Init() {
|
||||
migrations.AddDatabases,
|
||||
migrations.UpdateDatabase,
|
||||
migrations.UpdateAppInstallResource,
|
||||
migrations.DropDatabaseLocal,
|
||||
})
|
||||
if err := m.Migrate(); err != nil {
|
||||
global.LOG.Error(err)
|
||||
|
||||
@@ -572,103 +572,40 @@ var AddDatabases = &gormigrate.Migration{
|
||||
ID: "20230831-add-databases",
|
||||
Migrate: func(tx *gorm.DB) error {
|
||||
installRepo := repo.NewIAppInstallRepo()
|
||||
mysqlInfo, err := installRepo.LoadBaseInfo("mysql", "")
|
||||
if err == nil {
|
||||
var mysqlDb model.Database
|
||||
_ = tx.Where("name = ?", mysqlInfo.Name).First(&mysqlDb).Error
|
||||
if mysqlDb.ID == 0 {
|
||||
if err := tx.Create(&model.Database{
|
||||
AppInstallID: mysqlInfo.ID,
|
||||
Name: mysqlInfo.Name,
|
||||
Type: "mysql",
|
||||
Version: mysqlInfo.Version,
|
||||
From: "local",
|
||||
Address: mysqlInfo.ServiceName,
|
||||
Port: service.DatabaseKeys["mysql"],
|
||||
Username: "root",
|
||||
Password: mysqlInfo.Password,
|
||||
}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
mariadbInfo, err := installRepo.LoadBaseInfo("mariadb", "")
|
||||
if err == nil {
|
||||
if err := tx.Create(&model.Database{
|
||||
AppInstallID: mariadbInfo.ID,
|
||||
Name: mariadbInfo.Name,
|
||||
Type: "mariadb",
|
||||
Version: mariadbInfo.Version,
|
||||
From: "local",
|
||||
Address: mariadbInfo.ServiceName,
|
||||
Port: service.DatabaseKeys["mariadb"],
|
||||
Username: "root",
|
||||
Password: mariadbInfo.Password,
|
||||
}).Error; err != nil {
|
||||
_ = tx.Where("name = ? AND address = ?", "local", "127.0.0.1").Delete(&model.Database{}).Error
|
||||
mysql := addDatabaseData(tx, installRepo, "mysql")
|
||||
if mysql.AppInstallID != 0 {
|
||||
if err := tx.Create(mysql).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
redisInfo, err := installRepo.LoadBaseInfo("redis", "")
|
||||
if err == nil {
|
||||
if err := tx.Create(&model.Database{
|
||||
AppInstallID: redisInfo.ID,
|
||||
Name: redisInfo.Name,
|
||||
Type: "redis",
|
||||
Version: redisInfo.Version,
|
||||
From: "local",
|
||||
Address: redisInfo.ServiceName,
|
||||
Port: service.DatabaseKeys["redis"],
|
||||
Username: "root",
|
||||
Password: redisInfo.Password,
|
||||
}).Error; err != nil {
|
||||
mariadb := addDatabaseData(tx, installRepo, "mariadb")
|
||||
if mariadb.AppInstallID != 0 {
|
||||
if err := tx.Create(mariadb).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
pgInfo, err := installRepo.LoadBaseInfo("postgresql", "")
|
||||
if err == nil {
|
||||
if err := tx.Create(&model.Database{
|
||||
AppInstallID: pgInfo.ID,
|
||||
Name: pgInfo.Name,
|
||||
Type: "postgresql",
|
||||
Version: pgInfo.Version,
|
||||
From: "local",
|
||||
Address: pgInfo.ServiceName,
|
||||
Port: service.DatabaseKeys["postgresql"],
|
||||
Username: pgInfo.UserName,
|
||||
Password: pgInfo.Password,
|
||||
}).Error; err != nil {
|
||||
redis := addDatabaseData(tx, installRepo, "redis")
|
||||
if redis.AppInstallID != 0 {
|
||||
if err := tx.Create(redis).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
mongodbInfo, err := installRepo.LoadBaseInfo("mongodb", "")
|
||||
if err == nil {
|
||||
if err := tx.Create(&model.Database{
|
||||
AppInstallID: mongodbInfo.ID,
|
||||
Name: mongodbInfo.Name,
|
||||
Type: "mongodb",
|
||||
Version: mongodbInfo.Version,
|
||||
From: "local",
|
||||
Address: mongodbInfo.ServiceName,
|
||||
Port: service.DatabaseKeys["mongodb"],
|
||||
Username: mongodbInfo.UserName,
|
||||
Password: mongodbInfo.Password,
|
||||
}).Error; err != nil {
|
||||
postgresql := addDatabaseData(tx, installRepo, "postgresql")
|
||||
if postgresql.AppInstallID != 0 {
|
||||
if err := tx.Create(postgresql).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
memcachedInfo, err := installRepo.LoadBaseInfo("memcached", "")
|
||||
if err == nil {
|
||||
if err := tx.Create(&model.Database{
|
||||
AppInstallID: memcachedInfo.ID,
|
||||
Name: memcachedInfo.Name,
|
||||
Type: "memcached",
|
||||
Version: memcachedInfo.Version,
|
||||
From: "local",
|
||||
Address: memcachedInfo.ServiceName,
|
||||
Port: service.DatabaseKeys["memcached"],
|
||||
Username: "root",
|
||||
Password: memcachedInfo.Password,
|
||||
}).Error; err != nil {
|
||||
mongodb := addDatabaseData(tx, installRepo, "mongodb")
|
||||
if mongodb.AppInstallID != 0 {
|
||||
if err := tx.Create(mongodb).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
memcached := addDatabaseData(tx, installRepo, "memcached")
|
||||
if memcached.AppInstallID != 0 {
|
||||
if err := tx.Create(memcached).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -691,37 +628,15 @@ var UpdateDatabase = &gormigrate.Migration{
|
||||
return nil
|
||||
}
|
||||
for _, data := range datas {
|
||||
if data.Name == "local" && data.Address == "127.0.0.1" && data.Type == "mysql" {
|
||||
installRepo := repo.NewIAppInstallRepo()
|
||||
mysqlInfo, err := installRepo.LoadBaseInfo("mysql", "")
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
pass, err := encrypt.StringEncrypt(data.Password)
|
||||
if err != nil {
|
||||
global.LOG.Errorf("encrypt database %s password failed, err: %v", data.Name, err)
|
||||
continue
|
||||
}
|
||||
if err := tx.Model(&model.Database{}).Where("id = ?", data.ID).Updates(map[string]interface{}{
|
||||
"app_install_id": mysqlInfo.ID,
|
||||
"name": mysqlInfo.Name,
|
||||
"password": pass,
|
||||
"port": service.DatabaseKeys["mysql"],
|
||||
"address": mysqlInfo.ServiceName,
|
||||
}).Error; err != nil {
|
||||
global.LOG.Errorf("updata database %s info failed, err: %v", data.Name, err)
|
||||
}
|
||||
} else {
|
||||
pass, err := encrypt.StringEncrypt(data.Password)
|
||||
if err != nil {
|
||||
global.LOG.Errorf("encrypt database %s password failed, err: %v", data.Name, err)
|
||||
continue
|
||||
}
|
||||
if err := tx.Model(&model.Database{}).Where("id = ?", data.ID).Updates(map[string]interface{}{
|
||||
"password": pass,
|
||||
}).Error; err != nil {
|
||||
global.LOG.Errorf("updata database %s info failed, err: %v", data.Name, err)
|
||||
}
|
||||
pass, err := encrypt.StringEncrypt(data.Password)
|
||||
if err != nil {
|
||||
global.LOG.Errorf("encrypt database %s password failed, err: %v", data.Name, err)
|
||||
continue
|
||||
}
|
||||
if err := tx.Model(&model.Database{}).Where("id = ?", data.ID).Updates(map[string]interface{}{
|
||||
"password": pass,
|
||||
}).Error; err != nil {
|
||||
global.LOG.Errorf("updata database %s info failed, err: %v", data.Name, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -759,3 +674,70 @@ var UpdateAppInstallResource = &gormigrate.Migration{
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
var DropDatabaseLocal = &gormigrate.Migration{
|
||||
ID: "20230914-drop-database-local",
|
||||
Migrate: func(tx *gorm.DB) error {
|
||||
_ = tx.Where("name = ? AND address = ?", "local", "127.0.0.1").Delete(&model.Database{}).Error
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
func addDatabaseData(tx *gorm.DB, installRepo repo.IAppInstallRepo, appType string) *model.Database {
|
||||
dbInfo, err := installRepo.LoadBaseInfo(appType, "")
|
||||
if err != nil {
|
||||
return &model.Database{}
|
||||
}
|
||||
|
||||
if appType == "mysql" || appType == "redis" || appType == "mariadb" || appType == "memcached" {
|
||||
dbInfo.UserName = "root"
|
||||
}
|
||||
database := &model.Database{
|
||||
AppInstallID: dbInfo.ID,
|
||||
Name: dbInfo.Name,
|
||||
Type: appType,
|
||||
Version: dbInfo.Version,
|
||||
From: "local",
|
||||
Address: dbInfo.ServiceName,
|
||||
Port: service.DatabaseKeys[appType],
|
||||
Username: dbInfo.UserName,
|
||||
Password: dbInfo.Password,
|
||||
}
|
||||
var dbItem model.Database
|
||||
_ = global.DB.Where("name = ?", dbInfo.Name).First(&dbItem).Error
|
||||
if dbItem.ID != 0 {
|
||||
if appType == "mysql" {
|
||||
var (
|
||||
backups []model.BackupRecord
|
||||
mysqls []model.DatabaseMysql
|
||||
)
|
||||
_ = tx.Where("name = ? AND type = ?", dbItem.Name, "mysql").Find(&backups)
|
||||
_ = tx.Where("`from` = ?", "local").Find(&mysqls)
|
||||
for _, item := range backups {
|
||||
isLocal := false
|
||||
for _, mysql := range mysqls {
|
||||
if item.Name == mysql.MysqlName && item.DetailName == mysql.Name {
|
||||
isLocal = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isLocal {
|
||||
_ = tx.Model(&model.BackupRecord{}).Where("id = ?", item.ID).Updates(map[string]interface{}{
|
||||
"name": "remote-" + dbItem.Name,
|
||||
}).Error
|
||||
}
|
||||
}
|
||||
}
|
||||
if err := tx.Debug().Model(&model.DatabaseMysql{}).Where("mysql_name = ? AND `from` != ?", dbItem.Name, "local").Updates(map[string]interface{}{
|
||||
"mysql_name": "remote-" + dbItem.Name,
|
||||
}).Error; err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
if err := tx.Debug().Model(&model.Database{}).Where("name = ?", dbItem.Name).Updates(map[string]interface{}{
|
||||
"name": "remote-" + dbItem.Name,
|
||||
}).Error; err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
return database
|
||||
}
|
||||
|
||||
@@ -24,6 +24,17 @@ func CompareVersion(version1 string, version2 string) bool {
|
||||
version1s := strings.Split(version1, ".")
|
||||
version2s := strings.Split(version2, ".")
|
||||
|
||||
if len(version2s) > len(version1s) {
|
||||
for i := 0; i < len(version2s)-len(version1s); i++ {
|
||||
version1s = append(version1s, "0")
|
||||
}
|
||||
}
|
||||
if len(version1s) > len(version2s) {
|
||||
for i := 0; i < len(version1s)-len(version2s); i++ {
|
||||
version2s = append(version2s, "0")
|
||||
}
|
||||
}
|
||||
|
||||
n := min(len(version1s), len(version2s))
|
||||
re := regexp.MustCompile("[0-9]+")
|
||||
for i := 0; i < n; i++ {
|
||||
@@ -147,6 +158,16 @@ func RemoveRepeatElement(a interface{}) (ret []interface{}) {
|
||||
}
|
||||
|
||||
func LoadSizeUnit(value float64) string {
|
||||
if value > 1048576 {
|
||||
return fmt.Sprintf("%vM", value/1048576)
|
||||
}
|
||||
if value > 1024 {
|
||||
return fmt.Sprintf("%vK", value/1024)
|
||||
}
|
||||
return fmt.Sprintf("%v", value)
|
||||
}
|
||||
|
||||
func LoadSizeUnit2F(value float64) string {
|
||||
if value > 1073741824 {
|
||||
return fmt.Sprintf("%.2fG", value/1073741824)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
mathRand "math/rand"
|
||||
"strings"
|
||||
|
||||
"github.com/1Panel-dev/1Panel/backend/utils/common"
|
||||
@@ -113,26 +112,5 @@ func randomPassword(user string) string {
|
||||
if len(user) > 6 {
|
||||
passwdItem = user[:6]
|
||||
}
|
||||
num := []rune("1234567890")
|
||||
uppercase := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||
lowercase := []rune("abcdefghijklmnopqrstuvwxyz")
|
||||
special := []rune(".%@!~_-")
|
||||
|
||||
b := make([]rune, 10)
|
||||
for i := 0; i < 2; i++ {
|
||||
b[i] = lowercase[mathRand.Intn(len(lowercase))]
|
||||
}
|
||||
for i := 2; i < 4; i++ {
|
||||
b[i] = uppercase[mathRand.Intn(len(uppercase))]
|
||||
}
|
||||
b[4] = special[mathRand.Intn(len(special))]
|
||||
for i := 5; i < 9; i++ {
|
||||
b[i] = num[mathRand.Intn(len(num))]
|
||||
}
|
||||
|
||||
for i := len(b) - 1; i > 0; i-- {
|
||||
j := mathRand.Intn(i + 1)
|
||||
b[i], b[j] = b[j], b[i]
|
||||
}
|
||||
return passwdItem + "-" + (string(b))
|
||||
return passwdItem + "@" + common.RandStrAndNum(8)
|
||||
}
|
||||
|
||||
@@ -17688,6 +17688,9 @@ const docTemplate = `{
|
||||
},
|
||||
"end": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"path": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -17681,6 +17681,9 @@
|
||||
},
|
||||
"end": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"path": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -4016,6 +4016,8 @@ definitions:
|
||||
type: boolean
|
||||
end:
|
||||
type: boolean
|
||||
path:
|
||||
type: string
|
||||
type: object
|
||||
response.WebsiteNginxConfig:
|
||||
properties:
|
||||
|
||||
@@ -90,6 +90,7 @@ export namespace Website {
|
||||
enable: boolean;
|
||||
content: string;
|
||||
end: boolean;
|
||||
path: string;
|
||||
}
|
||||
|
||||
export interface Domain {
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
<div v-else>
|
||||
<div v-if="!data.isExist && !isDB()">
|
||||
<LayoutContent :title="getTitle(key)" :divider="true">
|
||||
<template #main>
|
||||
<div class="app-warn">
|
||||
@@ -134,6 +134,10 @@ const goRouter = async (key: string) => {
|
||||
router.push({ name: 'AppAll', query: { install: key } });
|
||||
};
|
||||
|
||||
const isDB = () => {
|
||||
return key.value === 'mysql' || key.value === 'mariadb';
|
||||
};
|
||||
|
||||
const onCheck = async () => {
|
||||
await CheckAppInstalled(key.value, name.value)
|
||||
.then((res) => {
|
||||
|
||||
@@ -180,11 +180,13 @@ html.dark {
|
||||
|
||||
.router_card_button {
|
||||
.el-radio-button__inner {
|
||||
background: none;
|
||||
background: none !important;
|
||||
}
|
||||
.el-radio-button__original-radio:checked + .el-radio-button__inner {
|
||||
color: #ffffff;
|
||||
background-color: var(--panel-button-active) !important;
|
||||
box-shadow: none !important;
|
||||
border: none !important;
|
||||
}
|
||||
}
|
||||
// content-box
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<el-dialog v-model="open" :title="$t('app.delete')" width="30%" :close-on-click-modal="false">
|
||||
<el-dialog v-model="open" :title="$t('container.' + operation)" width="30%" :close-on-click-modal="false">
|
||||
<el-row>
|
||||
<el-col :span="20" :offset="2">
|
||||
<el-alert :title="msg" show-icon type="error" :closable="false"></el-alert>
|
||||
@@ -64,7 +64,7 @@ const onConfirm = () => {
|
||||
open.value = false;
|
||||
loading.value = false;
|
||||
em('search');
|
||||
MsgSuccess(i18n.global.t('commons.msg.deleteSuccess'));
|
||||
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
|
||||
})
|
||||
.finally(() => {
|
||||
open.value = false;
|
||||
|
||||
@@ -164,7 +164,7 @@
|
||||
</template>
|
||||
</LayoutContent>
|
||||
|
||||
<div v-if="!currentDB?.id">
|
||||
<div v-if="dbOptionsLocal.length === 0 && dbOptionsRemote.length === 0">
|
||||
<LayoutContent :title="'MySQL ' + $t('menu.database')" :divider="true">
|
||||
<template #main>
|
||||
<div class="app-warn">
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
plain
|
||||
round
|
||||
size="small"
|
||||
:disabled="app.limit == 1 && app.installed"
|
||||
@click="goInstall(app.key)"
|
||||
>
|
||||
{{ $t('app.install') }}
|
||||
@@ -57,7 +58,7 @@ let req = reactive({
|
||||
});
|
||||
|
||||
let loading = ref(false);
|
||||
let apps = ref<App.App[]>([]);
|
||||
let apps = ref<App.AppDTO[]>([]);
|
||||
|
||||
const acceptParams = (): void => {
|
||||
search(req);
|
||||
|
||||
@@ -4,19 +4,14 @@
|
||||
<el-form-item :label="$t('website.enable')">
|
||||
<el-switch v-model="data.enable" @change="updateEnable"></el-switch>
|
||||
</el-form-item>
|
||||
<div style="margin-top: 10px">
|
||||
<el-checkbox border v-model="tailLog" style="float: left" @change="changeTail">
|
||||
<div class="mt-2.5">
|
||||
<el-checkbox border v-model="tailLog" class="float-left" @change="changeTail">
|
||||
{{ $t('commons.button.watch') }}
|
||||
</el-checkbox>
|
||||
<el-button
|
||||
style="margin-left: 20px"
|
||||
@click="onDownload"
|
||||
icon="Download"
|
||||
:disabled="data.content === ''"
|
||||
>
|
||||
<el-button class="ml-5" @click="onDownload" icon="Download" :disabled="data.content === ''">
|
||||
{{ $t('file.download') }}
|
||||
</el-button>
|
||||
<el-button style="margin-left: 20px" @click="cleanLog" icon="Delete" :disabled="data.content === ''">
|
||||
<el-button class="ml-5" @click="cleanLog" icon="Delete" :disabled="data.content === ''">
|
||||
{{ $t('commons.button.clean') }}
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -46,8 +41,8 @@ import { javascript } from '@codemirror/lang-javascript';
|
||||
import { oneDark } from '@codemirror/theme-one-dark';
|
||||
import { computed, nextTick, onMounted, onUnmounted, reactive, ref, shallowRef } from 'vue';
|
||||
import { OpWebsiteLog } from '@/api/modules/website';
|
||||
import { dateFormatForName, downloadWithContent } from '@/utils/util';
|
||||
import { useDeleteData } from '@/hooks/use-delete-data';
|
||||
import { downloadFile } from '@/utils/util';
|
||||
|
||||
const extensions = [javascript(), oneDark];
|
||||
const props = defineProps({
|
||||
@@ -70,6 +65,7 @@ const loading = ref(false);
|
||||
const data = ref({
|
||||
enable: false,
|
||||
content: '',
|
||||
path: '',
|
||||
});
|
||||
const tailLog = ref(false);
|
||||
let timer: NodeJS.Timer | null = null;
|
||||
@@ -165,7 +161,7 @@ const cleanLog = async () => {
|
||||
};
|
||||
|
||||
const onDownload = async () => {
|
||||
downloadWithContent(data.value.content, logType.value + '-' + dateFormatForName(new Date()) + '.log');
|
||||
downloadFile(data.value.path);
|
||||
};
|
||||
|
||||
const onCloseLog = async () => {
|
||||
|
||||
Reference in New Issue
Block a user