mirror of
https://gitee.com/fit2cloud-feizhiyun/1Panel.git
synced 2024-12-04 12:59:52 +08:00
style: 创建应用增加端口判断
This commit is contained in:
parent
ba5d6794b1
commit
24b3d21204
@ -47,13 +47,19 @@ func (a *AppInstallRepo) WithServiceName(serviceName string) DBOption {
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AppInstallRepo) WithPort(port int) DBOption {
|
||||
return func(db *gorm.DB) *gorm.DB {
|
||||
return db.Where("https_port = ? or http_port = ?", port, port)
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AppInstallRepo) WithIdNotInWebsite() DBOption {
|
||||
return func(db *gorm.DB) *gorm.DB {
|
||||
return db.Where("id not in (select app_install_id from websites)")
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AppInstallRepo) GetBy(opts ...DBOption) ([]model.AppInstall, error) {
|
||||
func (a *AppInstallRepo) ListBy(opts ...DBOption) ([]model.AppInstall, error) {
|
||||
var install []model.AppInstall
|
||||
db := getDb(opts...).Model(&model.AppInstall{})
|
||||
err := db.Preload("App").Preload("Backups").Find(&install).Error
|
||||
|
@ -155,7 +155,7 @@ func (a AppService) GetAppDetail(appId uint, version string) (response.AppDetail
|
||||
}
|
||||
|
||||
func (a AppService) Install(ctx context.Context, req request.AppInstallCreate) (*model.AppInstall, error) {
|
||||
if list, _ := appInstallRepo.GetBy(commonRepo.WithByName(req.Name)); len(list) > 0 {
|
||||
if list, _ := appInstallRepo.ListBy(commonRepo.WithByName(req.Name)); len(list) > 0 {
|
||||
return nil, buserr.New(constant.ErrNameIsExist)
|
||||
}
|
||||
|
||||
|
@ -137,12 +137,12 @@ func (a AppInstallService) SearchForWebsite(req request.AppInstalledSearch) ([]r
|
||||
opts = append(opts, appInstallRepo.WithIdNotInWebsite())
|
||||
}
|
||||
opts = append(opts, appInstallRepo.WithAppIdsIn(ids))
|
||||
installs, err = appInstallRepo.GetBy(opts...)
|
||||
installs, err = appInstallRepo.ListBy(opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
installs, err = appInstallRepo.GetBy()
|
||||
installs, err = appInstallRepo.ListBy()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -178,7 +178,7 @@ func (a AppInstallService) Operate(req request.AppInstalledOperate) error {
|
||||
install.Status = constant.Running
|
||||
case constant.Delete:
|
||||
tx, ctx := getTxAndContext()
|
||||
if err := deleteAppInstall(ctx, install, req.DeleteBackup); err != nil && !req.ForceDelete {
|
||||
if err := deleteAppInstall(ctx, install, req.DeleteBackup, req.ForceDelete); err != nil && !req.ForceDelete {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
@ -206,7 +206,7 @@ func (a AppInstallService) Operate(req request.AppInstalledOperate) error {
|
||||
}
|
||||
|
||||
func (a AppInstallService) SyncAll() error {
|
||||
allList, err := appInstallRepo.GetBy()
|
||||
allList, err := appInstallRepo.ListBy()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -253,7 +253,7 @@ func (a AppInstallService) GetServices(key string) ([]response.AppService, error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
installs, err := appInstallRepo.GetBy(appInstallRepo.WithAppId(app.ID), appInstallRepo.WithStatus(constant.Running))
|
||||
installs, err := appInstallRepo.ListBy(appInstallRepo.WithAppId(app.ID), appInstallRepo.WithStatus(constant.Running))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -40,8 +40,17 @@ func checkPort(key string, params map[string]interface{}) (int, error) {
|
||||
port, ok := params[key]
|
||||
if ok {
|
||||
portN := int(math.Ceil(port.(float64)))
|
||||
|
||||
oldInstalled, _ := appInstallRepo.ListBy(appInstallRepo.WithPort(portN))
|
||||
if len(oldInstalled) > 0 {
|
||||
var apps []string
|
||||
for _, install := range oldInstalled {
|
||||
apps = append(apps, install.App.Name)
|
||||
}
|
||||
return portN, buserr.WithMap(constant.ErrPortInOtherApp, map[string]interface{}{"port": portN, "apps": apps}, nil)
|
||||
}
|
||||
if common.ScanPort(portN) {
|
||||
return portN, buserr.WithMessage(constant.ErrPortInUsed, portN, nil)
|
||||
return portN, buserr.WithDetail(constant.ErrPortInUsed, portN, nil)
|
||||
} else {
|
||||
return portN, nil
|
||||
}
|
||||
@ -105,23 +114,23 @@ func createLink(ctx context.Context, app model.App, appInstall *model.AppInstall
|
||||
return nil
|
||||
}
|
||||
|
||||
func deleteAppInstall(ctx context.Context, install model.AppInstall, deleteBackup bool) error {
|
||||
func deleteAppInstall(ctx context.Context, install model.AppInstall, deleteBackup bool, forceDelete bool) error {
|
||||
op := files.NewFileOp()
|
||||
appDir := install.GetPath()
|
||||
dir, _ := os.Stat(appDir)
|
||||
if dir != nil {
|
||||
out, err := compose.Down(install.GetComposePath())
|
||||
if err != nil {
|
||||
if err != nil && !forceDelete {
|
||||
return handleErr(install, err, out)
|
||||
}
|
||||
if err := op.DeleteDir(appDir); err != nil {
|
||||
if err := op.DeleteDir(appDir); err != nil && !forceDelete {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := appInstallRepo.Delete(ctx, install); err != nil {
|
||||
if err := appInstallRepo.Delete(ctx, install); err != nil && !forceDelete {
|
||||
return err
|
||||
}
|
||||
if err := deleteLink(ctx, &install); err != nil {
|
||||
if err := deleteLink(ctx, &install); err != nil && !forceDelete {
|
||||
return err
|
||||
}
|
||||
if deleteBackup {
|
||||
@ -129,7 +138,7 @@ func deleteAppInstall(ctx context.Context, install model.AppInstall, deleteBacku
|
||||
for _, backup := range backups {
|
||||
_ = op.DeleteDir(backup.Path)
|
||||
}
|
||||
if err := appInstallBackupRepo.Delete(ctx, appInstallBackupRepo.WithAppInstallID(install.ID)); err != nil {
|
||||
if err := appInstallBackupRepo.Delete(ctx, appInstallBackupRepo.WithAppInstallID(install.ID)); err != nil && !forceDelete {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -320,7 +329,7 @@ func getContainerNames(install model.AppInstall) ([]string, error) {
|
||||
|
||||
func checkLimit(app model.App) error {
|
||||
if app.Limit > 0 {
|
||||
installs, err := appInstallRepo.GetBy(appInstallRepo.WithAppId(app.ID))
|
||||
installs, err := appInstallRepo.ListBy(appInstallRepo.WithAppId(app.ID))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -361,7 +370,7 @@ func checkRequiredAndLimit(app model.App) error {
|
||||
|
||||
_, err = appInstallRepo.GetFirst(appInstallRepo.WithDetailIdsIn(detailIds))
|
||||
if err != nil {
|
||||
return buserr.WithMessage(constant.ErrAppRequired, requireApp.Name, nil)
|
||||
return buserr.WithDetail(constant.ErrAppRequired, requireApp.Name, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ func (u *DashboardService) LoadBaseInfo(ioOption string, netOption string) (*dto
|
||||
}
|
||||
}
|
||||
|
||||
appInstall, err := appInstallRepo.GetBy()
|
||||
appInstall, err := appInstallRepo.ListBy()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -334,7 +334,7 @@ func (w WebsiteService) DeleteWebsite(req request.WebsiteDelete) error {
|
||||
return err
|
||||
}
|
||||
if !reflect.DeepEqual(model.AppInstall{}, appInstall) {
|
||||
if err := deleteAppInstall(ctx, appInstall, true); err != nil && !req.ForceDelete {
|
||||
if err := deleteAppInstall(ctx, appInstall, true, req.ForceDelete); err != nil && !req.ForceDelete {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -638,7 +638,7 @@ func (w WebsiteService) PreInstallCheck(req request.WebsiteInstallCheckReq) ([]r
|
||||
res = append(res, response.WebsitePreInstallCheck{
|
||||
Name: appInstall.Name,
|
||||
AppName: app.Name,
|
||||
Status: buserr.WithMessage(constant.ErrNotInstall, app.Name, nil).Error(),
|
||||
Status: buserr.WithDetail(constant.ErrNotInstall, app.Name, nil).Error(),
|
||||
Version: appInstall.Version,
|
||||
})
|
||||
showErr = true
|
||||
@ -651,7 +651,7 @@ func (w WebsiteService) PreInstallCheck(req request.WebsiteInstallCheckReq) ([]r
|
||||
}
|
||||
}
|
||||
if len(checkIds) > 0 {
|
||||
installList, _ := appInstallRepo.GetBy(commonRepo.WithIdsIn(checkIds))
|
||||
installList, _ := appInstallRepo.ListBy(commonRepo.WithIdsIn(checkIds))
|
||||
for _, install := range installList {
|
||||
res = append(res, response.WebsitePreInstallCheck{
|
||||
Name: install.Name,
|
||||
|
@ -8,6 +8,7 @@ import (
|
||||
type BusinessError struct {
|
||||
Msg string
|
||||
Detail interface{}
|
||||
Map map[string]interface{}
|
||||
Err error
|
||||
}
|
||||
|
||||
@ -15,6 +16,8 @@ func (e BusinessError) Error() string {
|
||||
content := ""
|
||||
if e.Detail != nil {
|
||||
content = i18n.GetErrMsg(e.Msg, map[string]interface{}{"detail": e.Detail})
|
||||
} else if e.Map != nil {
|
||||
content = i18n.GetErrMsg(e.Msg, e.Map)
|
||||
} else {
|
||||
content = i18n.GetErrMsg(e.Msg, nil)
|
||||
}
|
||||
@ -35,10 +38,18 @@ func New(Key string) BusinessError {
|
||||
}
|
||||
}
|
||||
|
||||
func WithMessage(Key string, detail interface{}, err error) BusinessError {
|
||||
func WithDetail(Key string, detail interface{}, err error) BusinessError {
|
||||
return BusinessError{
|
||||
Msg: Key,
|
||||
Detail: detail,
|
||||
Err: err,
|
||||
}
|
||||
}
|
||||
|
||||
func WithMap(Key string, maps map[string]interface{}, err error) BusinessError {
|
||||
return BusinessError{
|
||||
Msg: Key,
|
||||
Map: maps,
|
||||
Err: err,
|
||||
}
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ var (
|
||||
ErrFileCanNotRead = "ErrFileCanNotRead"
|
||||
ErrFileToLarge = "ErrFileToLarge"
|
||||
ErrNotInstall = "ErrNotInstall"
|
||||
ErrPortInOtherApp = "ErrPortInOtherApp"
|
||||
)
|
||||
|
||||
//website
|
||||
|
@ -21,6 +21,7 @@ ErrPortInUsed: "{{ .detail }} port already in use"
|
||||
ErrAppLimit: "App exceeds install limit"
|
||||
ErrAppRequired: "{{ .detail }} app is required"
|
||||
ErrNotInstall: "App not installed"
|
||||
ErrPortInOtherApp: "{{ .port }} port already in use by {{ .apps }}"
|
||||
|
||||
|
||||
#file
|
||||
|
@ -21,6 +21,7 @@ ErrPortInUsed: "{{ .detail }} 端口已被占用!"
|
||||
ErrAppLimit: "应用超出安装数量限制"
|
||||
ErrAppRequired: "请先安装 {{ .detail }} 应用"
|
||||
ErrNotInstall: "应用未安装"
|
||||
ErrPortInOtherApp: "{{ .port }} 端口已被 {{ .apps }}占用!"
|
||||
|
||||
#file
|
||||
ErrFileCanNotRead: "此文件不支持预览"
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div v-for="(p, index) in paramObjs" :key="index">
|
||||
<el-form-item :label="p.labelZh" :prop="p.prop">
|
||||
<el-form-item :label="getLabel(p)" :prop="p.prop">
|
||||
<el-input
|
||||
v-model.trim="form[p.envKey]"
|
||||
v-if="p.type == 'text'"
|
||||
@ -43,12 +43,13 @@
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { computed, onMounted, reactive, ref } from 'vue';
|
||||
import { computed, inject, onMounted, reactive, ref } from 'vue';
|
||||
import { getRandomStr } from '@/utils/util';
|
||||
import { GetAppService } from '@/api/modules/app';
|
||||
import { Rules } from '@/global/form-rules';
|
||||
import { App } from '@/api/interface/app';
|
||||
import { useRouter } from 'vue-router';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
const router = useRouter();
|
||||
|
||||
interface ParamObj extends App.FromField {
|
||||
@ -169,8 +170,23 @@ const changeService = (value: string, services: App.AppService[]) => {
|
||||
updateParam();
|
||||
};
|
||||
|
||||
const getLabel = (row: ParamObj): string => {
|
||||
const language = useI18n().locale.value;
|
||||
if (language == 'zh') {
|
||||
return row.labelZh;
|
||||
} else {
|
||||
return row.labelEn;
|
||||
}
|
||||
};
|
||||
|
||||
let reloadPage: Function = inject('reload');
|
||||
|
||||
const toPage = () => {
|
||||
router.push({ name: 'App' });
|
||||
const nowPath = router.currentRoute.value.path;
|
||||
if (nowPath && nowPath == '/apps/all') {
|
||||
reloadPage();
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
|
Loading…
Reference in New Issue
Block a user