mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-01-19 06:32:59 +08:00
feat: 增加网站设置过期时间的功能
This commit is contained in:
parent
7ffd8f4578
commit
8357d536bc
@ -1,6 +1,8 @@
|
||||
package request
|
||||
|
||||
import "github.com/1Panel-dev/1Panel/backend/app/dto"
|
||||
import (
|
||||
"github.com/1Panel-dev/1Panel/backend/app/dto"
|
||||
)
|
||||
|
||||
type WebsiteSearch struct {
|
||||
dto.PageInfo
|
||||
@ -36,6 +38,7 @@ type WebsiteUpdate struct {
|
||||
PrimaryDomain string `json:"primaryDomain" validate:"required"`
|
||||
Remark string `json:"remark"`
|
||||
WebsiteGroupID uint `json:"webSiteGroupID" validate:"required"`
|
||||
ExpireDate string `json:"expireDate"`
|
||||
}
|
||||
|
||||
type WebsiteDelete struct {
|
||||
|
@ -254,6 +254,13 @@ func (w WebsiteService) UpdateWebsite(req request.WebsiteUpdate) error {
|
||||
website.PrimaryDomain = req.PrimaryDomain
|
||||
website.WebsiteGroupID = req.WebsiteGroupID
|
||||
website.Remark = req.Remark
|
||||
if req.ExpireDate != "" {
|
||||
expireDate, err := time.Parse(constant.DateLayout, req.ExpireDate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
website.ExpireDate = expireDate
|
||||
}
|
||||
|
||||
return websiteRepo.Save(context.TODO(), &website)
|
||||
}
|
||||
|
@ -67,6 +67,7 @@ export namespace Website {
|
||||
primaryDomain: string;
|
||||
remark: string;
|
||||
webSiteGroupId: number;
|
||||
expireDate?: string;
|
||||
}
|
||||
|
||||
export interface WebSiteOp {
|
||||
|
@ -947,6 +947,8 @@ export default {
|
||||
ext: '文件扩展名',
|
||||
wafInputHelper: '按行输入数据,一行一个',
|
||||
data: '数据',
|
||||
ever: '永久',
|
||||
nextYear: '一年后',
|
||||
},
|
||||
nginx: {
|
||||
serverNamesHashBucketSizeHelper: '服务器名字的hash表大小',
|
||||
|
@ -49,6 +49,17 @@ export function dateFromat(row: number, col: number, dataStr: any) {
|
||||
return `${String(y)}-${String(m)}-${String(d)} ${String(h)}:${String(minute)}:${String(second)}`;
|
||||
}
|
||||
|
||||
//2016-01-12
|
||||
export function dateFromatSimple(dataStr: any) {
|
||||
const date = new Date(dataStr);
|
||||
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;
|
||||
return `${String(y)}-${String(m)}-${String(d)}`;
|
||||
}
|
||||
|
||||
// 20221013151302
|
||||
export function dateFromatForName(dataStr: any) {
|
||||
const date = new Date(dataStr);
|
||||
|
@ -48,9 +48,29 @@
|
||||
<el-table-column :label="$t('website.remark')" prop="remark"></el-table-column>
|
||||
<el-table-column :label="$t('website.protocol')" prop="protocol"></el-table-column>
|
||||
<el-table-column :label="$t('website.expireDate')">
|
||||
<template #default="{ row }">
|
||||
<span v-if="row.protocol === 'HTTP'">{{ $t('website.neverExpire') }}</span>
|
||||
<span v-else>{{ dateFromat(1, 1, row.webSiteSSL.expireDate) }}</span>
|
||||
<template #default="{ row, $index }">
|
||||
<div v-show="row.showdate">
|
||||
<el-date-picker
|
||||
v-model="row.expireDate"
|
||||
type="date"
|
||||
:disabled-date="checkDate"
|
||||
:shortcuts="shortcuts"
|
||||
:clearable="false"
|
||||
:default-value="setDate(row.expireDate)"
|
||||
:ref="(el) => setdateRefs(el, $index)"
|
||||
@change="submitDate(row)"
|
||||
@visible-change="(visibility:boolean) => pickerVisibility(visibility, row)"
|
||||
size="small"
|
||||
></el-date-picker>
|
||||
</div>
|
||||
<div v-show="!row.showdate">
|
||||
<span v-if="isEver(row.expireDate)" @click="openDatePicker(row, $index)">
|
||||
{{ $t('website.neverExpire') }}
|
||||
</span>
|
||||
<span v-else @click="openDatePicker(row, $index)">
|
||||
{{ dateFromatSimple(row.expireDate) }}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<fu-table-operations
|
||||
@ -93,19 +113,34 @@ import { onMounted, reactive, ref } from '@vue/runtime-core';
|
||||
import CreateWebSite from './create/index.vue';
|
||||
import DeleteWebsite from './delete/index.vue';
|
||||
import WebSiteGroup from './group/index.vue';
|
||||
import { OpWebsite, SearchWebsites } from '@/api/modules/website';
|
||||
import { OpWebsite, SearchWebsites, UpdateWebsite } from '@/api/modules/website';
|
||||
import { Website } from '@/api/interface/website';
|
||||
import AppStatus from '@/components/app-status/index.vue';
|
||||
import NginxConfig from './nginx/index.vue';
|
||||
import { dateFromat } from '@/utils/util';
|
||||
|
||||
import i18n from '@/lang';
|
||||
import router from '@/routers';
|
||||
import { App } from '@/api/interface/app';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { dateFromatSimple } from '@/utils/util';
|
||||
|
||||
const shortcuts = [
|
||||
{
|
||||
text: i18n.global.t('website.ever'),
|
||||
value: () => {
|
||||
return new Date('1970-01-01');
|
||||
},
|
||||
},
|
||||
{
|
||||
text: i18n.global.t('website.nextYear'),
|
||||
value: () => {
|
||||
const now = new Date();
|
||||
now.setFullYear(now.getFullYear() + 1);
|
||||
return now;
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const loading = ref(false);
|
||||
|
||||
const createRef = ref();
|
||||
const deleteRef = ref();
|
||||
const groupRef = ref();
|
||||
@ -114,6 +149,10 @@ let nginxIsExist = ref(false);
|
||||
let containerName = ref('');
|
||||
let nginxStatus = ref('');
|
||||
let installPath = ref('');
|
||||
const uploadRef = ref();
|
||||
const dialogBackupRef = ref();
|
||||
const data = ref();
|
||||
let dateRefs: Map<number, any> = new Map();
|
||||
|
||||
const paginationConfig = reactive({
|
||||
currentPage: 1,
|
||||
@ -121,14 +160,12 @@ const paginationConfig = reactive({
|
||||
total: 0,
|
||||
});
|
||||
|
||||
const data = ref();
|
||||
const search = async () => {
|
||||
const req = {
|
||||
name: '',
|
||||
page: paginationConfig.currentPage,
|
||||
pageSize: paginationConfig.pageSize,
|
||||
};
|
||||
|
||||
SearchWebsites(req).then((res) => {
|
||||
data.value = res.data.items;
|
||||
paginationConfig.total = res.data.total;
|
||||
@ -142,8 +179,67 @@ const openConfig = (id: number) => {
|
||||
router.push({ name: 'WebsiteConfig', params: { id: id, tab: 'basic' } });
|
||||
};
|
||||
|
||||
const uploadRef = ref();
|
||||
const dialogBackupRef = ref();
|
||||
const isEver = (time: string) => {
|
||||
const expireDate = new Date(time);
|
||||
return expireDate < new Date('1970-01-02');
|
||||
};
|
||||
|
||||
const isBeforeNow = (time: string) => {
|
||||
return new Date() > new Date(time);
|
||||
};
|
||||
|
||||
const setDate = (time: string) => {
|
||||
if (isEver(time)) {
|
||||
return new Date().toLocaleDateString();
|
||||
} else {
|
||||
return new Date(time);
|
||||
}
|
||||
};
|
||||
|
||||
const openDatePicker = (row: any, index: number) => {
|
||||
row.showdate = true;
|
||||
const ref = dateRefs.get(index);
|
||||
if (ref != undefined) {
|
||||
if (isBeforeNow(row.expireDate)) {
|
||||
row.oldExpireDate = row.expireDate;
|
||||
const date = new Date().toLocaleDateString();
|
||||
row.expireDate = date;
|
||||
}
|
||||
ref.handleOpen();
|
||||
}
|
||||
};
|
||||
|
||||
const setdateRefs = (ref: any, index: number) => {
|
||||
dateRefs.set(index, ref);
|
||||
};
|
||||
|
||||
const pickerVisibility = (visibility: boolean, row: any) => {
|
||||
if (!visibility) {
|
||||
row.showdate = false;
|
||||
if (!row.change) {
|
||||
if (row.oldExpireDate) {
|
||||
row.expireDate = row.oldExpireDate;
|
||||
}
|
||||
row.change = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const submitDate = (row: any) => {
|
||||
const reqDate = dateFromatSimple(row.expireDate);
|
||||
const req = {
|
||||
id: row.id,
|
||||
primaryDomain: row.primaryDomain,
|
||||
remark: row.remark,
|
||||
webSiteGroupId: row.webSiteGroupId,
|
||||
expireDate: reqDate,
|
||||
};
|
||||
|
||||
UpdateWebsite(req).then(() => {
|
||||
row.change = true;
|
||||
ElMessage.success(i18n.global.t('commons.msg.updateSuccess'));
|
||||
});
|
||||
};
|
||||
|
||||
const buttons = [
|
||||
{
|
||||
@ -200,6 +296,11 @@ const checkExist = (data: App.CheckInstalled) => {
|
||||
installPath.value = data.installPath;
|
||||
};
|
||||
|
||||
const checkDate = (date: Date) => {
|
||||
const now = new Date();
|
||||
return date < now;
|
||||
};
|
||||
|
||||
const opWebsite = (op: string, id: number) => {
|
||||
ElMessageBox.confirm(i18n.global.t('website.' + op + 'Helper'), i18n.global.t('cronjob.changeStatus'), {
|
||||
confirmButtonText: i18n.global.t('commons.button.confirm'),
|
||||
|
Loading…
Reference in New Issue
Block a user