From 869f552cf800dcc87c0265e84f965c766efbdd7e Mon Sep 17 00:00:00 2001 From: zhengkunwang223 Date: Tue, 3 Jan 2023 16:56:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=BD=91=E7=AB=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mysql/versions/5.7.39/config.json | 2 +- apps/mysql/versions/8.0.30/config.json | 2 +- backend/app/api/v1/website.go | 22 ++++++ backend/app/dto/request/website.go | 4 ++ backend/app/model/website.go | 1 + backend/app/repo/website.go | 7 ++ backend/app/service/website.go | 37 ++++++++++ backend/app/service/website_utils.go | 4 +- backend/router/ro_website.go | 2 + backend/utils/nginx/components/block.go | 17 ----- backend/utils/nginx/components/server.go | 13 ++++ frontend/src/api/interface/website.ts | 5 ++ frontend/src/api/modules/website.ts | 8 +++ frontend/src/lang/modules/zh.ts | 2 + .../views/website/website/default/index.vue | 70 +++++++++++++++++++ frontend/src/views/website/website/index.vue | 19 +++-- 16 files changed, 189 insertions(+), 26 deletions(-) create mode 100644 frontend/src/views/website/website/default/index.vue diff --git a/apps/mysql/versions/5.7.39/config.json b/apps/mysql/versions/5.7.39/config.json index 42423c27a..1af8edbb8 100644 --- a/apps/mysql/versions/5.7.39/config.json +++ b/apps/mysql/versions/5.7.39/config.json @@ -2,7 +2,7 @@ "formFields": [ { "type": "password", - "labelZh": "Root用户密码", + "labelZh": "root用户密码", "labelEn": "RootPassword", "required": true, "default": "random", diff --git a/apps/mysql/versions/8.0.30/config.json b/apps/mysql/versions/8.0.30/config.json index 42423c27a..1af8edbb8 100644 --- a/apps/mysql/versions/8.0.30/config.json +++ b/apps/mysql/versions/8.0.30/config.json @@ -2,7 +2,7 @@ "formFields": [ { "type": "password", - "labelZh": "Root用户密码", + "labelZh": "root用户密码", "labelEn": "RootPassword", "required": true, "default": "random", diff --git a/backend/app/api/v1/website.go b/backend/app/api/v1/website.go index d0fc01d42..4f34419ad 100644 --- a/backend/app/api/v1/website.go +++ b/backend/app/api/v1/website.go @@ -26,6 +26,15 @@ func (b *BaseApi) PageWebsite(c *gin.Context) { }) } +func (b *BaseApi) GetWebsites(c *gin.Context) { + websites, err := websiteService.GetWebsites() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, websites) +} + func (b *BaseApi) GetWebsiteOptions(c *gin.Context) { websites, err := websiteService.GetWebsiteOptions() if err != nil { @@ -334,3 +343,16 @@ func (b *BaseApi) OpWebsiteLog(c *gin.Context) { } helper.SuccessWithData(c, res) } + +func (b *BaseApi) ChangeDefaultServer(c *gin.Context) { + var req request.WebsiteDefaultUpdate + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + if err := websiteService.ChangeDefaultServer(req.ID); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} diff --git a/backend/app/dto/request/website.go b/backend/app/dto/request/website.go index b2448450e..22c67a6a3 100644 --- a/backend/app/dto/request/website.go +++ b/backend/app/dto/request/website.go @@ -122,3 +122,7 @@ type WebsiteLogReq struct { Operate string `json:"operate" validate:"required"` LogType string `json:"logType" validate:"required"` } + +type WebsiteDefaultUpdate struct { + ID uint `json:"id" validate:"required"` +} diff --git a/backend/app/model/website.go b/backend/app/model/website.go index a948d8fd4..6943ef348 100644 --- a/backend/app/model/website.go +++ b/backend/app/model/website.go @@ -18,6 +18,7 @@ type Website struct { Proxy string `gorm:"type:varchar(128);not null" json:"proxy"` ErrorLog bool `json:"errorLog"` AccessLog bool `json:"accessLog"` + DefaultServer bool `json:"defaultServer"` Domains []WebsiteDomain `json:"domains"` WebsiteSSL WebsiteSSL `json:"webSiteSSL"` } diff --git a/backend/app/repo/website.go b/backend/app/repo/website.go index 772efcd65..54be5eb41 100644 --- a/backend/app/repo/website.go +++ b/backend/app/repo/website.go @@ -14,6 +14,7 @@ type IWebsiteRepo interface { WithAlias(alias string) DBOption WithWebsiteSSLID(sslId uint) DBOption WithGroupID(groupId uint) DBOption + WithDefaultServer() DBOption Page(page, size int, opts ...DBOption) (int64, []model.Website, error) List(opts ...DBOption) ([]model.Website, error) GetFirst(opts ...DBOption) (model.Website, error) @@ -60,6 +61,12 @@ func (w *WebsiteRepo) WithGroupID(groupId uint) DBOption { } } +func (w *WebsiteRepo) WithDefaultServer() DBOption { + return func(db *gorm.DB) *gorm.DB { + return db.Where("default_server = 1") + } +} + func (w *WebsiteRepo) Page(page, size int, opts ...DBOption) (int64, []model.Website, error) { var websites []model.Website db := getDb(opts...).Model(&model.Website{}) diff --git a/backend/app/service/website.go b/backend/app/service/website.go index e9ac19336..9bc6f1e3d 100644 --- a/backend/app/service/website.go +++ b/backend/app/service/website.go @@ -29,6 +29,7 @@ type WebsiteService struct { type IWebsiteService interface { PageWebsite(req request.WebsiteSearch) (int64, []response.WebsiteDTO, error) + GetWebsites() ([]response.WebsiteDTO, error) CreateWebsite(create request.WebsiteCreate) error OpWebsite(req request.WebsiteOp) error GetWebsiteOptions() ([]string, error) @@ -81,6 +82,20 @@ func (w WebsiteService) PageWebsite(req request.WebsiteSearch) (int64, []respons return total, websiteDTOs, nil } +func (w WebsiteService) GetWebsites() ([]response.WebsiteDTO, error) { + var websiteDTOs []response.WebsiteDTO + websites, err := websiteRepo.List() + if err != nil { + return nil, err + } + for _, web := range websites { + websiteDTOs = append(websiteDTOs, response.WebsiteDTO{ + Website: web, + }) + } + return websiteDTOs, nil +} + func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) error { if exist, _ := websiteRepo.GetBy(websiteRepo.WithDomain(create.PrimaryDomain)); len(exist) > 0 { return buserr.New(constant.ErrNameIsExist) @@ -777,3 +792,25 @@ func (w WebsiteService) OpWebsiteLog(req request.WebsiteLogReq) (*response.Websi } return res, nil } + +func (w WebsiteService) ChangeDefaultServer(id uint) error { + defaultWebsite, _ := websiteRepo.GetFirst(websiteRepo.WithDefaultServer()) + if defaultWebsite.ID > 0 { + if err := updateNginxConfig(constant.NginxScopeServer, []dto.NginxParam{{Name: "listen", Params: []string{"80"}}}, &defaultWebsite); err != nil { + return err + } + defaultWebsite.DefaultServer = false + if err := websiteRepo.Save(context.Background(), &defaultWebsite); err != nil { + return err + } + } + website, err := websiteRepo.GetFirst(commonRepo.WithByID(id)) + if err != nil { + return err + } + if err := updateNginxConfig(constant.NginxScopeServer, []dto.NginxParam{{Name: "listen", Params: []string{"80", "default_server"}}}, &website); err != nil { + return err + } + website.DefaultServer = true + return websiteRepo.Save(context.Background(), &website) +} diff --git a/backend/app/service/website_utils.go b/backend/app/service/website_utils.go index b029cda1a..1f219fe9b 100644 --- a/backend/app/service/website_utils.go +++ b/backend/app/service/website_utils.go @@ -314,10 +314,10 @@ func applySSL(website model.Website, websiteSSL model.WebsiteSSL, req request.We server.RemoveListenByBind("80") server.RemoveDirective("if", []string{"($scheme"}) case constant.HTTPToHTTPS: - server.UpdateListen("80", false) + server.UpdateListen("80", website.DefaultServer) server.AddHTTP2HTTPS() case constant.HTTPAlso: - server.UpdateListen("80", false) + server.UpdateListen("80", website.DefaultServer) server.RemoveDirective("if", []string{"($scheme"}) } diff --git a/backend/router/ro_website.go b/backend/router/ro_website.go index 82d001b46..36edce8c3 100644 --- a/backend/router/ro_website.go +++ b/backend/router/ro_website.go @@ -16,6 +16,7 @@ func (a *WebsiteRouter) InitWebsiteRouter(Router *gin.RouterGroup) { baseApi := v1.ApiGroupApp.BaseApi { groupRouter.POST("/search", baseApi.PageWebsite) + groupRouter.GET("/list", baseApi.GetWebsites) groupRouter.POST("", baseApi.CreateWebsite) groupRouter.POST("/operate", baseApi.OpWebsite) groupRouter.POST("/log", baseApi.OpWebsiteLog) @@ -40,5 +41,6 @@ func (a *WebsiteRouter) InitWebsiteRouter(Router *gin.RouterGroup) { groupRouter.POST("/waf/config", baseApi.GetWebsiteWafConfig) groupRouter.POST("/waf/update", baseApi.UpdateWebsiteWafConfig) groupRouter.POST("/nginx/update", baseApi.UpdateWebsiteNginxConfig) + groupRouter.POST("/default/server", baseApi.ChangeDefaultServer) } } diff --git a/backend/utils/nginx/components/block.go b/backend/utils/nginx/components/block.go index 0d3141a46..bbbf5a147 100644 --- a/backend/utils/nginx/components/block.go +++ b/backend/utils/nginx/components/block.go @@ -32,23 +32,6 @@ func (b *Block) FindDirectives(directiveName string) []IDirective { return directives } -//func (b *Block) UpdateDirectives(directiveName string, directive Directive) { -// directives := b.GetDirectives() -// index := -1 -// for i, dir := range directives { -// if dir.GetName() == directiveName { -// index = i -// break -// } -// } -// if index > -1 { -// directives[index] = &directive -// } else { -// directives = append(directives, &directive) -// } -// b.Directives = directives -//} - func (b *Block) UpdateDirective(key string, params []string) { if key == "" || len(params) == 0 { return diff --git a/backend/utils/nginx/components/server.go b/backend/utils/nginx/components/server.go index 1fd2b010f..01b468061 100644 --- a/backend/utils/nginx/components/server.go +++ b/backend/utils/nginx/components/server.go @@ -73,6 +73,19 @@ func (s *Server) UpdateDirective(key string, params []string) { if key == "" || len(params) == 0 { return } + if key == "listen" { + defaultServer := false + if len(params) > 1 && params[1] == "default_server" { + defaultServer = true + } + if len(params) > 2 { + s.UpdateListen(params[0], defaultServer, params[2:]...) + } else { + s.UpdateListen(params[0], defaultServer) + } + return + } + directives := s.Directives index := -1 for i, dir := range directives { diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 6fe1f70fe..d44a8c091 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -11,6 +11,7 @@ export namespace Website { appInstallId?: number; webSiteGroupId: number; otherDomains: string; + defaultServer: boolean; appinstall?: NewAppInstall; webSiteSSL: SSL; } @@ -271,4 +272,8 @@ export namespace Website { id: number; content: string; } + + export interface DefaultServerUpdate { + id: number; + } } diff --git a/frontend/src/api/modules/website.ts b/frontend/src/api/modules/website.ts index 17c9cb1d8..99da7e142 100644 --- a/frontend/src/api/modules/website.ts +++ b/frontend/src/api/modules/website.ts @@ -7,6 +7,10 @@ export const SearchWebsites = (req: Website.WebSiteSearch) => { return http.post>(`/websites/search`, req); }; +export const ListWebsites = () => { + return http.get(`/websites/list`); +}; + export const CreateWebsite = (req: Website.WebSiteCreateReq) => { return http.post(`/websites`, req); }; @@ -174,3 +178,7 @@ export const UpdateWafEnable = (req: Website.WafUpdate) => { export const UpdateNginxFile = (req: Website.NginxUpdate) => { return http.post(`/websites/nginx/update`, req); }; + +export const ChangeDefaultServer = (req: Website.DefaultServerUpdate) => { + return http.post(`/websites/default/server`, req); +}; diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 117faba6b..f9f4f592e 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -959,6 +959,8 @@ export default { nextYear: '一年后', allGroup: '所有分组', noLog: '当前没有日志...', + defaulServer: '默认网站', + noDefaulServer: '当前没有默认网站', }, nginx: { serverNamesHashBucketSizeHelper: '服务器名字的hash表大小', diff --git a/frontend/src/views/website/website/default/index.vue b/frontend/src/views/website/website/default/index.vue new file mode 100644 index 000000000..b23e879a9 --- /dev/null +++ b/frontend/src/views/website/website/default/index.vue @@ -0,0 +1,70 @@ + + diff --git a/frontend/src/views/website/website/index.vue b/frontend/src/views/website/website/index.vue index de84320c5..8c0b24c41 100644 --- a/frontend/src/views/website/website/index.vue +++ b/frontend/src/views/website/website/index.vue @@ -16,6 +16,9 @@ {{ $t('website.group') }} + + {{ $t('website.defaulServer') }} +
@@ -120,6 +123,7 @@ +
@@ -127,7 +131,6 @@ {{ $t('commons.service.serviceNotStarted', ['OpenResty']) }}
- @@ -138,6 +141,7 @@ import LayoutContent from '@/layout/layout-content.vue'; import BackupRecords from '@/views/website/website/backup/index.vue'; import UploadDialog from '@/views/website/website/upload/index.vue'; +import DefaultServer from '@/views/website/website/default/index.vue'; import ComplexTable from '@/components/complex-table/index.vue'; import { onMounted, reactive, ref } from '@vue/runtime-core'; import CreateWebSite from './create/index.vue'; @@ -181,25 +185,26 @@ let nginxStatus = ref(''); let installPath = ref(''); const uploadRef = ref(); const dialogBackupRef = ref(); +const defaultRef = ref(); const data = ref(); let dateRefs: Map = new Map(); let groups = ref([]); const paginationConfig = reactive({ currentPage: 1, - pageSize: 20, + pageSize: 15, total: 0, }); let req = reactive({ name: '', - page: paginationConfig.currentPage, - pageSize: paginationConfig.pageSize, + page: 1, + pageSize: 15, websiteGroupId: 0, }); const search = async () => { req.page = paginationConfig.currentPage; - req.pageSize = paginationConfig.currentPage; + req.pageSize = paginationConfig.pageSize; SearchWebsites(req).then((res) => { data.value = res.data.items; paginationConfig.total = res.data.total; @@ -330,6 +335,10 @@ const openGroup = () => { groupRef.value.acceptParams(); }; +const openDefault = () => { + defaultRef.value.acceptParams(); +}; + const checkExist = (data: App.CheckInstalled) => { nginxIsExist.value = data.isExist; containerName.value = data.containerName;