mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2024-11-27 12:39:01 +08:00
style: 调整 Xpack 界面样式与菜单位置 (#4323)
This commit is contained in:
parent
b0cc1248f0
commit
18faed79f3
@ -1458,11 +1458,12 @@ const message = {
|
|||||||
|
|
||||||
license: 'License',
|
license: 'License',
|
||||||
},
|
},
|
||||||
license: {
|
License: {
|
||||||
community: 'Community Edition',
|
community: 'Community Edition',
|
||||||
pro: 'Professional Edition',
|
pro: 'Professional Edition',
|
||||||
trial: 'Trial Version',
|
trial: 'Trial Edition',
|
||||||
office: 'Official Version',
|
office: 'Official Edition',
|
||||||
|
trialInfo: 'Version',
|
||||||
authorizationId: 'Subscription Authorization ID',
|
authorizationId: 'Subscription Authorization ID',
|
||||||
authorizedUser: 'Authorized User',
|
authorizedUser: 'Authorized User',
|
||||||
expiresAt: 'Expiration Time',
|
expiresAt: 'Expiration Time',
|
||||||
@ -1474,16 +1475,23 @@ const message = {
|
|||||||
Enable: 'Enabled',
|
Enable: 'Enabled',
|
||||||
Disable: 'Disabled',
|
Disable: 'Disabled',
|
||||||
lostHelper:
|
lostHelper:
|
||||||
'The license needs to be regularly synchronized for availability. Please ensure normal access to the external network. After three losses of contact, the license binding will be released.',
|
'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',
|
quickUpdate: 'Quick Update',
|
||||||
import: 'Import',
|
import: 'Import',
|
||||||
|
power: 'Authorize',
|
||||||
importLicense: 'Import License',
|
importLicense: 'Import License',
|
||||||
importHelper: 'Click or drag the License file here',
|
importHelper: 'Please click or drag the license file here',
|
||||||
technicalAdvice: 'Technical Advice',
|
technicalAdvice: 'Technical Advice',
|
||||||
advice: 'Consultation',
|
advice: 'Consultation',
|
||||||
indefinitePeriod: 'Indefinite Period',
|
indefinitePeriod: 'Indefinite Period',
|
||||||
levelUpPro: 'Upgrade to Professional Edition',
|
levelUpPro: 'Upgrade to Professional Edition',
|
||||||
knowMorePro: 'Learn More about Professional Edition',
|
knowMorePro: 'Learn More',
|
||||||
|
closeAlert: 'The current page can be closed in the panel settings',
|
||||||
|
introduce: 'Feature Introduction',
|
||||||
|
waf: '1Panel WAF effectively prevents common attacks such as CC attacks, malicious data collection, API abuse, and hacker penetration testing behaviors, providing strong protection for your website security.',
|
||||||
|
tamper: '1Panel Tamper Protection effectively safeguards data from tampering and malicious attacks, ensuring data reliability and security.',
|
||||||
|
setting:
|
||||||
|
'1Panel interface settings allow you to customize panel logos, welcome messages, and other information.',
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
scan: 'Start Scanning',
|
scan: 'Start Scanning',
|
||||||
|
@ -1358,30 +1358,38 @@ const message = {
|
|||||||
|
|
||||||
license: '許可證',
|
license: '許可證',
|
||||||
},
|
},
|
||||||
license: {
|
License: {
|
||||||
community: '社區版',
|
community: '社區版',
|
||||||
pro: '專業版',
|
pro: '專業版',
|
||||||
trial: '試用版',
|
trial: '試用版',
|
||||||
office: '正式版本',
|
office: '正式版',
|
||||||
|
trialInfo: '版本',
|
||||||
authorizationId: '訂閱授權 ID',
|
authorizationId: '訂閱授權 ID',
|
||||||
authorizedUser: '被授權方',
|
authorizedUser: '被授權方',
|
||||||
|
expiresAt: '到期時間',
|
||||||
productName: '產品名稱',
|
productName: '產品名稱',
|
||||||
productStatus: '產品狀態',
|
productStatus: '產品狀態',
|
||||||
Lost01: '失聯 * 1',
|
Lost01: '失聯 * 1',
|
||||||
Lost02: '失聯 * 2',
|
Lost02: '失聯 * 2',
|
||||||
Lost03: '失聯',
|
Lost03: '已失聯',
|
||||||
Enable: '已啟用',
|
Enable: '已啟用',
|
||||||
Disable: '未啟用',
|
Disable: '未啟用',
|
||||||
lostHelper: 'License 需要定時同步是否可用,請確保正常外網訪問,失聯三次後將解除 License 綁定',
|
lostHelper: '許可證需要定時同步是否可用,請保證正常外網訪問,失聯三次後將解除許可證綁定',
|
||||||
quickUpdate: '快速更新',
|
quickUpdate: '快速更新',
|
||||||
import: '導入',
|
import: '導入',
|
||||||
importLicense: '導入 License',
|
power: '授 權',
|
||||||
importHelper: '點擊或將 License 文件拖拽到此處',
|
importLicense: '導入許可證',
|
||||||
|
importHelper: '請點擊或拖動許可文件到此處',
|
||||||
technicalAdvice: '技術諮詢',
|
technicalAdvice: '技術諮詢',
|
||||||
advice: '諮詢',
|
advice: '諮詢',
|
||||||
indefinitePeriod: '無限期',
|
indefinitePeriod: '無限期',
|
||||||
levelUpPro: '升級專業版',
|
levelUpPro: '升級專業版',
|
||||||
knowMorePro: '了解更多專業版信息',
|
knowMorePro: '了解更多',
|
||||||
|
closeAlert: '當前頁面可在面板設置中關閉顯示',
|
||||||
|
introduce: '功能介紹',
|
||||||
|
waf: '1Panel WAF 有效防 CC 攻擊、防惡意采集、防刷接口等常見攻擊和黑客滲透測試行為,強力守護您網站業務安全。',
|
||||||
|
tamper: '1Panel 防篡改有效保護數據免受篡改和惡意攻擊,確保數據的可靠性和安全性。',
|
||||||
|
setting: '1Panel 介面設置可自定義面板 Logo、歡迎簡介等信息。',
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
scan: '開始掃描',
|
scan: '開始掃描',
|
||||||
|
@ -1376,18 +1376,22 @@ const message = {
|
|||||||
Lost03: '已失联',
|
Lost03: '已失联',
|
||||||
Enable: '已激活',
|
Enable: '已激活',
|
||||||
Disable: '未激活',
|
Disable: '未激活',
|
||||||
lostHelper: 'License 需要定时同步是否可用,请保证正常外网访问,失联三次后将解除 License 绑定',
|
lostHelper: '许可证需要定时同步是否可用,请保证正常外网访问,失联三次后将解除许可证绑定',
|
||||||
quickUpdate: '快速更新',
|
quickUpdate: '快速更新',
|
||||||
import: '导入',
|
import: '导入',
|
||||||
power: '授权',
|
power: '授 权',
|
||||||
importLicense: '导入 License',
|
importLicense: '导入许可证',
|
||||||
importHelper: '点击或将 License 文件拖拽到此处',
|
importHelper: '请点击或拖动许可文件到此处',
|
||||||
technicalAdvice: '技术咨询',
|
technicalAdvice: '技术咨询',
|
||||||
advice: '咨询',
|
advice: '咨询',
|
||||||
indefinitePeriod: '无限期',
|
indefinitePeriod: '无限期',
|
||||||
levelUpPro: '升级专业版',
|
levelUpPro: '升级专业版',
|
||||||
knowMorePro: '了解更多专业版信息',
|
knowMorePro: '了解更多',
|
||||||
closeAlert: '当前页面可在面板设置中关闭显示',
|
closeAlert: '当前页面可在面板设置中关闭显示',
|
||||||
|
introduce: '功能介绍',
|
||||||
|
waf: '1Panel WAF 有效防CC攻击、防恶意采集、防刷接口等常见攻击和黑客渗透测试行为,强力守护您网站业务安全。',
|
||||||
|
tamper: '1Panel 防篡改有效保护数据免受篡改和恶意攻击,确保数据的可靠性和安全性。',
|
||||||
|
setting: '1Panel 界面设置可自定义面板 Logo、欢迎简介等信息。',
|
||||||
},
|
},
|
||||||
clean: {
|
clean: {
|
||||||
scan: '开始扫描',
|
scan: '开始扫描',
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Layout } from '@/routers/constant';
|
import { Layout } from '@/routers/constant';
|
||||||
|
|
||||||
const settingRouter = {
|
const settingRouter = {
|
||||||
sort: 9,
|
sort: 10,
|
||||||
path: '/settings',
|
path: '/settings',
|
||||||
component: Layout,
|
component: Layout,
|
||||||
redirect: '/settings/panel',
|
redirect: '/settings/panel',
|
||||||
|
@ -234,7 +234,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<License ref="licenseRef" />
|
<LicenseImport ref="licenseRef" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -243,6 +243,7 @@ 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';
|
||||||
@ -252,7 +253,6 @@ import { loadBaseInfo, loadCurrentInfo } from '@/api/modules/dashboard';
|
|||||||
import { getIOOptions, getNetworkOptions } from '@/api/modules/monitor';
|
import { getIOOptions, getNetworkOptions } from '@/api/modules/monitor';
|
||||||
import { getSettingInfo, loadUpgradeInfo } from '@/api/modules/setting';
|
import { getSettingInfo, loadUpgradeInfo } from '@/api/modules/setting';
|
||||||
import { GlobalStore } from '@/store';
|
import { GlobalStore } from '@/store';
|
||||||
import License from '@/views/home/license/index.vue';
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const globalStore = GlobalStore();
|
const globalStore = GlobalStore();
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</LayoutContent>
|
</LayoutContent>
|
||||||
|
|
||||||
<Upload ref="uploadRef" @search="search()" />
|
<LicenseImport ref="licenseRef" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -106,12 +106,12 @@
|
|||||||
import { ref, reactive, onMounted } from 'vue';
|
import { ref, reactive, onMounted } from 'vue';
|
||||||
import { getLicense, syncLicense } from '@/api/modules/setting';
|
import { getLicense, syncLicense } from '@/api/modules/setting';
|
||||||
import CardWithHeader from '@/components/card-with-header/index.vue';
|
import CardWithHeader from '@/components/card-with-header/index.vue';
|
||||||
import Upload from '@/views/setting/license/upload/index.vue';
|
import LicenseImport from '@/components/license-import/index.vue';
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
import { MsgSuccess } from '@/utils/message';
|
import { MsgSuccess } from '@/utils/message';
|
||||||
import { GlobalStore } from '@/store';
|
import { GlobalStore } from '@/store';
|
||||||
const loading = ref();
|
const loading = ref();
|
||||||
const uploadRef = ref();
|
const licenseRef = ref();
|
||||||
const globalStore = GlobalStore();
|
const globalStore = GlobalStore();
|
||||||
|
|
||||||
const license = reactive({
|
const license = reactive({
|
||||||
@ -194,7 +194,7 @@ const showSync = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const toUpload = () => {
|
const toUpload = () => {
|
||||||
uploadRef.value.acceptParams();
|
licenseRef.value.acceptParams();
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
@ -1,109 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-drawer
|
|
||||||
v-model="open"
|
|
||||||
:before-close="handleClose"
|
|
||||||
size="30%"
|
|
||||||
:destroy-on-close="true"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
>
|
|
||||||
<template #header>
|
|
||||||
<DrawerHeader :header="$t('license.importLicense')" :back="handleClose" />
|
|
||||||
</template>
|
|
||||||
<div v-loading="loading">
|
|
||||||
<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>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<template #footer>
|
|
||||||
<span class="dialog-footer">
|
|
||||||
<el-button @click="handleClose" :disabled="loading">{{ $t('commons.button.cancel') }}</el-button>
|
|
||||||
<el-button type="primary" @click="submit()" :disabled="loading || uploaderFiles.length == 0">
|
|
||||||
{{ $t('commons.button.confirm') }}
|
|
||||||
</el-button>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-drawer>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ref } from 'vue';
|
|
||||||
import { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadRawFile, genFileId } from 'element-plus';
|
|
||||||
import { UploadFileData } from '@/api/modules/setting';
|
|
||||||
import i18n from '@/lang';
|
|
||||||
import DrawerHeader from '@/components/drawer-header/index.vue';
|
|
||||||
import { MsgSuccess } from '@/utils/message';
|
|
||||||
import { GlobalStore } from '@/store';
|
|
||||||
const globalStore = GlobalStore();
|
|
||||||
|
|
||||||
const loading = ref(false);
|
|
||||||
const open = ref(false);
|
|
||||||
|
|
||||||
const em = defineEmits(['search']);
|
|
||||||
|
|
||||||
const uploadRef = ref<UploadInstance>();
|
|
||||||
const uploaderFiles = ref<UploadFiles>([]);
|
|
||||||
|
|
||||||
const handleClose = () => {
|
|
||||||
open.value = false;
|
|
||||||
uploadRef.value!.clearFiles();
|
|
||||||
em('search');
|
|
||||||
};
|
|
||||||
|
|
||||||
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 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 () => {
|
|
||||||
loading.value = false;
|
|
||||||
uploadRef.value!.clearFiles();
|
|
||||||
uploaderFiles.value = [];
|
|
||||||
globalStore.isProductPro = true;
|
|
||||||
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>
|
|
Loading…
Reference in New Issue
Block a user