fix: Fix the problem of abnormal container port jumps (#8514)

This commit is contained in:
ssongliu 2025-04-29 19:07:57 +08:00 committed by GitHub
parent ea12a22575
commit 4dfa421c1a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 63 additions and 39 deletions

View file

@ -36,7 +36,6 @@ const (
tmpUploadPath = "1panel/tmp/upload"
uploadPath = "1panel/uploads"
downloadPath = "1panel/download"
logPath = "1panel/log"
)
func (u *DeviceService) Scan() dto.CleanData {
@ -247,7 +246,7 @@ func (u *DeviceService) Clean(req []dto.Clean) {
case "system_log":
if len(item.Name) == 0 {
files, _ := os.ReadDir(path.Join(global.Dir.BaseDir, logPath))
files, _ := os.ReadDir(global.Dir.LogDir)
if len(files) == 0 {
continue
}
@ -255,14 +254,14 @@ func (u *DeviceService) Clean(req []dto.Clean) {
if file.Name() == "1Panel-Core.log" || file.Name() == "1Panel.log" || file.IsDir() {
continue
}
dropFileOrDir(path.Join(global.Dir.BaseDir, logPath, file.Name()))
dropFileOrDir(path.Join(global.Dir.LogDir, file.Name()))
}
} else {
dropFileOrDir(path.Join(global.Dir.BaseDir, logPath, item.Name))
dropFileOrDir(path.Join(global.Dir.LogDir, item.Name))
}
case "task_log":
if len(item.Name) == 0 {
files, _ := os.ReadDir(path.Join(global.Dir.BaseDir, logPath))
files, _ := os.ReadDir(path.Join(global.Dir.TaskDir))
if len(files) == 0 {
continue
}
@ -270,11 +269,11 @@ func (u *DeviceService) Clean(req []dto.Clean) {
if file.Name() == "ssl" || !file.IsDir() {
continue
}
dropFileOrDir(path.Join(global.Dir.BaseDir, logPath, file.Name()))
dropFileOrDir(path.Join(global.Dir.TaskDir, file.Name()))
}
_ = taskRepo.DeleteAll()
} else {
pathItem := path.Join(global.Dir.BaseDir, logPath, item.Name)
pathItem := path.Join(global.Dir.TaskDir, item.Name)
dropFileOrDir(pathItem)
if len(item.Name) != 0 {
_ = taskRepo.Delete(repo.WithByType(item.Name))
@ -341,15 +340,14 @@ func systemClean(taskItem *task.Task) error {
dropWithTask(path.Join(global.Dir.BaseDir, uploadPath), taskItem, &size, &fileCount)
dropWithTask(path.Join(global.Dir.BaseDir, downloadPath), taskItem, &size, &fileCount)
logPath := path.Join(global.Dir.BaseDir, logPath)
logFiles, _ := os.ReadDir(logPath)
logFiles, _ := os.ReadDir(global.Dir.LogDir)
if len(logFiles) != 0 {
for i := 0; i < len(logFiles); i++ {
if logFiles[i].IsDir() {
continue
}
if logFiles[i].Name() != "1Panel.log" && logFiles[i].Name() != "1Panel-Core.log" {
dropWithTask(path.Join(logPath, logFiles[i].Name()), taskItem, &size, &fileCount)
dropWithTask(path.Join(global.Dir.LogDir, logFiles[i].Name()), taskItem, &size, &fileCount)
}
}
}
@ -506,7 +504,7 @@ func loadDownloadTree(fileOp fileUtils.FileOp) []dto.CleanTree {
func loadLogTree(fileOp fileUtils.FileOp) []dto.CleanTree {
var treeData []dto.CleanTree
path1 := path.Join(global.Dir.BaseDir, logPath)
path1 := path.Join(global.Dir.LogDir)
list1 := loadTreeWithAllFile(true, path1, "system_log", path1, fileOp)
size := uint64(0)
for _, file := range list1 {
@ -514,7 +512,7 @@ func loadLogTree(fileOp fileUtils.FileOp) []dto.CleanTree {
}
treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "system_log", Size: uint64(size), Children: list1, Type: "system_log", IsRecommend: true})
path2 := path.Join(global.Dir.BaseDir, logPath)
path2 := path.Join(global.Dir.TaskDir)
list2 := loadTreeWithDir(false, "task_log", path2, fileOp)
size2, _ := fileOp.GetDirSize(path2)
treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "task_log", Size: uint64(size2), Children: list2, Type: "task_log"})
@ -575,7 +573,7 @@ func loadTreeWithDir(isCheck bool, treeType, pathItem string, fileOp fileUtils.F
if treeType == "old_upgrade" {
continue
}
if treeType == "task_log" && file.Name() == "ssl" {
if file.Name() == "ssl" {
continue
}
if file.IsDir() {

View file

@ -95,6 +95,7 @@ ScriptLibrary: "Script Library"
Node: "Node"
SyncNode: "Sync node data"
LocalName: "'local' name is only used for system local identification"
SyncPackageData: "Package sync data [{{ .detail }}]"
SyncPackageEncrypt: "Data package encryption"
SyncRequest: "Request node sync API"

View file

@ -96,6 +96,7 @@ ScriptLibrary: "スクリプトライブラリ"
Node: "ノード"
SyncNode: "ノードデータ同期"
LocalName: "'local'名称はシステムのローカル識別のみに使用されます"
SyncPackageData: "同期データのパッケージ化 [{{ .detail }}]"
SyncPackageEncrypt: "データパッケージの暗号化"
SyncRequest: "ード同期APIをリクエスト"

View file

@ -95,6 +95,7 @@ ScriptLibrary: "스크립트 라이브러리"
Node: "노드"
SyncNode: "노드 데이터 동기화"
LocalName: "'local' 이름은 시스템 로컬 식별 전용으로 사용됩니다"
SyncPackageData: "동기화 데이터 패키징 [{{ .detail }}]"
SyncPackageEncrypt: "데이터 패키지 암호화"
SyncRequest: "노드 동기화 API 요청"

View file

@ -95,6 +95,7 @@ ScriptLibrary: "Pustaka Skrip"
Node: "Nod"
SyncNode: "Segerakkan data nod"
LocalName: "Nama 'local' hanya digunakan untuk pengenalpastian tempatan sistem"
SyncPackageData: "Pakej data segerak [{{ .detail }}]"
SyncPackageEncrypt: "Enkripsi pakej data"
SyncRequest: "Permintaan API segerak nod"

View file

@ -95,6 +95,7 @@ ScriptLibrary: "Biblioteca de Scripts"
Node: "Nó"
SyncNode: "Sincronizar dados do nó"
LocalName: "O nome 'local' é usado apenas para identificação local do sistema"
SyncPackageData: "Empacotar dados de sincronização [{{ .detail }}]"
SyncPackageEncrypt: "Criptografia de pacote de dados"
SyncRequest: "Solicitar API de sincronização de nó"

View file

@ -95,6 +95,7 @@ ScriptLibrary: "Библиотека скриптов"
Node: "Узел"
SyncNode: "Синхронизация данных узла"
LocalName: "Имя 'local' используется только для локальной идентификации в системе"
SyncPackageData: "Упаковка данных синхронизации [{{ .detail }}]"
SyncPackageEncrypt: "Шифрование пакета данных"
SyncRequest: "Запрос API синхронизации узла"

View file

@ -95,6 +95,7 @@ ScriptLibrary: "腳本庫"
Node: "節點"
SyncNode: "同步節點數據"
LocalName: "'local' 名稱僅用於系統本機標識"
SyncPackageData: "打包同步數據 [{{ .detail }}]"
SyncPackageEncrypt: "數據包加密"
SyncRequest: "請求節點同步接口"

View file

@ -96,6 +96,7 @@ ScriptLibrary: "脚本库"
#sync node
Node: "节点"
SyncNode: "同步节点数据"
LocalName: "local 名称仅用于系统本机标识"
SyncPackageData: "打包同步数据 [{{ .detail }}]"
SyncPackageEncrypt: "数据包加密"
SyncRequest: "请求节点同步接口"

View file

@ -16,7 +16,7 @@
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { getSettingInfo } from '@/api/modules/setting';
import { getAgentSettingInfo } from '@/api/modules/setting';
import i18n from '@/lang';
import { MsgError, MsgWarning } from '@/utils/message';
import { jumpToPath } from '@/utils/util';
@ -37,7 +37,7 @@ const acceptParams = async (params: DialogProps): Promise<void> => {
return;
}
let protocol = params.protocol === 'https' ? 'https' : 'http';
const res = await getSettingInfo();
const res = await getAgentSettingInfo();
if (!res.data.systemIP) {
open.value = true;
return;

View file

@ -1537,7 +1537,8 @@ const message = {
sessionTimeoutHelper:
'If you do not operate the panel for more than {0} seconds, the panel automatically logs out',
systemIP: 'Default access address',
systemIPHelper: 'Default access address for application and container redirection on this node',
systemIPHelper:
'Application redirects, container access and other functions will use this address for routing. Each node can be configured with a different address.',
proxy: 'Server Proxy',
proxyHelper: 'After setting up the proxy server, it will be effective in the following scenarios:',
proxyHelper1: 'Downloading and synchronizing installation packages from the app store (Professional)',
@ -1580,7 +1581,8 @@ const message = {
confDockerProxy: 'Configure Docker Proxy',
restartNowHelper: 'Configuring Docker proxy requires restarting the Docker service.',
restartNow: 'Restart immediately',
systemIPWarning: 'The server address is not currently set. Please set it in the control panel first!',
systemIPWarning:
'The current node has no default access address configured. Please go to panel settings to configure it!',
systemIPWarning1: 'The current server address is set to {0}, and quick redirection is not possible!',
syncTime: 'Server Time',
timeZone: 'Time Zone',
@ -2116,7 +2118,8 @@ const message = {
defaultWebDomain: 'Default Access Address',
defaultWebDomainHepler:
'If the application port is 8080, the redirect address will be http(s)://default access address:8080',
webUIConfig: 'Please add the access address in the application parameters or the app store settings',
webUIConfig:
'The current node has no default access address configured. Please set it in application parameters or go to panel settings to configure!',
toLink: 'Open',
customAppHelper:
'Before installing a custom app store package, please ensure that there are no installed apps.',

View file

@ -1478,7 +1478,8 @@ const message = {
sessionTimeoutError: '最小セッションタイムアウトは300秒です',
sessionTimeoutHelper: '{0}秒以上操作がない場合パネルは自動的にログアウトされます',
systemIP: 'デフォルトアクセスアドレス',
systemIPHelper: 'このノード上のアプリケーションとコンテナリダイレクト用のデフォルトアクセスアドレス',
systemIPHelper:
'アプリケーションリダイレクトコンテナアクセスなどの機能はこのアドレスを使用して転送されます各ノードで異なるアドレスを設定できます',
proxy: 'サーバープロキシ',
proxyHelper: 'プロキシサーバーを設定した後次のシナリオで効果的になります',
proxyHelper1:
@ -1516,7 +1517,8 @@ const message = {
confDockerProxy: 'Dockerプロキシを構成します',
restartNowHelper: 'Dockerプロキシの構成にはDockerサービスを再起動する必要があります',
restartNow: 'すぐに再起動します',
systemIPWarning: `サーバーアドレスは現在設定されていません。最初にコントロールパネルに設定します。`,
systemIPWarning:
'現在のノードにはデフォルトアクセスアドレスが設定されていませんパネル設定から設定してください',
systemIPWarning1: `現在のサーバーアドレスは{0}に設定されており、クイックリダイレクトは不可能です!`,
defaultNetwork: 'ネットワークカード',
syncTime: 'サーバー時間',
@ -2021,7 +2023,8 @@ const message = {
defaultWebDomain: 'デフォルトアクセスアドレス',
defaultWebDomainHepler:
'アプリケーションポートが8080の場合アドレスはhttp(s)://デフォルトアクセスアドレス:8080にジャンプします',
webUIConfig: 'アプリパラメータまたはアプリストア設定でアクセスアドレスを追加してください',
webUIConfig:
'現在のノードにはデフォルトアクセスアドレスが設定されていませんアプリケーションパラメータで設定するかパネル設定から設定してください',
toLink: 'ジャンプ',
customAppHelper:
'カスタムアプリストアパッケージをインストールする前にインストールされているアプリがないことを確認してください',

View file

@ -1462,7 +1462,8 @@ const message = {
sessionTimeoutError: '최소 세션 타임아웃은 300초입니다.',
sessionTimeoutHelper: '패널에서 {0} 이상 조작이 없을 경우 자동으로 로그아웃됩니다.',
systemIP: '기본 접근 주소',
systemIPHelper: ' 노드에서 애플리케이션 컨테이너 전환을 위한 기본 접근 주소',
systemIPHelper:
'애플리케이션 리다이렉트, 컨테이너 접근 등의 기능은 주소를 사용하여 라우팅됩니다. 노드마다 다른 주소를 설정할 있습니다.',
proxy: '서버 프록시',
proxyHelper: '프록시 서버를 설정한 다음 시나리오에서 적용됩니다:',
proxyHelper1: '설치 패키지 다운로드 스토어 동기화 (전문 버전에서만 제공)',
@ -1502,7 +1503,7 @@ const message = {
confDockerProxy: 'Docker 프록시 구성',
restartNowHelper: 'Docker 프록시 구성을 위해 Docker 서비스를 재시작해야 합니다.',
restartNow: '즉시 재시작',
systemIPWarning: '서버 주소가 현재 설정되지 않았습니다. 제어 패널에서 먼저 설정하십시오.',
systemIPWarning: '현재 노드에 기본 접근 주소가 설정되지 않았습니다. 패널 설정에서 설정해 주세요!',
systemIPWarning1: '현재 서버 주소는 {0}으로 설정되어 있어 빠른 리디렉션이 불가능합니다!',
defaultNetwork: '네트워크 카드',
syncTime: '서버 시간',
@ -1988,7 +1989,8 @@ const message = {
webUIPlaceholder: ': http://example.com:8080/login',
defaultWebDomain: '기본 접속 주소',
defaultWebDomainHepler: '애플리케이션 포트가 8080 경우 접속 주소는 http(s)://기본 접속 주소:8080입니다',
webUIConfig: '애플리케이션 매개변수 또는 스토어 설정에서 접속 주소를 추가하세요',
webUIConfig:
'현재 노드에 기본 접근 주소가 설정되지 않았습니다. 애플리케이션 매개변수에서 설정하거나 패널 설정으로 이동하여 설정하세요!',
toLink: '이동',
customAppHelper: '사용자 정의 스토어 패키지를 설치하기 전에 설치된 앱이 없는지 확인하십시오.',
forceUninstall: '강제 제거',

View file

@ -1523,7 +1523,8 @@ const message = {
sessionTimeoutError: 'Tempoh tamat sesi minimum ialah 300 saat',
sessionTimeoutHelper: 'Panel akan log keluar secara automatik jika tiada operasi lebih daripada {0} saat.',
systemIP: 'Alamat akses lalai',
systemIPHelper: 'Alamat akses lalai untuk aplikasi dan penghantaran semula kontena pada nod ini',
systemIPHelper:
'Penghantaran semula aplikasi, akses kontena dan fungsi lain akan menggunakan alamat ini untuk penghalaan. Setiap nod boleh ditetapkan dengan alamat yang berbeza.',
proxy: 'Proksi pelayan',
proxyHelper: 'Ia akan berkuat kuasa dalam senario berikut selepas anda menyediakan pelayan proksi:',
proxyHelper1: 'Muat turun pakej pemasangan dan penyelarasan dari kedai aplikasi (Edisi Profesional sahaja)',
@ -1566,7 +1567,8 @@ const message = {
confDockerProxy: 'Konfigurasi proksi docker',
restartNowHelper: 'Mengkonfigurasi proksi Docker memerlukan memulakan semula perkhidmatan Docker.',
restartNow: 'Mulakan semula sekarang',
systemIPWarning: 'Alamat pelayan belum ditetapkan. Tetapkan di panel kawalan terlebih dahulu.',
systemIPWarning:
'Nod semasa belum mempunyai alamat akses lalai yang dikonfigurasi. Sila pergi ke tetapan panel untuk mengkonfigurasinya!',
systemIPWarning1: 'Alamat pelayan semasa ditetapkan kepada {0}, dan pengalihan cepat tidak mungkin!',
defaultNetwork: 'Kad rangkaian',
syncTime: 'Waktu Pelayan',
@ -2074,7 +2076,8 @@ const message = {
defaultWebDomain: 'Alamat Akses Lalai',
defaultWebDomainHepler:
'Jika port aplikasi adalah 8080, alamat loncatan akan menjadi http(s)://alamat akses lalai:8080',
webUIConfig: 'Sila tambah alamat akses di parameter aplikasi atau tetapan kedai aplikasi',
webUIConfig:
'Nod semasa belum mempunyai alamat akses lalai yang dikonfigurasi. Sila tetapkan dalam parameter aplikasi atau pergi ke tetapan panel untuk mengkonfigurasinya!',
toLink: 'Loncat',
customAppHelper:
'Sebelum memasang pakej kedai aplikasi tersuai, sila pastikan tidak ada aplikasi yang dipasang.',

View file

@ -1508,7 +1508,8 @@ const message = {
sessionTimeoutError: 'O tempo mínimo de sessão é de 300 segundos',
sessionTimeoutHelper: 'O painel será desconectado automaticamente após {0} segundo(s) de inatividade.',
systemIP: 'Endereço de acesso padrão',
systemIPHelper: 'Endereço de acesso padrão para redirecionamento de aplicativos e containers neste ',
systemIPHelper:
'Redirecionamentos de aplicativos, acesso a containers e outras funcionalidades usarão este endereço para roteamento. Cada pode ser configurado com um endereço diferente.',
proxy: 'Proxy do servidor',
proxyHelper: 'Será eficaz nos seguintes cenários após configurar o servidor proxy:',
proxyHelper1:
@ -1549,7 +1550,7 @@ const message = {
restartNowHelper: 'Configurar o proxy do Docker exige reiniciar o serviço Docker.',
restartNow: 'Reiniciar imediatamente',
systemIPWarning:
'O endereço do servidor ainda não está configurado. Configure-o no painel de controle primeiro.',
'O atual não tem um endereço de acesso padrão configurado. Por favor, para as configurações do painel para configurá-lo!',
systemIPWarning1:
'O endereço atual do servidor está configurado como {0}, e o redirecionamento rápido não é possível!',
defaultNetwork: 'Placa de rede',
@ -2068,7 +2069,7 @@ const message = {
defaultWebDomain: 'Endereço de Acesso Padrão',
defaultWebDomainHepler: 'Se a porta do aplicativo for 8080, o endereço será http(s)://endereço padrão:8080',
webUIConfig:
'Adicione o endereço de acesso nos parâmetros do aplicativo ou nas configurações da loja de aplicativos',
'O atual não tem um endereço de acesso padrão configurado. Por favor, defina-o nos parâmetros do aplicativo ou para as configurações do painel para configurar!',
toLink: 'Ir para',
customAppHelper:
'Antes de instalar um pacote de loja de aplicativos personalizado, certifique-se de que não aplicativos instalados.',

View file

@ -1510,7 +1510,8 @@ const message = {
sessionTimeoutError: 'Минимальное время сессии 300 секунд',
sessionTimeoutHelper: 'Панель автоматически выйдет из системы, если не будет операций более {0} секунд.',
systemIP: 'Адрес доступа по умолчанию',
systemIPHelper: 'Адрес по умолчанию для доступа к приложениям и перенаправления контейнеров на этом узле',
systemIPHelper:
'Перенаправления приложений, доступ к контейнерам и другие функции будут использовать этот адрес для маршрутизации. Каждый узел можно настроить с разным адресом.',
proxy: 'Прокси',
proxyHelper: 'После настройки прокси-сервера он будет действовать в следующих сценариях:',
proxyHelper1:
@ -1554,7 +1555,8 @@ const message = {
confDockerProxy: 'Настроить прокси docker',
restartNowHelper: 'Настройка прокси Docker требует перезапуска службы Docker.',
restartNow: 'Перезапустить немедленно',
systemIPWarning: 'Адрес сервера в настоящее время не задан. Сначала установите его в панели управления.',
systemIPWarning:
'Текущий узел не имеет настроенного адреса доступа по умолчанию. Пожалуйста, перейдите в настройки панели для его настройки!',
systemIPWarning1: 'Текущий адрес сервера установлен на {0}, быстрое перенаправление невозможно!',
defaultNetwork: 'Сетевой интерфейс',
syncTime: 'Время сервера',
@ -2067,7 +2069,8 @@ const message = {
webUIPlaceholder: 'Например: http://example.com:8080/login',
defaultWebDomain: 'Адрес доступа по умолчанию',
defaultWebDomainHepler: 'Если порт приложения 8080, то адрес будет http(s)://адрес по умолчанию:8080',
webUIConfig: 'Добавьте адрес доступа в параметры приложения или настройки магазина приложений',
webUIConfig:
'Текущий узел не имеет настроенного адреса доступа по умолчанию. Пожалуйста, настройте его в параметрах приложения или перейдите в настройки панели!',
toLink: 'Перейти',
customAppHelper:
'Перед установкой пользовательского пакета из магазина приложений убедитесь, что нет установленных приложений.',

View file

@ -1457,7 +1457,7 @@ const message = {
sessionTimeoutError: '最小超時時間為 300 ',
sessionTimeoutHelper: '如果用戶超過 {0} 秒未操作面板面板將自動退出登錄',
systemIP: '預設存取地址',
systemIPHelper: '當前節點存取應用容器跳轉的預設存取地址',
systemIPHelper: '應用跳轉容器存取等功能將使用此地址進行路由每個節點可設定不同地址',
proxy: '代理伺服器',
proxyHelper: '設置代理伺服器後將在以下場景中生效',
proxyHelper1: '應用商店的安裝包下載和同步專業版功能',
@ -1495,7 +1495,7 @@ const message = {
confDockerProxy: '配寘 Docker 代理',
restartNowHelper: '配寘 Docker 代理需要重啓 Docker 服務',
restartNow: '立即重啓',
systemIPWarning: '當前未設置服務器地址請先在面板設置中設置',
systemIPWarning: '當前節點尚未配置預設存取地址請前往面板設定進行設定',
systemIPWarning1: '當前服務器地址設置為 {0}無法快速跳轉',
changePassword: '密碼修改',
oldPassword: '原密碼',
@ -1961,7 +1961,7 @@ const message = {
defaultWebDomain: '默認訪問地址',
defaultWebDomainHepler:
'默認訪問用於應用端口跳轉例如應用端口為 8080 則跳轉地址為 http(s)://默認訪問地址:8080',
webUIConfig: '請在應用參數或者應用商店設置處添加訪問地址',
webUIConfig: '當前節點尚未配置預設存取地址請在應用參數或者前往面板設定進行設定',
toLink: '連結',
customAppHelper: '在安裝自訂應用商店包之前請確保沒有任何已安裝的應用',
forceUninstall: '強制卸載',

View file

@ -1453,7 +1453,7 @@ const message = {
sessionTimeoutError: '最小超时时间为 300 ',
sessionTimeoutHelper: '如果用户超过 {0} 秒未操作面板面板将自动退出登录',
systemIP: '默认访问地址',
systemIPHelper: '当前节点访问应用容器跳转的默认访问地址',
systemIPHelper: '应用跳转容器访问等功能将使用此地址进行跳转每个节点可设置不同地址',
proxy: '代理服务器',
proxyHelper: '设置代理服务器后将在以下场景中生效',
proxyHelper1: '应用商店的安装包下载和同步专业版功能',
@ -1491,7 +1491,7 @@ const message = {
confDockerProxy: '配置 Docker 代理',
restartNowHelper: '配置 Docker 代理需要重启 Docker 服务',
restartNow: '立即重启',
systemIPWarning: '当前未设置服务器地址请先在面板设置中设置',
systemIPWarning: '当前节点尚未配置默认访问地址请前往面板设置进行设置',
systemIPWarning1: '当前服务器地址设置为 {0}无法快速跳转',
changePassword: '密码修改',
oldPassword: '原密码',
@ -1951,7 +1951,7 @@ const message = {
webUIPlaceholder: '例如http://example.com:8080/login',
defaultWebDomain: '默认访问地址',
defaultWebDomainHepler: '如果应用端口为 8080则跳转地址为 http(s)://默认访问地址:8080',
webUIConfig: '请在应用参数或者应用商店设置处添加访问地址',
webUIConfig: '当前节点尚未配置默认访问地址请在应用参数或者前往面板设置进行设置',
toLink: '跳转',
customAppHelper: '在使用自定义应用商店仓库之前请确保没有任何已安装的应用',
forceUninstall: '强制卸载',

View file

@ -133,6 +133,7 @@
</el-button>
</template>
</el-input>
<span class="input-help">{{ $t('setting.systemIPHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('setting.proxy')" prop="proxyShow" v-if="isMaster">

View file

@ -643,6 +643,8 @@ function load18n(label: string) {
case 'System':
case 'Website':
return i18n.global.t('menu.' + label.toLowerCase());
case 'Script':
return i18n.global.t('cronjob.library.library');
case 'Compose':
return i18n.global.t('container.compose');
case 'CustomAppstore':