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

feat: 移除多余代码

This commit is contained in:
ssongliu 2024-10-16 14:27:19 +08:00
parent 65da51a478
commit fcb8a9c860
25 changed files with 10 additions and 899 deletions

View File

@ -1,20 +0,0 @@
package dto
type CreateOrUpdateAlert struct {
AlertTitle string `json:"alertTitle"`
AlertType string `json:"alertType"`
AlertCount uint `json:"alertCount"`
EntryID uint `json:"entryID"`
}
type AlertBase struct {
AlertType string `json:"alertType"`
EntryID uint `json:"entryID"`
}
type PushAlert struct {
TaskName string `json:"taskName"`
AlertType string `json:"alertType"`
EntryID uint `json:"entryID"`
Param string `json:"param"`
}

View File

@ -33,7 +33,6 @@ type ClamInfo struct {
LastHandleDate string `json:"lastHandleDate"` LastHandleDate string `json:"lastHandleDate"`
Spec string `json:"spec"` Spec string `json:"spec"`
Description string `json:"description"` Description string `json:"description"`
AlertCount uint `json:"alertCount"`
} }
type ClamLogSearch struct { type ClamLogSearch struct {
@ -72,8 +71,6 @@ type ClamCreate struct {
InfectedDir string `json:"infectedDir"` InfectedDir string `json:"infectedDir"`
Spec string `json:"spec"` Spec string `json:"spec"`
Description string `json:"description"` Description string `json:"description"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
} }
type ClamUpdate struct { type ClamUpdate struct {

View File

@ -31,13 +31,10 @@ type CronjobCreate struct {
DefaultDownload string `json:"defaultDownload"` DefaultDownload string `json:"defaultDownload"`
RetainCopies int `json:"retainCopies" validate:"number,min=1"` RetainCopies int `json:"retainCopies" validate:"number,min=1"`
Secret string `json:"secret"` Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
} }
type CronjobUpdate struct { type CronjobUpdate struct {
ID uint `json:"id" validate:"required"` ID uint `json:"id" validate:"required"`
Type string `json:"type" validate:"required"`
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
Spec string `json:"spec" validate:"required"` Spec string `json:"spec" validate:"required"`
@ -56,8 +53,6 @@ type CronjobUpdate struct {
DefaultDownload string `json:"defaultDownload"` DefaultDownload string `json:"defaultDownload"`
RetainCopies int `json:"retainCopies" validate:"number,min=1"` RetainCopies int `json:"retainCopies" validate:"number,min=1"`
Secret string `json:"secret"` Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
AlertTitle string `json:"alertTitle"`
} }
type CronjobUpdateStatus struct { type CronjobUpdateStatus struct {
@ -104,7 +99,6 @@ type CronjobInfo struct {
LastRecordTime string `json:"lastRecordTime"` LastRecordTime string `json:"lastRecordTime"`
Status string `json:"status"` Status string `json:"status"`
Secret string `json:"secret"` Secret string `json:"secret"`
AlertCount uint `json:"alertCount"`
} }
type SearchRecord struct { type SearchRecord struct {

View File

@ -8,7 +8,6 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"sort" "sort"
"strconv"
"strings" "strings"
"time" "time"
@ -21,7 +20,6 @@ import (
"github.com/1Panel-dev/1Panel/backend/utils/common" "github.com/1Panel-dev/1Panel/backend/utils/common"
"github.com/1Panel-dev/1Panel/backend/utils/systemctl" "github.com/1Panel-dev/1Panel/backend/utils/systemctl"
"github.com/1Panel-dev/1Panel/backend/utils/xpack" "github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/1Panel-dev/1Panel/backend/xpack/utils/alert"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"github.com/robfig/cron/v3" "github.com/robfig/cron/v3"
@ -156,16 +154,6 @@ func (c *ClamService) SearchWithPage(req dto.SearchClamWithPage) (int64, interfa
} }
datas[i].LastHandleDate = t1.Format(constant.DateTimeLayout) datas[i].LastHandleDate = t1.Format(constant.DateTimeLayout)
} }
alertBase := dto.AlertBase{
AlertType: "clams",
EntryID: datas[i].ID,
}
alertCount := xpack.GetAlert(alertBase)
if alertCount != 0 {
datas[i].AlertCount = alertCount
} else {
datas[i].AlertCount = 0
}
} }
return total, datas, err return total, datas, err
} }
@ -192,19 +180,6 @@ func (c *ClamService) Create(req dto.ClamCreate) error {
if err := clamRepo.Create(&clam); err != nil { if err := clamRepo.Create(&clam); err != nil {
return err return err
} }
if req.AlertCount != 0 {
createAlert := dto.CreateOrUpdateAlert{
AlertTitle: req.AlertTitle,
AlertCount: req.AlertCount,
AlertType: "clams",
EntryID: clam.ID,
}
err := xpack.CreateAlert(createAlert)
if err != nil {
return err
}
}
return nil return nil
} }
@ -250,16 +225,6 @@ func (c *ClamService) Update(req dto.ClamUpdate) error {
if err := clamRepo.Update(req.ID, upMap); err != nil { if err := clamRepo.Update(req.ID, upMap); err != nil {
return err return err
} }
updateAlert := dto.CreateOrUpdateAlert{
AlertTitle: req.AlertTitle,
AlertType: "clams",
AlertCount: req.AlertCount,
EntryID: clam.ID,
}
err := xpack.UpdateAlert(updateAlert)
if err != nil {
return err
}
return nil return nil
} }
@ -300,14 +265,6 @@ func (c *ClamService) Delete(req dto.ClamDelete) error {
if err := clamRepo.Delete(commonRepo.WithByID(id)); err != nil { if err := clamRepo.Delete(commonRepo.WithByID(id)); err != nil {
return err return err
} }
alertBase := dto.AlertBase{
AlertType: "clams",
EntryID: clam.ID,
}
err := xpack.DeleteAlert(alertBase)
if err != nil {
return err
}
} }
return nil return nil
} }
@ -348,7 +305,6 @@ func (c *ClamService) HandleOnce(req dto.OperateByID) error {
} }
global.LOG.Debugf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile) global.LOG.Debugf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile)
stdout, err := cmd.Execf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile) stdout, err := cmd.Execf("clamdscan --fdpass %s %s -l %s", strategy, clam.Path, logFile)
handleAlert(stdout, clam.Name, clam.ID)
if err != nil { if err != nil {
global.LOG.Errorf("clamdscan failed, stdout: %v, err: %v", stdout, err) global.LOG.Errorf("clamdscan failed, stdout: %v, err: %v", stdout, err)
} }
@ -629,28 +585,3 @@ func (c *ClamService) loadLogPath(name string) string {
return "" return ""
} }
func handleAlert(stdout, clamName string, clamId uint) {
if strings.Contains(stdout, "- SCAN SUMMARY -") {
lines := strings.Split(stdout, "\n")
for _, line := range lines {
if strings.HasPrefix(line, "Infected files:") {
var infectedFiles = 0
infectedFiles, _ = strconv.Atoi(strings.TrimPrefix(line, "Infected files:"))
if infectedFiles > 0 {
pushAlert := dto.PushAlert{
TaskName: clamName,
AlertType: "clams",
EntryID: clamId,
Param: strconv.Itoa(infectedFiles),
}
err := alert.PushAlert(pushAlert)
if err != nil {
global.LOG.Errorf("clamdscan push failed, err: %v", err)
}
break
}
}
}
}
}

View File

@ -13,7 +13,6 @@ import (
"github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global" "github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/robfig/cron/v3" "github.com/robfig/cron/v3"
@ -54,16 +53,6 @@ func (u *CronjobService) SearchWithPage(search dto.PageCronjob) (int64, interfac
} else { } else {
item.LastRecordTime = "-" item.LastRecordTime = "-"
} }
alertBase := dto.AlertBase{
AlertType: cronjob.Type,
EntryID: cronjob.ID,
}
alertCount := xpack.GetAlert(alertBase)
if alertCount != 0 {
item.AlertCount = alertCount
} else {
item.AlertCount = 0
}
dtoCronjobs = append(dtoCronjobs, item) dtoCronjobs = append(dtoCronjobs, item)
} }
return total, dtoCronjobs, err return total, dtoCronjobs, err
@ -201,18 +190,6 @@ func (u *CronjobService) Create(cronjobDto dto.CronjobCreate) error {
if err := cronjobRepo.Create(&cronjob); err != nil { if err := cronjobRepo.Create(&cronjob); err != nil {
return err return err
} }
if cronjobDto.AlertCount != 0 {
createAlert := dto.CreateOrUpdateAlert{
AlertTitle: cronjobDto.AlertTitle,
AlertCount: cronjobDto.AlertCount,
AlertType: cronjob.Type,
EntryID: cronjob.ID,
}
err := xpack.CreateAlert(createAlert)
if err != nil {
return err
}
}
return nil return nil
} }
@ -255,14 +232,6 @@ func (u *CronjobService) Delete(req dto.CronjobBatchDelete) error {
if err := cronjobRepo.Delete(commonRepo.WithByID(id)); err != nil { if err := cronjobRepo.Delete(commonRepo.WithByID(id)); err != nil {
return err return err
} }
alertBase := dto.AlertBase{
AlertType: cronjob.Type,
EntryID: cronjob.ID,
}
err := xpack.DeleteAlert(alertBase)
if err != nil {
return err
}
} }
return nil return nil
@ -312,21 +281,7 @@ func (u *CronjobService) Update(id uint, req dto.CronjobUpdate) error {
upMap["default_download"] = req.DefaultDownload upMap["default_download"] = req.DefaultDownload
upMap["retain_copies"] = req.RetainCopies upMap["retain_copies"] = req.RetainCopies
upMap["secret"] = req.Secret upMap["secret"] = req.Secret
err = cronjobRepo.Update(id, upMap) return cronjobRepo.Update(id, upMap)
if err != nil {
return err
}
updateAlert := dto.CreateOrUpdateAlert{
AlertTitle: req.AlertTitle,
AlertType: cronModel.Type,
AlertCount: req.AlertCount,
EntryID: cronModel.ID,
}
err = xpack.UpdateAlert(updateAlert)
if err != nil {
return err
}
return nil
} }
func (u *CronjobService) UpdateStatus(id uint, status string) error { func (u *CronjobService) UpdateStatus(id uint, status string) error {
@ -338,7 +293,6 @@ func (u *CronjobService) UpdateStatus(id uint, status string) error {
entryIDs string entryIDs string
err error err error
) )
if status == constant.StatusEnable { if status == constant.StatusEnable {
entryIDs, err = u.StartJob(&cronjob, false) entryIDs, err = u.StartJob(&cronjob, false)
if err != nil { if err != nil {

View File

@ -12,7 +12,6 @@ import (
"github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/i18n" "github.com/1Panel-dev/1Panel/backend/i18n"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/app/repo" "github.com/1Panel-dev/1Panel/backend/app/repo"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
@ -21,12 +20,9 @@ import (
"github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/cmd"
"github.com/1Panel-dev/1Panel/backend/utils/files" "github.com/1Panel-dev/1Panel/backend/utils/files"
"github.com/1Panel-dev/1Panel/backend/utils/ntp" "github.com/1Panel-dev/1Panel/backend/utils/ntp"
"github.com/1Panel-dev/1Panel/backend/utils/xpack"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
var alertTypes = map[string]bool{"app": true, "website": true, "database": true, "directory": true, "log": true, "snapshot": true}
func (u *CronjobService) HandleJob(cronjob *model.Cronjob) { func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
var ( var (
message []byte message []byte
@ -94,7 +90,6 @@ func (u *CronjobService) HandleJob(cronjob *model.Cronjob) {
record.Records, _ = mkdirAndWriteFile(cronjob, record.StartTime, message) record.Records, _ = mkdirAndWriteFile(cronjob, record.StartTime, message)
} }
cronjobRepo.EndRecords(record, constant.StatusFailed, err.Error(), record.Records) cronjobRepo.EndRecords(record, constant.StatusFailed, err.Error(), record.Records)
handleCronJobAlert(cronjob)
return return
} }
if len(message) != 0 { if len(message) != 0 {
@ -396,19 +391,3 @@ func (u *CronjobService) generateLogsPath(cronjob model.Cronjob, startTime time.
func hasBackup(cronjobType string) bool { func hasBackup(cronjobType string) bool {
return cronjobType == "app" || cronjobType == "database" || cronjobType == "website" || cronjobType == "directory" || cronjobType == "snapshot" || cronjobType == "log" return cronjobType == "app" || cronjobType == "database" || cronjobType == "website" || cronjobType == "directory" || cronjobType == "snapshot" || cronjobType == "log"
} }
func handleCronJobAlert(cronjob *model.Cronjob) {
if alertTypes[cronjob.Type] {
pushAlert := dto.PushAlert{
TaskName: cronjob.Name,
AlertType: cronjob.Type,
EntryID: cronjob.ID,
Param: cronjob.Type,
}
err := xpack.PushAlert(pushAlert)
if err != nil {
global.LOG.Errorf("cronjob alert push failed, err: %v", err)
return
}
}
}

View File

@ -178,6 +178,8 @@ func handleUserInfo(tags string, settingRepo repo.ISettingRepo) {
if err := settingRepo.Update("SecurityEntrance", common.RandStrAndNum(10)); err != nil { if err := settingRepo.Update("SecurityEntrance", common.RandStrAndNum(10)); err != nil {
global.LOG.Fatalf("init entrance before start failed, err: %v", err) global.LOG.Fatalf("init entrance before start failed, err: %v", err)
} }
sudo := cmd.SudoHandleCmd()
_, _ = cmd.Execf("%s sed -i '/CHANGE_USER_INFO=%v/d' /usr/local/bin/1pctl", sudo, global.CONF.System.ChangeUserInfo)
return return
} }
if strings.Contains(global.CONF.System.ChangeUserInfo, "username") { if strings.Contains(global.CONF.System.ChangeUserInfo, "username") {

View File

@ -8,7 +8,6 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/app/model"
"github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/constant"
@ -40,23 +39,3 @@ func LoadXpuInfo() []interface{} {
func StartClam(startClam model.Clam, isUpdate bool) (int, error) { func StartClam(startClam model.Clam, isUpdate bool) (int, error) {
return 0, buserr.New(constant.ErrXpackNotFound) return 0, buserr.New(constant.ErrXpackNotFound)
} }
func CreateAlert(createAlert dto.CreateOrUpdateAlert) error {
return nil
}
func UpdateAlert(updateAlert dto.CreateOrUpdateAlert) error {
return nil
}
func DeleteAlert(alertBase dto.AlertBase) error {
return nil
}
func GetAlert(alertBase dto.AlertBase) uint {
return 0
}
func PushAlert(pushAlert dto.PushAlert) error {
return nil
}

View File

@ -2,7 +2,7 @@ system:
db_file: 1Panel.db db_file: 1Panel.db
base_dir: /opt base_dir: /opt
mode: dev mode: dev
repo_url: https://resource.fit2cloud.com/1panel/package repo_url: https://resource.fit2cloud.com/1panel/package/aliyun
app_repo: https://apps-assets.fit2cloud.com app_repo: https://apps-assets.fit2cloud.com
is_demo: false is_demo: false
port: 9999 port: 9999

View File

@ -30,9 +30,6 @@ export namespace Cronjob {
retainCopies: number; retainCopies: number;
status: string; status: string;
secret: string; secret: string;
hasAlert: boolean;
alertCount: number;
alertTitle: string;
} }
export interface CronjobCreate { export interface CronjobCreate {
name: string; name: string;

View File

@ -139,9 +139,6 @@ export namespace Toolbox {
spec: string; spec: string;
specObj: Cronjob.SpecObj; specObj: Cronjob.SpecObj;
description: string; description: string;
hasAlert: boolean;
alertCount: number;
alertTitle: string;
} }
export interface ClamCreate { export interface ClamCreate {
name: string; name: string;

View File

@ -1,119 +0,0 @@
<template>
<div>
<el-dialog class="level-up-pro" v-model="open" :close-on-click-modal="false" @close="handleClose">
<div style="text-align: center" v-loading="loading">
<span class="text-3xl font-medium title">{{ $t('license.levelUpPro') }}</span>
<el-row type="flex" justify="center" class="mt-6">
<el-col :span="22">
<el-upload
action="#"
:auto-upload="false"
ref="uploadRef"
class="upload-demo"
drag
:limit="1"
:on-change="fileOnChange"
:on-exceed="handleExceed"
v-model:file-list="uploaderFiles"
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">
{{ $t('license.importHelper') }}
</div>
</el-upload>
</el-col>
</el-row>
<el-button
type="primary"
class="mt-3 w-52"
:disabled="loading || uploaderFiles.length == 0"
plain
@click="submit"
>
{{ $t('license.power') }}
</el-button>
<div class="mt-3 mb-5">
<el-button text type="primary" @click="toHalo">{{ $t('license.knowMorePro') }}</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import i18n from '@/lang';
import { ref } from 'vue';
import { MsgSuccess } from '@/utils/message';
import { UploadFileData } from '@/api/modules/setting';
import { GlobalStore } from '@/store';
import { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadRawFile, genFileId } from 'element-plus';
import { useTheme } from '@/hooks/use-theme';
import { getXpackSetting } from '@/utils/xpack';
const globalStore = GlobalStore();
const { switchTheme } = useTheme();
const loading = ref(false);
const open = ref(false);
const uploadRef = ref<UploadInstance>();
const uploaderFiles = ref<UploadFiles>([]);
const handleClose = () => {
open.value = false;
uploadRef.value!.clearFiles();
};
const fileOnChange = (_uploadFile: UploadFile, uploadFiles: UploadFiles) => {
uploaderFiles.value = uploadFiles;
};
const handleExceed: UploadProps['onExceed'] = (files) => {
uploadRef.value!.clearFiles();
const file = files[0] as UploadRawFile;
file.uid = genFileId();
uploadRef.value!.handleStart(file);
};
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
const submit = async () => {
if (uploaderFiles.value.length !== 1) {
return;
}
const file = uploaderFiles.value[0];
const formData = new FormData();
formData.append('file', file.raw);
loading.value = true;
await UploadFileData(formData)
.then(async () => {
globalStore.isProductPro = true;
const xpackRes = await getXpackSetting();
if (xpackRes) {
globalStore.themeConfig.isGold = xpackRes.data.theme === 'dark-gold';
}
loading.value = false;
switchTheme();
uploadRef.value!.clearFiles();
uploaderFiles.value = [];
open.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
window.location.reload();
})
.catch(() => {
loading.value = false;
uploadRef.value!.clearFiles();
uploaderFiles.value = [];
});
};
const acceptParams = () => {
uploaderFiles.value = [];
uploadRef.value?.clearFiles();
open.value = true;
};
defineExpose({
acceptParams,
});
</script>

View File

@ -16,11 +16,6 @@
<el-divider v-if="!mobile" direction="vertical" /> <el-divider v-if="!mobile" direction="vertical" />
</div> </div>
<div class="flex flex-wrap"> <div class="flex flex-wrap">
<el-button type="primary" link @click="toHalo">
<span class="font-normal">
{{ isProductPro ? $t('license.pro') : $t('license.community') }}
</span>
</el-button>
<span class="version" @click="copyText(version)">{{ version }}</span> <span class="version" @click="copyText(version)">{{ version }}</span>
<el-badge is-dot style="margin-top: -3px" v-if="version !== 'Waiting' && globalStore.hasNewVersion"> <el-badge is-dot style="margin-top: -3px" v-if="version !== 'Waiting' && globalStore.hasNewVersion">
<el-button type="primary" link @click="onLoadUpgradeInfo"> <el-button type="primary" link @click="onLoadUpgradeInfo">
@ -126,10 +121,6 @@ const handleClose = () => {
drawerVisible.value = false; drawerVisible.value = false;
}; };
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
const toDoc = () => { const toDoc = () => {
window.open('https://1panel.cn/docs/', '_blank', 'noopener,noreferrer'); window.open('https://1panel.cn/docs/', '_blank', 'noopener,noreferrer');
}; };

View File

@ -1094,7 +1094,6 @@ const message = {
clam: { clam: {
clam: 'Virus Scan', clam: 'Virus Scan',
cron: 'Scheduled scan', cron: 'Scheduled scan',
cronHelper: 'Professional version supports scheduled scan feature',
specErr: 'Execution schedule format error, please check and retry!', specErr: 'Execution schedule format error, please check and retry!',
disableMsg: disableMsg:
'Stopping scheduled execution will prevent this scan task from running automatically. Do you want to continue?', 'Stopping scheduled execution will prevent this scan task from running automatically. Do you want to continue?',
@ -1655,49 +1654,6 @@ const message = {
compressPassword: 'Compression Password', compressPassword: 'Compression Password',
backupRecoverMessage: 'Please enter the compression or decompression password (leave blank to not set)', backupRecoverMessage: 'Please enter the compression or decompression password (leave blank to not set)',
}, },
license: {
community: 'Community Edition: ',
community2: 'Community Edition',
pro: 'Professional Edition: ',
trial: 'Trial Edition',
office: 'Official Edition',
trialInfo: 'Version',
authorizationId: 'Subscription Authorization ID',
authorizedUser: 'Authorized User',
expiresAt: 'Expiry Date',
productName: 'Product Name',
productStatus: 'Product Status',
Lost01: 'Lost * 1',
Lost02: 'Lost * 2',
Lost03: 'Lost',
Enable: 'Enabled',
Disable: 'Disabled',
lostHelper:
'The License needs to be periodically synchronized for availability. Please ensure normal external network access. After three losses of connection, the License binding will be released.',
quickUpdate: 'Quick Update',
import: 'Import',
power: 'Authorize',
unbind: 'Unbind License',
unbindHelper: 'All Pro related Settings will be cleared after unbinding. Do you want to continue? ',
importLicense: 'Import License',
importHelper: 'Please click or drag the license file here',
technicalAdvice: 'Technical Advice',
advice: 'Consultation',
indefinitePeriod: 'Indefinite Period',
levelUpPro: 'Upgrade to Professional Edition',
licenseSync: 'License Sync',
knowMorePro: 'Learn More',
closeAlert: 'The current page can be closed in the panel settings',
introduce: 'Feature Introduction',
waf: 'Upgrading to the professional version can provide features such as interception map, logs, block records, geographical location blocking, custom rules, custom interception pages, etc.',
tamper: 'Upgrading to the professional version can protect websites from unauthorized modifications or tampering.',
gpu: 'Upgrading to the professional version can help users visually monitor important parameters of GPU such as workload, temperature, memory usage in real time.',
setting:
'Upgrading to the professional version allows customization of panel logo, welcome message, and other information.',
monitor:
'Upgrade to the professional version to view the real-time status of the website, visitor trends, visitor sources, request logs and other information. ',
alert: 'Upgrade to the professional version to receive alarm information via SMS and view alarm logs, fully control various key events, and ensure worry-free system operation',
},
clean: { clean: {
scan: 'Start Scanning', scan: 'Start Scanning',
scanHelper: 'Easily tidy up junk files accumulated during 1Panel runtime', scanHelper: 'Easily tidy up junk files accumulated during 1Panel runtime',

View File

@ -1034,7 +1034,6 @@ const message = {
clam: { clam: {
clam: '病毒掃描', clam: '病毒掃描',
cron: '定時掃描', cron: '定時掃描',
cronHelper: '專業版支持定時掃描功能',
specErr: '執行周期格式錯誤請檢查後重試', specErr: '執行周期格式錯誤請檢查後重試',
disableMsg: '停止定時執行會導致該掃描任務不再自動執行是否繼續', disableMsg: '停止定時執行會導致該掃描任務不再自動執行是否繼續',
enableMsg: '啟用定時執行會讓該掃描任務定期自動執行是否繼續', enableMsg: '啟用定時執行會讓該掃描任務定期自動執行是否繼續',
@ -1308,8 +1307,8 @@ const message = {
systemIP: '伺服器地址', systemIP: '伺服器地址',
proxy: '代理伺服器', proxy: '代理伺服器',
proxyHelper: '設置代理伺服器後將在以下場景中生效', proxyHelper: '設置代理伺服器後將在以下場景中生效',
proxyHelper1: '應用商店的安裝包下載和同步專業版功能', proxyHelper1: '應用商店的安裝包下載和同步',
proxyHelper2: '系統版本升級及獲取更新說明專業版功能', proxyHelper2: '系統版本升級及獲取更新說明',
proxyHelper3: '系統許可證的驗證和同步', proxyHelper3: '系統許可證的驗證和同步',
proxyType: '代理類型', proxyType: '代理類型',
proxyUrl: '代理地址', proxyUrl: '代理地址',
@ -1538,46 +1537,6 @@ const message = {
compressPassword: '壓縮密碼', compressPassword: '壓縮密碼',
backupRecoverMessage: '請輸入壓縮或解壓縮密碼留空則不設定', backupRecoverMessage: '請輸入壓縮或解壓縮密碼留空則不設定',
}, },
license: {
community: '社區版',
community2: '社區版',
pro: '專業版',
trial: '試用版',
office: '正式版',
trialInfo: '版本',
authorizationId: '訂閱授權 ID',
authorizedUser: '被授權方',
expiresAt: '到期時間',
productName: '產品名稱',
productStatus: '產品狀態',
Lost01: '失聯 * 1',
Lost02: '失聯 * 2',
Lost03: '已失聯',
Enable: '已啟用',
Disable: '未啟用',
lostHelper: '許可證需要定時同步是否可用請保證正常外網訪問失聯三次後將解除許可證綁定',
quickUpdate: '快速更新',
import: '導入',
power: ' ',
unbind: '解除綁定',
unbindHelper: '解除綁定後將清除所有專業版相關設置是否繼續',
importLicense: '導入許可證',
importHelper: '請點擊或拖動許可文件到此處',
technicalAdvice: '技術諮詢',
advice: '諮詢',
indefinitePeriod: '無限期',
levelUpPro: '升級專業版',
licenseSync: '許可證同步',
knowMorePro: '了解更多',
closeAlert: '當前頁面可在面板設置中關閉顯示',
introduce: '功能介紹',
waf: '升級專業版可以獲得攔截地圖日誌封鎖記錄地理位置封禁自定義規則自定義攔截頁面等功能',
tamper: '升級專業版可以保護網站免受未經授權的修改或篡改',
gpu: '升級專業版可以幫助用戶實時直觀查看到 GPU 的工作負載溫度顯存等重要參數',
setting: '升級專業版可以自定義面板 Logo歡迎簡介等信息',
monitor: '升級專業版可以查看網站的即時狀態訪客趨勢訪客來源請求日誌等資訊 ',
alert: '陞級專業版可通過簡訊接收告警資訊並查看告警日誌全面掌控各類關鍵事件確保系統運行無憂',
},
clean: { clean: {
scan: '開始掃描', scan: '開始掃描',
scanHelper: '輕鬆梳理 1Panel 運行期間積累的垃圾文件', scanHelper: '輕鬆梳理 1Panel 運行期間積累的垃圾文件',

View File

@ -1035,7 +1035,6 @@ const message = {
clam: { clam: {
clam: '病毒扫描', clam: '病毒扫描',
cron: '定时扫描', cron: '定时扫描',
cronHelper: '专业版支持定时扫描功能 ',
specErr: '执行周期格式错误请检查后重试', specErr: '执行周期格式错误请检查后重试',
disableMsg: '停止定时执行会导致该扫描任务不再自动执行是否继续', disableMsg: '停止定时执行会导致该扫描任务不再自动执行是否继续',
enableMsg: '启用定时执行会让该扫描任务定期自动执行是否继续', enableMsg: '启用定时执行会让该扫描任务定期自动执行是否继续',
@ -1310,8 +1309,8 @@ const message = {
systemIP: '服务器地址', systemIP: '服务器地址',
proxy: '代理服务器', proxy: '代理服务器',
proxyHelper: '设置代理服务器后将在以下场景中生效', proxyHelper: '设置代理服务器后将在以下场景中生效',
proxyHelper1: '应用商店的安装包下载和同步专业版功能', proxyHelper1: '应用商店的安装包下载和同步',
proxyHelper2: '系统版本升级及获取更新说明专业版功能', proxyHelper2: '系统版本升级及获取更新说明',
proxyHelper3: '系统许可证的验证和同步', proxyHelper3: '系统许可证的验证和同步',
proxyType: '代理类型', proxyType: '代理类型',
proxyUrl: '代理地址', proxyUrl: '代理地址',
@ -1540,46 +1539,6 @@ const message = {
compressPassword: '压缩密码', compressPassword: '压缩密码',
backupRecoverMessage: '请输入压缩或解压缩密码留空则不设置', backupRecoverMessage: '请输入压缩或解压缩密码留空则不设置',
}, },
license: {
community: '社区版',
community2: '社区版',
pro: '专业版',
trial: '试用版',
office: '正式版',
trialInfo: '版本',
authorizationId: '订阅授权 ID',
authorizedUser: '被授权方',
expiresAt: '到期时间',
productName: '产品名称',
productStatus: '产品状态',
Lost01: '失联 * 1',
Lost02: '失联 * 2',
Lost03: '已失联',
Enable: '已激活',
Disable: '未激活',
lostHelper: '许可证需要定时同步是否可用请保证正常外网访问失联三次后将解除许可证绑定',
quickUpdate: '快速更新',
import: '导入',
power: ' ',
unbind: '解除绑定',
unbindHelper: '解除绑定后将清除所有专业版相关设置是否继续',
importLicense: '导入许可证',
importHelper: '请点击或拖动许可文件到此处',
technicalAdvice: '技术咨询',
advice: '咨询',
indefinitePeriod: '无限期',
levelUpPro: '升级专业版',
licenseSync: '许可证同步',
knowMorePro: '了解更多',
closeAlert: '当前页面可在面板设置中关闭显示',
introduce: '功能介绍',
waf: '升级专业版可以获得拦截地图日志封锁记录地理位置封禁自定义规则自定义拦截页面等功能',
tamper: '升级专业版可以保护网站免受未经授权的修改或篡改',
gpu: '升级专业版可以帮助用户实时直观查看到 GPU 的工作负载温度显存等重要参数',
setting: '升级专业版可以自定义面板 Logo欢迎简介等信息',
monitor: '升级专业版可以查看网站的实时状态访客趋势访客来源请求日志等信息',
alert: '升级专业版可通过短信接收告警信息并查看告警日志全面掌控各类关键事件确保系统运行无忧',
},
clean: { clean: {
scan: '开始扫描', scan: '开始扫描',
scanHelper: '轻松梳理 1Panel 运行期间积累的垃圾文件', scanHelper: '轻松梳理 1Panel 运行期间积累的垃圾文件',

View File

@ -37,16 +37,6 @@ const settingRouter = {
activeMenu: 'Setting', activeMenu: 'Setting',
}, },
}, },
{
path: 'license',
name: 'License',
component: () => import('@/views/setting/license/index.vue'),
hidden: true,
meta: {
requiresAuth: true,
activeMenu: 'Setting',
},
},
{ {
path: 'about', path: 'about',
name: 'About', name: 'About',

View File

@ -23,8 +23,3 @@ body,
.el-switch--small,.is-checked .el-switch__core::after { .el-switch--small,.is-checked .el-switch__core::after {
margin-left: 12px !important; margin-left: 12px !important;
} }
.el-alert__title {
display: flex;
align-items: center;
}

View File

@ -336,31 +336,6 @@
<el-input clearable v-model.trim="dialogData.rowData!.url" /> <el-input clearable v-model.trim="dialogData.rowData!.url" />
</el-form-item> </el-form-item>
<el-form-item prop="hasAlert" v-if="alertTypes.includes(dialogData.rowData!.type)">
<el-checkbox v-model="dialogData.rowData!.hasAlert" :label="$t('alert.isAlert')" />
<span class="input-help">{{ $t('alert.cronJobHelper') }}</span>
</el-form-item>
<el-form-item
prop="alertCount"
v-if="dialogData.rowData!.hasAlert && isProductPro"
:label="$t('alert.alertCount')"
>
<el-input-number
style="width: 200px"
:min="1"
step-strictly
:step="1"
v-model.number="dialogData.rowData!.alertCount"
></el-input-number>
<span class="input-help">{{ $t('alert.alertCountHelper') }}</span>
</el-form-item>
<el-form-item v-if="dialogData.rowData!.hasAlert && !isProductPro">
<span>{{ $t('alert.licenseHelper') }}</span>
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</el-form-item>
<el-form-item <el-form-item
v-if="hasExclusionRules()" v-if="hasExclusionRules()"
:label="$t('cronjob.exclusionRules')" :label="$t('cronjob.exclusionRules')"
@ -386,7 +361,6 @@
</el-button> </el-button>
</span> </span>
</template> </template>
<LicenseImport ref="licenseRef" />
</el-drawer> </el-drawer>
</template> </template>
@ -408,9 +382,6 @@ import { listContainer } from '@/api/modules/container';
import { Database } from '@/api/interface/database'; import { Database } from '@/api/interface/database';
import { ListAppInstalled } from '@/api/modules/app'; import { ListAppInstalled } from '@/api/modules/app';
import { loadDefaultSpec, specOptions, transObjToSpec, transSpecToObj, weekOptions } from './../helper'; import { loadDefaultSpec, specOptions, transObjToSpec, transSpecToObj, weekOptions } from './../helper';
import { storeToRefs } from 'pinia';
import { GlobalStore } from '@/store';
import LicenseImport from '@/components/license-import/index.vue';
const router = useRouter(); const router = useRouter();
@ -426,11 +397,6 @@ const dialogData = ref<DialogProps>({
title: '', title: '',
}); });
const globalStore = GlobalStore();
const licenseRef = ref();
const { isProductPro } = storeToRefs(globalStore);
const alertTypes = ['app', 'website', 'database', 'directory', 'log', 'snapshot'];
const acceptParams = (params: DialogProps): void => { const acceptParams = (params: DialogProps): void => {
dialogData.value = params; dialogData.value = params;
if (dialogData.value.rowData?.spec) { if (dialogData.value.rowData?.spec) {
@ -457,8 +423,6 @@ const acceptParams = (params: DialogProps): void => {
if (dialogData.value.rowData.dbName) { if (dialogData.value.rowData.dbName) {
dialogData.value.rowData.dbNameList = dialogData.value.rowData.dbName.split(','); dialogData.value.rowData.dbNameList = dialogData.value.rowData.dbName.split(',');
} }
dialogData.value.rowData.hasAlert = dialogData.value.rowData!.alertCount > 0;
dialogData.value.rowData!.alertCount = dialogData.value.rowData!.alertCount || 3;
dialogData.value.rowData!.command = dialogData.value.rowData!.command || 'sh'; dialogData.value.rowData!.command = dialogData.value.rowData!.command || 'sh';
dialogData.value.rowData!.isCustom = dialogData.value.rowData!.isCustom =
dialogData.value.rowData!.command !== 'sh' && dialogData.value.rowData!.command !== 'sh' &&
@ -596,18 +560,6 @@ const verifySpec = (rule: any, value: any, callback: any) => {
callback(); callback();
}; };
function checkSendCount(rule: any, value: any, callback: any) {
if (value === '') {
callback();
}
const regex = /^(?:[1-9]|[12][0-9]|30)$/;
if (!regex.test(value)) {
return callback(new Error(i18n.global.t('commons.rule.numberRange', [1, 30])));
}
callback();
}
const rules = reactive({ const rules = reactive({
name: [Rules.requiredInput, Rules.noSpace], name: [Rules.requiredInput, Rules.noSpace],
type: [Rules.requiredSelect], type: [Rules.requiredSelect],
@ -626,7 +578,6 @@ const rules = reactive({
backupAccounts: [Rules.requiredSelect], backupAccounts: [Rules.requiredSelect],
defaultDownload: [Rules.requiredSelect], defaultDownload: [Rules.requiredSelect],
retainCopies: [Rules.number], retainCopies: [Rules.number],
alertCount: [Rules.integerNumber, { validator: checkSendCount, trigger: 'blur' }],
}); });
type FormInstance = InstanceType<typeof ElForm>; type FormInstance = InstanceType<typeof ElForm>;
@ -805,17 +756,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
if (dialogData.value?.rowData?.exclusionRules) { if (dialogData.value?.rowData?.exclusionRules) {
dialogData.value.rowData.exclusionRules = dialogData.value.rowData.exclusionRules.replaceAll('\n', ','); dialogData.value.rowData.exclusionRules = dialogData.value.rowData.exclusionRules.replaceAll('\n', ',');
} }
if (alertTypes.includes(dialogData.value.rowData.type)) {
dialogData.value.rowData.alertCount =
dialogData.value.rowData!.hasAlert && isProductPro.value ? dialogData.value.rowData.alertCount : 0;
dialogData.value.rowData.alertTitle =
dialogData.value.rowData!.hasAlert && isProductPro.value
? i18n.global.t('cronjob.alertTitle', [
i18n.global.t('cronjob.' + dialogData.value.rowData.type),
dialogData.value.rowData.name,
])
: '';
}
if (!dialogData.value.rowData) return; if (!dialogData.value.rowData) return;
if (dialogData.value.title === 'create') { if (dialogData.value.title === 'create') {
await addCronjob(dialogData.value.rowData); await addCronjob(dialogData.value.rowData);
@ -830,10 +770,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
}); });
}; };
const toUpload = () => {
licenseRef.value.acceptParams();
};
defineExpose({ defineExpose({
acceptParams, acceptParams,
}); });

View File

@ -7,17 +7,7 @@
path: '/', path: '/',
}, },
]" ]"
> />
<template #route-button>
<div class="router-button">
<template v-if="!isProductPro">
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</template>
</div>
</template>
</RouterButton>
<el-alert <el-alert
v-if="!isSafety && globalStore.showEntranceWarn" v-if="!isSafety && globalStore.showEntranceWarn"
@ -259,8 +249,6 @@
</CardWithHeader> </CardWithHeader>
</el-col> </el-col>
</el-row> </el-row>
<LicenseImport ref="licenseRef" />
</div> </div>
</template> </template>
@ -269,7 +257,6 @@ import { onMounted, onBeforeUnmount, ref, reactive } from 'vue';
import Status from '@/views/home/status/index.vue'; import Status from '@/views/home/status/index.vue';
import App from '@/views/home/app/index.vue'; import App from '@/views/home/app/index.vue';
import VCharts from '@/components/v-charts/index.vue'; import VCharts from '@/components/v-charts/index.vue';
import LicenseImport from '@/components/license-import/index.vue';
import CardWithHeader from '@/components/card-with-header/index.vue'; import CardWithHeader from '@/components/card-with-header/index.vue';
import i18n from '@/lang'; import i18n from '@/lang';
import { Dashboard } from '@/api/interface/dashboard'; import { Dashboard } from '@/api/interface/dashboard';
@ -303,9 +290,6 @@ const timeNetDatas = ref<Array<string>>([]);
const ioOptions = ref(); const ioOptions = ref();
const netOptions = ref(); const netOptions = ref();
const licenseRef = ref();
const isProductPro = ref();
const searchInfo = reactive({ const searchInfo = reactive({
ioOption: 'all', ioOption: 'all',
netOption: 'all', netOption: 'all',
@ -659,12 +643,7 @@ const onBlur = () => {
isActive.value = false; isActive.value = false;
}; };
const toUpload = () => {
licenseRef.value.acceptParams();
};
onMounted(() => { onMounted(() => {
isProductPro.value = globalStore.isProductPro;
window.addEventListener('focus', onFocus); window.addEventListener('focus', onFocus);
window.addEventListener('blur', onBlur); window.addEventListener('blur', onBlur);
loadSafeStatus(); loadSafeStatus();

View File

@ -27,10 +27,6 @@ const buttons = [
label: i18n.global.t('setting.snapshot'), label: i18n.global.t('setting.snapshot'),
path: '/settings/snapshot', path: '/settings/snapshot',
}, },
{
label: i18n.global.t('setting.license'),
path: '/settings/license',
},
{ {
label: i18n.global.t('setting.about'), label: i18n.global.t('setting.about'),
path: '/settings/about', path: '/settings/about',

View File

@ -1,261 +0,0 @@
<template>
<div>
<LayoutContent v-loading="loading" :title="$t('setting.license')" :divider="true">
<template #main>
<el-row :gutter="20" class="mt-5; mb-10">
<el-col :xs="24" :sm="24" :md="15" :lg="15" :xl="15">
<div class="descriptions" v-if="hasLicense">
<el-descriptions :column="1" direction="horizontal" size="large" border>
<el-descriptions-item :label="$t('license.authorizationId')">
{{ license.licenseName || '-' }}
<el-button
type="primary"
class="ml-3"
plain
@click="onSync"
size="small"
v-if="showSync()"
>
{{ $t('commons.button.sync') }}
</el-button>
<el-button
v-if="!license.offline"
type="primary"
class="ml-3"
plain
@click="onUnBind()"
size="small"
>
{{ $t('license.unbind') }}
</el-button>
</el-descriptions-item>
<el-descriptions-item :label="$t('license.authorizedUser')">
{{ license.assigneeName || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.productName')">
{{ license.productName || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.trialInfo')">
{{ license.trial ? $t('license.trial') : $t('license.office') }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.expiresAt')">
{{ license.expiresAt || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="$t('license.productStatus')">
<div v-if="license.status">
<el-tooltip
v-if="license.status.indexOf('Lost') !== -1"
:content="$t('license.lostHelper')"
>
<el-tag type="info">
{{ $t('license.' + license.status) }}
</el-tag>
</el-tooltip>
<el-tag v-else>{{ $t('license.' + license.status) }}</el-tag>
</div>
<span v-else>-</span>
</el-descriptions-item>
<el-descriptions-item class="descriptions" :label="$t('commons.table.message')">
{{ license.message }}
</el-descriptions-item>
</el-descriptions>
</div>
<CardWithHeader :header="$t('home.overview')" height="160px" v-if="!hasLicense">
<template #body>
<div class="h-app-card">
<el-row>
<el-col :span="6">
<span>{{ $t('setting.license') }}</span>
</el-col>
<el-col :span="6">
<span>{{ $t('license.community2') }}</span>
</el-col>
</el-row>
</div>
</template>
</CardWithHeader>
</el-col>
<el-col :xs="24" :sm="24" :md="9" :lg="9" :xl="9">
<CardWithHeader :header="$t('license.quickUpdate')" height="160px">
<template #body>
<div class="h-app-card">
<el-row>
<el-col :span="15">
<div class="h-app-content">{{ $t('license.importLicense') }}</div>
</el-col>
<el-col :span="5">
<el-button type="primary" plain round size="small" @click="toUpload">
{{ $t('license.import') }}
</el-button>
</el-col>
</el-row>
</div>
<div class="h-app-card">
<el-row>
<el-col :span="15">
<div class="h-app-content">{{ $t('license.technicalAdvice') }}</div>
</el-col>
<el-col :span="5">
<el-button type="primary" plain round size="small" @click="toHalo()">
{{ $t('license.advice') }}
</el-button>
</el-col>
</el-row>
</div>
</template>
</CardWithHeader>
</el-col>
</el-row>
</template>
</LayoutContent>
<LicenseImport ref="licenseRef" />
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue';
import { getLicense, syncLicense, unbindLicense } from '@/api/modules/setting';
import CardWithHeader from '@/components/card-with-header/index.vue';
import LicenseImport from '@/components/license-import/index.vue';
import i18n from '@/lang';
import { MsgSuccess } from '@/utils/message';
import { GlobalStore } from '@/store';
const loading = ref();
const licenseRef = ref();
const globalStore = GlobalStore();
const hasLicense = ref();
const license = reactive({
licenseName: '',
trial: true,
offline: true,
expiresAt: '',
assigneeName: '',
productName: '',
status: '',
message: '',
});
const toHalo = () => {
window.open('https://www.lxware.cn/1panel' + '', '_blank', 'noopener,noreferrer');
};
const onSync = async () => {
loading.value = true;
await syncLicense()
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
window.location.reload();
})
.catch(() => {
loading.value = false;
});
};
const onUnBind = async () => {
ElMessageBox.confirm(i18n.global.t('license.unbindHelper'), i18n.global.t('license.unbind'), {
confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info',
}).then(async () => {
loading.value = true;
await unbindLicense()
.then(() => {
loading.value = false;
globalStore.isProductPro = false;
globalStore.themeConfig.isGold = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
window.location.reload();
})
.catch(() => {
loading.value = false;
});
});
};
const timestampToDate = (timestamp: number) => {
const date = new Date(timestamp * 1000);
const y = date.getFullYear();
let m: string | number = date.getMonth() + 1;
m = m < 10 ? `0${String(m)}` : m;
let d: string | number = date.getDate();
d = d < 10 ? `0${String(d)}` : d;
let h: string | number = date.getHours();
h = h < 10 ? `0${String(h)}` : h;
let minute: string | number = date.getMinutes();
minute = minute < 10 ? `0${String(minute)}` : minute;
let second: string | number = date.getSeconds();
second = second < 10 ? `0${String(second)}` : second;
return `${y}-${m}-${d} ${h}:${minute}:${second}`;
};
const search = async () => {
loading.value = true;
await getLicense()
.then((res) => {
loading.value = false;
license.status = res.data.status;
globalStore.isProductPro =
res.data.status === 'Enable' || res.data.status === 'Lost01' || res.data.status === 'Lost02';
if (res.data.status === '') {
hasLicense.value = false;
return;
}
hasLicense.value = true;
if (globalStore.isProductPro) {
globalStore.productProExpires = Number(res.data.productPro);
globalStore.isTrial = res.data.trial;
}
license.licenseName = res.data.licenseName;
license.message = res.data.message;
license.assigneeName = res.data.assigneeName;
license.trial = res.data.trial;
license.offline = res.data.offline;
if (res.data.productPro) {
license.productName = 'product-1panel-pro';
license.expiresAt =
res.data.productPro === '0'
? i18n.global.t('license.indefinitePeriod')
: timestampToDate(Number(res.data.productPro));
}
})
.catch(() => {
loading.value = false;
});
};
const showSync = () => {
return (license.status.indexOf('Lost') !== -1 || license.status === 'Disable') && !license.offline;
};
const toUpload = () => {
licenseRef.value.acceptParams();
};
onMounted(() => {
search();
});
</script>
<style scoped lang="scss">
.h-app-card {
padding: 10px 15px;
margin-right: 10px;
line-height: 18px;
&:hover {
background-color: rgba(0, 94, 235, 0.03);
}
}
:deep(.el-descriptions__content) {
max-width: 300px;
}
.descriptions {
word-break: break-all;
word-wrap: break-word;
}
</style>

View File

@ -126,21 +126,6 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('setting.developerMode')" prop="developerMode">
<el-radio-group
@change="onSave('DeveloperMode', form.developerMode)"
v-model="form.developerMode"
>
<el-radio-button value="enable">
<span>{{ $t('commons.button.enable') }}</span>
</el-radio-button>
<el-radio-button value="disable">
<span>{{ $t('commons.button.disable') }}</span>
</el-radio-button>
</el-radio-group>
<span class="input-help">{{ $t('setting.developerModeHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('setting.advancedMenuHide')"> <el-form-item :label="$t('setting.advancedMenuHide')">
<el-input disabled v-model="form.proHideMenus"> <el-input disabled v-model="form.proHideMenus">
<template #append> <template #append>
@ -266,7 +251,6 @@ const search = async () => {
form.defaultNetworkVal = res.data.defaultNetwork === 'all' ? i18n.t('commons.table.all') : res.data.defaultNetwork; form.defaultNetworkVal = res.data.defaultNetwork === 'all' ? i18n.t('commons.table.all') : res.data.defaultNetwork;
form.proHideMenus = res.data.xpackHideMenu; form.proHideMenus = res.data.xpackHideMenu;
form.hideMenuList = res.data.xpackHideMenu; form.hideMenuList = res.data.xpackHideMenu;
form.developerMode = res.data.developerMode;
form.proxyUrl = res.data.proxyUrl; form.proxyUrl = res.data.proxyUrl;
form.proxyType = res.data.proxyType; form.proxyType = res.data.proxyType;

View File

@ -19,7 +19,6 @@
<ul style="margin-left: -20px"> <ul style="margin-left: -20px">
<li v-if="isProductPro">{{ $t('setting.proxyHelper1') }}</li> <li v-if="isProductPro">{{ $t('setting.proxyHelper1') }}</li>
<li v-if="isProductPro">{{ $t('setting.proxyHelper2') }}</li> <li v-if="isProductPro">{{ $t('setting.proxyHelper2') }}</li>
<li>{{ $t('setting.proxyHelper3') }}</li>
</ul> </ul>
</template> </template>
</el-alert> </el-alert>

View File

@ -53,12 +53,6 @@
<el-form-item prop="hasSpec"> <el-form-item prop="hasSpec">
<el-checkbox v-model="dialogData.rowData!.hasSpec" :label="$t('toolbox.clam.cron')" /> <el-checkbox v-model="dialogData.rowData!.hasSpec" :label="$t('toolbox.clam.cron')" />
</el-form-item> </el-form-item>
<el-form-item v-if="dialogData.rowData!.hasSpec && !isProductPro">
<span>{{ $t('toolbox.clam.cronHelper') }}</span>
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</el-form-item>
<el-form-item prop="spec" v-if="dialogData.rowData!.hasSpec && isProductPro"> <el-form-item prop="spec" v-if="dialogData.rowData!.hasSpec && isProductPro">
<el-select <el-select
class="specTypeClass" class="specTypeClass"
@ -121,30 +115,6 @@
</template> </template>
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item prop="hasAlert">
<el-checkbox v-model="dialogData.rowData!.hasAlert" :label="$t('alert.isAlert')" />
<span class="input-help">{{ $t('alert.clamHelper') }}</span>
</el-form-item>
<el-form-item v-if="dialogData.rowData!.hasAlert && !isProductPro">
<span>{{ $t('toolbox.clam.alertHelper') }}</span>
<el-button link type="primary" @click="toUpload">
{{ $t('license.levelUpPro') }}
</el-button>
</el-form-item>
<el-form-item
prop="alertCount"
v-if="dialogData.rowData!.hasAlert && isProductPro"
:label="$t('alert.alertCount')"
>
<el-input-number
style="width: 200px"
:min="1"
step-strictly
:step="1"
v-model.number="dialogData.rowData!.alertCount"
></el-input-number>
<span class="input-help">{{ $t('alert.alertCountHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description"> <el-form-item :label="$t('commons.table.description')" prop="description">
<el-input type="textarea" :rows="3" clearable v-model="dialogData.rowData!.description" /> <el-input type="textarea" :rows="3" clearable v-model="dialogData.rowData!.description" />
</el-form-item> </el-form-item>
@ -159,7 +129,6 @@
</el-button> </el-button>
</span> </span>
</template> </template>
<LicenseImport ref="licenseRef" />
</el-drawer> </el-drawer>
</template> </template>
@ -169,7 +138,6 @@ import { Rules } from '@/global/form-rules';
import FileList from '@/components/file-list/index.vue'; import FileList from '@/components/file-list/index.vue';
import i18n from '@/lang'; import i18n from '@/lang';
import { ElForm } from 'element-plus'; import { ElForm } from 'element-plus';
import LicenseImport from '@/components/license-import/index.vue';
import DrawerHeader from '@/components/drawer-header/index.vue'; import DrawerHeader from '@/components/drawer-header/index.vue';
import { MsgError, MsgSuccess } from '@/utils/message'; import { MsgError, MsgSuccess } from '@/utils/message';
import { Toolbox } from '@/api/interface/toolbox'; import { Toolbox } from '@/api/interface/toolbox';
@ -179,7 +147,6 @@ import { storeToRefs } from 'pinia';
import { GlobalStore } from '@/store'; import { GlobalStore } from '@/store';
const globalStore = GlobalStore(); const globalStore = GlobalStore();
const licenseRef = ref();
const { isProductPro } = storeToRefs(globalStore); const { isProductPro } = storeToRefs(globalStore);
interface DialogProps { interface DialogProps {
title: string; title: string;
@ -208,8 +175,6 @@ const acceptParams = (params: DialogProps): void => {
second: 30, second: 30,
}; };
} }
dialogData.value.rowData.hasAlert = dialogData.value.rowData!.alertCount > 0;
dialogData.value.rowData!.alertCount = dialogData.value.rowData!.alertCount || 3;
title.value = i18n.global.t('commons.button.' + dialogData.value.title); title.value = i18n.global.t('commons.button.' + dialogData.value.title);
drawerVisible.value = true; drawerVisible.value = true;
}; };
@ -303,19 +268,6 @@ const verifySpec = (rule: any, value: any, callback: any) => {
} }
callback(); callback();
}; };
function checkSendCount(rule: any, value: any, callback: any) {
if (value === '') {
callback();
}
const regex = /^(?:[1-9]|[12][0-9]|30)$/;
if (!regex.test(value)) {
return callback(new Error(i18n.global.t('commons.rule.numberRange', [1, 30])));
}
callback();
}
const rules = reactive({ const rules = reactive({
name: [Rules.simpleName], name: [Rules.simpleName],
path: [Rules.requiredInput, Rules.noSpace], path: [Rules.requiredInput, Rules.noSpace],
@ -323,7 +275,6 @@ const rules = reactive({
{ validator: verifySpec, trigger: 'blur', required: true }, { validator: verifySpec, trigger: 'blur', required: true },
{ validator: verifySpec, trigger: 'change', required: true }, { validator: verifySpec, trigger: 'change', required: true },
], ],
alertCount: [Rules.integerNumber, { validator: checkSendCount, trigger: 'blur' }],
}); });
type FormInstance = InstanceType<typeof ElForm>; type FormInstance = InstanceType<typeof ElForm>;
@ -347,10 +298,6 @@ const hasHour = (item: any) => {
return item.specType !== 'perHour' && item.specType !== 'perNMinute' && item.specType !== 'perNSecond'; return item.specType !== 'perHour' && item.specType !== 'perNMinute' && item.specType !== 'perNSecond';
}; };
const toUpload = () => {
licenseRef.value.acceptParams();
};
const changeSpecType = () => { const changeSpecType = () => {
let item = dialogData.value.rowData!.specObj; let item = dialogData.value.rowData!.specObj;
switch (item.specType) { switch (item.specType) {
@ -393,16 +340,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
MsgError(i18n.global.t('cronjob.cronSpecHelper')); MsgError(i18n.global.t('cronjob.cronSpecHelper'));
return; return;
} }
dialogData.value.rowData.alertCount = dialogData.value.rowData!.hasAlert
? dialogData.value.rowData.alertCount
: 0;
dialogData.value.rowData.alertTitle = i18n.global.t('toolbox.clam.alertTitle', [
dialogData.value.rowData.name,
]);
} else {
dialogData.value.rowData.alertTitle = '';
dialogData.value.rowData.alertCount = 0;
dialogData.value.rowData.hasAlert = false;
} }
dialogData.value.rowData.spec = spec; dialogData.value.rowData.spec = spec;