From 3daa0273a487ba9b4258ec94fe2ec97e3c37bec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E6=98=8A?= Date: Tue, 5 May 2026 15:09:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(news):=20=E6=94=AF=E6=8C=81=E6=96=B0?= =?UTF-8?q?=E9=97=BB=E4=B8=AD=E5=BF=83=E5=A4=9A=E7=AB=99=E7=82=B9=E9=9A=94?= =?UTF-8?q?=E7=A6=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增站点编码配置,支持新闻分类与文章按站点隔离。主要变更包括: - 数据库表增加 site_code 字段及索引 - 后台管理界面支持按站点筛选 - 前台接口支持通过查询参数或请求头指定站点 - 新增站点配置与解析逻辑 --- .idea/vcs.xml | 6 + client/env.d.ts | 4 + client/src/api/index.ts | 15 +- client/src/config/portalSite.ts | 8 + client/src/views/admin/NewsPage.vue | 61 ++++++- database/sql/migration_news_multisite.sql | 37 +++++ .../server/WuhanSagaApplication.java | 3 + .../server/config/PortalSiteProperties.java | 31 ++++ .../server/config/PortalSiteResolver.java | 54 +++++++ .../wuhansaga/server/constant/SiteCodes.java | 15 ++ .../controller/admin/AdminNewsController.java | 13 +- .../portal/PortalNewsController.java | 27 ++-- .../com/wuhansaga/server/entity/News.java | 2 + .../wuhansaga/server/entity/NewsCategory.java | 2 + .../server/mapper/NewsCategoryMapper.java | 5 +- .../wuhansaga/server/mapper/NewsMapper.java | 13 +- .../server/service/NewsCategoryService.java | 18 ++- .../wuhansaga/server/service/NewsService.java | 55 ++++++- server/src/main/resources/application.yml | 6 + server/src/main/resources/data.sql | 17 +- .../resources/mapper/NewsCategoryMapper.xml | 13 +- .../src/main/resources/mapper/NewsMapper.xml | 43 ++++- server/src/main/resources/schema.sql | 7 +- server/target/classes/application.yml | 6 + .../server/WuhanSagaApplication.class | Bin 851 -> 994 bytes .../server/common/BizException.class | Bin 673 -> 673 bytes .../wuhansaga/server/common/PageQuery.class | Bin 2148 -> 2144 bytes .../wuhansaga/server/common/PageResult.class | Bin 4112 -> 4024 bytes .../server/config/OpenApiConfig.class | Bin 2256 -> 2248 bytes .../server/config/PortalSiteProperties.class | Bin 0 -> 4153 bytes .../server/config/PortalSiteResolver.class | Bin 0 -> 2739 bytes .../wuhansaga/server/config/RedisConfig.class | Bin 3674 -> 3674 bytes .../server/config/SaTokenConfig.class | Bin 2185 -> 2190 bytes .../server/config/WebMvcConfig.class | Bin 3404 -> 3404 bytes .../wuhansaga/server/constant/SiteCodes.class | Bin 0 -> 446 bytes .../admin/AdminNewsController.class | Bin 4688 -> 5034 bytes .../admin/AdminProductLineController.class | Bin 4997 -> 4997 bytes .../portal/PortalNewsController.class | Bin 2771 -> 3707 bytes .../portal/PortalProductController.class | Bin 5011 -> 5011 bytes .../server/entity/MediaLibrary.class | Bin 12007 -> 12102 bytes .../com/wuhansaga/server/entity/News.class | Bin 15858 -> 16466 bytes .../server/entity/NewsCategory.class | Bin 7166 -> 7684 bytes .../server/entity/ProductCategory.class | Bin 9582 -> 9678 bytes .../wuhansaga/server/entity/ProductLine.class | Bin 30608 -> 30706 bytes .../server/entity/SingleEquipment.class | Bin 20999 -> 21090 bytes .../wuhansaga/server/entity/SparePart.class | Bin 20422 -> 20513 bytes .../server/mapper/CaseCategoryMapper.class | Bin 672 -> 672 bytes .../server/mapper/CompanyInfoMapper.class | Bin 426 -> 426 bytes .../server/mapper/ContactMapper.class | Bin 506 -> 506 bytes .../server/mapper/CoreTechnologyMapper.class | Bin 682 -> 682 bytes .../server/mapper/NewsCategoryMapper.class | Bin 672 -> 862 bytes .../wuhansaga/server/mapper/NewsMapper.class | Bin 1291 -> 1685 bytes .../server/mapper/ProductCategoryMapper.class | Bin 976 -> 976 bytes .../mapper/ProductLineEquipmentMapper.class | Bin 1138 -> 1138 bytes .../server/mapper/SingleEquipmentMapper.class | Bin 1249 -> 1249 bytes .../server/service/AboutService.class | Bin 2099 -> 2099 bytes .../server/service/AuthService.class | Bin 2693 -> 2693 bytes .../server/service/BannerService.class | Bin 2260 -> 2260 bytes .../server/service/CaseCategoryService.class | Bin 1984 -> 1984 bytes .../server/service/CaseStudyService.class | Bin 3106 -> 3106 bytes .../server/service/CompanyInfoService.class | Bin 2336 -> 2336 bytes .../service/CoreTechnologyService.class | Bin 2010 -> 2010 bytes .../server/service/MediaLibraryService.class | Bin 6068 -> 6080 bytes .../server/service/NewsCategoryService.class | Bin 1984 -> 2508 bytes .../server/service/NewsService.class | Bin 3285 -> 5341 bytes .../service/ProductCategoryService.class | Bin 3732 -> 3797 bytes .../server/service/ProductLineService.class | Bin 4591 -> 4591 bytes .../service/SingleEquipmentService.class | Bin 3142 -> 3142 bytes .../server/service/SparePartService.class | Bin 3052 -> 3052 bytes .../server/service/WorkshopService.class | Bin 2199 -> 2199 bytes server/target/classes/data.sql | 153 +++++++++++++----- .../classes/mapper/NewsCategoryMapper.xml | 13 +- server/target/classes/mapper/NewsMapper.xml | 43 ++++- server/target/classes/schema.sql | 29 +++- .../compile/default-compile/createdFiles.lst | 3 + .../compile/default-compile/inputFiles.lst | 4 + 76 files changed, 592 insertions(+), 114 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 client/src/config/portalSite.ts create mode 100644 database/sql/migration_news_multisite.sql create mode 100644 server/src/main/java/com/wuhansaga/server/config/PortalSiteProperties.java create mode 100644 server/src/main/java/com/wuhansaga/server/config/PortalSiteResolver.java create mode 100644 server/src/main/java/com/wuhansaga/server/constant/SiteCodes.java create mode 100644 server/target/classes/com/wuhansaga/server/config/PortalSiteProperties.class create mode 100644 server/target/classes/com/wuhansaga/server/config/PortalSiteResolver.class create mode 100644 server/target/classes/com/wuhansaga/server/constant/SiteCodes.class diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/client/env.d.ts b/client/env.d.ts index 323c78a6..65d697c5 100644 --- a/client/env.d.ts +++ b/client/env.d.ts @@ -1,5 +1,9 @@ /// +interface ImportMetaEnv { + readonly VITE_PORTAL_SITE_CODE?: string +} + declare module '*.vue' { import type { DefineComponent } from 'vue' const component: DefineComponent<{}, {}, any> diff --git a/client/src/api/index.ts b/client/src/api/index.ts index c4d63a99..05554048 100644 --- a/client/src/api/index.ts +++ b/client/src/api/index.ts @@ -1,4 +1,5 @@ import request from '@/utils/request' +import { portalSiteQueryParams } from '@/config/portalSite' export const portalApi = { getCompanyInfo: () => request.get('/portal/company'), @@ -17,9 +18,12 @@ export const portalApi = { getCaseCategories: () => request.get('/portal/case/category'), getCases: (params?: any) => request.get('/portal/case', { params }), getCaseById: (id: number) => request.get(`/portal/case/${id}`), - getNewsCategories: () => request.get('/portal/news/category'), - getNewsList: (params?: any) => request.get('/portal/news', { params }), - getNewsById: (id: number) => request.get(`/portal/news/${id}`), + getNewsCategories: () => + request.get('/portal/news/category', { params: { ...portalSiteQueryParams() } }), + getNewsList: (params?: any) => + request.get('/portal/news', { params: { ...portalSiteQueryParams(), ...params } }), + getNewsById: (id: number) => + request.get(`/portal/news/${id}`, { params: { ...portalSiteQueryParams() } }), } export const adminApi = { @@ -85,11 +89,12 @@ export const adminApi = { addCaseCategory: (data: any) => request.post('/admin/case/category', data), deleteCaseCategory: (id: number) => request.delete(`/admin/case/category/${id}`), - getNewsList: (params?: any) => request.get('/admin/news', { params }), + getNewsList: (params?: any) => request.get('/admin/news', { params: { ...params } }), addNews: (data: any) => request.post('/admin/news', data), updateNews: (data: any) => request.put('/admin/news', data), deleteNews: (id: number) => request.delete(`/admin/news/${id}`), - getNewsCategories: () => request.get('/admin/news/category'), + getNewsCategories: (params?: any) => + request.get('/admin/news/category', { params: { ...params } }), addNewsCategory: (data: any) => request.post('/admin/news/category', data), deleteNewsCategory: (id: number) => request.delete(`/admin/news/category/${id}`), diff --git a/client/src/config/portalSite.ts b/client/src/config/portalSite.ts new file mode 100644 index 00000000..388a2c99 --- /dev/null +++ b/client/src/config/portalSite.ts @@ -0,0 +1,8 @@ +/** 前台新闻等接口按站点隔离;与后端 app.portal.allowed-site-codes 一致。不设则走后端默认 site-code。 */ +export function portalSiteQueryParams(): Record { + const code = import.meta.env.VITE_PORTAL_SITE_CODE as string | undefined + if (code && String(code).trim() !== '') { + return { siteCode: String(code).trim().toLowerCase() } + } + return {} +} diff --git a/client/src/views/admin/NewsPage.vue b/client/src/views/admin/NewsPage.vue index 2f5ac55b..d3d68eeb 100644 --- a/client/src/views/admin/NewsPage.vue +++ b/client/src/views/admin/NewsPage.vue @@ -2,10 +2,19 @@
+