From 2565373db6552bb64dc192d085adbeb5da4da985 Mon Sep 17 00:00:00 2001 From: zhengkunwang <31820853+zhengkunwang223@users.noreply.github.com> Date: Wed, 9 Oct 2024 21:56:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=AA=E9=9D=99=E6=80=81=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BF=9D=E5=AD=98=E4=B8=BA=E6=A8=A1=E7=89=88=20(#6663?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs https://github.com/1Panel-dev/1Panel/issues/705 --- agent/app/api/v2/website.go | 36 +++++++++ agent/app/dto/request/nginx.go | 6 ++ agent/app/service/backup_website.go | 2 +- agent/app/service/website.go | 52 +++++++++++- agent/app/service/website_utils.go | 42 ++++++---- agent/router/ro_website.go | 2 + frontend/src/api/interface/website.ts | 6 ++ frontend/src/api/modules/website.ts | 8 ++ frontend/src/lang/modules/en.ts | 1 + frontend/src/lang/modules/tw.ts | 1 + frontend/src/lang/modules/zh.ts | 1 + .../config/basic/rewrite/custom/index.vue | 72 +++++++++++++++++ .../website/config/basic/rewrite/index.vue | 79 ++++++++++++++++--- 13 files changed, 278 insertions(+), 30 deletions(-) create mode 100644 frontend/src/views/website/website/config/basic/rewrite/custom/index.vue diff --git a/agent/app/api/v2/website.go b/agent/app/api/v2/website.go index acddda770..91cad041d 100644 --- a/agent/app/api/v2/website.go +++ b/agent/app/api/v2/website.go @@ -1047,3 +1047,39 @@ func (b *BaseApi) ChangeWebsiteDatabase(c *gin.Context) { } helper.SuccessWithOutData(c) } + +// @Tags Website +// @Summary Operate custom rewrite +// @Description 编辑自定义重写模版 +// @Accept json +// @Param request body request.CustomRewriteOperate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /websites/rewrite/custom [post] +func (b *BaseApi) OperateCustomRewrite(c *gin.Context) { + var req request.CustomRewriteOperate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + if err := websiteService.OperateCustomRewrite(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithOutData(c) +} + +// @Tags Website +// @Summary List custom rewrite +// @Description 获取自定义重写模版列表 +// @Accept json +// @Success 200 {object} []string +// @Security ApiKeyAuth +// @Router /websites/rewrite/custom [get] +func (b *BaseApi) ListCustomRewrite(c *gin.Context) { + res, err := websiteService.ListCustomRewrite() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, res) +} diff --git a/agent/app/dto/request/nginx.go b/agent/app/dto/request/nginx.go index 946eeedc0..cc70181b8 100644 --- a/agent/app/dto/request/nginx.go +++ b/agent/app/dto/request/nginx.go @@ -24,6 +24,12 @@ type NginxRewriteReq struct { Name string `json:"name" validate:"required"` } +type CustomRewriteOperate struct { + Operate string `json:"operate" validate:"required,oneof=create delete"` + Content string `json:"content"` + Name string `json:"name"` +} + type NginxRewriteUpdate struct { WebsiteID uint `json:"websiteId" validate:"required"` Name string `json:"name" validate:"required"` diff --git a/agent/app/service/backup_website.go b/agent/app/service/backup_website.go index fb574eba6..bf5d42624 100644 --- a/agent/app/service/backup_website.go +++ b/agent/app/service/backup_website.go @@ -134,7 +134,7 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback if err != nil { return err } - if err = fileOp.CopyFile(fmt.Sprintf("%s/%s.conf", tmpPath, website.Alias), GetSitePath(*website, SiteConfDir)); err != nil { + if err = fileOp.CopyFile(fmt.Sprintf("%s/%s.conf", tmpPath, website.Alias), GetOpenrestyDir(SiteConfDir)); err != nil { return err } diff --git a/agent/app/service/website.go b/agent/app/service/website.go index d3b420d95..15be3f03a 100644 --- a/agent/app/service/website.go +++ b/agent/app/service/website.go @@ -78,6 +78,9 @@ type IWebsiteService interface { GetRewriteConfig(req request.NginxRewriteReq) (*response.NginxRewriteRes, error) UpdateRewriteConfig(req request.NginxRewriteUpdate) error + OperateCustomRewrite(req request.CustomRewriteOperate) error + ListCustomRewrite() ([]string, error) + LoadWebsiteDirConfig(req request.WebsiteCommonReq) (*response.WebsiteDirConfig, error) UpdateSiteDir(req request.WebsiteUpdateDir) error UpdateSitePermission(req request.WebsiteUpdateDirPermission) error @@ -1431,9 +1434,11 @@ func (w WebsiteService) GetRewriteConfig(req request.NginxRewriteReq) (*response } } else { rewriteFile := fmt.Sprintf("rewrite/%s.conf", strings.ToLower(req.Name)) - contentByte, err = nginx_conf.Rewrites.ReadFile(rewriteFile) - if err != nil { - return nil, err + contentByte, _ = nginx_conf.Rewrites.ReadFile(rewriteFile) + if contentByte == nil { + customRewriteDir := GetOpenrestyDir(DefaultRewriteDir) + customRewriteFile := path.Join(customRewriteDir, fmt.Sprintf("%s.conf", strings.ToLower(req.Name))) + contentByte, err = files.NewFileOp().GetContent(customRewriteFile) } } return &response.NginxRewriteRes{ @@ -1441,6 +1446,47 @@ func (w WebsiteService) GetRewriteConfig(req request.NginxRewriteReq) (*response }, err } +func (w WebsiteService) OperateCustomRewrite(req request.CustomRewriteOperate) error { + rewriteDir := GetOpenrestyDir(DefaultRewriteDir) + fileOp := files.NewFileOp() + if !fileOp.Stat(rewriteDir) { + if err := fileOp.CreateDir(rewriteDir, 0755); err != nil { + return err + } + } + rewriteFile := path.Join(rewriteDir, fmt.Sprintf("%s.conf", req.Name)) + switch req.Operate { + case "create": + if fileOp.Stat(rewriteFile) { + return buserr.New(constant.ErrNameIsExist) + } + return fileOp.WriteFile(rewriteFile, strings.NewReader(req.Content), 0755) + case "delete": + return fileOp.DeleteFile(rewriteFile) + } + return nil +} + +func (w WebsiteService) ListCustomRewrite() ([]string, error) { + rewriteDir := GetOpenrestyDir(DefaultRewriteDir) + fileOp := files.NewFileOp() + if !fileOp.Stat(rewriteDir) { + return nil, nil + } + entries, err := os.ReadDir(rewriteDir) + if err != nil { + return nil, err + } + var res []string + for _, entry := range entries { + if entry.IsDir() { + continue + } + res = append(res, strings.TrimSuffix(entry.Name(), ".conf")) + } + return res, nil +} + func (w WebsiteService) UpdateSiteDir(req request.WebsiteUpdateDir) error { website, err := websiteRepo.GetFirst(commonRepo.WithByID(req.ID)) if err != nil { diff --git a/agent/app/service/website_utils.go b/agent/app/service/website_utils.go index 6718c90d7..0b78900b5 100644 --- a/agent/app/service/website_utils.go +++ b/agent/app/service/website_utils.go @@ -1194,19 +1194,21 @@ func GteSiteDir(alias string) string { } const ( - SiteConf = "SiteConf" - SiteAccessLog = "access.log" - SiteErrorLog = "error.log" - WebsiteRootDir = "WebsiteRootDir" - SiteDir = "SiteDir" - SiteIndexDir = "SiteIndexDir" - SiteProxyDir = "SiteProxyDir" - SiteSSLDir = "SiteSSLDir" - SiteReWritePath = "SiteReWritePath" - SiteRedirectDir = "SiteRedirectDir" - SiteCacheDir = "SiteCacheDir" - SiteConfDir = "SiteConfDir" - SitesRootDir = "SitesRootDir" + SiteConf = "SiteConf" + SiteAccessLog = "access.log" + SiteErrorLog = "error.log" + WebsiteRootDir = "WebsiteRootDir" + SiteDir = "SiteDir" + SiteIndexDir = "SiteIndexDir" + SiteProxyDir = "SiteProxyDir" + SiteSSLDir = "SiteSSLDir" + SiteReWritePath = "SiteReWritePath" + SiteRedirectDir = "SiteRedirectDir" + SiteCacheDir = "SiteCacheDir" + SiteConfDir = "SiteConfDir" + SitesRootDir = "SitesRootDir" + DefaultDir = "DefaultDir" + DefaultRewriteDir = "DefaultRewriteDir" ) func GetSitePath(website model.Website, confType string) string { @@ -1217,8 +1219,6 @@ func GetSitePath(website model.Website, confType string) string { return path.Join(GteSiteDir(website.Alias), "log", "access.log") case SiteErrorLog: return path.Join(GteSiteDir(website.Alias), "log", "error.log") - case WebsiteRootDir: - return GetWebSiteRootDir() case SiteDir: return GteSiteDir(website.Alias) case SiteIndexDir: @@ -1233,10 +1233,22 @@ func GetSitePath(website model.Website, confType string) string { return path.Join(GteSiteDir(website.Alias), "rewrite", website.Alias+".conf") case SiteRedirectDir: return path.Join(GteSiteDir(website.Alias), "redirect") + } + return "" +} + +func GetOpenrestyDir(confType string) string { + switch confType { + case WebsiteRootDir: + return GetWebSiteRootDir() case SiteConfDir: return path.Join(GetWebSiteRootDir(), "conf.d") case SitesRootDir: return path.Join(GetWebSiteRootDir(), "sites") + case DefaultDir: + return path.Join(GetWebSiteRootDir(), "default") + case DefaultRewriteDir: + return path.Join(GetWebSiteRootDir(), "default", "rewrite") } return "" } diff --git a/agent/router/ro_website.go b/agent/router/ro_website.go index dabb3a384..fd93d8529 100644 --- a/agent/router/ro_website.go +++ b/agent/router/ro_website.go @@ -41,6 +41,8 @@ func (a *WebsiteRouter) InitRouter(Router *gin.RouterGroup) { websiteRouter.POST("/rewrite", baseApi.GetRewriteConfig) websiteRouter.POST("/rewrite/update", baseApi.UpdateRewriteConfig) + websiteRouter.POST("/rewrite/custom", baseApi.OperateCustomRewrite) + websiteRouter.GET("/rewrite/custom", baseApi.ListCustomRewrite) websiteRouter.POST("/dir/update", baseApi.UpdateSiteDir) websiteRouter.POST("/dir/permission", baseApi.UpdateSiteDirPermission) diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 7bdbbbd2f..7e7c755de 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -350,6 +350,12 @@ export namespace Website { content: string; } + export interface CustomRewirte { + operate: string; + name: string; + content: string; + } + export interface DirUpdate { id: number; siteDir: string; diff --git a/frontend/src/api/modules/website.ts b/frontend/src/api/modules/website.ts index 142d13044..de0299329 100644 --- a/frontend/src/api/modules/website.ts +++ b/frontend/src/api/modules/website.ts @@ -331,3 +331,11 @@ export const GetWebsiteDatabase = () => { export const ChangeDatabase = (req: Website.ChangeDatabase) => { return http.post(`/websites/databases`, req); }; + +export const OperateCustomRewrite = (req: Website.CustomRewirte) => { + return http.post(`/websites/rewrite/custom`, req); +}; + +export const ListCustomRewrite = () => { + return http.get(`/websites/rewrite/custom`); +}; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index ff35c4e27..1681eee8f 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -2244,6 +2244,7 @@ const message = { changeDatabase: 'Change Database', changeDatabaseHelper1: 'Database association is used for backing up and restoring the website.', changeDatabaseHelper2: 'Switching to another database will cause previous backups to be unrecoverable.', + saveCustom: 'Save as Template', }, php: { short_open_tag: 'Short tag support', diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index 95d18e277..88ce3a35e 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -2091,6 +2091,7 @@ const message = { changeDatabase: '切換資料庫', changeDatabaseHelper1: '資料庫關聯用於備份恢復網站。', changeDatabaseHelper2: '切換其他資料庫會導致以前的備份無法恢復。', + saveCustom: '另存为模版', }, php: { short_open_tag: '短標簽支持', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index aebaee1c7..98f5d94fe 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -2089,6 +2089,7 @@ const message = { changeDatabase: '切换数据库', changeDatabaseHelper1: '数据库关联用于备份恢复网站', changeDatabaseHelper2: '切换其他数据库会导致以前的备份无法恢复', + saveCustom: '另存为模版', }, php: { short_open_tag: '短标签支持', diff --git a/frontend/src/views/website/website/config/basic/rewrite/custom/index.vue b/frontend/src/views/website/website/config/basic/rewrite/custom/index.vue new file mode 100644 index 000000000..7d7d79897 --- /dev/null +++ b/frontend/src/views/website/website/config/basic/rewrite/custom/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/frontend/src/views/website/website/config/basic/rewrite/index.vue b/frontend/src/views/website/website/config/basic/rewrite/index.vue index 32310c49c..19a2e393f 100644 --- a/frontend/src/views/website/website/config/basic/rewrite/index.vue +++ b/frontend/src/views/website/website/config/basic/rewrite/index.vue @@ -4,11 +4,20 @@ + :label="rewrite.name" + :value="rewrite.name" + > + {{ rewrite.name }} + + {{ $t('website.rewriteHelper2') }} @@ -20,43 +29,54 @@ {{ $t('nginx.saveAndReload') }} + + {{ $t('website.saveCustom') }} + + +