feat: 证书列表增加设置自动续签功能 (#337)

pull/341/head
zhengkunwang223 2023-03-21 14:42:50 +08:00 committed by GitHub
parent f516333682
commit 72237596f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 683 additions and 470 deletions

View File

@ -449,7 +449,7 @@ func (b *BaseApi) Download(c *gin.Context) {
// @Summary Download file with path // @Summary Download file with path
// @Description 下载指定文件 // @Description 下载指定文件
// @Accept json // @Accept json
// @Param request body request.FilePath true "request" // @Param request body dto.FilePath true "request"
// @Success 200 // @Success 200
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Router /files/download/bypath [post] // @Router /files/download/bypath [post]

View File

@ -176,3 +176,25 @@ func (b *BaseApi) GetWebsiteSSLById(c *gin.Context) {
} }
helper.SuccessWithData(c, websiteSSL) helper.SuccessWithData(c, websiteSSL)
} }
// @Tags Website SSL
// @Summary Update ssl
// @Description 更新 ssl
// @Accept json
// @Param request body request.WebsiteSSLUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Router /websites/ssl/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFuntions":[{"input_colume":"id","input_value":"id","isList":false,"db":"website_ssls","output_colume":"primary_domain","output_value":"domain"}],"formatZH":"更新证书设置 [domain]","formatEN":"Update ssl config [domain]"}
func (b *BaseApi) UpdateWebsiteSSL(c *gin.Context) {
var req request.WebsiteSSLUpdate
if err := c.ShouldBindJSON(&req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err)
return
}
if err := websiteSSLService.Update(req); err != nil {
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
return
}
helper.SuccessWithData(c, nil)
}

View File

@ -44,3 +44,8 @@ type WebsiteDnsAccountUpdate struct {
type WebsiteResourceReq struct { type WebsiteResourceReq struct {
ID uint `json:"id" validate:"required"` ID uint `json:"id" validate:"required"`
} }
type WebsiteSSLUpdate struct {
ID uint `json:"id" validate:"required"`
AutoRenew bool `json:"autoRenew" validate:"required"`
}

View File

@ -27,6 +27,7 @@ type IWebsiteSSLService interface {
GetDNSResolve(req request.WebsiteDNSReq) ([]response.WebsiteDNSRes, error) GetDNSResolve(req request.WebsiteDNSReq) ([]response.WebsiteDNSRes, error)
GetWebsiteSSL(websiteId uint) (response.WebsiteSSLDTO, error) GetWebsiteSSL(websiteId uint) (response.WebsiteSSLDTO, error)
Delete(id uint) error Delete(id uint) error
Update(update request.WebsiteSSLUpdate) error
} }
func NewIWebsiteSSLService() IWebsiteSSLService { func NewIWebsiteSSLService() IWebsiteSSLService {
@ -132,6 +133,7 @@ func (w WebsiteSSLService) Create(create request.WebsiteSSLCreate) (request.Webs
websiteSSL.StartDate = cert.NotBefore websiteSSL.StartDate = cert.NotBefore
websiteSSL.Type = cert.Issuer.CommonName websiteSSL.Type = cert.Issuer.CommonName
websiteSSL.Organization = cert.Issuer.Organization[0] websiteSSL.Organization = cert.Issuer.Organization[0]
websiteSSL.AutoRenew = create.AutoRenew
if err := websiteSSLRepo.Create(context.TODO(), &websiteSSL); err != nil { if err := websiteSSLRepo.Create(context.TODO(), &websiteSSL); err != nil {
return res, err return res, err
@ -258,3 +260,12 @@ func (w WebsiteSSLService) Delete(id uint) error {
} }
return websiteSSLRepo.DeleteBy(commonRepo.WithByID(id)) return websiteSSLRepo.DeleteBy(commonRepo.WithByID(id))
} }
func (w WebsiteSSLService) Update(update request.WebsiteSSLUpdate) error {
websiteSSL, err := websiteSSLRepo.GetFirst(commonRepo.WithByID(update.ID))
if err != nil {
return err
}
websiteSSL.AutoRenew = update.AutoRenew
return websiteSSLRepo.Save(websiteSSL)
}

View File

@ -22,5 +22,6 @@ func (a *WebsiteSSLRouter) InitWebsiteSSLRouter(Router *gin.RouterGroup) {
groupRouter.POST("/del", baseApi.DeleteWebsiteSSL) groupRouter.POST("/del", baseApi.DeleteWebsiteSSL)
groupRouter.GET("/website/:websiteId", baseApi.GetWebsiteSSLByWebsiteId) groupRouter.GET("/website/:websiteId", baseApi.GetWebsiteSSLByWebsiteId)
groupRouter.GET("/:id", baseApi.GetWebsiteSSLById) groupRouter.GET("/:id", baseApi.GetWebsiteSSLById)
groupRouter.POST("/update", baseApi.UpdateWebsiteSSL)
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -160,6 +160,7 @@ export namespace Website {
startDate: string; startDate: string;
provider: string; provider: string;
websites?: Website.Website[]; websites?: Website.Website[];
autoRenew: boolean;
} }
export interface SSLCreate { export interface SSLCreate {
@ -179,6 +180,11 @@ export namespace Website {
SSLId: number; SSLId: number;
} }
export interface SSLUpdate {
id: number;
autoRenew: boolean;
}
export interface AcmeAccount extends CommonModel { export interface AcmeAccount extends CommonModel {
email: string; email: string;
url: string; url: string;

View File

@ -139,6 +139,10 @@ export const RenewSSL = (req: Website.SSLRenew) => {
return http.post<any>(`/websites/ssl/renew`, req); return http.post<any>(`/websites/ssl/renew`, req);
}; };
export const UpdateSSL = (req: Website.SSLUpdate) => {
return http.post<any>(`/websites/ssl/update`, req);
};
export const GetDnsResolve = (req: Website.DNSResolveReq) => { export const GetDnsResolve = (req: Website.DNSResolveReq) => {
return http.post<Website.DNSResolve[]>(`/websites/ssl/resolve`, req); return http.post<Website.DNSResolve[]>(`/websites/ssl/resolve`, req);
}; };

View File

@ -50,6 +50,15 @@
show-overflow-tooltip show-overflow-tooltip
prop="type" prop="type"
></el-table-column> ></el-table-column>
<el-table-column :label="$t('ssl.autoRenew')" fix>
<template #default="{ row }">
<el-switch
:disabled="row.provider === 'dnsManual' || row.provider === 'manual'"
v-model="row.autoRenew"
@change="updateConfig(row)"
/>
</template>
</el-table-column>
<el-table-column <el-table-column
prop="expireDate" prop="expireDate"
:label="$t('website.expireDate')" :label="$t('website.expireDate')"
@ -79,7 +88,7 @@ import LayoutContent from '@/layout/layout-content.vue';
import RouterButton from '@/components/router-button/index.vue'; import RouterButton from '@/components/router-button/index.vue';
import ComplexTable from '@/components/complex-table/index.vue'; import ComplexTable from '@/components/complex-table/index.vue';
import { onMounted, reactive, ref } from 'vue'; import { onMounted, reactive, ref } from 'vue';
import { DeleteSSL, SearchSSL } from '@/api/modules/website'; import { DeleteSSL, SearchSSL, UpdateSSL } from '@/api/modules/website';
import DnsAccount from './dns-account/index.vue'; import DnsAccount from './dns-account/index.vue';
import AcmeAccount from './acme-account/index.vue'; import AcmeAccount from './acme-account/index.vue';
import Renew from './renew/index.vue'; import Renew from './renew/index.vue';
@ -89,6 +98,7 @@ import { dateFormat, getProvider } from '@/utils/util';
import i18n from '@/lang'; import i18n from '@/lang';
import { Website } from '@/api/interface/website'; import { Website } from '@/api/interface/website';
import { useDeleteData } from '@/hooks/use-delete-data'; import { useDeleteData } from '@/hooks/use-delete-data';
import { MsgSuccess } from '@/utils/message';
const paginationConfig = reactive({ const paginationConfig = reactive({
currentPage: 1, currentPage: 1,
@ -150,6 +160,17 @@ const search = () => {
}); });
}; };
const updateConfig = (row: Website.SSL) => {
loading.value = true;
UpdateSSL({ id: row.id, autoRenew: row.autoRenew })
.then(() => {
MsgSuccess(i18n.global.t('commons.msg.updateSuccess'));
})
.finally(() => {
loading.value = false;
});
};
const openAcmeAccount = () => { const openAcmeAccount = () => {
acmeAccountRef.value.acceptParams(); acmeAccountRef.value.acceptParams();
}; };