# hw-portal 抽离迁移指导 ## 1. 文档目的 - 本文档基于仓库内源模块 `ruoyi-portal` 做静态分析,目标是指导其按“`hw-portal` 独立代码模块”方式迁移到当前 `Admin.NET`(.NET 10)项目。 - 约束前提:数据库表结构不变、SQL 不变、方法业务逻辑不变;允许替换工具类、框架胶水代码、统一返回包装、分页封装、鉴权与注解实现。 - 当前仓库里还没有现成的 `hw-portal` 模块,因此本文档既是源码分析结果,也是后续抽离实施的基线。 ## 2. 已确认事实与不确定点 - 源模块路径:`C:/D/WORK/NewP/Admin.NET-v2/ruoyi-portal`。 - `pom.xml` 可直接确认:父工程 `com.ruoyi:ruoyi:3.9.1`,模块坐标 `ruoyi-portal`。 - 模块 `pom.xml` 直接声明的依赖只有:`com.ruoyi:ruoyi-common`。 - 由于 Spring Boot、MyBatis、Easy-ES 等版本由父 POM 继承,当前模块自身 `pom.xml` 里看不到完整版本;因此迁移指导按“版本无关 + 保留现有行为”编写。 - 你补充说明源系统是 `Spring Boot 3.5.8 + MyBatis + JDK17`;源码中也确实出现了 `jakarta.servlet`,说明至少已经是 Jakarta 体系。 - `ruoyi-portal/src/test/java` 下未发现测试源码,因此本次分析全部基于生产代码。 ## 3. 模块总体画像 - Java 源文件数:`92`。 - MyBatis XML 文件数:`15`。 - 参与源码附录的文件总数(含 `pom.xml`):`108`。 - 涉及主要数据库表:`hw_about_us_info_detail`, `hw_about_us_info`, `hw_web_visit_event`, `hw_web_visit_daily`, `hw_contact_us_info`, `hw_portal_config`, `hw_portal_config_type`, `hw_product_case_info`, `hw_product_info_detail`, `hw_product_info`, `hw_web_menu`, `hw_web`, `hw_web1`, `hw_web_document`, `hw_web_menu1`。 | 包/目录 | 文件数 | | --- | ---: | | `controller` | 17 | | `domain` | 16 | | `domain/dto` | 6 | | `domain/vo` | 1 | | `mapper` | 15 | | `search/convert` | 1 | | `search/es/entity` | 1 | | `search/es/mapper` | 1 | | `search/service` | 1 | | `search/service/impl` | 1 | | `service` | 16 | | `service/impl` | 16 | ### 3.1 功能分块 - 门户前台聚合:`HwPortalController`。 - 后台内容维护:关于我们、联系我们、门户配置、配置类型、产品、案例、页面 JSON、菜单、资料文档。 - 搜索:MySQL 联合搜索 + Easy-ES 可选搜索 + 索引重建。 - 官网分析:匿名埋点采集、日报聚合、看板排行。 - 树结构数据:配置类型树、产品明细树、菜单树。 ### 3.2 当前 Admin.NET 的推荐落点 - 结合本仓库现状,最小阻力方案是把 `hw-portal` 放进 `Admin.NET.Core`: - 实体建议放 `Admin.NET/Admin.NET.Core/Entity/HwPortal/`。 - 服务建议放 `Admin.NET/Admin.NET.Core/Service/HwPortal/`。 - DTO 建议放 `Admin.NET/Admin.NET.Core/Service/HwPortal/Dto/`。 - 若要完全隔离,也可以单独建 `Admin.NET/Plugins/Admin.NET.Plugin.HwPortal/`,但这会增加宿主注册、配置扫描、发布结构复杂度。 - 从当前项目惯例看,`IDynamicApiController + SqlSugarRepository/ISqlSugarClient + AdminResultProvider` 是最贴合现有骨架的实现方式。 - 因为你要求“SQL 不变”,所以仓储层不要把 XML SQL 改写成 SqlSugar LINQ;优先保留原 SQL 文本,通过 `ISqlSugarClient.Ado` 执行。 ## 4. 接口清单 | 控制器 | 方法名 | HTTP | 路径 | 方法签名 | 注解 | 主要调用链 | | --- | --- | --- | --- | --- | --- | --- | | `HwAboutUsInfoController` | `list` | `GET` | `/portal/aboutUsInfo/list` | `public TableDataInfo list(HwAboutUsInfo hwAboutUsInfo)` | - | hwAboutUsInfoService.selectHwAboutUsInfoList | | `HwAboutUsInfoController` | `export` | `POST` | `/portal/aboutUsInfo/export` | `public void export(HttpServletResponse response, HwAboutUsInfo hwAboutUsInfo)` | RepeatSubmit | hwAboutUsInfoService.selectHwAboutUsInfoList | | `HwAboutUsInfoController` | `getInfo` | `GET` | `/portal/aboutUsInfo/{aboutUsInfoId}` | `public AjaxResult getInfo(@PathVariable("aboutUsInfoId") Long aboutUsInfoId)` | - | hwAboutUsInfoService.selectHwAboutUsInfoByAboutUsInfoId | | `HwAboutUsInfoController` | `add` | `POST` | `/portal/aboutUsInfo` | `public AjaxResult add(@RequestBody HwAboutUsInfo hwAboutUsInfo)` | RepeatSubmit | hwAboutUsInfoService.insertHwAboutUsInfo | | `HwAboutUsInfoController` | `edit` | `PUT` | `/portal/aboutUsInfo` | `public AjaxResult edit(@RequestBody HwAboutUsInfo hwAboutUsInfo)` | RepeatSubmit | hwAboutUsInfoService.updateHwAboutUsInfo | | `HwAboutUsInfoController` | `remove` | `DELETE` | `/portal/aboutUsInfo/{aboutUsInfoIds}` | `public AjaxResult remove(@PathVariable Long[] aboutUsInfoIds)` | RepeatSubmit | hwAboutUsInfoService.deleteHwAboutUsInfoByAboutUsInfoIds | | `HwAboutUsInfoDetailController` | `list` | `GET` | `/portal/aboutUsInfoDetail/list` | `public TableDataInfo list(HwAboutUsInfoDetail hwAboutUsInfoDetail)` | - | hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailList | | `HwAboutUsInfoDetailController` | `export` | `POST` | `/portal/aboutUsInfoDetail/export` | `public void export(HttpServletResponse response, HwAboutUsInfoDetail hwAboutUsInfoDetail)` | RepeatSubmit | hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailList | | `HwAboutUsInfoDetailController` | `getInfo` | `GET` | `/portal/aboutUsInfoDetail/{usInfoDetailId}` | `public AjaxResult getInfo(@PathVariable("usInfoDetailId") Long usInfoDetailId)` | - | hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailByUsInfoDetailId | | `HwAboutUsInfoDetailController` | `add` | `POST` | `/portal/aboutUsInfoDetail` | `public AjaxResult add(@RequestBody HwAboutUsInfoDetail hwAboutUsInfoDetail)` | RepeatSubmit | hwAboutUsInfoDetailService.insertHwAboutUsInfoDetail | | `HwAboutUsInfoDetailController` | `edit` | `PUT` | `/portal/aboutUsInfoDetail` | `public AjaxResult edit(@RequestBody HwAboutUsInfoDetail hwAboutUsInfoDetail)` | RepeatSubmit | hwAboutUsInfoDetailService.updateHwAboutUsInfoDetail | | `HwAboutUsInfoDetailController` | `remove` | `DELETE` | `/portal/aboutUsInfoDetail/{usInfoDetailIds}` | `public AjaxResult remove(@PathVariable Long[] usInfoDetailIds)` | RepeatSubmit | hwAboutUsInfoDetailService.deleteHwAboutUsInfoDetailByUsInfoDetailIds | | `HwAnalyticsController` | `collect` | `POST` | `/portal/analytics/collect` | `public AjaxResult collect(@RequestBody(required = false) String body, HttpServletRequest request)` | Anonymous / RateLimiter | hwAnalyticsService.collect | | `HwAnalyticsController` | `dashboard` | `GET` | `/portal/analytics/dashboard` | `public AjaxResult dashboard(@RequestParam(value = "statDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate statDate, @RequestParam(value = "top", required = false) Integer top)` | Log | hwAnalyticsService.getDashboard | | `HwAnalyticsController` | `refreshDaily` | `POST` | `/portal/analytics/refreshDaily` | `public AjaxResult refreshDaily(@RequestParam(value = "statDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate statDate)` | Log | hwAnalyticsService.refreshDailyStat | | `HwContactUsInfoController` | `list` | `GET` | `/portal/contactUsInfo/list` | `public TableDataInfo list(HwContactUsInfo hwContactUsInfo)` | - | hwContactUsInfoService.selectHwContactUsInfoList | | `HwContactUsInfoController` | `export` | `POST` | `/portal/contactUsInfo/export` | `public void export(HttpServletResponse response, HwContactUsInfo hwContactUsInfo)` | RepeatSubmit | hwContactUsInfoService.selectHwContactUsInfoList | | `HwContactUsInfoController` | `getInfo` | `GET` | `/portal/contactUsInfo/{contactUsInfoId}` | `public AjaxResult getInfo(@PathVariable("contactUsInfoId") Long contactUsInfoId)` | - | hwContactUsInfoService.selectHwContactUsInfoByContactUsInfoId | | `HwContactUsInfoController` | `add` | `POST` | `/portal/contactUsInfo` | `public AjaxResult add(@RequestBody HwContactUsInfo hwContactUsInfo)` | RepeatSubmit | hwContactUsInfoService.insertHwContactUsInfo | | `HwContactUsInfoController` | `edit` | `PUT` | `/portal/contactUsInfo` | `public AjaxResult edit(@RequestBody HwContactUsInfo hwContactUsInfo)` | RepeatSubmit | hwContactUsInfoService.updateHwContactUsInfo | | `HwContactUsInfoController` | `remove` | `DELETE` | `/portal/contactUsInfo/{contactUsInfoIds}` | `public AjaxResult remove(@PathVariable Long[] contactUsInfoIds)` | RepeatSubmit | hwContactUsInfoService.deleteHwContactUsInfoByContactUsInfoIds | | `HwPortalConfigController` | `list` | `GET` | `/portal/portalConfig/list` | `public TableDataInfo list(HwPortalConfig hwPortalConfig)` | - | hwPortalConfigService.selectHwPortalConfigJoinList | | `HwPortalConfigController` | `export` | `POST` | `/portal/portalConfig/export` | `public void export(HttpServletResponse response, HwPortalConfig hwPortalConfig)` | RepeatSubmit | hwPortalConfigService.selectHwPortalConfigList | | `HwPortalConfigController` | `getInfo` | `GET` | `/portal/portalConfig/{portalConfigId}` | `public AjaxResult getInfo(@PathVariable("portalConfigId") Long portalConfigId)` | - | hwPortalConfigService.selectHwPortalConfigByPortalConfigId | | `HwPortalConfigController` | `add` | `POST` | `/portal/portalConfig` | `public AjaxResult add(@RequestBody HwPortalConfig hwPortalConfig)` | RepeatSubmit | hwPortalConfigService.insertHwPortalConfig | | `HwPortalConfigController` | `edit` | `PUT` | `/portal/portalConfig` | `public AjaxResult edit(@RequestBody HwPortalConfig hwPortalConfig)` | RepeatSubmit | hwPortalConfigService.updateHwPortalConfig | | `HwPortalConfigController` | `remove` | `DELETE` | `/portal/portalConfig/{portalConfigIds}` | `public AjaxResult remove(@PathVariable Long[] portalConfigIds)` | RepeatSubmit | hwPortalConfigService.deleteHwPortalConfigByPortalConfigIds | | `HwPortalConfigController` | `portalConfigTypeTree` | `GET` | `/portal/portalConfig/portalConfigTypeTree` | `public AjaxResult portalConfigTypeTree(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectPortalConfigTypeTreeList | | `HwPortalConfigTypeController` | `list` | `GET` | `/portal/portalConfigType/list` | `public AjaxResult list(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectHwPortalConfigTypeList | | `HwPortalConfigTypeController` | `export` | `POST` | `/portal/portalConfigType/export` | `public void export(HttpServletResponse response, HwPortalConfigType hwPortalConfigType)` | RepeatSubmit | hwPortalConfigTypeService.selectHwPortalConfigTypeList | | `HwPortalConfigTypeController` | `getInfo` | `GET` | `/portal/portalConfigType/{configTypeId}` | `public AjaxResult getInfo(@PathVariable("configTypeId") Long configTypeId)` | - | hwPortalConfigTypeService.selectHwPortalConfigTypeByConfigTypeId | | `HwPortalConfigTypeController` | `add` | `POST` | `/portal/portalConfigType` | `public AjaxResult add(@RequestBody HwPortalConfigType hwPortalConfigType)` | RepeatSubmit | hwPortalConfigTypeService.insertHwPortalConfigType | | `HwPortalConfigTypeController` | `edit` | `PUT` | `/portal/portalConfigType` | `public AjaxResult edit(@RequestBody HwPortalConfigType hwPortalConfigType)` | RepeatSubmit | hwPortalConfigTypeService.updateHwPortalConfigType | | `HwPortalConfigTypeController` | `remove` | `DELETE` | `/portal/portalConfigType/{configTypeIds}` | `public AjaxResult remove(@PathVariable Long[] configTypeIds)` | RepeatSubmit | hwPortalConfigTypeService.deleteHwPortalConfigTypeByConfigTypeIds | | `HwPortalController` | `getPortalConfigList` | `GET` | `/portal/portal/getPortalConfigList` | `public TableDataInfo getPortalConfigList(HwPortalConfig hwPortalConfig)` | - | hwPortalConfigService.selectHwPortalConfigList | | `HwPortalController` | `getPortalConfigTypeList` | `GET` | `/portal/portal/getPortalConfigTypeList` | `public TableDataInfo getPortalConfigTypeList(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectHwPortalConfigTypeList | | `HwPortalController` | `selectConfigTypeList` | `GET` | `/portal/portal/selectConfigTypeList` | `public TableDataInfo selectConfigTypeList(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectConfigTypeList | | `HwPortalController` | `getHomeCaseTitleList` | `GET` | `/portal/portal/getHomeCaseTitleList` | `public TableDataInfo getHomeCaseTitleList(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectHwPortalConfigTypeList | | `HwPortalController` | `getTypicalHomeCaseInfo` | `GET` | `/portal/portal/getTypicalHomeCaseInfo` | `public AjaxResult getTypicalHomeCaseInfo(HwProductCaseInfo queryProductCaseInfo)` | - | hwProductCaseInfoService.getTypicalHomeCaseInfo | | `HwPortalController` | `addContactUsInfo` | `POST` | `/portal/portal/addContactUsInfo` | `public AjaxResult addContactUsInfo(@RequestBody HwContactUsInfo hwContactUsInfo)` | RepeatSubmit | hwContactUsInfoService.insertHwContactUsInfo | | `HwPortalController` | `getProductCenterProductInfos` | `GET` | `/portal/portal/getProductCenterProductInfos` | `public AjaxResult getProductCenterProductInfos(HwProductInfo hwProductInfo)` | - | productInfoService.selectHwProductInfoJoinDetailList | | `HwPortalController` | `getProductCenterProductDetailInfos` | `GET` | `/portal/portal/getProductCenterProductDetailInfos` | `public AjaxResult getProductCenterProductDetailInfos(HwProductInfoDetail hwProductInfoDetail)` | - | hwProductInfoDetailService.selectHwProductInfoDetailList | | `HwPortalController` | `getCaseCenterCaseInfos` | `GET` | `/portal/portal/getCaseCenterCaseInfos` | `public AjaxResult getCaseCenterCaseInfos(HwProductCaseInfo hwProductCaseInfo)` | - | hwProductCaseInfoService.selectHwProductCaseInfoList | | `HwPortalController` | `getCaseCenterCaseInfo` | `GET` | `/portal/portal/getCaseCenterCaseInfo/{caseInfoId}` | `public AjaxResult getCaseCenterCaseInfo(@PathVariable("caseInfoId") Long caseInfoId)` | - | hwProductCaseInfoService.selectHwProductCaseInfoByCaseInfoId | | `HwPortalController` | `getAboutUsInfo` | `GET` | `/portal/portal/getAboutUsInfo` | `public AjaxResult getAboutUsInfo(HwAboutUsInfo hwAboutUsInfo)` | - | hwAboutUsInfoService.selectHwAboutUsInfoList | | `HwPortalController` | `getAboutUsInfoDetails` | `GET` | `/portal/portal/getAboutUsInfoDetails` | `public AjaxResult getAboutUsInfoDetails(HwAboutUsInfoDetail hwAboutUsInfoDetail)` | - | hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailList | | `HwProductCaseInfoController` | `list` | `GET` | `/portal/productCaseInfo/list` | `public TableDataInfo list(HwProductCaseInfo hwProductCaseInfo)` | - | hwProductCaseInfoService.selectHwProductCaseInfoList | | `HwProductCaseInfoController` | `export` | `POST` | `/portal/productCaseInfo/export` | `public void export(HttpServletResponse response, HwProductCaseInfo hwProductCaseInfo)` | RepeatSubmit | hwProductCaseInfoService.selectHwProductCaseInfoList | | `HwProductCaseInfoController` | `getInfo` | `GET` | `/portal/productCaseInfo/{caseInfoId}` | `public AjaxResult getInfo(@PathVariable("caseInfoId") Long caseInfoId)` | - | hwProductCaseInfoService.selectHwProductCaseInfoByCaseInfoId | | `HwProductCaseInfoController` | `add` | `POST` | `/portal/productCaseInfo` | `public AjaxResult add(@RequestBody HwProductCaseInfo hwProductCaseInfo)` | RepeatSubmit | hwProductCaseInfoService.insertHwProductCaseInfo | | `HwProductCaseInfoController` | `edit` | `PUT` | `/portal/productCaseInfo` | `public AjaxResult edit(@RequestBody HwProductCaseInfo hwProductCaseInfo)` | RepeatSubmit | hwProductCaseInfoService.updateHwProductCaseInfo | | `HwProductCaseInfoController` | `remove` | `DELETE` | `/portal/productCaseInfo/{caseInfoIds}` | `public AjaxResult remove(@PathVariable Long[] caseInfoIds)` | RepeatSubmit | hwProductCaseInfoService.deleteHwProductCaseInfoByCaseInfoIds | | `HwProductCaseInfoController` | `portalConfigTypeTree` | `GET` | `/portal/productCaseInfo/portalConfigTypeTree` | `public AjaxResult portalConfigTypeTree(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectPortalConfigTypeTreeList | | `HwProductInfoController` | `list` | `GET` | `/portal/productInfo/list` | `public TableDataInfo list(HwProductInfo hwProductInfo)` | - | hwProductInfoService.selectHwProductInfoJoinList | | `HwProductInfoController` | `export` | `POST` | `/portal/productInfo/export` | `public void export(HttpServletResponse response, HwProductInfo hwProductInfo)` | RepeatSubmit | hwProductInfoService.selectHwProductInfoList | | `HwProductInfoController` | `getInfo` | `GET` | `/portal/productInfo/{productInfoId}` | `public AjaxResult getInfo(@PathVariable("productInfoId") Long productInfoId)` | - | hwProductInfoService.selectHwProductInfoByProductInfoId | | `HwProductInfoController` | `add` | `POST` | `/portal/productInfo` | `public AjaxResult add(@RequestBody HwProductInfo hwProductInfo)` | RepeatSubmit | hwProductInfoService.insertHwProductInfo | | `HwProductInfoController` | `edit` | `PUT` | `/portal/productInfo` | `public AjaxResult edit(@RequestBody HwProductInfo hwProductInfo)` | RepeatSubmit | hwProductInfoService.updateHwProductInfo | | `HwProductInfoController` | `remove` | `DELETE` | `/portal/productInfo/{productInfoIds}` | `public AjaxResult remove(@PathVariable Long[] productInfoIds)` | RepeatSubmit | hwProductInfoService.deleteHwProductInfoByProductInfoIds | | `HwProductInfoController` | `portalConfigTypeTree` | `GET` | `/portal/productInfo/portalConfigTypeTree` | `public AjaxResult portalConfigTypeTree(HwPortalConfigType hwPortalConfigType)` | - | hwPortalConfigTypeService.selectPortalConfigTypeTreeList | | `HwProductInfoDetailController` | `list` | `GET` | `/portal/productInfoDetail/list` | `public AjaxResult list(HwProductInfoDetail hwProductInfoDetail)` | - | hwProductInfoDetailService.selectHwProductInfoDetailList | | `HwProductInfoDetailController` | `export` | `POST` | `/portal/productInfoDetail/export` | `public void export(HttpServletResponse response, HwProductInfoDetail hwProductInfoDetail)` | RepeatSubmit | hwProductInfoDetailService.selectHwProductInfoDetailList | | `HwProductInfoDetailController` | `getInfo` | `GET` | `/portal/productInfoDetail/{productInfoDetailId}` | `public AjaxResult getInfo(@PathVariable("productInfoDetailId") Long productInfoDetailId)` | - | hwProductInfoDetailService.selectHwProductInfoDetailByProductInfoDetailId | | `HwProductInfoDetailController` | `add` | `POST` | `/portal/productInfoDetail` | `public AjaxResult add(@RequestBody HwProductInfoDetail hwProductInfoDetail)` | RepeatSubmit | hwProductInfoDetailService.insertHwProductInfoDetail | | `HwProductInfoDetailController` | `edit` | `PUT` | `/portal/productInfoDetail` | `public AjaxResult edit(@RequestBody HwProductInfoDetail hwProductInfoDetail)` | RepeatSubmit | hwProductInfoDetailService.updateHwProductInfoDetail | | `HwProductInfoDetailController` | `remove` | `DELETE` | `/portal/productInfoDetail/{productInfoDetailIds}` | `public AjaxResult remove(@PathVariable Long[] productInfoDetailIds)` | RepeatSubmit | hwProductInfoDetailService.deleteHwProductInfoDetailByProductInfoDetailIds | | `HwSearchAdminController` | `rebuild` | `POST` | `/portal/search/admin/rebuild` | `public AjaxResult rebuild()` | Log | hwSearchRebuildService.rebuildAll | | `HwSearchController` | `search` | `GET` | `/portal/search` | `public AjaxResult search(@RequestParam("keyword") String keyword, @RequestParam(value = "pageNum", required = false) Integer pageNum, @RequestParam(value = "pageSize", required = false) Integer pageSize)` | RateLimiter | hwSearchService.search | | `HwSearchController` | `editSearch` | `GET` | `/portal/search/edit` | `public AjaxResult editSearch(@RequestParam("keyword") String keyword, @RequestParam(value = "pageNum", required = false) Integer pageNum, @RequestParam(value = "pageSize", required = false) Integer pageSize)` | RateLimiter | hwSearchService.searchForEdit | | `HwWebController` | `list` | `GET` | `/portal/hwWeb/list` | `public TableDataInfo list(HwWeb hwWeb)` | - | hwWebService.selectHwWebList | | `HwWebController` | `export` | `POST` | `/portal/hwWeb/export` | `public void export(HttpServletResponse response, HwWeb hwWeb)` | RepeatSubmit | hwWebService.selectHwWebList | | `HwWebController` | `getInfo` | `GET` | `/portal/hwWeb/{webCode}` | `public AjaxResult getInfo(@PathVariable("webCode") Long webCode)` | - | hwWebService.selectHwWebByWebcode | | `HwWebController` | `add` | `POST` | `/portal/hwWeb` | `public AjaxResult add(@RequestBody HwWeb hwWeb)` | RepeatSubmit | hwWebService.insertHwWeb | | `HwWebController` | `edit` | `PUT` | `/portal/hwWeb` | `public AjaxResult edit(@RequestBody HwWeb hwWeb)` | RepeatSubmit | hwWebService.updateHwWeb | | `HwWebController` | `remove` | `DELETE` | `/portal/hwWeb/{webIds}` | `public AjaxResult remove(@PathVariable Long[] webIds)` | RepeatSubmit | hwWebService.deleteHwWebByWebIds | | `HwWebController` | `getHwWebList` | `GET` | `/portal/hwWeb/getHwWebList` | `public AjaxResult getHwWebList(HwWeb HwWeb)` | - | hwWebService.selectHwWebList | | `HwWebController1` | `list` | `GET` | `/portal/hwWeb1/list` | `public TableDataInfo list(HwWeb1 HwWeb1)` | - | - | | `HwWebController1` | `export` | `POST` | `/portal/hwWeb1/export` | `public void export(HttpServletResponse response, HwWeb1 HwWeb1)` | RepeatSubmit | - | | `HwWebController1` | `getInfo` | `GET` | `/portal/hwWeb1/{webCode}` | `public AjaxResult getInfo(@PathVariable("webCode") Long webCode)` | - | - | | `HwWebController1` | `add` | `POST` | `/portal/hwWeb1` | `public AjaxResult add(@RequestBody HwWeb1 HwWeb1)` | RepeatSubmit | - | | `HwWebController1` | `edit` | `PUT` | `/portal/hwWeb1` | `public AjaxResult edit(@RequestBody HwWeb1 HwWeb1)` | RepeatSubmit | - | | `HwWebController1` | `remove` | `DELETE` | `/portal/hwWeb1/{webIds}` | `public AjaxResult remove(@PathVariable Long[] webIds)` | RepeatSubmit | - | | `HwWebController1` | `getHwWeb1List` | `GET` | `/portal/hwWeb1/getHwWeb1List` | `public AjaxResult getHwWeb1List(HwWeb1 HwWeb1)` | - | - | | `HwWebDocumentController` | `list` | `GET` | `/portal/hwWebDocument/list` | `public TableDataInfo list(HwWebDocument hwWebDocument)` | - | hwWebDocumentService.selectHwWebDocumentList | | `HwWebDocumentController` | `export` | `POST` | `/portal/hwWebDocument/export` | `public void export(HttpServletResponse response, HwWebDocument hwWebDocument)` | RepeatSubmit | hwWebDocumentService.selectHwWebDocumentList | | `HwWebDocumentController` | `getInfo` | `GET` | `/portal/hwWebDocument/{documentId}` | `public AjaxResult getInfo(@PathVariable("documentId") String documentId)` | - | hwWebDocumentService.selectHwWebDocumentByDocumentId | | `HwWebDocumentController` | `add` | `POST` | `/portal/hwWebDocument` | `public AjaxResult add(@RequestBody HwWebDocument hwWebDocument)` | RepeatSubmit | hwWebDocumentService.insertHwWebDocument | | `HwWebDocumentController` | `edit` | `PUT` | `/portal/hwWebDocument` | `public AjaxResult edit(@RequestBody HwWebDocument hwWebDocument)` | RepeatSubmit | hwWebDocumentService.updateHwWebDocument | | `HwWebDocumentController` | `remove` | `DELETE` | `/portal/hwWebDocument/{documentIds}` | `public AjaxResult remove(@PathVariable String[] documentIds)` | RepeatSubmit | hwWebDocumentService.deleteHwWebDocumentByDocumentIds | | `HwWebDocumentController` | `getSecureDocumentAddress` | `POST` | `/portal/hwWebDocument/getSecureDocumentAddress` | `public AjaxResult getSecureDocumentAddress(@RequestBody SecureDocumentRequest request)` | RepeatSubmit | hwWebDocumentService.verifyAndGetDocumentAddress | | `HwWebMenuController` | `list` | `GET` | `/portal/hwWebMenu/list` | `public AjaxResult list(HwWebMenu hwWebMenu)` | - | hwWebMenuService.selectHwWebMenuList | | `HwWebMenuController` | `export` | `POST` | `/portal/hwWebMenu/export` | `public void export(HttpServletResponse response, HwWebMenu hwWebMenu)` | RepeatSubmit | hwWebMenuService.selectHwWebMenuList | | `HwWebMenuController` | `getInfo` | `GET` | `/portal/hwWebMenu/{webMenuId}` | `public AjaxResult getInfo(@PathVariable("webMenuId") Long webMenuId)` | - | hwWebMenuService.selectHwWebMenuByWebMenuId | | `HwWebMenuController` | `add` | `POST` | `/portal/hwWebMenu` | `public AjaxResult add(@RequestBody HwWebMenu hwWebMenu)` | RepeatSubmit | hwWebMenuService.insertHwWebMenu | | `HwWebMenuController` | `edit` | `PUT` | `/portal/hwWebMenu` | `public AjaxResult edit(@RequestBody HwWebMenu hwWebMenu)` | RepeatSubmit | hwWebMenuService.updateHwWebMenu | | `HwWebMenuController` | `remove` | `DELETE` | `/portal/hwWebMenu/{webMenuIds}` | `public AjaxResult remove(@PathVariable Long[] webMenuIds)` | RepeatSubmit | hwWebMenuService.deleteHwWebMenuByWebMenuIds | | `HwWebMenuController` | `selectMenuTree` | `GET` | `/portal/hwWebMenu/selectMenuTree` | `public AjaxResult selectMenuTree(HwWebMenu hwWebMenu)` | - | hwWebMenuService.selectMenuTree | | `HwWebMenuController1` | `list` | `GET` | `/portal/hwWebMenu1/list` | `public AjaxResult list(HwWebMenu1 hwWebMenu1)` | - | - | | `HwWebMenuController1` | `export` | `POST` | `/portal/hwWebMenu1/export` | `public void export(HttpServletResponse response, HwWebMenu1 hwWebMenu1)` | RepeatSubmit | - | | `HwWebMenuController1` | `getInfo` | `GET` | `/portal/hwWebMenu1/{webMenuId}` | `public AjaxResult getInfo(@PathVariable("webMenuId") Long webMenuId)` | - | - | | `HwWebMenuController1` | `add` | `POST` | `/portal/hwWebMenu1` | `public AjaxResult add(@RequestBody HwWebMenu1 hwWebMenu1)` | RepeatSubmit | - | | `HwWebMenuController1` | `edit` | `PUT` | `/portal/hwWebMenu1` | `public AjaxResult edit(@RequestBody HwWebMenu1 hwWebMenu1)` | RepeatSubmit | - | | `HwWebMenuController1` | `remove` | `DELETE` | `/portal/hwWebMenu1/{webMenuIds}` | `public AjaxResult remove(@PathVariable Long[] webMenuIds)` | RepeatSubmit | - | | `HwWebMenuController1` | `selectMenuTree` | `GET` | `/portal/hwWebMenu1/selectMenuTree` | `public AjaxResult selectMenuTree(HwWebMenu1 hwWebMenu1)` | - | - | ## 5. 服务接口与 Mapper 方法 ### 5.1 Service 接口 | 接口 | 方法 | 返回值 | 参数 | 源文件 | | --- | --- | --- | --- | --- | | `IHwAboutUsInfoDetailService` | `deleteHwAboutUsInfoDetailByUsInfoDetailId` | `public int` | `Long usInfoDetailId` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` | | `IHwAboutUsInfoDetailService` | `deleteHwAboutUsInfoDetailByUsInfoDetailIds` | `public int` | `Long[] usInfoDetailIds` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` | | `IHwAboutUsInfoDetailService` | `insertHwAboutUsInfoDetail` | `public int` | `HwAboutUsInfoDetail hwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` | | `IHwAboutUsInfoDetailService` | `selectHwAboutUsInfoDetailByUsInfoDetailId` | `public HwAboutUsInfoDetail` | `Long usInfoDetailId` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` | | `IHwAboutUsInfoDetailService` | `selectHwAboutUsInfoDetailList` | `public List` | `HwAboutUsInfoDetail hwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` | | `IHwAboutUsInfoDetailService` | `updateHwAboutUsInfoDetail` | `public int` | `HwAboutUsInfoDetail hwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` | | `IHwAboutUsInfoService` | `deleteHwAboutUsInfoByAboutUsInfoId` | `public int` | `Long aboutUsInfoId` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` | | `IHwAboutUsInfoService` | `deleteHwAboutUsInfoByAboutUsInfoIds` | `public int` | `Long[] aboutUsInfoIds` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` | | `IHwAboutUsInfoService` | `insertHwAboutUsInfo` | `public int` | `HwAboutUsInfo hwAboutUsInfo` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` | | `IHwAboutUsInfoService` | `selectHwAboutUsInfoByAboutUsInfoId` | `public HwAboutUsInfo` | `Long aboutUsInfoId` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` | | `IHwAboutUsInfoService` | `selectHwAboutUsInfoList` | `public List` | `HwAboutUsInfo hwAboutUsInfo` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` | | `IHwAboutUsInfoService` | `updateHwAboutUsInfo` | `public int` | `HwAboutUsInfo hwAboutUsInfo` | `src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` | | `IHwAnalyticsService` | `collect` | `void` | `AnalyticsCollectRequest request, String requestIp, String requestUserAgent` | `src/main/java/com/ruoyi/portal/service/IHwAnalyticsService.java` | | `IHwAnalyticsService` | `getDashboard` | `AnalyticsDashboardDTO` | `LocalDate statDate, Integer rankLimit` | `src/main/java/com/ruoyi/portal/service/IHwAnalyticsService.java` | | `IHwAnalyticsService` | `refreshDailyStat` | `void` | `LocalDate statDate` | `src/main/java/com/ruoyi/portal/service/IHwAnalyticsService.java` | | `IHwContactUsInfoService` | `deleteHwContactUsInfoByContactUsInfoId` | `public int` | `Long contactUsInfoId` | `src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` | | `IHwContactUsInfoService` | `deleteHwContactUsInfoByContactUsInfoIds` | `public int` | `Long[] contactUsInfoIds` | `src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` | | `IHwContactUsInfoService` | `insertHwContactUsInfo` | `public int` | `HwContactUsInfo hwContactUsInfo` | `src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` | | `IHwContactUsInfoService` | `selectHwContactUsInfoByContactUsInfoId` | `public HwContactUsInfo` | `Long contactUsInfoId` | `src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` | | `IHwContactUsInfoService` | `selectHwContactUsInfoList` | `public List` | `HwContactUsInfo hwContactUsInfo` | `src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` | | `IHwContactUsInfoService` | `updateHwContactUsInfo` | `public int` | `HwContactUsInfo hwContactUsInfo` | `src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` | | `IHwPortalConfigService` | `deleteHwPortalConfigByPortalConfigId` | `public int` | `Long portalConfigId` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigService` | `deleteHwPortalConfigByPortalConfigIds` | `public int` | `Long[] portalConfigIds` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigService` | `insertHwPortalConfig` | `public int` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigService` | `selectHwPortalConfigByPortalConfigId` | `public HwPortalConfig` | `Long portalConfigId` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigService` | `selectHwPortalConfigJoinList` | `public List` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigService` | `selectHwPortalConfigList` | `public List` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigService` | `updateHwPortalConfig` | `public int` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` | | `IHwPortalConfigTypeService` | `buildPortalConfigTypeTree` | `public List` | `List portalConfigTypes` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `buildPortalConfigTypeTreeSelect` | `public List` | `List portalConfigTypes` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `deleteHwPortalConfigTypeByConfigTypeId` | `public int` | `Long configTypeId` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `deleteHwPortalConfigTypeByConfigTypeIds` | `public int` | `Long[] configTypeIds` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `insertHwPortalConfigType` | `public int` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `selectConfigTypeList` | `public List` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `selectHwPortalConfigTypeByConfigTypeId` | `public HwPortalConfigType` | `Long configTypeId` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `selectHwPortalConfigTypeList` | `public List` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `selectPortalConfigTypeTreeList` | `public List` | `HwPortalConfigType portalConfigType` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwPortalConfigTypeService` | `updateHwPortalConfigType` | `public int` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` | | `IHwProductCaseInfoService` | `deleteHwProductCaseInfoByCaseInfoId` | `public int` | `Long caseInfoId` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `deleteHwProductCaseInfoByCaseInfoIds` | `public int` | `Long[] caseInfoIds` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `getTypicalHomeCaseInfo` | `public HwProductCaseInfo` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `insertHwProductCaseInfo` | `public int` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `selectHwProductCaseInfoByCaseInfoId` | `public HwProductCaseInfo` | `Long caseInfoId` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `selectHwProductCaseInfoJoinList` | `public List` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `selectHwProductCaseInfoList` | `public List` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductCaseInfoService` | `updateHwProductCaseInfo` | `public int` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` | | `IHwProductInfoDetailService` | `deleteHwProductInfoDetailByProductInfoDetailId` | `public int` | `Long productInfoDetailId` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` | | `IHwProductInfoDetailService` | `deleteHwProductInfoDetailByProductInfoDetailIds` | `public int` | `Long[] productInfoDetailIds` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` | | `IHwProductInfoDetailService` | `insertHwProductInfoDetail` | `public int` | `HwProductInfoDetail hwProductInfoDetail` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` | | `IHwProductInfoDetailService` | `selectHwProductInfoDetailByProductInfoDetailId` | `public HwProductInfoDetail` | `Long productInfoDetailId` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` | | `IHwProductInfoDetailService` | `selectHwProductInfoDetailList` | `public List` | `HwProductInfoDetail hwProductInfoDetail` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` | | `IHwProductInfoDetailService` | `updateHwProductInfoDetail` | `public int` | `HwProductInfoDetail hwProductInfoDetail` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` | | `IHwProductInfoService` | `deleteHwProductInfoByProductInfoId` | `public int` | `Long productInfoId` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `deleteHwProductInfoByProductInfoIds` | `public int` | `Long[] productInfoIds` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `insertHwProductInfo` | `public int` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `selectHwProductInfoByProductInfoId` | `public HwProductInfo` | `Long productInfoId` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `selectHwProductInfoJoinDetailList` | `public List` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `selectHwProductInfoJoinList` | `public List` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `selectHwProductInfoList` | `public List` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwProductInfoService` | `updateHwProductInfo` | `public int` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` | | `IHwSearchRebuildService` | `rebuildAll` | `void` | `` | `src/main/java/com/ruoyi/portal/service/IHwSearchRebuildService.java` | | `IHwSearchService` | `search` | `SearchPageDTO` | `String keyword, Integer pageNum, Integer pageSize` | `src/main/java/com/ruoyi/portal/service/IHwSearchService.java` | | `IHwSearchService` | `searchForEdit` | `SearchPageDTO` | `String keyword, Integer pageNum, Integer pageSize` | `src/main/java/com/ruoyi/portal/service/IHwSearchService.java` | | `IHwWebDocumentService` | `deleteHwWebDocumentByDocumentId` | `public int` | `String documentId` | `src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` | | `IHwWebDocumentService` | `deleteHwWebDocumentByDocumentIds` | `public int` | `String[] documentIds` | `src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` | | `IHwWebDocumentService` | `insertHwWebDocument` | `public int` | `HwWebDocument hwWebDocument` | `src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` | | `IHwWebDocumentService` | `selectHwWebDocumentByDocumentId` | `public HwWebDocument` | `String documentId` | `src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` | | `IHwWebDocumentService` | `selectHwWebDocumentList` | `public List` | `HwWebDocument hwWebDocument` | `src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` | | `IHwWebDocumentService` | `updateHwWebDocument` | `public int` | `HwWebDocument hwWebDocument` | `src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` | | `IHwWebMenuService` | `deleteHwWebMenuByWebMenuId` | `public int` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService` | `deleteHwWebMenuByWebMenuIds` | `public int` | `Long[] webMenuIds` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService` | `insertHwWebMenu` | `public int` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService` | `selectHwWebMenuByWebMenuId` | `public HwWebMenu` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService` | `selectHwWebMenuList` | `public List` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService` | `selectMenuTree` | `public List` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService` | `updateHwWebMenu` | `public int` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` | | `IHwWebMenuService1` | `deleteHwWebMenuByWebMenuId` | `public int` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebMenuService1` | `deleteHwWebMenuByWebMenuIds` | `public int` | `Long[] webMenuIds` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebMenuService1` | `insertHwWebMenu` | `public int` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebMenuService1` | `selectHwWebMenuByWebMenuId` | `public HwWebMenu1` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebMenuService1` | `selectHwWebMenuList` | `public List` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebMenuService1` | `selectMenuTree` | `public List` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebMenuService1` | `updateHwWebMenu` | `public int` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` | | `IHwWebService` | `deleteHwWebByWebId` | `public int` | `Long webId` | `src/main/java/com/ruoyi/portal/service/IHwWebService.java` | | `IHwWebService` | `deleteHwWebByWebIds` | `public int` | `Long[] webIds` | `src/main/java/com/ruoyi/portal/service/IHwWebService.java` | | `IHwWebService` | `insertHwWeb` | `public int` | `HwWeb hwWeb` | `src/main/java/com/ruoyi/portal/service/IHwWebService.java` | | `IHwWebService` | `selectHwWebByWebcode` | `public HwWeb` | `Long webCode` | `src/main/java/com/ruoyi/portal/service/IHwWebService.java` | | `IHwWebService` | `selectHwWebList` | `public List` | `HwWeb hwWeb` | `src/main/java/com/ruoyi/portal/service/IHwWebService.java` | | `IHwWebService` | `updateHwWeb` | `public int` | `HwWeb hwWeb` | `src/main/java/com/ruoyi/portal/service/IHwWebService.java` | | `IHwWebService1` | `deleteHwWebByWebId` | `public int` | `Long webId` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `IHwWebService1` | `deleteHwWebByWebIds` | `public int` | `Long[] webIds` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `IHwWebService1` | `insertHwWeb` | `public int` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `IHwWebService1` | `selectHwWebByWebcode` | `public HwWeb1` | `Long webCode` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `IHwWebService1` | `selectHwWebList` | `public List` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `IHwWebService1` | `selectHwWebOne` | `public HwWeb1` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `IHwWebService1` | `updateHwWeb` | `public int` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/service/IHwWebService1.java` | | `PortalSearchEsService` | `search` | `SearchPageDTO` | `String keyword, Integer pageNum, Integer pageSize, boolean editMode` | `src/main/java/com/ruoyi/portal/search/service/PortalSearchEsService.java` | ### 5.2 Mapper 接口 | Mapper | 方法 | 返回值 | 参数 | 源文件 | | --- | --- | --- | --- | --- | | `HwAboutUsInfoDetailMapper` | `deleteHwAboutUsInfoDetailByUsInfoDetailId` | `public int` | `Long usInfoDetailId` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` | | `HwAboutUsInfoDetailMapper` | `deleteHwAboutUsInfoDetailByUsInfoDetailIds` | `public int` | `Long[] usInfoDetailIds` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` | | `HwAboutUsInfoDetailMapper` | `insertHwAboutUsInfoDetail` | `public int` | `HwAboutUsInfoDetail hwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` | | `HwAboutUsInfoDetailMapper` | `selectHwAboutUsInfoDetailByUsInfoDetailId` | `public HwAboutUsInfoDetail` | `Long usInfoDetailId` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` | | `HwAboutUsInfoDetailMapper` | `selectHwAboutUsInfoDetailList` | `public List` | `HwAboutUsInfoDetail hwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` | | `HwAboutUsInfoDetailMapper` | `updateHwAboutUsInfoDetail` | `public int` | `HwAboutUsInfoDetail hwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` | | `HwAboutUsInfoMapper` | `deleteHwAboutUsInfoByAboutUsInfoId` | `public int` | `Long aboutUsInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` | | `HwAboutUsInfoMapper` | `deleteHwAboutUsInfoByAboutUsInfoIds` | `public int` | `Long[] aboutUsInfoIds` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` | | `HwAboutUsInfoMapper` | `insertHwAboutUsInfo` | `public int` | `HwAboutUsInfo hwAboutUsInfo` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` | | `HwAboutUsInfoMapper` | `selectHwAboutUsInfoByAboutUsInfoId` | `public HwAboutUsInfo` | `Long aboutUsInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` | | `HwAboutUsInfoMapper` | `selectHwAboutUsInfoList` | `public List` | `HwAboutUsInfo hwAboutUsInfo` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` | | `HwAboutUsInfoMapper` | `updateHwAboutUsInfo` | `public int` | `HwAboutUsInfo hwAboutUsInfo` | `src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` | | `HwAnalyticsMapper` | `avgStayMs` | `Long` | `@Param("statDate") LocalDate statDate` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `countDistinctIp` | `Long` | `@Param("statDate") LocalDate statDate` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `countDistinctSessions` | `Long` | `@Param("statDate") LocalDate statDate` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `countDistinctVisitor` | `Long` | `@Param("statDate") LocalDate statDate` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `countEventByType` | `Long` | `@Param("statDate") LocalDate statDate, @Param("eventType") String eventType` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `countSinglePageSessions` | `Long` | `@Param("statDate") LocalDate statDate` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `insertVisitEvent` | `int` | `HwWebVisitEvent event` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `selectDailyByDate` | `HwWebVisitDaily` | `@Param("statDate") LocalDate statDate` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `selectTopEntryPages` | `List` | `@Param("statDate") LocalDate statDate, @Param("limit") int limit` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `selectTopHotPages` | `List` | `@Param("statDate") LocalDate statDate, @Param("limit") int limit` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `selectTopKeywords` | `List` | `@Param("statDate") LocalDate statDate, @Param("limit") int limit` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwAnalyticsMapper` | `upsertDaily` | `int` | `HwWebVisitDaily daily` | `src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` | | `HwContactUsInfoMapper` | `deleteHwContactUsInfoByContactUsInfoId` | `public int` | `Long contactUsInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` | | `HwContactUsInfoMapper` | `deleteHwContactUsInfoByContactUsInfoIds` | `public int` | `Long[] contactUsInfoIds` | `src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` | | `HwContactUsInfoMapper` | `insertHwContactUsInfo` | `public int` | `HwContactUsInfo hwContactUsInfo` | `src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` | | `HwContactUsInfoMapper` | `selectHwContactUsInfoByContactUsInfoId` | `public HwContactUsInfo` | `Long contactUsInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` | | `HwContactUsInfoMapper` | `selectHwContactUsInfoList` | `public List` | `HwContactUsInfo hwContactUsInfo` | `src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` | | `HwContactUsInfoMapper` | `updateHwContactUsInfo` | `public int` | `HwContactUsInfo hwContactUsInfo` | `src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` | | `HwPortalConfigMapper` | `deleteHwPortalConfigByPortalConfigId` | `public int` | `Long portalConfigId` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `deleteHwPortalConfigByPortalConfigIds` | `public int` | `Long[] portalConfigIds` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `insertHwPortalConfig` | `public int` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `selectHwPortalConfigByPortalConfigId` | `public HwPortalConfig` | `Long portalConfigId` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `selectHwPortalConfigJoinList` | `public List` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `selectHwPortalConfigList` | `public List` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `selectHwPortalConfigList2` | `public List` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigMapper` | `updateHwPortalConfig` | `public int` | `HwPortalConfig hwPortalConfig` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` | | `HwPortalConfigTypeMapper` | `deleteHwPortalConfigTypeByConfigTypeId` | `public int` | `Long configTypeId` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` | | `HwPortalConfigTypeMapper` | `deleteHwPortalConfigTypeByConfigTypeIds` | `public int` | `Long[] configTypeIds` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` | | `HwPortalConfigTypeMapper` | `insertHwPortalConfigType` | `public int` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` | | `HwPortalConfigTypeMapper` | `selectHwPortalConfigTypeByConfigTypeId` | `public HwPortalConfigType` | `Long configTypeId` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` | | `HwPortalConfigTypeMapper` | `selectHwPortalConfigTypeList` | `public List` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` | | `HwPortalConfigTypeMapper` | `updateHwPortalConfigType` | `public int` | `HwPortalConfigType hwPortalConfigType` | `src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` | | `HwProductCaseInfoMapper` | `deleteHwProductCaseInfoByCaseInfoId` | `public int` | `Long caseInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductCaseInfoMapper` | `deleteHwProductCaseInfoByCaseInfoIds` | `public int` | `Long[] caseInfoIds` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductCaseInfoMapper` | `insertHwProductCaseInfo` | `public int` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductCaseInfoMapper` | `selectHwProductCaseInfoByCaseInfoId` | `public HwProductCaseInfo` | `Long caseInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductCaseInfoMapper` | `selectHwProductCaseInfoJoinList` | `public List` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductCaseInfoMapper` | `selectHwProductCaseInfoList` | `public List` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductCaseInfoMapper` | `updateHwProductCaseInfo` | `public int` | `HwProductCaseInfo hwProductCaseInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` | | `HwProductInfoDetailMapper` | `deleteHwProductInfoDetailByProductInfoDetailId` | `public int` | `Long productInfoDetailId` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` | | `HwProductInfoDetailMapper` | `deleteHwProductInfoDetailByProductInfoDetailIds` | `public int` | `Long[] productInfoDetailIds` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` | | `HwProductInfoDetailMapper` | `insertHwProductInfoDetail` | `public int` | `HwProductInfoDetail hwProductInfoDetail` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` | | `HwProductInfoDetailMapper` | `selectHwProductInfoDetailByProductInfoDetailId` | `public HwProductInfoDetail` | `Long productInfoDetailId` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` | | `HwProductInfoDetailMapper` | `selectHwProductInfoDetailList` | `public List` | `HwProductInfoDetail hwProductInfoDetail` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` | | `HwProductInfoDetailMapper` | `updateHwProductInfoDetail` | `public int` | `HwProductInfoDetail hwProductInfoDetail` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` | | `HwProductInfoMapper` | `deleteHwProductInfoByProductInfoId` | `public int` | `Long productInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `deleteHwProductInfoByProductInfoIds` | `public int` | `Long[] productInfoIds` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `insertHwProductInfo` | `public int` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `selectHwProductInfoByProductInfoId` | `public HwProductInfo` | `Long productInfoId` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `selectHwProductInfoJoinDetailList` | `public List` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `selectHwProductInfoJoinList` | `public List` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `selectHwProductInfoList` | `public List` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwProductInfoMapper` | `updateHwProductInfo` | `public int` | `HwProductInfo hwProductInfo` | `src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` | | `HwSearchMapper` | `searchByKeyword` | `List` | `@Param("keyword") String keyword` | `src/main/java/com/ruoyi/portal/mapper/HwSearchMapper.java` | | `HwWebDocumentMapper` | `deleteHwWebDocumentByDocumentId` | `public int` | `String documentId` | `src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` | | `HwWebDocumentMapper` | `deleteHwWebDocumentByDocumentIds` | `public int` | `String[] documentIds` | `src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` | | `HwWebDocumentMapper` | `insertHwWebDocument` | `public int` | `HwWebDocument hwWebDocument` | `src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` | | `HwWebDocumentMapper` | `selectHwWebDocumentByDocumentId` | `public HwWebDocument` | `String documentId` | `src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` | | `HwWebDocumentMapper` | `selectHwWebDocumentList` | `public List` | `HwWebDocument hwWebDocument` | `src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` | | `HwWebDocumentMapper` | `updateHwWebDocument` | `public int` | `HwWebDocument hwWebDocument` | `src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` | | `HwWebMapper` | `deleteHwWebByWebId` | `public int` | `Long webId` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` | | `HwWebMapper` | `deleteHwWebByWebIds` | `public int` | `Long[] webIds` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` | | `HwWebMapper` | `insertHwWeb` | `public int` | `HwWeb hwWeb` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` | | `HwWebMapper` | `selectHwWebByWebcode` | `public HwWeb` | `Long webCode` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` | | `HwWebMapper` | `selectHwWebList` | `public List` | `HwWeb hwWeb` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` | | `HwWebMapper` | `updateHwWeb` | `public int` | `HwWeb hwWeb` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` | | `HwWebMapper1` | `deleteHwWebByWebId` | `public int` | `Long webId` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMapper1` | `deleteHwWebByWebIds` | `public int` | `Long[] webIds` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMapper1` | `insertHwWeb` | `public int` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMapper1` | `selectHwWebByWebcode` | `public HwWeb1` | `Long webCode` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMapper1` | `selectHwWebList` | `public List` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMapper1` | `selectHwWebOne` | `public HwWeb1` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMapper1` | `updateHwWeb` | `public int` | `HwWeb1 hwWeb1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` | | `HwWebMenuMapper` | `deleteHwWebMenuByWebMenuId` | `public int` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` | | `HwWebMenuMapper` | `deleteHwWebMenuByWebMenuIds` | `public int` | `Long[] webMenuIds` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` | | `HwWebMenuMapper` | `insertHwWebMenu` | `public int` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` | | `HwWebMenuMapper` | `selectHwWebMenuByWebMenuId` | `public HwWebMenu` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` | | `HwWebMenuMapper` | `selectHwWebMenuList` | `public List` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` | | `HwWebMenuMapper` | `updateHwWebMenu` | `public int` | `HwWebMenu hwWebMenu` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` | | `HwWebMenuMapper1` | `deleteHwWebMenuByWebMenuId` | `public int` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | | `HwWebMenuMapper1` | `deleteHwWebMenuByWebMenuIds` | `public int` | `Long[] webMenuIds` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | | `HwWebMenuMapper1` | `insertHwWebMenu` | `public int` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | | `HwWebMenuMapper1` | `selectHwWebMenuByWebMenuId` | `public HwWebMenu1` | `Long webMenuId` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | | `HwWebMenuMapper1` | `selectHwWebMenuList` | `public List` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | | `HwWebMenuMapper1` | `selectMenuTree` | `public List` | `HwWebMenu1 hwWebMenu` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | | `HwWebMenuMapper1` | `updateHwWebMenu` | `public int` | `HwWebMenu1 HwWebMenu1` | `src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` | ### 5.3 MyBatis XML 操作 | XML | 操作 | id | 涉及表 | 源文件 | | --- | --- | --- | --- | --- | | `HwAboutUsInfoDetailMapper.xml` | `DELETE` | `deleteHwAboutUsInfoDetailByUsInfoDetailId` | hw_about_us_info_detail | `src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` | | `HwAboutUsInfoDetailMapper.xml` | `DELETE` | `deleteHwAboutUsInfoDetailByUsInfoDetailIds` | hw_about_us_info_detail | `src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` | | `HwAboutUsInfoDetailMapper.xml` | `INSERT` | `insertHwAboutUsInfoDetail` | hw_about_us_info_detail | `src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` | | `HwAboutUsInfoDetailMapper.xml` | `SELECT` | `selectHwAboutUsInfoDetailByUsInfoDetailId` | hw_about_us_info_detail | `src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` | | `HwAboutUsInfoDetailMapper.xml` | `SELECT` | `selectHwAboutUsInfoDetailList` | hw_about_us_info_detail | `src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` | | `HwAboutUsInfoDetailMapper.xml` | `UPDATE` | `updateHwAboutUsInfoDetail` | hw_about_us_info_detail | `src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` | | `HwAboutUsInfoMapper.xml` | `DELETE` | `deleteHwAboutUsInfoByAboutUsInfoId` | hw_about_us_info | `src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` | | `HwAboutUsInfoMapper.xml` | `DELETE` | `deleteHwAboutUsInfoByAboutUsInfoIds` | hw_about_us_info | `src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` | | `HwAboutUsInfoMapper.xml` | `INSERT` | `insertHwAboutUsInfo` | hw_about_us_info | `src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` | | `HwAboutUsInfoMapper.xml` | `SELECT` | `selectHwAboutUsInfoByAboutUsInfoId` | hw_about_us_info | `src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` | | `HwAboutUsInfoMapper.xml` | `SELECT` | `selectHwAboutUsInfoList` | hw_about_us_info | `src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` | | `HwAboutUsInfoMapper.xml` | `UPDATE` | `updateHwAboutUsInfo` | hw_about_us_info | `src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` | | `HwAnalyticsMapper.xml` | `INSERT` | `insertVisitEvent` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `INSERT` | `upsertDaily` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `avgStayMs` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `countDistinctIp` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `countDistinctSessions` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `countDistinctVisitor` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `countEventByType` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `countSinglePageSessions` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `selectDailyByDate` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `selectTopEntryPages` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `selectTopHotPages` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwAnalyticsMapper.xml` | `SELECT` | `selectTopKeywords` | hw_web_visit_event, hw_web_visit_daily | `src/main/resources/mapper/portal/HwAnalyticsMapper.xml` | | `HwContactUsInfoMapper.xml` | `DELETE` | `deleteHwContactUsInfoByContactUsInfoId` | hw_contact_us_info | `src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` | | `HwContactUsInfoMapper.xml` | `DELETE` | `deleteHwContactUsInfoByContactUsInfoIds` | hw_contact_us_info | `src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` | | `HwContactUsInfoMapper.xml` | `INSERT` | `insertHwContactUsInfo` | hw_contact_us_info | `src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` | | `HwContactUsInfoMapper.xml` | `SELECT` | `selectHwContactUsInfoByContactUsInfoId` | hw_contact_us_info | `src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` | | `HwContactUsInfoMapper.xml` | `SELECT` | `selectHwContactUsInfoList` | hw_contact_us_info | `src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` | | `HwContactUsInfoMapper.xml` | `UPDATE` | `updateHwContactUsInfo` | hw_contact_us_info | `src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` | | `HwPortalConfigMapper.xml` | `DELETE` | `deleteHwPortalConfigByPortalConfigId` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `DELETE` | `deleteHwPortalConfigByPortalConfigIds` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `INSERT` | `insertHwPortalConfig` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `SELECT` | `selectHwPortalConfigByPortalConfigId` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `SELECT` | `selectHwPortalConfigJoinList` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `SELECT` | `selectHwPortalConfigList` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `SELECT` | `selectHwPortalConfigList2` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigMapper.xml` | `UPDATE` | `updateHwPortalConfig` | hw_portal_config, hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigMapper.xml` | | `HwPortalConfigTypeMapper.xml` | `DELETE` | `deleteHwPortalConfigTypeByConfigTypeId` | hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` | | `HwPortalConfigTypeMapper.xml` | `DELETE` | `deleteHwPortalConfigTypeByConfigTypeIds` | hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` | | `HwPortalConfigTypeMapper.xml` | `INSERT` | `insertHwPortalConfigType` | hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` | | `HwPortalConfigTypeMapper.xml` | `SELECT` | `selectHwPortalConfigTypeByConfigTypeId` | hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` | | `HwPortalConfigTypeMapper.xml` | `SELECT` | `selectHwPortalConfigTypeList` | hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` | | `HwPortalConfigTypeMapper.xml` | `UPDATE` | `updateHwPortalConfigType` | hw_portal_config_type | `src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` | | `HwProductCaseInfoMapper.xml` | `DELETE` | `deleteHwProductCaseInfoByCaseInfoId` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductCaseInfoMapper.xml` | `DELETE` | `deleteHwProductCaseInfoByCaseInfoIds` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductCaseInfoMapper.xml` | `INSERT` | `insertHwProductCaseInfo` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductCaseInfoMapper.xml` | `SELECT` | `selectHwProductCaseInfoByCaseInfoId` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductCaseInfoMapper.xml` | `SELECT` | `selectHwProductCaseInfoJoinList` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductCaseInfoMapper.xml` | `SELECT` | `selectHwProductCaseInfoList` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductCaseInfoMapper.xml` | `UPDATE` | `updateHwProductCaseInfo` | hw_product_case_info, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` | | `HwProductInfoDetailMapper.xml` | `DELETE` | `deleteHwProductInfoDetailByProductInfoDetailId` | hw_product_info_detail | `src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` | | `HwProductInfoDetailMapper.xml` | `DELETE` | `deleteHwProductInfoDetailByProductInfoDetailIds` | hw_product_info_detail | `src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` | | `HwProductInfoDetailMapper.xml` | `INSERT` | `insertHwProductInfoDetail` | hw_product_info_detail | `src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` | | `HwProductInfoDetailMapper.xml` | `SELECT` | `selectHwProductInfoDetailByProductInfoDetailId` | hw_product_info_detail | `src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` | | `HwProductInfoDetailMapper.xml` | `SELECT` | `selectHwProductInfoDetailList` | hw_product_info_detail | `src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` | | `HwProductInfoDetailMapper.xml` | `UPDATE` | `updateHwProductInfoDetail` | hw_product_info_detail | `src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` | | `HwProductInfoMapper.xml` | `DELETE` | `deleteHwProductInfoByProductInfoId` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `DELETE` | `deleteHwProductInfoByProductInfoIds` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `INSERT` | `insertHwProductInfo` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `SELECT` | `selectHwProductInfoByProductInfoId` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `SELECT` | `selectHwProductInfoJoinDetailList` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `SELECT` | `selectHwProductInfoJoinList` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `SELECT` | `selectHwProductInfoList` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwProductInfoMapper.xml` | `UPDATE` | `updateHwProductInfo` | hw_product_info, hw_product_info_detail, hw_portal_config_type | `src/main/resources/mapper/portal/HwProductInfoMapper.xml` | | `HwSearchMapper.xml` | `SELECT` | `searchByKeyword` | hw_web_menu, hw_web, hw_web1, hw_web_document, hw_portal_config_type | `src/main/resources/mapper/portal/HwSearchMapper.xml` | | `HwWebDocumentMapper.xml` | `INSERT` | `insertHwWebDocument` | hw_web_document | `src/main/resources/mapper/portal/HwWebDocumentMapper.xml` | | `HwWebDocumentMapper.xml` | `SELECT` | `selectHwWebDocumentByDocumentId` | hw_web_document | `src/main/resources/mapper/portal/HwWebDocumentMapper.xml` | | `HwWebDocumentMapper.xml` | `SELECT` | `selectHwWebDocumentList` | hw_web_document | `src/main/resources/mapper/portal/HwWebDocumentMapper.xml` | | `HwWebDocumentMapper.xml` | `UPDATE` | `deleteHwWebDocumentByDocumentId` | hw_web_document | `src/main/resources/mapper/portal/HwWebDocumentMapper.xml` | | `HwWebDocumentMapper.xml` | `UPDATE` | `deleteHwWebDocumentByDocumentIds` | hw_web_document | `src/main/resources/mapper/portal/HwWebDocumentMapper.xml` | | `HwWebDocumentMapper.xml` | `UPDATE` | `updateHwWebDocument` | hw_web_document | `src/main/resources/mapper/portal/HwWebDocumentMapper.xml` | | `HwWebMapper.xml` | `INSERT` | `insertHwWeb` | hw_web | `src/main/resources/mapper/portal/HwWebMapper.xml` | | `HwWebMapper.xml` | `SELECT` | `selectHwWebByWebcode` | hw_web | `src/main/resources/mapper/portal/HwWebMapper.xml` | | `HwWebMapper.xml` | `SELECT` | `selectHwWebList` | hw_web | `src/main/resources/mapper/portal/HwWebMapper.xml` | | `HwWebMapper.xml` | `UPDATE` | `deleteHwWebByWebId` | hw_web | `src/main/resources/mapper/portal/HwWebMapper.xml` | | `HwWebMapper.xml` | `UPDATE` | `deleteHwWebByWebIds` | hw_web | `src/main/resources/mapper/portal/HwWebMapper.xml` | | `HwWebMapper.xml` | `UPDATE` | `updateHwWeb` | hw_web | `src/main/resources/mapper/portal/HwWebMapper.xml` | | `HwWebMapper1.xml` | `INSERT` | `insertHwWeb` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMapper1.xml` | `SELECT` | `selectHwWebByWebcode` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMapper1.xml` | `SELECT` | `selectHwWebList` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMapper1.xml` | `SELECT` | `selectHwWebOne` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMapper1.xml` | `UPDATE` | `deleteHwWebByWebId` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMapper1.xml` | `UPDATE` | `deleteHwWebByWebIds` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMapper1.xml` | `UPDATE` | `updateHwWeb` | hw_web1 | `src/main/resources/mapper/portal/HwWebMapper1.xml` | | `HwWebMenuMapper.xml` | `INSERT` | `insertHwWebMenu` | hw_web_menu | `src/main/resources/mapper/portal/HwWebMenuMapper.xml` | | `HwWebMenuMapper.xml` | `SELECT` | `selectHwWebMenuByWebMenuId` | hw_web_menu | `src/main/resources/mapper/portal/HwWebMenuMapper.xml` | | `HwWebMenuMapper.xml` | `SELECT` | `selectHwWebMenuList` | hw_web_menu | `src/main/resources/mapper/portal/HwWebMenuMapper.xml` | | `HwWebMenuMapper.xml` | `UPDATE` | `deleteHwWebMenuByWebMenuId` | hw_web_menu | `src/main/resources/mapper/portal/HwWebMenuMapper.xml` | | `HwWebMenuMapper.xml` | `UPDATE` | `deleteHwWebMenuByWebMenuIds` | hw_web_menu | `src/main/resources/mapper/portal/HwWebMenuMapper.xml` | | `HwWebMenuMapper.xml` | `UPDATE` | `updateHwWebMenu` | hw_web_menu | `src/main/resources/mapper/portal/HwWebMenuMapper.xml` | | `HwWebMenuMapper1.xml` | `INSERT` | `insertHwWebMenu` | hw_web_menu1 | `src/main/resources/mapper/portal/HwWebMenuMapper1.xml` | | `HwWebMenuMapper1.xml` | `SELECT` | `selectHwWebMenuByWebMenuId` | hw_web_menu1 | `src/main/resources/mapper/portal/HwWebMenuMapper1.xml` | | `HwWebMenuMapper1.xml` | `SELECT` | `selectHwWebMenuList` | hw_web_menu1 | `src/main/resources/mapper/portal/HwWebMenuMapper1.xml` | | `HwWebMenuMapper1.xml` | `UPDATE` | `deleteHwWebMenuByWebMenuId` | hw_web_menu1 | `src/main/resources/mapper/portal/HwWebMenuMapper1.xml` | | `HwWebMenuMapper1.xml` | `UPDATE` | `deleteHwWebMenuByWebMenuIds` | hw_web_menu1 | `src/main/resources/mapper/portal/HwWebMenuMapper1.xml` | | `HwWebMenuMapper1.xml` | `UPDATE` | `updateHwWebMenu` | hw_web_menu1 | `src/main/resources/mapper/portal/HwWebMenuMapper1.xml` | ### 5.4 实体 / DTO / VO / 搜索文档清单 | 类型 | 源文件 | 直接依赖的 `ruoyi-common` 能力 | | --- | --- | --- | | `AnalyticsCollectRequest` | `src/main/java/com/ruoyi/portal/domain/dto/AnalyticsCollectRequest.java` | - | | `AnalyticsDashboardDTO` | `src/main/java/com/ruoyi/portal/domain/dto/AnalyticsDashboardDTO.java` | - | | `AnalyticsRankItemDTO` | `src/main/java/com/ruoyi/portal/domain/dto/AnalyticsRankItemDTO.java` | - | | `HwAboutUsInfo` | `src/main/java/com/ruoyi/portal/domain/HwAboutUsInfo.java` | Excel, BaseEntity | | `HwAboutUsInfoDetail` | `src/main/java/com/ruoyi/portal/domain/HwAboutUsInfoDetail.java` | Excel, BaseEntity | | `HwContactUsInfo` | `src/main/java/com/ruoyi/portal/domain/HwContactUsInfo.java` | Excel, BaseEntity | | `HwPortalConfig` | `src/main/java/com/ruoyi/portal/domain/HwPortalConfig.java` | Excel, BaseEntity | | `HwPortalConfigType` | `src/main/java/com/ruoyi/portal/domain/HwPortalConfigType.java` | Excel, BaseEntity, TreeEntity | | `HwProductCaseInfo` | `src/main/java/com/ruoyi/portal/domain/HwProductCaseInfo.java` | Excel, BaseEntity | | `HwProductInfo` | `src/main/java/com/ruoyi/portal/domain/HwProductInfo.java` | Excel, BaseEntity | | `HwProductInfoDetail` | `src/main/java/com/ruoyi/portal/domain/HwProductInfoDetail.java` | Excel, TreeEntity | | `HwWeb` | `src/main/java/com/ruoyi/portal/domain/HwWeb.java` | Excel, BaseEntity | | `HwWeb1` | `src/main/java/com/ruoyi/portal/domain/HwWeb1.java` | Excel, BaseEntity | | `HwWebDocument` | `src/main/java/com/ruoyi/portal/domain/HwWebDocument.java` | Excel, BaseEntity | | `HwWebMenu` | `src/main/java/com/ruoyi/portal/domain/HwWebMenu.java` | Excel, TreeEntity | | `HwWebMenu1` | `src/main/java/com/ruoyi/portal/domain/HwWebMenu1.java` | Excel, TreeEntity | | `HwWebVisitDaily` | `src/main/java/com/ruoyi/portal/domain/HwWebVisitDaily.java` | - | | `HwWebVisitEvent` | `src/main/java/com/ruoyi/portal/domain/HwWebVisitEvent.java` | BaseEntity | | `PortalSearchDoc` | `src/main/java/com/ruoyi/portal/search/es/entity/PortalSearchDoc.java` | - | | `SearchPageDTO` | `src/main/java/com/ruoyi/portal/domain/dto/SearchPageDTO.java` | - | | `SearchRawRecord` | `src/main/java/com/ruoyi/portal/domain/dto/SearchRawRecord.java` | - | | `SearchResultDTO` | `src/main/java/com/ruoyi/portal/domain/dto/SearchResultDTO.java` | - | | `SecureDocumentRequest` | `src/main/java/com/ruoyi/portal/domain/SecureDocumentRequest.java` | - | | `TreeSelect` | `src/main/java/com/ruoyi/portal/domain/vo/TreeSelect.java` | - | ## 6. 关键代码逻辑 ### 6.1 `HwAnalyticsServiceImpl.java` - 埋点事件白名单固定为 `page_view/page_leave/search_submit/download_click/contact_submit`。 - IP 不直接存库,而是用 `SHA-256(ip + "|hw-portal-analytics")` 计算哈希;这个固定盐值必须保持不变,否则历史统计口径会断裂。 - `collect` 每落一条事件就立即刷新当天汇总表。 - `refreshDailyStat` 的跳出率算法是 `singlePageSessionCount * 100 / sessionCount`,并四舍五入到两位小数。 ### 6.2 `HwPortalConfigServiceImpl.java` - `selectHwPortalConfigList` 根据 `portalConfigType == "2"` 在两套 SQL 之间切换:普通列表 SQL 与 `selectHwPortalConfigList2`。 - 这类“按字段切换 SQL 模板”的行为必须保留,不要在 C# 中合并成单条动态拼装 SQL。 ### 6.3 `HwPortalConfigTypeServiceImpl.java` - `selectConfigTypeList` 在带 `configTypeClassfication` 过滤时,先查全量、再补齐所有子孙节点、最后组树;这不是普通 where 过滤。 - `insertHwPortalConfigType` 会根据父节点补 `parentId/ancestors/createTime/createBy`,新增逻辑不能只做简单 Insert。 - 树构造规则是“父节点为空、0、或父节点不在当前集合中即视为根”。 ### 6.4 `HwPortalController.java` - 这是门户前台聚合控制器,不自己落库,只组合 `config/configType/product/case/contact/aboutUs` 多个服务。 - 其中 `getPortalConfigList`、`getHomeCaseTitleList` 调用了 `startPage()`;迁移到 Admin.NET 时如果要保持返回契约,需要保留分页行为而不是直接返回全部。 - `addContactUsInfo` 会在入库前写入客户端 IP,属于方法逻辑的一部分,不能省略。 ### 6.5 `HwProductCaseInfoServiceImpl.java` - `getTypicalHomeCaseInfo` 会先强制设置 `homeTypicalFlag=1`,再查询列表,然后优先返回 `typicalFlag==1` 的首条,否则回退到列表首条。 - 没有命中数据时返回的是新的空对象,不是 `null`。 ### 6.6 `HwProductInfoDetailServiceImpl.java` - `insertHwProductInfoDetail` 会根据父节点补 `parentId/ancestors/createTime/createBy`。 - 这里 `parentId == null` 和 `parentId == 0` 都被归一成根节点,迁移时要保持相同行为。 ### 6.7 `HwProductInfoServiceImpl.java` - `selectHwProductInfoJoinDetailList` 先跑 join SQL,再在内存中按 `configModal == 13` 或明细 `configModel == 13` 把明细列表转换为树。 - 树化后同时写入 `TreeEntity.children` 与 `hwProductInfoDetailList`,前端可能依赖两套字段。 ### 6.8 `HwSearchMapper.xml` - MySQL 搜索 SQL 由 5 段 `UNION ALL` 组成,只覆盖 `menu/web/web1/document/configType`。 - 每段都带固定基础分值:menu=110、web1=90、web=80、document=70、configType=65;随后服务层再叠加标题/内容命中分。 ### 6.9 `HwSearchRebuildServiceImpl.java` - 索引名固定为 `hw_portal_content`。重建流程是:存在则删索引 -> 创建索引 -> 收集文档 -> 批量写入。 - 当前仅重建 `menu/web/web1/document/configType` 五类文档,没有把 product/case/aboutUs 纳入 ES。 ### 6.10 `HwSearchServiceImpl.java` - 搜索引擎选择规则是:`search.es.enabled=true` 且 `search.engine=es` 且 ES 服务存在时优先走 ES;任一条件不满足或 ES 异常时回退 MySQL。 - MySQL 搜索先跑 `HwSearchMapper.searchByKeyword`,再在内存中做二次过滤、打分、摘要截取、高亮、分页。 - 搜索关键字限制长度 50,页大小上限 50,MySQL SQL 内部结果上限 500。 ### 6.11 `HwWebDocumentController.java` - 列表和详情接口都会把 `secretKey` 置空;当 `hasSecret=true` 时还会把 `documentAddress` 置空。 - `getSecureDocumentAddress` 捕获异常后直接把错误信息返回前端,这也是现有接口契约的一部分。 ### 6.12 `HwWebDocumentServiceImpl.java` - `updateHwWebDocument` 对 `secretKey == null` 做了特殊归一:改成空字符串,以便触发 Mapper 更新逻辑清空数据库密钥。 - `verifyAndGetDocumentAddress` 的判定规则是:数据库密钥为空则直接放行;否则要求前端传入去空格后的完全相等密钥。 - 增删改成功后会静默重建搜索索引。 ### 6.13 `HwWebMenuServiceImpl.java` - 菜单列表的树化发生在服务层,不在 SQL 里。 - 增删改成功后会静默触发搜索索引重建,失败只记日志不回滚主业务。 ### 6.14 `HwWebMenuServiceImpl1.java` - `HwWebMenu1` 是另一套菜单模型,保留了同样的树化规则,但没有搜索索引重建逻辑。 ### 6.15 `HwWebServiceImpl.java` - `updateHwWeb` 不是更新原记录,而是按 `webCode` 查重后逻辑删除旧记录,再插入一条新记录。 - 新插入前显式设置 `isDelete = "0"`,并且整个过程包在事务里。 ### 6.16 `HwWebServiceImpl1.java` - `updateHwWeb` 的唯一键是 `webCode + typeId + deviceId`,处理方式同 `HwWebServiceImpl`:先逻辑删除旧记录,再插入新记录。 ### 6.17 `PortalSearchDocConverter.java` - 对 `web/web1` 的 JSON 内容会先去 HTML,再按 JSON 递归提取可搜索文本,并跳过 `icon/url/banner/img/secretKey` 等字段。 - 路由和路由参数是在建索引阶段就写进文档,不是在查询阶段临时拼装。 ## 7. `ruoyi-common` / Spring 能力替换为 Admin.NET 的映射 | 源能力 | Admin.NET 建议替代 | | --- | --- | | `BaseController.startPage()/getDataTable()` | `SqlSugarPagedList` 或自定义分页 DTO,分页参数建议继承 `BasePageInput` | | `AjaxResult/success/error/toAjax` | `AdminResultProvider` 统一返回;业务层直接返回对象/分页对象,异常用 `Oops.Oh(...)` 或统一异常 | | `@Anonymous` | Admin.NET 的 `[AllowAnonymous]` | | `@RepeatSubmit` | Admin.NET 的 `[Idempotent]`,默认基于分布式锁与缓存去重 | | `@RateLimiter` | 当前项目已启用 `AspNetCoreRateLimit`;若要保持按接口/IP 限流,需要在中间件策略或自定义特性中落地 | | `DateUtils.getNowDate()` | `.NET` 的 `DateTime.Now` 或统一时间工具,但要保持本地时区语义 | | `SecurityUtils.getUsername()` | `UserManager.Account` / `UserManager.RealName` 视原字段含义选择 | | `IpUtils.getIpAddr()` | `HttpContext.GetRemoteIpAddressToIPv4(true)` | | `UserAgentUtils.getBrowser()/getOperatingSystem()` | `HttpContextExtension.GetClientBrowser()/GetClientOs()` 或 UA Parser | | `StringUtils` | 优先用 `string`/`string.IsNullOrWhiteSpace` 与现有扩展;需要保留 `defaultIfBlank/containsIgnoreCase` 语义 | | `MyBatis XML` | 若要求 SQL 文本完全不变,优先在 C# 仓库层用 `ISqlSugarClient.Ado.SqlQueryAsync/ExecuteCommandAsync` 执行原 SQL,避免改写成 LINQ | ### 7.1 当前模块对 `com.ruoyi.common` 的直接依赖分布 | 依赖 | 使用文件数 | | --- | ---: | | `com.ruoyi.common.annotation.Anonymous` | 16 | | `com.ruoyi.common.annotation.Excel` | 13 | | `com.ruoyi.common.annotation.Log` | 16 | | `com.ruoyi.common.annotation.RateLimiter` | 2 | | `com.ruoyi.common.annotation.RepeatSubmit` | 14 | | `com.ruoyi.common.constant.HwPortalConstants` | 1 | | `com.ruoyi.common.constant.UserConstants` | 1 | | `com.ruoyi.common.core.controller.BaseController` | 17 | | `com.ruoyi.common.core.domain.AjaxResult` | 17 | | `com.ruoyi.common.core.domain.BaseEntity` | 11 | | `com.ruoyi.common.core.domain.TreeEntity` | 4 | | `com.ruoyi.common.core.page.TableDataInfo` | 10 | | `com.ruoyi.common.enums.BusinessType` | 16 | | `com.ruoyi.common.enums.LimitType` | 2 | | `com.ruoyi.common.exception.ServiceException` | 5 | | `com.ruoyi.common.utils.DateUtils` | 9 | | `com.ruoyi.common.utils.SecurityUtils` | 2 | | `com.ruoyi.common.utils.StringUtils` | 8 | | `com.ruoyi.common.utils.http.UserAgentUtils` | 1 | | `com.ruoyi.common.utils.ip.IpUtils` | 2 | | `com.ruoyi.common.utils.poi.ExcelUtil` | 13 | ## 8. 抽离到 `hw-portal` 的实施建议 ### 8.1 分层建议 1. `Entity` 层:按原表一比一建立 C# 实体,字段名、表名、主键、逻辑删除字段保持原样,避免任何列名重命名。 2. `Repository` 层:每个 Java Mapper + XML 对应一个 C# Repository;把 XML 中的 SQL 原样保存在 `.sql` 资源、常量字符串或独立类中,通过 `ISqlSugarClient.Ado` 执行。 3. `Service` 层:严格按 Java `ServiceImpl` 的方法流程翻译,尤其是树构造、字段归一、软删再插入、索引静默重建、密钥校验、搜索打分与摘要。 4. `Api` 层:如果要兼容原前端,优先保留原 URL、HTTP Method、入参与出参结构;若统一为 Admin.NET 动态 API,需要额外做路由别名或兼容层。 ### 8.2 必须保持不变的“行为点” - 原 SQL 文本。 - 原接口路径与 HTTP 方法。 - `HwWeb/HwWeb1` 的“逻辑删旧记录再插入新记录”更新语义。 - `ancestors` 的拼接规则。 - 树根识别规则。 - 搜索路由、路由参数、打分规则、摘要截断规则、高亮 HTML。 - Analytics 的白名单事件、IP 哈希算法和固定盐值、日报刷新算法。 - 文档密钥为空时直接放行、有密钥时精确匹配。 ### 8.3 当前源码中需要特别留意的事实差异 - `SearchResultDTO` 的注释声称会覆盖 `productInfo/productDetail/caseInfo/aboutUs` 等来源,但实际 MySQL 搜索 SQL 和 ES 重建只覆盖 `menu/web/web1/document/configType`。迁移时应以“实际代码行为”为准。 - `HwWebDocumentController` 与 `HwPortalController` 都标了匿名访问,这意味着迁移后要显式放开访问,而不是默认套用后台鉴权。 - `RepeatSubmit` 在原系统大量使用,迁移后如果不补幂等控制,会出现行为退化。 ## 9. 验证清单 - 分别对 17 个 Controller 路由做契约对比,确认 URL、HTTP Method、参数名、空值行为、返回 JSON 结构一致。 - 对 15 份 Mapper XML 的 SQL 做逐条对照,确认迁移后执行的 SQL 文本与原 XML 一致。 - 对 `HwWeb/HwWeb1` 更新接口做集成测试:旧记录应被逻辑删除,新记录新增成功。 - 对配置类型树、菜单树、产品明细树做结构对比测试,确认 children 层级与根节点判定一致。 - 对搜索做双通道验证:MySQL 模式与 ES 模式都验证关键字命中、分页、高亮、编辑端路由。 - 对 Analytics 做口径验证:`collect -> daily` 的 PV/UV/IP UV/停留时长/跳出率 与原算法一致。 - 对文档密钥场景做安全验证:无密钥直接放行;有密钥时空字符串报错、错误密钥报错、正确密钥返回地址。 ## 10. 附录:完整源码基线 以下附录直接贴出 `ruoyi-portal` 当前源码与 XML,作为后续 `hw-portal` 抽离的原始对照基线。 ### `ruoyi-portal/pom.xml` ```xml ruoyi com.ruoyi 3.9.1 4.0.0 ruoyi-portal portal系统模块 com.ruoyi ruoyi-common ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwAboutUsInfoController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwAboutUsInfo; import com.ruoyi.portal.service.IHwAboutUsInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 关于我们信息Controller * * @author xins * @date 2024-12-01 */ @RestController @Anonymous//不需要登陆任何人都可以操作 @RequestMapping("/portal/aboutUsInfo") public class HwAboutUsInfoController extends BaseController { @Autowired private IHwAboutUsInfoService hwAboutUsInfoService; /** * 查询关于我们信息列表 */ //@RequiresPermissions("portalaboutUsInfo:list") @GetMapping("/list") public TableDataInfo list(HwAboutUsInfo hwAboutUsInfo) { startPage(); List list = hwAboutUsInfoService.selectHwAboutUsInfoList(hwAboutUsInfo); return getDataTable(list); } /** * 导出关于我们信息列表 */ //@RequiresPermissions("portalaboutUsInfo:export") //@Log(title = "关于我们信息", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwAboutUsInfo hwAboutUsInfo) { List list = hwAboutUsInfoService.selectHwAboutUsInfoList(hwAboutUsInfo); ExcelUtil util = new ExcelUtil(HwAboutUsInfo.class); util.exportExcel(response, list, "关于我们信息数据"); } /** * 获取关于我们信息详细信息 */ //@RequiresPermissions("portalaboutUsInfo:query") @GetMapping(value = "/{aboutUsInfoId}") public AjaxResult getInfo(@PathVariable("aboutUsInfoId") Long aboutUsInfoId) { return success(hwAboutUsInfoService.selectHwAboutUsInfoByAboutUsInfoId(aboutUsInfoId)); } /** * 新增关于我们信息 */ //@RequiresPermissions("portalaboutUsInfo:add") //@Log(title = "关于我们信息", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwAboutUsInfo hwAboutUsInfo) { return toAjax(hwAboutUsInfoService.insertHwAboutUsInfo(hwAboutUsInfo)); } /** * 修改关于我们信息 */ //@RequiresPermissions("portalaboutUsInfo:edit") //@Log(title = "关于我们信息", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwAboutUsInfo hwAboutUsInfo) { return toAjax(hwAboutUsInfoService.updateHwAboutUsInfo(hwAboutUsInfo)); } /** * 删除关于我们信息 */ //@RequiresPermissions("portalaboutUsInfo:remove") //@Log(title = "关于我们信息", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{aboutUsInfoIds}") public AjaxResult remove(@PathVariable Long[] aboutUsInfoIds) { return toAjax(hwAboutUsInfoService.deleteHwAboutUsInfoByAboutUsInfoIds(aboutUsInfoIds)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwAboutUsInfoDetailController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwAboutUsInfoDetail; import com.ruoyi.portal.service.IHwAboutUsInfoDetailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 关于我们信息明细Controller * * @author ruoyi * @date 2024-12-01 */ @RestController @RequestMapping("/portal/aboutUsInfoDetail") @Anonymous//不需要登陆任何人都可以操作 public class HwAboutUsInfoDetailController extends BaseController { @Autowired private IHwAboutUsInfoDetailService hwAboutUsInfoDetailService; /** * 查询关于我们信息明细列表 */ //@RequiresPermissions("portalaboutUsInfoDetail:list") @GetMapping("/list") public TableDataInfo list(HwAboutUsInfoDetail hwAboutUsInfoDetail) { startPage(); List list = hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailList(hwAboutUsInfoDetail); return getDataTable(list); } /** * 导出关于我们信息明细列表 */ //@RequiresPermissions("portalaboutUsInfoDetail:export") //@Log(title = "关于我们信息明细", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwAboutUsInfoDetail hwAboutUsInfoDetail) { List list = hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailList(hwAboutUsInfoDetail); ExcelUtil util = new ExcelUtil(HwAboutUsInfoDetail.class); util.exportExcel(response, list, "关于我们信息明细数据"); } /** * 获取关于我们信息明细详细信息 */ //@RequiresPermissions("portalaboutUsInfoDetail:query") @GetMapping(value = "/{usInfoDetailId}") public AjaxResult getInfo(@PathVariable("usInfoDetailId") Long usInfoDetailId) { return success(hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailByUsInfoDetailId(usInfoDetailId)); } /** * 新增关于我们信息明细 */ //@RequiresPermissions("portalaboutUsInfoDetail:add") //@Log(title = "关于我们信息明细", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwAboutUsInfoDetail hwAboutUsInfoDetail) { return toAjax(hwAboutUsInfoDetailService.insertHwAboutUsInfoDetail(hwAboutUsInfoDetail)); } /** * 修改关于我们信息明细 */ //@RequiresPermissions("portalaboutUsInfoDetail:edit") //@Log(title = "关于我们信息明细", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwAboutUsInfoDetail hwAboutUsInfoDetail) { return toAjax(hwAboutUsInfoDetailService.updateHwAboutUsInfoDetail(hwAboutUsInfoDetail)); } /** * 删除关于我们信息明细 */ //@RequiresPermissions("portalaboutUsInfoDetail:remove") //@Log(title = "关于我们信息明细", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{usInfoDetailIds}") public AjaxResult remove(@PathVariable Long[] usInfoDetailIds) { return toAjax(hwAboutUsInfoDetailService.deleteHwAboutUsInfoDetailByUsInfoDetailIds(usInfoDetailIds)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwAnalyticsController.java` ```java package com.ruoyi.portal.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.LimitType; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.portal.domain.dto.AnalyticsCollectRequest; import com.ruoyi.portal.service.IHwAnalyticsService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; /** * 官网匿名访问监控 * * @author ruoyi */ @RestController @RequestMapping("/portal/analytics") public class HwAnalyticsController extends BaseController { private final IHwAnalyticsService hwAnalyticsService; private final ObjectMapper objectMapper = new ObjectMapper(); public HwAnalyticsController(IHwAnalyticsService hwAnalyticsService) { this.hwAnalyticsService = hwAnalyticsService; } /** * 匿名访问事件采集 */ @Anonymous @RateLimiter(key = "portal_analytics_collect", time = 60, count = 240, limitType = LimitType.IP) @PostMapping(value = "/collect", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_PLAIN_VALUE}) public AjaxResult collect(@RequestBody(required = false) String body, HttpServletRequest request) { if (body == null || body.trim().isEmpty()) { return error("请求体不能为空"); } try { AnalyticsCollectRequest collectRequest = objectMapper.readValue(body, AnalyticsCollectRequest.class); hwAnalyticsService.collect(collectRequest, IpUtils.getIpAddr(request), request.getHeader("User-Agent")); return success(); } catch (Exception e) { return error("采集失败: " + e.getMessage()); } } /** * 监控看板数据 */ @Log(title = "官网访问监控", businessType = BusinessType.OTHER) @GetMapping("/dashboard") public AjaxResult dashboard(@RequestParam(value = "statDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate statDate, @RequestParam(value = "top", required = false) Integer top) { return success(hwAnalyticsService.getDashboard(statDate, top)); } /** * 刷新某日统计数据 */ @Log(title = "官网访问监控", businessType = BusinessType.OTHER) @PostMapping("/refreshDaily") public AjaxResult refreshDaily(@RequestParam(value = "statDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate statDate) { hwAnalyticsService.refreshDailyStat(statDate); return success("刷新成功"); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwContactUsInfoController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwContactUsInfo; import com.ruoyi.portal.service.IHwContactUsInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 联系我们信息Controller * * @author xins * @date 2024-12-01 */ @RestController @RequestMapping("/portal/contactUsInfo") @Anonymous//不需要登陆任何人都可以操作 public class HwContactUsInfoController extends BaseController { @Autowired private IHwContactUsInfoService hwContactUsInfoService; /** * 查询联系我们信息列表 */ //@RequiresPermissions("portalcontactUsInfo:list") @GetMapping("/list") public TableDataInfo list(HwContactUsInfo hwContactUsInfo) { startPage(); List list = hwContactUsInfoService.selectHwContactUsInfoList(hwContactUsInfo); return getDataTable(list); } /** * 导出联系我们信息列表 */ //@RequiresPermissions("portalcontactUsInfo:export") //@Log(title = "联系我们信息", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwContactUsInfo hwContactUsInfo) { List list = hwContactUsInfoService.selectHwContactUsInfoList(hwContactUsInfo); ExcelUtil util = new ExcelUtil(HwContactUsInfo.class); util.exportExcel(response, list, "联系我们信息数据"); } /** * 获取联系我们信息详细信息 */ //@RequiresPermissions("portalcontactUsInfo:query") @GetMapping(value = "/{contactUsInfoId}") public AjaxResult getInfo(@PathVariable("contactUsInfoId") Long contactUsInfoId) { return success(hwContactUsInfoService.selectHwContactUsInfoByContactUsInfoId(contactUsInfoId)); } /** * 新增联系我们信息 */ //@RequiresPermissions("portalcontactUsInfo:add") //@Log(title = "联系我们信息", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwContactUsInfo hwContactUsInfo) { return toAjax(hwContactUsInfoService.insertHwContactUsInfo(hwContactUsInfo)); } /** * 修改联系我们信息 */ //@RequiresPermissions("portalcontactUsInfo:edit") //@Log(title = "联系我们信息", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwContactUsInfo hwContactUsInfo) { return toAjax(hwContactUsInfoService.updateHwContactUsInfo(hwContactUsInfo)); } /** * 删除联系我们信息 */ //@RequiresPermissions("portalcontactUsInfo:remove") //@Log(title = "联系我们信息", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{contactUsInfoIds}") public AjaxResult remove(@PathVariable Long[] contactUsInfoIds) { return toAjax(hwContactUsInfoService.deleteHwContactUsInfoByContactUsInfoIds(contactUsInfoIds)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwPortalConfigController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwPortalConfig; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.service.IHwPortalConfigService; import com.ruoyi.portal.service.IHwPortalConfigTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 门户网站配置Controller * * @author xins * @date 2024-12-01 */ @RestController @RequestMapping("/portal/portalConfig") @Anonymous//不需要登陆任何人都可以操作 public class HwPortalConfigController extends BaseController { @Autowired private IHwPortalConfigService hwPortalConfigService; @Autowired private IHwPortalConfigTypeService hwPortalConfigTypeService; /** * 查询门户网站配置列表 */ //@RequiresPermissions("portalportalConfig:list") @GetMapping("/list") public TableDataInfo list(HwPortalConfig hwPortalConfig) { startPage(); List list = hwPortalConfigService.selectHwPortalConfigJoinList(hwPortalConfig); return getDataTable(list); } /** * 导出门户网站配置列表 */ //@RequiresPermissions("portalportalConfig:export") //@Log(title = "门户网站配置", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwPortalConfig hwPortalConfig) { List list = hwPortalConfigService.selectHwPortalConfigList(hwPortalConfig); ExcelUtil util = new ExcelUtil(HwPortalConfig.class); util.exportExcel(response, list, "门户网站配置数据"); } /** * 获取门户网站配置详细信息 */ //@RequiresPermissions("portalportalConfig:query") @GetMapping(value = "/{portalConfigId}") public AjaxResult getInfo(@PathVariable("portalConfigId") Long portalConfigId) { return success(hwPortalConfigService.selectHwPortalConfigByPortalConfigId(portalConfigId)); } /** * 新增门户网站配置 */ //@RequiresPermissions("portalportalConfig:add") //@Log(title = "门户网站配置", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwPortalConfig hwPortalConfig) { return toAjax(hwPortalConfigService.insertHwPortalConfig(hwPortalConfig)); } /** * 修改门户网站配置 */ //@RequiresPermissions("portalportalConfig:edit") //@Log(title = "门户网站配置", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwPortalConfig hwPortalConfig) { return toAjax(hwPortalConfigService.updateHwPortalConfig(hwPortalConfig)); } /** * 删除门户网站配置 */ //@RequiresPermissions("portalportalConfig:remove") //@Log(title = "门户网站配置", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{portalConfigIds}") public AjaxResult remove(@PathVariable Long[] portalConfigIds) { return toAjax(hwPortalConfigService.deleteHwPortalConfigByPortalConfigIds(portalConfigIds)); } /** * 获取门户网站配置树列表 */ //@RequiresPermissions("portalportalConfig:list") @GetMapping("/portalConfigTypeTree") public AjaxResult portalConfigTypeTree(HwPortalConfigType hwPortalConfigType) { return success(hwPortalConfigTypeService.selectPortalConfigTypeTreeList(hwPortalConfigType)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwPortalConfigTypeController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.service.IHwPortalConfigTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 门户网站配置类型Controller * * @author xins * @date 2024-12-11 */ @RestController @RequestMapping("/portal/portalConfigType") @Anonymous//不需要登陆任何人都可以操作 public class HwPortalConfigTypeController extends BaseController { @Autowired private IHwPortalConfigTypeService hwPortalConfigTypeService; /** * 查询门户网站配置类型列表 */ //@RequiresPermissions("portalportalConfigType:list") @GetMapping("/list") public AjaxResult list(HwPortalConfigType hwPortalConfigType) { List list = hwPortalConfigTypeService.selectHwPortalConfigTypeList(hwPortalConfigType); return success(list); } /** * 导出门户网站配置类型列表 */ //@RequiresPermissions("portalportalConfigType:export") //@Log(title = "门户网站配置类型", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwPortalConfigType hwPortalConfigType) { List list = hwPortalConfigTypeService.selectHwPortalConfigTypeList(hwPortalConfigType); ExcelUtil util = new ExcelUtil(HwPortalConfigType.class); util.exportExcel(response, list, "门户网站配置类型数据"); } /** * 获取门户网站配置类型详细信息 */ //@RequiresPermissions("portalportalConfigType:query") @GetMapping(value = "/{configTypeId}") public AjaxResult getInfo(@PathVariable("configTypeId") Long configTypeId) { return success(hwPortalConfigTypeService.selectHwPortalConfigTypeByConfigTypeId(configTypeId)); } /** * 新增门户网站配置类型 */ //@RequiresPermissions("portalportalConfigType:add") //@Log(title = "门户网站配置类型", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwPortalConfigType hwPortalConfigType) { return toAjax(hwPortalConfigTypeService.insertHwPortalConfigType(hwPortalConfigType)); } /** * 修改门户网站配置类型 */ //@RequiresPermissions("portalportalConfigType:edit") //@Log(title = "门户网站配置类型", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwPortalConfigType hwPortalConfigType) { return toAjax(hwPortalConfigTypeService.updateHwPortalConfigType(hwPortalConfigType)); } /** * 删除门户网站配置类型 */ //@RequiresPermissions("portalportalConfigType:remove") //@Log(title = "门户网站配置类型", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{configTypeIds}") public AjaxResult remove(@PathVariable Long[] configTypeIds) { return toAjax(hwPortalConfigTypeService.deleteHwPortalConfigTypeByConfigTypeIds(configTypeIds)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwPortalController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.*; import com.ruoyi.portal.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 门户网站前端Controller * * @author xins * @date 2024-12-12 */ @RestController @RequestMapping("/portal/portal") @Anonymous//不需要登陆任何人都可以操作 public class HwPortalController extends BaseController { @Autowired private IHwPortalConfigService hwPortalConfigService; @Autowired private IHwPortalConfigTypeService hwPortalConfigTypeService; @Autowired private IHwProductCaseInfoService hwProductCaseInfoService; @Autowired private IHwContactUsInfoService hwContactUsInfoService; @Autowired private IHwProductInfoService productInfoService; @Autowired private IHwProductInfoDetailService hwProductInfoDetailService; @Autowired private IHwAboutUsInfoService hwAboutUsInfoService; @Autowired private IHwAboutUsInfoDetailService hwAboutUsInfoDetailService; /** * 查询门户网站配置列表(首页大图,portal_config_type为1;产品中心大图,portal_config_type为2,并且需要根据portalConfigTypeId获取) */ @GetMapping("/getPortalConfigList") public TableDataInfo getPortalConfigList(HwPortalConfig hwPortalConfig) { startPage(); List list = hwPortalConfigService.selectHwPortalConfigList(hwPortalConfig); return getDataTable(list); } /** * 门户网站配置类型(首页产品中心,config_type_classfication为1,按homeConfigTypeName显示;产品中心页面上面的按configTypeName显示) */ @GetMapping("/getPortalConfigTypeList") public TableDataInfo getPortalConfigTypeList(HwPortalConfigType hwPortalConfigType) { List list = hwPortalConfigTypeService.selectHwPortalConfigTypeList(hwPortalConfigType); return getDataTable(list); } /** * 门户网站配置类型(首页产品中心,config_type_classfication为1,按homeConfigTypeName显示;产品中心页面上面的按configTypeName显示) */ @GetMapping("/selectConfigTypeList") public TableDataInfo selectConfigTypeList(HwPortalConfigType hwPortalConfigType) { List list = hwPortalConfigTypeService.selectConfigTypeList(hwPortalConfigType); return getDataTable(list); } /** * 获取首页案例tab title(例如物联网、制造中心和快递物流) */ @GetMapping("/getHomeCaseTitleList") public TableDataInfo getHomeCaseTitleList(HwPortalConfigType hwPortalConfigType) { startPage(); List list = hwPortalConfigTypeService.selectHwPortalConfigTypeList(hwPortalConfigType); return getDataTable(list); } /** * 获取首页案例信息 */ @GetMapping("/getTypicalHomeCaseInfo") public AjaxResult getTypicalHomeCaseInfo(HwProductCaseInfo queryProductCaseInfo) { HwProductCaseInfo hwProductCaseInfo = hwProductCaseInfoService.getTypicalHomeCaseInfo(queryProductCaseInfo); return success(hwProductCaseInfo); } /** * 新增联系我们 */ //@Log(title = "联系我们", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping("/addContactUsInfo") public AjaxResult addContactUsInfo(@RequestBody HwContactUsInfo hwContactUsInfo) { hwContactUsInfo.setUserIp(IpUtils.getIpAddr()); return toAjax(hwContactUsInfoService.insertHwContactUsInfo(hwContactUsInfo)); } /** * 获取产品中心产品信息(平台简介,hw_product_info获取,(配置模式2左标题+内容,右图片)读取中文标题和英文标题,下面内容从hw_product_info_detail获取,读取标题,内容和图片) */ @GetMapping("/getProductCenterProductInfos") public AjaxResult getProductCenterProductInfos(HwProductInfo hwProductInfo) { // 配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8左图右列表9上图下内容,一行4个) return success(productInfoService.selectHwProductInfoJoinDetailList(hwProductInfo)); } /** * 产品中心如果tab的话,根据tab的product_info_detail_id获取children productinfodetail * @param hwProductInfoDetail * @return */ @GetMapping("/getProductCenterProductDetailInfos") public AjaxResult getProductCenterProductDetailInfos(HwProductInfoDetail hwProductInfoDetail) { // productinfodetail的config_modal 配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8一张图9上图下内容,一行4个) return success(hwProductInfoDetailService.selectHwProductInfoDetailList(hwProductInfoDetail)); } /** * 产品中心如果tab的话,根据tab的portalconfigtypeid获取productcaseinfo * @param hwProductCaseInfo * @return */ @GetMapping("/getCaseCenterCaseInfos") public AjaxResult getCaseCenterCaseInfos(HwProductCaseInfo hwProductCaseInfo) { return success(hwProductCaseInfoService.selectHwProductCaseInfoList(hwProductCaseInfo)); } /** * 根据案例ID获取案例详情 * @param caseInfoId * @return */ @GetMapping("/getCaseCenterCaseInfo/{caseInfoId}") public AjaxResult getCaseCenterCaseInfo(@PathVariable("caseInfoId") Long caseInfoId) { return success(hwProductCaseInfoService.selectHwProductCaseInfoByCaseInfoId(caseInfoId)); } /** * 获取关于我们信息 * @param hwAboutUsInfo * @return */ @GetMapping("/getAboutUsInfo") public AjaxResult getAboutUsInfo(HwAboutUsInfo hwAboutUsInfo) { return success(hwAboutUsInfoService.selectHwAboutUsInfoList(hwAboutUsInfo)); } /** * 获取关于我们信息详情 * @param hwAboutUsInfoDetail * @return */ @GetMapping("/getAboutUsInfoDetails") public AjaxResult getAboutUsInfoDetails(HwAboutUsInfoDetail hwAboutUsInfoDetail) { return success(hwAboutUsInfoDetailService.selectHwAboutUsInfoDetailList(hwAboutUsInfoDetail)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwProductCaseInfoController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.HwProductCaseInfo; import com.ruoyi.portal.service.IHwPortalConfigTypeService; import com.ruoyi.portal.service.IHwProductCaseInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 案例内容Controller * * @author xins * @date 2024-12-01 */ @RestController @RequestMapping("/portal/productCaseInfo") @Anonymous//不需要登陆任何人都可以操作 public class HwProductCaseInfoController extends BaseController { @Autowired private IHwProductCaseInfoService hwProductCaseInfoService; @Autowired private IHwPortalConfigTypeService hwPortalConfigTypeService; /** * 查询案例内容列表 */ //@RequiresPermissions("portalproductCaseInfo:list") @GetMapping("/list") public TableDataInfo list(HwProductCaseInfo hwProductCaseInfo) { startPage(); List list = hwProductCaseInfoService.selectHwProductCaseInfoList(hwProductCaseInfo); return getDataTable(list); } /** * 导出案例内容列表 */ //@RequiresPermissions("portalproductCaseInfo:export") //@Log(title = "案例内容", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwProductCaseInfo hwProductCaseInfo) { List list = hwProductCaseInfoService.selectHwProductCaseInfoList(hwProductCaseInfo); ExcelUtil util = new ExcelUtil(HwProductCaseInfo.class); util.exportExcel(response, list, "案例内容数据"); } /** * 获取案例内容详细信息 */ //@RequiresPermissions("portalproductCaseInfo:query") @GetMapping(value = "/{caseInfoId}") public AjaxResult getInfo(@PathVariable("caseInfoId") Long caseInfoId) { return success(hwProductCaseInfoService.selectHwProductCaseInfoByCaseInfoId(caseInfoId)); } /** * 新增案例内容 */ //@RequiresPermissions("portalproductCaseInfo:add") //@Log(title = "案例内容", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwProductCaseInfo hwProductCaseInfo) { return toAjax(hwProductCaseInfoService.insertHwProductCaseInfo(hwProductCaseInfo)); } /** * 修改案例内容 */ //@RequiresPermissions("portalproductCaseInfo:edit") //@Log(title = "案例内容", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwProductCaseInfo hwProductCaseInfo) { return toAjax(hwProductCaseInfoService.updateHwProductCaseInfo(hwProductCaseInfo)); } /** * 删除案例内容 */ //@RequiresPermissions("portalproductCaseInfo:remove") //@Log(title = "案例内容", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{caseInfoIds}") public AjaxResult remove(@PathVariable Long[] caseInfoIds) { return toAjax(hwProductCaseInfoService.deleteHwProductCaseInfoByCaseInfoIds(caseInfoIds)); } /** * 查询门户网站配置类型s树列表 */ /** * 获取门户网站配置树列表 */ //@RequiresPermissions("portalproductCaseInfo:list") @GetMapping("/portalConfigTypeTree") public AjaxResult portalConfigTypeTree(HwPortalConfigType hwPortalConfigType) { return success(hwPortalConfigTypeService.selectPortalConfigTypeTreeList(hwPortalConfigType)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwProductInfoController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.HwProductInfo; import com.ruoyi.portal.service.IHwPortalConfigTypeService; import com.ruoyi.portal.service.IHwProductInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 产品信息配置Controller * * @author xins * @date 2024-12-01 */ @RestController @RequestMapping("/portal/productInfo") @Anonymous//不需要登陆任何人都可以操作 public class HwProductInfoController extends BaseController { @Autowired private IHwProductInfoService hwProductInfoService; @Autowired private IHwPortalConfigTypeService hwPortalConfigTypeService; /** * 查询产品信息配置列表 */ //@RequiresPermissions("portalproductInfo:list") @GetMapping("/list") public TableDataInfo list(HwProductInfo hwProductInfo) { startPage(); List list = hwProductInfoService.selectHwProductInfoJoinList(hwProductInfo); return getDataTable(list); } /** * 导出产品信息配置列表 */ //@RequiresPermissions("portalproductInfo:export") //@Log(title = "产品信息配置", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwProductInfo hwProductInfo) { List list = hwProductInfoService.selectHwProductInfoList(hwProductInfo); ExcelUtil util = new ExcelUtil(HwProductInfo.class); util.exportExcel(response, list, "产品信息配置数据"); } /** * 获取产品信息配置详细信息 */ //@RequiresPermissions("portalproductInfo:query") @GetMapping(value = "/{productInfoId}") public AjaxResult getInfo(@PathVariable("productInfoId") Long productInfoId) { return success(hwProductInfoService.selectHwProductInfoByProductInfoId(productInfoId)); } /** * 新增产品信息配置 */ //@RequiresPermissions("portalproductInfo:add") //@Log(title = "产品信息配置", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwProductInfo hwProductInfo) { return toAjax(hwProductInfoService.insertHwProductInfo(hwProductInfo)); } /** * 修改产品信息配置 */ //@RequiresPermissions("portalproductInfo:edit") //@Log(title = "产品信息配置", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwProductInfo hwProductInfo) { return toAjax(hwProductInfoService.updateHwProductInfo(hwProductInfo)); } /** * 删除产品信息配置 */ //@RequiresPermissions("portalproductInfo:remove") //@Log(title = "产品信息配置", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{productInfoIds}") public AjaxResult remove(@PathVariable Long[] productInfoIds) { return toAjax(hwProductInfoService.deleteHwProductInfoByProductInfoIds(productInfoIds)); } /** * 查询门户网站配置类型s树列表 */ /** * 获取门户网站配置树列表 */ //@RequiresPermissions("portalproductInfo:list") @GetMapping("/portalConfigTypeTree") public AjaxResult portalConfigTypeTree(HwPortalConfigType hwPortalConfigType) { return success(hwPortalConfigTypeService.selectPortalConfigTypeTreeList(hwPortalConfigType)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwProductInfoDetailController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwProductInfoDetail; import com.ruoyi.portal.service.IHwProductInfoDetailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * 产品信息明细配置Controller * * @author xins * @date 2024-12-11 */ @RestController @RequestMapping("/portal/productInfoDetail") @Anonymous//不需要登陆任何人都可以操作 public class HwProductInfoDetailController extends BaseController { @Autowired private IHwProductInfoDetailService hwProductInfoDetailService; /** * 查询产品信息明细配置列表 */ //@RequiresPermissions("portalproductInfoDetail:list") @GetMapping("/list") public AjaxResult list(HwProductInfoDetail hwProductInfoDetail) { List list = hwProductInfoDetailService.selectHwProductInfoDetailList(hwProductInfoDetail); return success(list); } /** * 导出产品信息明细配置列表 */ //@RequiresPermissions("portalproductInfoDetail:export") //@Log(title = "产品信息明细配置", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwProductInfoDetail hwProductInfoDetail) { List list = hwProductInfoDetailService.selectHwProductInfoDetailList(hwProductInfoDetail); ExcelUtil util = new ExcelUtil(HwProductInfoDetail.class); util.exportExcel(response, list, "产品信息明细配置数据"); } /** * 获取产品信息明细配置详细信息 */ //@RequiresPermissions("portalproductInfoDetail:query") @GetMapping(value = "/{productInfoDetailId}") public AjaxResult getInfo(@PathVariable("productInfoDetailId") Long productInfoDetailId) { return success(hwProductInfoDetailService.selectHwProductInfoDetailByProductInfoDetailId(productInfoDetailId)); } /** * 新增产品信息明细配置 */ //@RequiresPermissions("portalproductInfoDetail:add") //@Log(title = "产品信息明细配置", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwProductInfoDetail hwProductInfoDetail) { return toAjax(hwProductInfoDetailService.insertHwProductInfoDetail(hwProductInfoDetail)); } /** * 修改产品信息明细配置 */ //@RequiresPermissions("portalproductInfoDetail:edit") //@Log(title = "产品信息明细配置", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwProductInfoDetail hwProductInfoDetail) { return toAjax(hwProductInfoDetailService.updateHwProductInfoDetail(hwProductInfoDetail)); } /** * 删除产品信息明细配置 */ //@RequiresPermissions("portalproductInfoDetail:remove") //@Log(title = "产品信息明细配置", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{productInfoDetailIds}") public AjaxResult remove(@PathVariable Long[] productInfoDetailIds) { return toAjax(hwProductInfoDetailService.deleteHwProductInfoDetailByProductInfoDetailIds(productInfoDetailIds)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwSearchAdminController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.service.IHwSearchRebuildService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 搜索索引管理接口 * * @author ruoyi */ @RestController @RequestMapping("/portal/search/admin") public class HwSearchAdminController extends BaseController { private final IHwSearchRebuildService hwSearchRebuildService; public HwSearchAdminController(IHwSearchRebuildService hwSearchRebuildService) { this.hwSearchRebuildService = hwSearchRebuildService; } /** * 全量重建 ES 索引 */ @Log(title = "门户搜索索引", businessType = BusinessType.OTHER) @PostMapping("/rebuild") public AjaxResult rebuild() { hwSearchRebuildService.rebuildAll(); return success("重建完成"); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwSearchController.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.LimitType; import com.ruoyi.portal.service.IHwSearchService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * 门户关键词搜索 * * @author ruoyi */ @RestController @RequestMapping("/portal/search") @Anonymous public class HwSearchController extends BaseController { private final IHwSearchService hwSearchService; public HwSearchController(IHwSearchService hwSearchService) { this.hwSearchService = hwSearchService; } /** * 门户搜索(展示端) */ @GetMapping @RateLimiter(key = "portal_search", time = 60, count = 120, limitType = LimitType.IP) public AjaxResult search(@RequestParam("keyword") String keyword, @RequestParam(value = "pageNum", required = false) Integer pageNum, @RequestParam(value = "pageSize", required = false) Integer pageSize) { return success(hwSearchService.search(keyword, pageNum, pageSize)); } /** * 编辑端搜索 */ @GetMapping("/edit") @RateLimiter(key = "portal_search_edit", time = 60, count = 120, limitType = LimitType.IP) public AjaxResult editSearch(@RequestParam("keyword") String keyword, @RequestParam(value = "pageNum", required = false) Integer pageNum, @RequestParam(value = "pageSize", required = false) Integer pageSize) { return success(hwSearchService.searchForEdit(keyword, pageNum, pageSize)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwWebController.java` ```java package com.ruoyi.portal.controller; import java.util.List; import java.io.IOException; import jakarta.servlet.http.HttpServletResponse; import com.ruoyi.portal.domain.HwWeb1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwWeb; import com.ruoyi.portal.service.IHwWebService; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * haiwei官网jsonController * * @author ruoyi * @date 2025-08-18 */ @RestController @RequestMapping("/portal/hwWeb") @Anonymous//不需要登陆任何人都可以操作 public class HwWebController extends BaseController { @Autowired private IHwWebService hwWebService; /** * 查询haiwei官网json列表 */ //@RequiresPermissions("portalhwWeb:list") @GetMapping("/list") public TableDataInfo list(HwWeb hwWeb) { // startPage(); List list = hwWebService.selectHwWebList(hwWeb); return getDataTable(list); } /** * 导出haiwei官网json列表 */ //@RequiresPermissions("portalhwWeb:export") //@Log(title = "haiwei官网json", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwWeb hwWeb) { List list = hwWebService.selectHwWebList(hwWeb); ExcelUtil util = new ExcelUtil(HwWeb.class); util.exportExcel(response, list, "haiwei官网json数据"); } /** * 获取haiwei官网json详细信息 */ //@RequiresPermissions("portalhwWeb:query") @GetMapping(value = "/{webCode}") public AjaxResult getInfo(@PathVariable("webCode") Long webCode) { return success(hwWebService.selectHwWebByWebcode(webCode)); } /** * 新增haiwei官网json */ //@RequiresPermissions("portalhwWeb:add") //@Log(title = "haiwei官网json", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwWeb hwWeb) { return toAjax(hwWebService.insertHwWeb(hwWeb)); } /** * 修改haiwei官网json */ //@RequiresPermissions("portalhwWeb:edit") //@Log(title = "haiwei官网json", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwWeb hwWeb) { int i = hwWebService.updateHwWeb(hwWeb); return toAjax(i); } /** * 删除haiwei官网json */ //@RequiresPermissions("portalhwWeb:remove") //@Log(title = "haiwei官网json", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{webIds}") public AjaxResult remove(@PathVariable Long[] webIds) { return toAjax(hwWebService.deleteHwWebByWebIds(webIds)); } @GetMapping("/getHwWebList") public AjaxResult getHwWebList(HwWeb HwWeb) { return success(hwWebService.selectHwWebList(HwWeb)) ; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwWebController1.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwWeb1; import com.ruoyi.portal.service.IHwWebService1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * haiwei官网jsonController * * @author ruoyi * @date 2025-08-18 */ @RestController @RequestMapping("/portal/hwWeb1") @Anonymous//不需要登陆任何人都可以操作 public class HwWebController1 extends BaseController { @Autowired private IHwWebService1 hwWebService1; /** * 查询haiwei官网json列表 */ //@RequiresPermissions("portalhwWeb:list") @GetMapping("/list") public TableDataInfo list(HwWeb1 HwWeb1) { // startPage(); List list = hwWebService1.selectHwWebList(HwWeb1); return getDataTable(list); } /** * 导出haiwei官网json列表 */ //@RequiresPermissions("portalhwWeb:export") //@Log(title = "haiwei官网json", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwWeb1 HwWeb1) { List list = hwWebService1.selectHwWebList(HwWeb1); ExcelUtil util = new ExcelUtil(HwWeb1.class); util.exportExcel(response, list, "haiwei官网json数据"); } /** * 获取haiwei官网json详细信息 */ //@RequiresPermissions("portalhwWeb:query") @GetMapping(value = "/{webCode}") public AjaxResult getInfo(@PathVariable("webCode") Long webCode) { return success(hwWebService1.selectHwWebByWebcode(webCode)); } /** * 新增haiwei官网json */ //@RequiresPermissions("portalhwWeb:add") //@Log(title = "haiwei官网json", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwWeb1 HwWeb1) { return toAjax(hwWebService1.insertHwWeb(HwWeb1)); } /** * 修改haiwei官网json */ //@RequiresPermissions("portalhwWeb:edit") //@Log(title = "haiwei官网json", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwWeb1 HwWeb1) { int i = hwWebService1.updateHwWeb(HwWeb1); return toAjax(i); } /** * 删除haiwei官网json */ //@RequiresPermissions("portalhwWeb:remove") //@Log(title = "haiwei官网json", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{webIds}") public AjaxResult remove(@PathVariable Long[] webIds) { return toAjax(hwWebService1.deleteHwWebByWebIds(webIds)); } @GetMapping("/getHwWeb1List") public AjaxResult getHwWeb1List(HwWeb1 HwWeb1) { return success(hwWebService1.selectHwWebList(HwWeb1)) ; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwWebDocumentController.java` ```java package com.ruoyi.portal.controller; import java.util.List; import java.io.IOException; import jakarta.servlet.http.HttpServletResponse; import com.ruoyi.portal.domain.SecureDocumentRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwWebDocument; import com.ruoyi.portal.service.IHwWebDocumentService; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * Hw资料文件Controller * * @author zch * @date 2025-09-22 */ @RestController @RequestMapping("/portal/hwWebDocument") @Anonymous//不需要登陆任何人都可以操作 public class HwWebDocumentController extends BaseController { @Autowired private IHwWebDocumentService hwWebDocumentService; /** * 查询Hw资料文件列表 */ // @RequiresPermissions("portal:hwWebDocument:list") @GetMapping("/list") public TableDataInfo list(HwWebDocument hwWebDocument) { startPage(); List list = hwWebDocumentService.selectHwWebDocumentList(hwWebDocument); for (HwWebDocument doc : list) { // 隐藏密钥,若设置了密钥则隐藏文件地址 doc.setSecretKey(null); if (doc.getHasSecret()) { doc.setDocumentAddress(null); } } return getDataTable(list); } /** * 导出Hw资料文件列表 */ // @RequiresPermissions("portal:hwWebDocument:export") //@Log(title = "Hw资料文件", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwWebDocument hwWebDocument) { List list = hwWebDocumentService.selectHwWebDocumentList(hwWebDocument); ExcelUtil util = new ExcelUtil(HwWebDocument.class); util.exportExcel(response, list, "Hw资料文件数据"); } /** * 获取Hw资料文件详细信息 */ // @RequiresPermissions("portal:hwWebDocument:query") @GetMapping(value = "/{documentId}") public AjaxResult getInfo(@PathVariable("documentId") String documentId) { HwWebDocument doc = hwWebDocumentService.selectHwWebDocumentByDocumentId(documentId); if (doc != null) { // 隐藏密钥,若设置了密钥则隐藏文件地址 doc.setSecretKey(null); if (doc.getHasSecret()) { doc.setDocumentAddress(null); } } return success(doc); } /** * 新增Hw资料文件 */ // @RequiresPermissions("portal:hwWebDocument:add") //@Log(title = "Hw资料文件", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwWebDocument hwWebDocument) { return toAjax(hwWebDocumentService.insertHwWebDocument(hwWebDocument)); } /** * 修改Hw资料文件 */ // @RequiresPermissions("portal:hwWebDocument:edit") //@Log(title = "Hw资料文件", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwWebDocument hwWebDocument) { System.out.println(hwWebDocument.getSecretKey()); return toAjax(hwWebDocumentService.updateHwWebDocument(hwWebDocument)); } /** * 删除Hw资料文件 */ // @RequiresPermissions("portal:hwWebDocument:remove") //@Log(title = "Hw资料文件", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{documentIds}") public AjaxResult remove(@PathVariable String[] documentIds) { return toAjax(hwWebDocumentService.deleteHwWebDocumentByDocumentIds(documentIds)); } /** * 获取安全文件地址 */ // @RequiresPermissions("portal:hwWebDocument:query") //@Log(title = "获取安全文件地址", businessType = BusinessType.OTHER) @RepeatSubmit @PostMapping("/getSecureDocumentAddress") public AjaxResult getSecureDocumentAddress(@RequestBody SecureDocumentRequest request) { try { String address = hwWebDocumentService.verifyAndGetDocumentAddress(request.getDocumentId(), request.getProvidedKey()); return success(address); } catch (Exception e) { return error(e.getMessage()); } } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwWebMenuController.java` ```java package com.ruoyi.portal.controller; import java.util.List; import java.io.IOException; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwWebMenu; import com.ruoyi.portal.service.IHwWebMenuService; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * haiwei官网菜单Controller * * @author zch * @date 2025-08-18 */ @RestController @RequestMapping("/portal/hwWebMenu") @Anonymous//不需要登陆任何人都可以操作 public class HwWebMenuController extends BaseController { @Autowired private IHwWebMenuService hwWebMenuService; /** * 查询haiwei官网菜单列表 */ //@RequiresPermissions("portalhwWebMenu:list") @GetMapping("/list") public AjaxResult list(HwWebMenu hwWebMenu) { List list = hwWebMenuService.selectHwWebMenuList(hwWebMenu); return success(list); } /** * 导出haiwei官网菜单列表 */ //@RequiresPermissions("portalhwWebMenu:export") //@Log(title = "haiwei官网菜单", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwWebMenu hwWebMenu) { List list = hwWebMenuService.selectHwWebMenuList(hwWebMenu); ExcelUtil util = new ExcelUtil(HwWebMenu.class); util.exportExcel(response, list, "haiwei官网菜单数据"); } /** * 获取haiwei官网菜单详细信息 */ //@RequiresPermissions("portalhwWebMenu:query") @GetMapping(value = "/{webMenuId}") public AjaxResult getInfo(@PathVariable("webMenuId") Long webMenuId) { return success(hwWebMenuService.selectHwWebMenuByWebMenuId(webMenuId)); } /** * 新增haiwei官网菜单 */ //@RequiresPermissions("portalhwWebMenu:add") //@Log(title = "haiwei官网菜单", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwWebMenu hwWebMenu) { return toAjax(hwWebMenuService.insertHwWebMenu(hwWebMenu)); } /** * 修改haiwei官网菜单 */ //@RequiresPermissions("portalhwWebMenu:edit") //@Log(title = "haiwei官网菜单", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwWebMenu hwWebMenu) { return toAjax(hwWebMenuService.updateHwWebMenu(hwWebMenu)); } /** * 删除haiwei官网菜单 */ //@RequiresPermissions("portalhwWebMenu:remove") //@Log(title = "haiwei官网菜单", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{webMenuIds}") public AjaxResult remove(@PathVariable Long[] webMenuIds) { return toAjax(hwWebMenuService.deleteHwWebMenuByWebMenuIds(webMenuIds)); } /** * 获取菜单树列表 */ @GetMapping("/selectMenuTree") public AjaxResult selectMenuTree(HwWebMenu hwWebMenu){ return success(hwWebMenuService.selectMenuTree(hwWebMenu)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/controller/HwWebMenuController1.java` ```java package com.ruoyi.portal.controller; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.portal.domain.HwWebMenu1; import com.ruoyi.portal.service.IHwWebMenuService1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.List; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.RepeatSubmit; /** * haiwei官网菜单Controller * * @author zch * @date 2025-08-18 */ @RestController @RequestMapping("/portal/hwWebMenu1") @Anonymous//不需要登陆任何人都可以操作 public class HwWebMenuController1 extends BaseController { @Autowired private IHwWebMenuService1 hwWebMenuService1; /** * 查询haiwei官网菜单列表 */ //@RequiresPermissions("portalhwWebMenu:list") @GetMapping("/list") public AjaxResult list(HwWebMenu1 hwWebMenu1) { List list = hwWebMenuService1.selectHwWebMenuList(hwWebMenu1); return success(list); } /** * 导出haiwei官网菜单列表 */ //@RequiresPermissions("portalhwWebMenu:export") //@Log(title = "haiwei官网菜单", businessType = BusinessType.EXPORT) @RepeatSubmit @PostMapping("/export") public void export(HttpServletResponse response, HwWebMenu1 hwWebMenu1) { List list = hwWebMenuService1.selectHwWebMenuList(hwWebMenu1); ExcelUtil util = new ExcelUtil(HwWebMenu1.class); util.exportExcel(response, list, "haiwei官网菜单数据"); } /** * 获取haiwei官网菜单详细信息 */ //@RequiresPermissions("portalhwWebMenu:query") @GetMapping(value = "/{webMenuId}") public AjaxResult getInfo(@PathVariable("webMenuId") Long webMenuId) { return success(hwWebMenuService1.selectHwWebMenuByWebMenuId(webMenuId)); } /** * 新增haiwei官网菜单 */ //@RequiresPermissions("portalhwWebMenu:add") //@Log(title = "haiwei官网菜单", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping public AjaxResult add(@RequestBody HwWebMenu1 hwWebMenu1) { return toAjax(hwWebMenuService1.insertHwWebMenu(hwWebMenu1)); } /** * 修改haiwei官网菜单 */ //@RequiresPermissions("portalhwWebMenu:edit") //@Log(title = "haiwei官网菜单", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping public AjaxResult edit(@RequestBody HwWebMenu1 hwWebMenu1) { return toAjax(hwWebMenuService1.updateHwWebMenu(hwWebMenu1)); } /** * 删除haiwei官网菜单 */ //@RequiresPermissions("portalhwWebMenu:remove") //@Log(title = "haiwei官网菜单", businessType = BusinessType.DELETE) @RepeatSubmit @DeleteMapping("/{webMenuIds}") public AjaxResult remove(@PathVariable Long[] webMenuIds) { return toAjax(hwWebMenuService1.deleteHwWebMenuByWebMenuIds(webMenuIds)); } /** * 获取菜单树列表 */ @GetMapping("/selectMenuTree") public AjaxResult selectMenuTree(HwWebMenu1 hwWebMenu1){ return success(hwWebMenuService1.selectMenuTree(hwWebMenu1)); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/dto/AnalyticsCollectRequest.java` ```java package com.ruoyi.portal.domain.dto; /** * 匿名访问采集请求 * * @author ruoyi */ public class AnalyticsCollectRequest { private String visitorId; private String sessionId; private String eventType; private String path; private String referrer; private String utmSource; private String utmMedium; private String utmCampaign; private String keyword; private String ua; private String device; private String browser; private String os; private Long stayMs; /** 毫秒时间戳 */ private Long eventTime; public String getVisitorId() { return visitorId; } public void setVisitorId(String visitorId) { this.visitorId = visitorId; } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } public String getEventType() { return eventType; } public void setEventType(String eventType) { this.eventType = eventType; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getReferrer() { return referrer; } public void setReferrer(String referrer) { this.referrer = referrer; } public String getUtmSource() { return utmSource; } public void setUtmSource(String utmSource) { this.utmSource = utmSource; } public String getUtmMedium() { return utmMedium; } public void setUtmMedium(String utmMedium) { this.utmMedium = utmMedium; } public String getUtmCampaign() { return utmCampaign; } public void setUtmCampaign(String utmCampaign) { this.utmCampaign = utmCampaign; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public String getUa() { return ua; } public void setUa(String ua) { this.ua = ua; } public String getDevice() { return device; } public void setDevice(String device) { this.device = device; } public String getBrowser() { return browser; } public void setBrowser(String browser) { this.browser = browser; } public String getOs() { return os; } public void setOs(String os) { this.os = os; } public Long getStayMs() { return stayMs; } public void setStayMs(Long stayMs) { this.stayMs = stayMs; } public Long getEventTime() { return eventTime; } public void setEventTime(Long eventTime) { this.eventTime = eventTime; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/dto/AnalyticsDashboardDTO.java` ```java package com.ruoyi.portal.domain.dto; import java.util.ArrayList; import java.util.List; /** * 官网访问监控看板 * * @author ruoyi */ public class AnalyticsDashboardDTO { private String statDate; private Long pv; private Long uv; private Long ipUv; private Long avgStayMs; private Double bounceRate; private Long searchCount; private Long downloadCount; private List entryPages = new ArrayList<>(); private List hotPages = new ArrayList<>(); private List hotKeywords = new ArrayList<>(); public String getStatDate() { return statDate; } public void setStatDate(String statDate) { this.statDate = statDate; } public Long getPv() { return pv; } public void setPv(Long pv) { this.pv = pv; } public Long getUv() { return uv; } public void setUv(Long uv) { this.uv = uv; } public Long getIpUv() { return ipUv; } public void setIpUv(Long ipUv) { this.ipUv = ipUv; } public Long getAvgStayMs() { return avgStayMs; } public void setAvgStayMs(Long avgStayMs) { this.avgStayMs = avgStayMs; } public Double getBounceRate() { return bounceRate; } public void setBounceRate(Double bounceRate) { this.bounceRate = bounceRate; } public Long getSearchCount() { return searchCount; } public void setSearchCount(Long searchCount) { this.searchCount = searchCount; } public Long getDownloadCount() { return downloadCount; } public void setDownloadCount(Long downloadCount) { this.downloadCount = downloadCount; } public List getEntryPages() { return entryPages; } public void setEntryPages(List entryPages) { this.entryPages = entryPages; } public List getHotPages() { return hotPages; } public void setHotPages(List hotPages) { this.hotPages = hotPages; } public List getHotKeywords() { return hotKeywords; } public void setHotKeywords(List hotKeywords) { this.hotKeywords = hotKeywords; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/dto/AnalyticsRankItemDTO.java` ```java package com.ruoyi.portal.domain.dto; /** * 统计排行项 * * @author ruoyi */ public class AnalyticsRankItemDTO { private String name; private Long value; public String getName() { return name; } public void setName(String name) { this.name = name; } public Long getValue() { return value; } public void setValue(Long value) { this.value = value; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/dto/SearchPageDTO.java` ```java package com.ruoyi.portal.domain.dto; import java.util.ArrayList; import java.util.List; /** * 搜索分页数据 * * @author ruoyi */ public class SearchPageDTO { /** 总记录数 */ private long total; /** 结果列表 */ private List rows = new ArrayList<>(); public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public List getRows() { return rows; } public void setRows(List rows) { this.rows = rows; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/dto/SearchRawRecord.java` ```java package com.ruoyi.portal.domain.dto; import java.util.Date; /** * 搜索原始记录 * * @author ruoyi */ public class SearchRawRecord { private String sourceType; private String bizId; private String title; private String content; private String webCode; private String typeId; private String deviceId; private String menuId; private String documentId; private Integer score; private Date updatedAt; public String getSourceType() { return sourceType; } public void setSourceType(String sourceType) { this.sourceType = sourceType; } public String getBizId() { return bizId; } public void setBizId(String bizId) { this.bizId = bizId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getWebCode() { return webCode; } public void setWebCode(String webCode) { this.webCode = webCode; } public String getTypeId() { return typeId; } public void setTypeId(String typeId) { this.typeId = typeId; } public String getDeviceId() { return deviceId; } public void setDeviceId(String deviceId) { this.deviceId = deviceId; } public String getMenuId() { return menuId; } public void setMenuId(String menuId) { this.menuId = menuId; } public String getDocumentId() { return documentId; } public void setDocumentId(String documentId) { this.documentId = documentId; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public Date getUpdatedAt() { return updatedAt; } public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/dto/SearchResultDTO.java` ```java package com.ruoyi.portal.domain.dto; import java.util.Map; /** * 门户搜索结果 * * @author ruoyi */ public class SearchResultDTO { /** 来源类型 menu/web/web1/document/configType/productInfo/productDetail/caseInfo/aboutUs */ private String sourceType; /** 标题 */ private String title; /** 命中摘要 */ private String snippet; /** 相关度分值 */ private Integer score; /** 展示端跳转路由 */ private String route; /** 展示端路由参数 */ private Map routeQuery; /** 编辑端跳转路由 */ private String editRoute; public String getSourceType() { return sourceType; } public void setSourceType(String sourceType) { this.sourceType = sourceType; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSnippet() { return snippet; } public void setSnippet(String snippet) { this.snippet = snippet; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public String getRoute() { return route; } public void setRoute(String route) { this.route = route; } public Map getRouteQuery() { return routeQuery; } public void setRouteQuery(Map routeQuery) { this.routeQuery = routeQuery; } public String getEditRoute() { return editRoute; } public void setEditRoute(String editRoute) { this.editRoute = editRoute; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwAboutUsInfo.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * 关于我们信息对象 hw_about_us_info * * @author xins * @date 2024-12-01 */ public class HwAboutUsInfo extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long aboutUsInfoId; /** 类型(1关于我们页面上大图2公司简介3企业资质4认证证书5团队风貌) */ @Excel(name = "类型", readConverterExp = "1=关于我们页面上大图2公司简介3企业资质4认证证书5团队风貌") private String aboutUsInfoType; /** 英文标题 */ @Excel(name = "英文标题") private String aboutUsInfoEtitle; /** 中文标题 */ @Excel(name = "中文标题") private String aboutUsInfoTitle; /** 内容 */ @Excel(name = "内容") private String aboutUsInfoDesc; /** 顺序 */ @Excel(name = "顺序") private Long aboutUsInfoOrder; /** 显示模式 */ @Excel(name = "显示模式") private String displayModal; /** 图片地址 */ @Excel(name = "图片地址") private String aboutUsInfoPic; public void setAboutUsInfoId(Long aboutUsInfoId) { this.aboutUsInfoId = aboutUsInfoId; } public Long getAboutUsInfoId() { return aboutUsInfoId; } public void setAboutUsInfoType(String aboutUsInfoType) { this.aboutUsInfoType = aboutUsInfoType; } public String getAboutUsInfoType() { return aboutUsInfoType; } public String getAboutUsInfoEtitle() { return aboutUsInfoEtitle; } public void setAboutUsInfoEtitle(String aboutUsInfoEtitle) { this.aboutUsInfoEtitle = aboutUsInfoEtitle; } public void setAboutUsInfoTitle(String aboutUsInfoTitle) { this.aboutUsInfoTitle = aboutUsInfoTitle; } public String getAboutUsInfoTitle() { return aboutUsInfoTitle; } public void setAboutUsInfoDesc(String aboutUsInfoDesc) { this.aboutUsInfoDesc = aboutUsInfoDesc; } public String getAboutUsInfoDesc() { return aboutUsInfoDesc; } public void setAboutUsInfoOrder(Long aboutUsInfoOrder) { this.aboutUsInfoOrder = aboutUsInfoOrder; } public Long getAboutUsInfoOrder() { return aboutUsInfoOrder; } public String getDisplayModal() { return displayModal; } public void setDisplayModal(String displayModal) { this.displayModal = displayModal; } public void setAboutUsInfoPic(String aboutUsInfoPic) { this.aboutUsInfoPic = aboutUsInfoPic; } public String getAboutUsInfoPic() { return aboutUsInfoPic; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("aboutUsInfoId", getAboutUsInfoId()) .append("aboutUsInfoType", getAboutUsInfoType()) .append("aboutUsInfoTitle", getAboutUsInfoTitle()) .append("aboutUsInfoDesc", getAboutUsInfoDesc()) .append("aboutUsInfoOrder", getAboutUsInfoOrder()) .append("aboutUsInfoPic", getAboutUsInfoPic()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwAboutUsInfoDetail.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * 关于我们信息明细对象 hw_about_us_info_detail * * @author ruoyi * @date 2024-12-01 */ public class HwAboutUsInfoDetail extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long usInfoDetailId; /** 关于我们信息ID */ @Excel(name = "关于我们信息ID") private Long aboutUsInfoId; /** 标题 */ @Excel(name = "标题") private String usInfoDetailTitle; /** 内容 */ @Excel(name = "内容") private String usInfoDetailDesc; /** 顺序 */ @Excel(name = "顺序") private Long usInfoDetailOrder; /** 图片地址 */ @Excel(name = "图片地址") private String usInfoDetailPic; public void setUsInfoDetailId(Long usInfoDetailId) { this.usInfoDetailId = usInfoDetailId; } public Long getUsInfoDetailId() { return usInfoDetailId; } public void setAboutUsInfoId(Long aboutUsInfoId) { this.aboutUsInfoId = aboutUsInfoId; } public Long getAboutUsInfoId() { return aboutUsInfoId; } public void setUsInfoDetailTitle(String usInfoDetailTitle) { this.usInfoDetailTitle = usInfoDetailTitle; } public String getUsInfoDetailTitle() { return usInfoDetailTitle; } public void setUsInfoDetailDesc(String usInfoDetailDesc) { this.usInfoDetailDesc = usInfoDetailDesc; } public String getUsInfoDetailDesc() { return usInfoDetailDesc; } public void setUsInfoDetailOrder(Long usInfoDetailOrder) { this.usInfoDetailOrder = usInfoDetailOrder; } public Long getUsInfoDetailOrder() { return usInfoDetailOrder; } public void setUsInfoDetailPic(String usInfoDetailPic) { this.usInfoDetailPic = usInfoDetailPic; } public String getUsInfoDetailPic() { return usInfoDetailPic; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("usInfoDetailId", getUsInfoDetailId()) .append("aboutUsInfoId", getAboutUsInfoId()) .append("usInfoDetailTitle", getUsInfoDetailTitle()) .append("usInfoDetailDesc", getUsInfoDetailDesc()) .append("usInfoDetailOrder", getUsInfoDetailOrder()) .append("usInfoDetailPic", getUsInfoDetailPic()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwContactUsInfo.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * 联系我们信息对象 hw_contact_us_info * * @author xins * @date 2024-12-01 */ public class HwContactUsInfo extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long contactUsInfoId; /** 用户姓名 */ @Excel(name = "用户姓名") private String userName; /** 邮箱 */ @Excel(name = "邮箱") private String userEmail; /** 手机号 */ @Excel(name = "手机号") private String userPhone; /** IP地址 */ @Excel(name = "IP地址") private String userIp; private String remark; public void setContactUsInfoId(Long contactUsInfoId) { this.contactUsInfoId = contactUsInfoId; } public Long getContactUsInfoId() { return contactUsInfoId; } public void setUserName(String userName) { this.userName = userName; } public String getUserName() { return userName; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; } public String getUserEmail() { return userEmail; } public void setUserPhone(String userPhone) { this.userPhone = userPhone; } public String getUserPhone() { return userPhone; } public void setUserIp(String userIp) { this.userIp = userIp; } public String getUserIp() { return userIp; } @Override public String getRemark() { return remark; } @Override public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("contactUsInfoId", getContactUsInfoId()) .append("userName", getUserName()) .append("userEmail", getUserEmail()) .append("userPhone", getUserPhone()) .append("userIp", getUserIp()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwPortalConfig.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * 门户网站配置对象 hw_portal_config * * @author xins * @date 2024-12-01 */ public class HwPortalConfig extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long portalConfigId; /** 类型(1首页大图 2产品中心大图) */ @Excel(name = "类型(1首页大图 2产品中心大图)") private String portalConfigType; /**如果类型是2的,则需要关联hw_portal_config_type*/ private Long portalConfigTypeId; /** 标题 */ @Excel(name = "标题") private String portalConfigTitle; /** 顺序 */ @Excel(name = "顺序") private Long portalConfigOrder; /** 内容 */ @Excel(name = "内容") private String portalConfigDesc; /** 按钮名称 */ @Excel(name = "按钮名称") private String buttonName; /** 按钮跳转地址 */ @Excel(name = "按钮跳转地址") private String routerAddress; /** 主图地址 */ @Excel(name = "主图地址") private String portalConfigPic; private String configTypeName; private String homeConfigTypePic; private String homeConfigTypeIcon; private String homeConfigTypeName; private String homeConfigTypeClassfication; private Long parentId; private String ancestors; public void setPortalConfigId(Long portalConfigId) { this.portalConfigId = portalConfigId; } public Long getPortalConfigId() { return portalConfigId; } public void setPortalConfigType(String portalConfigType) { this.portalConfigType = portalConfigType; } public String getPortalConfigType() { return portalConfigType; } public Long getPortalConfigTypeId() { return portalConfigTypeId; } public void setPortalConfigTypeId(Long portalConfigTypeId) { this.portalConfigTypeId = portalConfigTypeId; } public void setPortalConfigTitle(String portalConfigTitle) { this.portalConfigTitle = portalConfigTitle; } public String getPortalConfigTitle() { return portalConfigTitle; } public void setPortalConfigOrder(Long portalConfigOrder) { this.portalConfigOrder = portalConfigOrder; } public Long getPortalConfigOrder() { return portalConfigOrder; } public void setPortalConfigDesc(String portalConfigDesc) { this.portalConfigDesc = portalConfigDesc; } public String getPortalConfigDesc() { return portalConfigDesc; } public void setButtonName(String buttonName) { this.buttonName = buttonName; } public String getButtonName() { return buttonName; } public void setRouterAddress(String routerAddress) { this.routerAddress = routerAddress; } public String getRouterAddress() { return routerAddress; } public void setPortalConfigPic(String portalConfigPic) { this.portalConfigPic = portalConfigPic; } public String getPortalConfigPic() { return portalConfigPic; } public String getConfigTypeName() { return configTypeName; } public void setConfigTypeName(String configTypeName) { this.configTypeName = configTypeName; } public String getHomeConfigTypePic() { return homeConfigTypePic; } public void setHomeConfigTypePic(String homeConfigTypePic) { this.homeConfigTypePic = homeConfigTypePic; } public String getHomeConfigTypeIcon() { return homeConfigTypeIcon; } public void setHomeConfigTypeIcon(String homeConfigTypeIcon) { this.homeConfigTypeIcon = homeConfigTypeIcon; } public String getHomeConfigTypeName() { return homeConfigTypeName; } public void setHomeConfigTypeName(String homeConfigTypeName) { this.homeConfigTypeName = homeConfigTypeName; } public String getHomeConfigTypeClassfication() { return homeConfigTypeClassfication; } public void setHomeConfigTypeClassfication(String homeConfigTypeClassfication) { this.homeConfigTypeClassfication = homeConfigTypeClassfication; } public Long getParentId() { return parentId; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getAncestors() { return ancestors; } public void setAncestors(String ancestors) { this.ancestors = ancestors; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("portalConfigId", getPortalConfigId()) .append("portalConfigType", getPortalConfigType()) .append("portalConfigTitle", getPortalConfigTitle()) .append("portalConfigOrder", getPortalConfigOrder()) .append("portalConfigDesc", getPortalConfigDesc()) .append("buttonName", getButtonName()) .append("routerAddress", getRouterAddress()) .append("portalConfigPic", getPortalConfigPic()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .append("configTypeName", getConfigTypeName()) .append("homeConfigTypePic", getHomeConfigTypePic()) .append("homeConfigTypeIcon", getHomeConfigTypeIcon()) .append("homeConfigTypeName", getHomeConfigTypeName()) .append("homeConfigTypeClassfication", getHomeConfigTypeClassfication()) .append("parentId", getParentId()) .append("ancestors", getAncestors()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwPortalConfigType.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.TreeEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.ArrayList; import java.util.List; /** * 门户网站配置类型对象 hw_portal_config_type * * @author xins * @date 2024-12-11 */ public class HwPortalConfigType extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long configTypeId; /** 大类(1产品中心,2案例) */ @Excel(name = "大类(1产品中心,2案例)") private String configTypeClassfication; /** 名称 */ @Excel(name = "名称") private String configTypeName; /** 首页名称 */ @Excel(name = "首页名称") private String homeConfigTypeName; /** 备注 */ @Excel(name = "备注") private String configTypeDesc; /** 图标地址 */ @Excel(name = "图标地址") private String configTypeIcon; /** 首页图片地址 */ @Excel(name = "首页图片地址") private String homeConfigTypePic; private Long parentId; private String ancestors; private List hwProductCaseInfoList; /** 子类型 */ private List children = new ArrayList(); public void setConfigTypeId(Long configTypeId) { this.configTypeId = configTypeId; } public Long getConfigTypeId() { return configTypeId; } public void setConfigTypeClassfication(String configTypeClassfication) { this.configTypeClassfication = configTypeClassfication; } public String getConfigTypeClassfication() { return configTypeClassfication; } public void setConfigTypeName(String configTypeName) { this.configTypeName = configTypeName; } public String getConfigTypeName() { return configTypeName; } public void setHomeConfigTypeName(String homeConfigTypeName) { this.homeConfigTypeName = homeConfigTypeName; } public String getHomeConfigTypeName() { return homeConfigTypeName; } public void setConfigTypeDesc(String configTypeDesc) { this.configTypeDesc = configTypeDesc; } public String getConfigTypeDesc() { return configTypeDesc; } public void setConfigTypeIcon(String configTypeIcon) { this.configTypeIcon = configTypeIcon; } public String getConfigTypeIcon() { return configTypeIcon; } public void setHomeConfigTypePic(String homeConfigTypePic) { this.homeConfigTypePic = homeConfigTypePic; } public String getHomeConfigTypePic() { return homeConfigTypePic; } public Long getParentId() { return parentId; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getAncestors() { return ancestors; } public void setAncestors(String ancestors) { this.ancestors = ancestors; } public List getHwProductCaseInfoList() { return hwProductCaseInfoList; } public void setHwProductCaseInfoList(List hwProductCaseInfoList) { this.hwProductCaseInfoList = hwProductCaseInfoList; } public List getChildren() { return children; } public void setChildren(List children) { this.children = children; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("configTypeId", getConfigTypeId()) .append("configTypeClassfication", getConfigTypeClassfication()) .append("configTypeName", getConfigTypeName()) .append("homeConfigTypeName", getHomeConfigTypeName()) .append("configTypeDesc", getConfigTypeDesc()) .append("configTypeIcon", getConfigTypeIcon()) .append("homeConfigTypePic", getHomeConfigTypePic()) .append("parentId", getParentId()) .append("ancestors", getAncestors()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwProductCaseInfo.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * 案例内容对象 hw_product_case_info * * @author xins * @date 2024-12-01 */ public class HwProductCaseInfo extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long caseInfoId; /** 案例标题 */ @Excel(name = "案例标题") private String caseInfoTitle; /** 配置类型ID */ @Excel(name = "配置类型ID") private Long configTypeId; /** 典型案例标识(1是0否) */ @Excel(name = "典型案例标识(1是0否)") private String typicalFlag; /** 案例内容 */ @Excel(name = "案例内容") private String caseInfoDesc; /** 案例内容图片 */ @Excel(name = "案例内容图片") private String caseInfoPic; /** 案例详情 */ @Excel(name = "案例详情") private String caseInfoHtml; private String homeTypicalFlag; public void setCaseInfoId(Long caseInfoId) { this.caseInfoId = caseInfoId; } public Long getCaseInfoId() { return caseInfoId; } public void setCaseInfoTitle(String caseInfoTitle) { this.caseInfoTitle = caseInfoTitle; } public String getCaseInfoTitle() { return caseInfoTitle; } public Long getConfigTypeId() { return configTypeId; } public void setConfigTypeId(Long configTypeId) { this.configTypeId = configTypeId; } public void setTypicalFlag(String typicalFlag) { this.typicalFlag = typicalFlag; } public String getTypicalFlag() { return typicalFlag; } public void setCaseInfoDesc(String caseInfoDesc) { this.caseInfoDesc = caseInfoDesc; } public String getCaseInfoDesc() { return caseInfoDesc; } public void setCaseInfoPic(String caseInfoPic) { this.caseInfoPic = caseInfoPic; } public String getCaseInfoPic() { return caseInfoPic; } public void setCaseInfoHtml(String caseInfoHtml) { this.caseInfoHtml = caseInfoHtml; } public String getCaseInfoHtml() { return caseInfoHtml; } public String getHomeTypicalFlag() { return homeTypicalFlag; } public void setHomeTypicalFlag(String homeTypicalFlag) { this.homeTypicalFlag = homeTypicalFlag; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("caseInfoId", getCaseInfoId()) .append("caseInfoTitle", getCaseInfoTitle()) .append("configTypeId", getConfigTypeId()) .append("typicalFlag", getTypicalFlag()) .append("caseInfoDesc", getCaseInfoDesc()) .append("caseInfoPic", getCaseInfoPic()) .append("caseInfoHtml", getCaseInfoHtml()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwProductInfo.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.List; /** * 产品信息配置对象 hw_product_info * * @author xins * @date 2024-12-01 */ public class HwProductInfo extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long productInfoId; /** 配置类型(例如物联网解决方案下的物联网平台和物联网硬件产品系列) */ @Excel(name = "配置类型", readConverterExp = "例=如物联网解决方案下的物联网平台和物联网硬件产品系列") private String configTypeId; /** 是否按tab显示(1是0否) */ @Excel(name = "是否按tab显示", readConverterExp = "1=是0否") private String tabFlag; /** 配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8左图右图9上图下内容,一行4个) */ @Excel(name = "配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8左图右图9上图下内容,一行4个),13为hw官网配置模式") private String configModal; /** 英文标题 */ @Excel(name = "英文标题") private String productInfoEtitle; /** 中文标题 */ @Excel(name = "中文标题") private String productInfoCtitle; /** 顺序 */ @Excel(name = "顺序") private Long productInfoOrder; /** 产品信息明细配置信息 */ private List hwProductInfoDetailList; private Long parentId; private String configTypeName; public void setProductInfoId(Long productInfoId) { this.productInfoId = productInfoId; } public Long getProductInfoId() { return productInfoId; } public void setConfigTypeId(String configTypeId) { this.configTypeId = configTypeId; } public String getConfigTypeId() { return configTypeId; } public void setTabFlag(String tabFlag) { this.tabFlag = tabFlag; } public String getTabFlag() { return tabFlag; } public void setConfigModal(String configModal) { this.configModal = configModal; } public String getConfigModal() { return configModal; } public void setProductInfoEtitle(String productInfoEtitle) { this.productInfoEtitle = productInfoEtitle; } public String getProductInfoEtitle() { return productInfoEtitle; } public void setProductInfoCtitle(String productInfoCtitle) { this.productInfoCtitle = productInfoCtitle; } public String getProductInfoCtitle() { return productInfoCtitle; } public void setProductInfoOrder(Long productInfoOrder) { this.productInfoOrder = productInfoOrder; } public Long getProductInfoOrder() { return productInfoOrder; } public List getHwProductInfoDetailList() { return hwProductInfoDetailList; } public void setHwProductInfoDetailList(List hwProductInfoDetailList) { this.hwProductInfoDetailList = hwProductInfoDetailList; } public Long getParentId() { return parentId; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getConfigTypeName() { return configTypeName; } public void setConfigTypeName(String configTypeName) { this.configTypeName = configTypeName; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("productInfoId", getProductInfoId()) .append("configTypeId", getConfigTypeId()) .append("tabFlag", getTabFlag()) .append("configModal", getConfigModal()) .append("productInfoEtitle", getProductInfoEtitle()) .append("productInfoCtitle", getProductInfoCtitle()) .append("productInfoOrder", getProductInfoOrder()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .append("hwProductInfoDetailList", getHwProductInfoDetailList()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwProductInfoDetail.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.TreeEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.List; /** * 产品信息明细配置对象 hw_product_info_detail * * @author xins * @date 2024-12-11 */ public class HwProductInfoDetail extends TreeEntity { private static final long serialVersionUID = 1L; /** 主键标识 */ private Long productInfoDetailId; /** 产品信息配置ID */ @Excel(name = "产品信息配置ID") private Long productInfoId; /** 配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8一张图9上图下内容,一行4个);针对右children时配置的 */ @Excel(name = "配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8一张图9上图下内容,一行4个);针对右children时配置的") private String configModal; /** 配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8一张图9上图下内容,一行4个);针对右children时配置的 */ @Excel(name = "配置模式(1图标 +文字+内容横铺4个2左标题+内容,右图片;3左图标,右标题+内容,一行2个;4左大图右标题+内容,一行2个;5上标题+下图片,6上标题+内容,下图片;7图标标题内容,一行3个,8一张图9上图下内容,一行4个);针对右children时配置的") private String configModel; /** 标题 */ @Excel(name = "标题") private String productInfoDetailTitle; /** 内容 */ @Excel(name = "内容") private String productInfoDetailDesc; /** 顺序 */ @Excel(name = "顺序") private Long productInfoDetailOrder; /** 图片地址 */ @Excel(name = "图片地址") private String productInfoDetailPic; /** 产品信息明细配置信息 */ private List hwProductInfoDetailList; public void setProductInfoDetailId(Long productInfoDetailId) { this.productInfoDetailId = productInfoDetailId; } public Long getProductInfoDetailId() { return productInfoDetailId; } public void setProductInfoId(Long productInfoId) { this.productInfoId = productInfoId; } public Long getProductInfoId() { return productInfoId; } public void setConfigModal(String configModal) { this.configModal = configModal; } public String getConfigModal() { return configModal; } public void setProductInfoDetailTitle(String productInfoDetailTitle) { this.productInfoDetailTitle = productInfoDetailTitle; } public String getProductInfoDetailTitle() { return productInfoDetailTitle; } public void setProductInfoDetailDesc(String productInfoDetailDesc) { this.productInfoDetailDesc = productInfoDetailDesc; } public String getProductInfoDetailDesc() { return productInfoDetailDesc; } public void setProductInfoDetailOrder(Long productInfoDetailOrder) { this.productInfoDetailOrder = productInfoDetailOrder; } public Long getProductInfoDetailOrder() { return productInfoDetailOrder; } public void setProductInfoDetailPic(String productInfoDetailPic) { this.productInfoDetailPic = productInfoDetailPic; } public String getProductInfoDetailPic() { return productInfoDetailPic; } public List getHwProductInfoDetailList() { return hwProductInfoDetailList; } public void setHwProductInfoDetailList(List hwProductInfoDetailList) { this.hwProductInfoDetailList = hwProductInfoDetailList; } public String getConfigModel() { return configModel; } public void setConfigModel(String configModel) { this.configModel = configModel; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("productInfoDetailId", getProductInfoDetailId()) .append("parentId", getParentId()) .append("productInfoId", getProductInfoId()) .append("configModal", getConfigModal()) .append("productInfoDetailTitle", getProductInfoDetailTitle()) .append("productInfoDetailDesc", getProductInfoDetailDesc()) .append("productInfoDetailOrder", getProductInfoDetailOrder()) .append("productInfoDetailPic", getProductInfoDetailPic()) .append("ancestors", getAncestors()) .append("createTime", getCreateTime()) .append("createBy", getCreateBy()) .append("updateTime", getUpdateTime()) .append("updateBy", getUpdateBy()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWeb.java` ```java package com.ruoyi.portal.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; /** * haiwei官网json对象 hw_web * * @author ruoyi * @date 2025-08-18 */ public class HwWeb extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键 */ private Long webId; /** json */ @Excel(name = "json") private String webJson; /** json字符串 */ @Excel(name = "json字符串") private String webJsonString; /** 页面 */ @Excel(name = "页面") private Long webCode; /** 逻辑删除标志:'0'未删除,'1'已删除 */ private String isDelete; /** json字符串 */ @Excel(name = "字符串") private String webJsonEnglish; public void setWebId(Long webId) { this.webId = webId; } public Long getWebId() { return webId; } public void setWebJson(String webJson) { this.webJson = webJson; } public String getWebJson() { return webJson; } public void setWebJsonString(String webJsonString) { this.webJsonString = webJsonString; } public String getWebJsonString() { return webJsonString; } public void setWebCode(Long webCode) { this.webCode = webCode; } public Long getWebCode() { return webCode; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } public String getwebJsonEnglish() { return webJsonEnglish; } public void setwebJsonEnglish(String webJsonEnglish) { this.webJsonEnglish = webJsonEnglish; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("webId", getWebId()) .append("webJson", getWebJson()) .append("webJsonString", getWebJsonString()) .append("webCode", getWebCode()) .append("isDelete", getIsDelete()) .append("webJsonEnglish", getwebJsonEnglish()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWeb1.java` ```java package com.ruoyi.portal.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; /** * haiwei官网json对象 hw_web1 * * @author ruoyi * @date 2025-08-18 */ public class HwWeb1 extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键 */ private Long webId; /** json */ @Excel(name = "json") private String webJson; /** json字符串 */ @Excel(name = "json字符串") private String webJsonString; /** 页面 */ @Excel(name = "页面") private Long webCode; private Long deviceId; private Long typeId; /** 逻辑删除标志:'0'未删除,'1'已删除 */ private String isDelete; /** json字符串 */ @Excel(name = "字符串") private String webJsonEnglish; public void setWebId(Long webId) { this.webId = webId; } public Long getWebId() { return webId; } public void setWebJson(String webJson) { this.webJson = webJson; } public String getWebJson() { return webJson; } public void setWebJsonString(String webJsonString) { this.webJsonString = webJsonString; } public String getWebJsonString() { return webJsonString; } public void setWebCode(Long webCode) { this.webCode = webCode; } public Long getWebCode() { return webCode; } public Long getDeviceId() { return deviceId; } public void setDeviceId(Long deviceId) { this.deviceId = deviceId; } public Long getTypeId() { return typeId; } public void setTypeId(Long typeId) { this.typeId = typeId; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } public String getwebJsonEnglish() { return webJsonEnglish; } public void setwebJsonEnglish(String webJsonEnglish) { this.webJsonEnglish = webJsonEnglish; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("webId", getWebId()) .append("webJson", getWebJson()) .append("webJsonString", getWebJsonString()) .append("webCode", getWebCode()) .append("deviceId", getDeviceId()) .append("typeId", getTypeId()) .append("isDelete", getIsDelete()) .append("webJsonEnglish", getwebJsonEnglish()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWebDocument.java` ```java package com.ruoyi.portal.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import com.fasterxml.jackson.annotation.JsonProperty; /** * Hw资料文件对象 hw_web_document * * @author zch * @date 2025-09-22 */ public class HwWebDocument extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键 */ private String documentId; /** 租户id */ @Excel(name = "租户id") private Long tenantId; /** 文件存储地址 */ @Excel(name = "文件存储地址") private String documentAddress; /** 页面编码,用来连表查询 */ @Excel(name = "页面编码,用来连表查询") private String webCode; /** 密钥 */ // @Excel(name = "密钥") @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String secretKey; /** json */ private String json; /** 文件类型 */ private String type; /** 逻辑删除标志:'0'未删除,'1'已删除 */ private String isDelete; public void setDocumentId(String documentId) { this.documentId = documentId; } public String getDocumentId() { return documentId; } public void setTenantId(Long tenantId) { this.tenantId = tenantId; } public Long getTenantId() { return tenantId; } public void setDocumentAddress(String documentAddress) { this.documentAddress = documentAddress; } public String getDocumentAddress() { return documentAddress; } public void setWebCode(String webCode) { this.webCode = webCode; } public String getWebCode() { return webCode; } public void setSecretKey(String secretKey) { this.secretKey = secretKey; } public String getSecretKey() { return secretKey; } public boolean getHasSecret() { return secretKey != null && !secretKey.trim().isEmpty(); } public String getJson() { return json; } public void setJson(String json) { this.json = json; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("documentId", getDocumentId()) .append("tenantId", getTenantId()) .append("documentAddress", getDocumentAddress()) .append("createTime", getCreateTime()) .append("webCode", getWebCode()) .append("hasSecret", getHasSecret()) .append("json", getJson()) .append("type", getType()) .append("isDelete", getIsDelete()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWebMenu.java` ```java package com.ruoyi.portal.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.TreeEntity; /** * haiwei官网菜单对象 hw_web_menu * * @author zch * @date 2025-08-18 */ public class HwWebMenu extends TreeEntity { private static final long serialVersionUID = 1L; /** 菜单主键id */ private Long webMenuId; /** 父节点 */ @Excel(name = "父节点") private Long parent; /** 状态 */ @Excel(name = "状态") private String status; /** 菜单名称 */ @Excel(name = "菜单名称") private String webMenuName; /** 租户 */ @Excel(name = "租户") private Long tenantId; /** 图片地址 */ @Excel(name = "图片地址") private String webMenuPic; /** 官网菜单类型 */ @Excel(name = "官网菜单类型") private Long webMenuType; /** 排序 */ @Excel(name = "排序") private Integer order; /** 逻辑删除标志:'0'未删除,'1'已删除 */ private String isDelete; private String webMenuNameEnglish; public void setWebMenuId(Long webMenuId) { this.webMenuId = webMenuId; } public Long getWebMenuId() { return webMenuId; } public void setParent(Long parent) { this.parent = parent; } public Long getParent() { return parent; } public void setStatus(String status) { this.status = status; } public String getStatus() { return status; } public void setWebMenuName(String webMenuName) { this.webMenuName = webMenuName; } public String getWebMenuName() { return webMenuName; } public void setTenantId(Long tenantId) { this.tenantId = tenantId; } public Long getTenantId() { return tenantId; } public void setWebMenuPic(String webMenuPic) { this.webMenuPic = webMenuPic; } public String getWebMenuPic() { return webMenuPic; } public void setWebMenuType(Long webMenuType) { this.webMenuType = webMenuType; } public Long getWebMenuType() { return webMenuType; } public Integer getOrder() { return order; } public void setOrder(Integer order) { this.order = order; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } public String getWebMenuNameEnglish() { return webMenuNameEnglish; } public void setWebMenuNameEnglish(String webMenuNameEnglish) { this.webMenuNameEnglish = webMenuNameEnglish; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("webMenuId", getWebMenuId()) .append("parent", getParent()) .append("ancestors", getAncestors()) .append("status", getStatus()) .append("webMenuName", getWebMenuName()) .append("tenantId", getTenantId()) .append("webMenuPic", getWebMenuPic()) .append("webMenuType", getWebMenuType()) .append("order", getOrder()) .append("isDelete", getIsDelete()) .append("webMenuNameEnglish", getWebMenuNameEnglish()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWebMenu1.java` ```java package com.ruoyi.portal.domain; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.TreeEntity; import java.util.List; /** * haiwei官网菜单对象 hw_web_menu1 * * @author zch * @date 2025-08-18 */ public class HwWebMenu1 extends TreeEntity { private static final long serialVersionUID = 1L; /** 菜单主键id */ private Long webMenuId; /** 父节点 */ @Excel(name = "父节点") private Long parent; /** 状态 */ @Excel(name = "状态") private String status; /** 菜单名称 */ @Excel(name = "菜单名称") private String webMenuName; /** 租户 */ @Excel(name = "租户") private Long tenantId; /** 图片地址 */ @Excel(name = "图片地址") private String webMenuPic; /** 官网菜单类型 */ @Excel(name = "官网菜单类型") private Long webMenuType; private String valuel; /** 逻辑删除标志:'0'未删除,'1'已删除 */ private String isDelete; private String webMenuNameEnglish; public void setWebMenuId(Long webMenuId) { this.webMenuId = webMenuId; } public Long getWebMenuId() { return webMenuId; } public void setParent(Long parent) { this.parent = parent; } public Long getParent() { return parent; } public void setStatus(String status) { this.status = status; } public String getStatus() { return status; } public void setWebMenuName(String webMenuName) { this.webMenuName = webMenuName; } public String getWebMenuName() { return webMenuName; } public void setTenantId(Long tenantId) { this.tenantId = tenantId; } public Long getTenantId() { return tenantId; } public void setWebMenuPic(String webMenuPic) { this.webMenuPic = webMenuPic; } public String getWebMenuPic() { return webMenuPic; } public void setWebMenuType(Long webMenuType) { this.webMenuType = webMenuType; } public Long getWebMenuType() { return webMenuType; } public String getValuel() { return valuel; } public void setValuel(String valuel) { this.valuel = valuel; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } public String getWebMenuNameEnglish() { return webMenuNameEnglish; } public void setWebMenuNameEnglish(String webMenuNameEnglish) { this.webMenuNameEnglish = webMenuNameEnglish; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("webMenuId", getWebMenuId()) .append("parent", getParent()) .append("ancestors", getAncestors()) .append("status", getStatus()) .append("webMenuName", getWebMenuName()) .append("tenantId", getTenantId()) .append("webMenuPic", getWebMenuPic()) .append("webMenuType", getWebMenuType()) .append("valuel", getValuel()) .append("isDelete", getIsDelete()) .append("webMenuNameEnglish", getWebMenuNameEnglish()) .toString(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWebVisitDaily.java` ```java package com.ruoyi.portal.domain; import java.util.Date; /** * 官网访问日汇总 * * @author ruoyi */ public class HwWebVisitDaily { private Date statDate; private Long pv; private Long uv; private Long ipUv; private Long avgStayMs; private Double bounceRate; private Long searchCount; private Long downloadCount; private Date createdAt; private Date updatedAt; public Date getStatDate() { return statDate; } public void setStatDate(Date statDate) { this.statDate = statDate; } public Long getPv() { return pv; } public void setPv(Long pv) { this.pv = pv; } public Long getUv() { return uv; } public void setUv(Long uv) { this.uv = uv; } public Long getIpUv() { return ipUv; } public void setIpUv(Long ipUv) { this.ipUv = ipUv; } public Long getAvgStayMs() { return avgStayMs; } public void setAvgStayMs(Long avgStayMs) { this.avgStayMs = avgStayMs; } public Double getBounceRate() { return bounceRate; } public void setBounceRate(Double bounceRate) { this.bounceRate = bounceRate; } public Long getSearchCount() { return searchCount; } public void setSearchCount(Long searchCount) { this.searchCount = searchCount; } public Long getDownloadCount() { return downloadCount; } public void setDownloadCount(Long downloadCount) { this.downloadCount = downloadCount; } public Date getCreatedAt() { return createdAt; } public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } public Date getUpdatedAt() { return updatedAt; } public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/HwWebVisitEvent.java` ```java package com.ruoyi.portal.domain; import com.ruoyi.common.core.domain.BaseEntity; import java.util.Date; /** * 官网匿名访问事件明细 * * @author ruoyi */ public class HwWebVisitEvent extends BaseEntity { private static final long serialVersionUID = 1L; private Long id; private String eventType; private String visitorId; private String sessionId; private String path; private String referrer; private String utmSource; private String utmMedium; private String utmCampaign; private String keyword; private String ipHash; private String ua; private String device; private String browser; private String os; private Long stayMs; private Date eventTime; private Date createdAt; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getEventType() { return eventType; } public void setEventType(String eventType) { this.eventType = eventType; } public String getVisitorId() { return visitorId; } public void setVisitorId(String visitorId) { this.visitorId = visitorId; } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getReferrer() { return referrer; } public void setReferrer(String referrer) { this.referrer = referrer; } public String getUtmSource() { return utmSource; } public void setUtmSource(String utmSource) { this.utmSource = utmSource; } public String getUtmMedium() { return utmMedium; } public void setUtmMedium(String utmMedium) { this.utmMedium = utmMedium; } public String getUtmCampaign() { return utmCampaign; } public void setUtmCampaign(String utmCampaign) { this.utmCampaign = utmCampaign; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public String getIpHash() { return ipHash; } public void setIpHash(String ipHash) { this.ipHash = ipHash; } public String getUa() { return ua; } public void setUa(String ua) { this.ua = ua; } public String getDevice() { return device; } public void setDevice(String device) { this.device = device; } public String getBrowser() { return browser; } public void setBrowser(String browser) { this.browser = browser; } public String getOs() { return os; } public void setOs(String os) { this.os = os; } public Long getStayMs() { return stayMs; } public void setStayMs(Long stayMs) { this.stayMs = stayMs; } public Date getEventTime() { return eventTime; } public void setEventTime(Date eventTime) { this.eventTime = eventTime; } public Date getCreatedAt() { return createdAt; } public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/SecureDocumentRequest.java` ```java package com.ruoyi.portal.domain; public class SecureDocumentRequest { private String documentId; private String providedKey; public String getDocumentId() { return documentId; } public void setDocumentId(String documentId) { this.documentId = documentId; } public String getProvidedKey() { return providedKey; } public void setProvidedKey(String providedKey) { this.providedKey = providedKey; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/domain/vo/TreeSelect.java` ```java package com.ruoyi.portal.domain.vo; import java.io.Serializable; import java.util.List; import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonInclude; import com.ruoyi.portal.domain.HwPortalConfigType; /** * Treeselect树结构实体类 * * @author ruoyi */ public class TreeSelect implements Serializable { private static final long serialVersionUID = 1L; /** 节点ID */ private Long id; /** 节点名称 */ private String label; /** 子节点 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) private List children; public TreeSelect() { } public TreeSelect(HwPortalConfigType portalConfigType) { this.id = portalConfigType.getConfigTypeId(); this.label = portalConfigType.getConfigTypeName(); this.children = portalConfigType.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public List getChildren() { return children; } public void setChildren(List children) { this.children = children; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoDetailMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwAboutUsInfoDetail; import java.util.List; /** * 关于我们信息明细Mapper接口 * * @author ruoyi * @date 2024-12-01 */ public interface HwAboutUsInfoDetailMapper { /** * 查询关于我们信息明细 * * @param usInfoDetailId 关于我们信息明细主键 * @return 关于我们信息明细 */ public HwAboutUsInfoDetail selectHwAboutUsInfoDetailByUsInfoDetailId(Long usInfoDetailId); /** * 查询关于我们信息明细列表 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 关于我们信息明细集合 */ public List selectHwAboutUsInfoDetailList(HwAboutUsInfoDetail hwAboutUsInfoDetail); /** * 新增关于我们信息明细 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 结果 */ public int insertHwAboutUsInfoDetail(HwAboutUsInfoDetail hwAboutUsInfoDetail); /** * 修改关于我们信息明细 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 结果 */ public int updateHwAboutUsInfoDetail(HwAboutUsInfoDetail hwAboutUsInfoDetail); /** * 删除关于我们信息明细 * * @param usInfoDetailId 关于我们信息明细主键 * @return 结果 */ public int deleteHwAboutUsInfoDetailByUsInfoDetailId(Long usInfoDetailId); /** * 批量删除关于我们信息明细 * * @param usInfoDetailIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwAboutUsInfoDetailByUsInfoDetailIds(Long[] usInfoDetailIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwAboutUsInfoMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwAboutUsInfo; import java.util.List; /** * 关于我们信息Mapper接口 * * @author xins * @date 2024-12-01 */ public interface HwAboutUsInfoMapper { /** * 查询关于我们信息 * * @param aboutUsInfoId 关于我们信息主键 * @return 关于我们信息 */ public HwAboutUsInfo selectHwAboutUsInfoByAboutUsInfoId(Long aboutUsInfoId); /** * 查询关于我们信息列表 * * @param hwAboutUsInfo 关于我们信息 * @return 关于我们信息集合 */ public List selectHwAboutUsInfoList(HwAboutUsInfo hwAboutUsInfo); /** * 新增关于我们信息 * * @param hwAboutUsInfo 关于我们信息 * @return 结果 */ public int insertHwAboutUsInfo(HwAboutUsInfo hwAboutUsInfo); /** * 修改关于我们信息 * * @param hwAboutUsInfo 关于我们信息 * @return 结果 */ public int updateHwAboutUsInfo(HwAboutUsInfo hwAboutUsInfo); /** * 删除关于我们信息 * * @param aboutUsInfoId 关于我们信息主键 * @return 结果 */ public int deleteHwAboutUsInfoByAboutUsInfoId(Long aboutUsInfoId); /** * 批量删除关于我们信息 * * @param aboutUsInfoIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwAboutUsInfoByAboutUsInfoIds(Long[] aboutUsInfoIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwAnalyticsMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwWebVisitDaily; import com.ruoyi.portal.domain.HwWebVisitEvent; import com.ruoyi.portal.domain.dto.AnalyticsRankItemDTO; import org.apache.ibatis.annotations.Param; import java.time.LocalDate; import java.util.List; /** * 官网访问监控 Mapper * * @author ruoyi */ public interface HwAnalyticsMapper { /** * 新增访问事件 * * @param event 事件 * @return 结果 */ int insertVisitEvent(HwWebVisitEvent event); /** * 查询指定日期事件总数 * * @param statDate 日期 * @param eventType 事件类型 * @return 数量 */ Long countEventByType(@Param("statDate") LocalDate statDate, @Param("eventType") String eventType); /** * 查询指定日期访客 UV * * @param statDate 日期 * @return UV */ Long countDistinctVisitor(@Param("statDate") LocalDate statDate); /** * 查询指定日期 IP UV * * @param statDate 日期 * @return IP UV */ Long countDistinctIp(@Param("statDate") LocalDate statDate); /** * 查询指定日期平均停留时长 * * @param statDate 日期 * @return 平均停留时长 */ Long avgStayMs(@Param("statDate") LocalDate statDate); /** * 查询指定日期会话总数 * * @param statDate 日期 * @return 会话总数 */ Long countDistinctSessions(@Param("statDate") LocalDate statDate); /** * 查询仅访问一个页面的会话总数 * * @param statDate 日期 * @return 会话总数 */ Long countSinglePageSessions(@Param("statDate") LocalDate statDate); /** * 查询入口页排行 * * @param statDate 日期 * @param limit 结果数量 * @return 排行 */ List selectTopEntryPages(@Param("statDate") LocalDate statDate, @Param("limit") int limit); /** * 查询热门页面排行 * * @param statDate 日期 * @param limit 结果数量 * @return 排行 */ List selectTopHotPages(@Param("statDate") LocalDate statDate, @Param("limit") int limit); /** * 查询热门关键词排行 * * @param statDate 日期 * @param limit 结果数量 * @return 排行 */ List selectTopKeywords(@Param("statDate") LocalDate statDate, @Param("limit") int limit); /** * 新增或更新日汇总 * * @param daily 日汇总 * @return 结果 */ int upsertDaily(HwWebVisitDaily daily); /** * 查询日汇总 * * @param statDate 日期 * @return 日汇总 */ HwWebVisitDaily selectDailyByDate(@Param("statDate") LocalDate statDate); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwContactUsInfoMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwContactUsInfo; import java.util.List; /** * 联系我们信息Mapper接口 * * @author xins * @date 2024-12-01 */ public interface HwContactUsInfoMapper { /** * 查询联系我们信息 * * @param contactUsInfoId 联系我们信息主键 * @return 联系我们信息 */ public HwContactUsInfo selectHwContactUsInfoByContactUsInfoId(Long contactUsInfoId); /** * 查询联系我们信息列表 * * @param hwContactUsInfo 联系我们信息 * @return 联系我们信息集合 */ public List selectHwContactUsInfoList(HwContactUsInfo hwContactUsInfo); /** * 新增联系我们信息 * * @param hwContactUsInfo 联系我们信息 * @return 结果 */ public int insertHwContactUsInfo(HwContactUsInfo hwContactUsInfo); /** * 修改联系我们信息 * * @param hwContactUsInfo 联系我们信息 * @return 结果 */ public int updateHwContactUsInfo(HwContactUsInfo hwContactUsInfo); /** * 删除联系我们信息 * * @param contactUsInfoId 联系我们信息主键 * @return 结果 */ public int deleteHwContactUsInfoByContactUsInfoId(Long contactUsInfoId); /** * 批量删除联系我们信息 * * @param contactUsInfoIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwContactUsInfoByContactUsInfoIds(Long[] contactUsInfoIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwPortalConfigMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwPortalConfig; import java.util.List; /** * 门户网站配置Mapper接口 * * @author xins * @date 2024-12-01 */ public interface HwPortalConfigMapper { /** * 查询门户网站配置 * * @param portalConfigId 门户网站配置主键 * @return 门户网站配置 */ public HwPortalConfig selectHwPortalConfigByPortalConfigId(Long portalConfigId); /** * 查询门户网站配置列表 * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置集合 */ public List selectHwPortalConfigList(HwPortalConfig hwPortalConfig); /** * 新增门户网站配置 * * @param hwPortalConfig 门户网站配置 * @return 结果 */ public int insertHwPortalConfig(HwPortalConfig hwPortalConfig); /** * 修改门户网站配置 * * @param hwPortalConfig 门户网站配置 * @return 结果 */ public int updateHwPortalConfig(HwPortalConfig hwPortalConfig); /** * 删除门户网站配置 * * @param portalConfigId 门户网站配置主键 * @return 结果 */ public int deleteHwPortalConfigByPortalConfigId(Long portalConfigId); /** * 批量删除门户网站配置 * * @param portalConfigIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwPortalConfigByPortalConfigIds(Long[] portalConfigIds); /** * 查询门户网站配置列表,join hw_portal_config_type * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置集合 */ public List selectHwPortalConfigJoinList(HwPortalConfig hwPortalConfig); /** * 查询门户网站配置列表 * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置集合 */ public List selectHwPortalConfigList2(HwPortalConfig hwPortalConfig); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwPortalConfigTypeMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwPortalConfigType; import java.util.List; /** * 门户网站配置类型Mapper接口 * * @author xins * @date 2024-12-11 */ public interface HwPortalConfigTypeMapper { /** * 查询门户网站配置类型 * * @param configTypeId 门户网站配置类型主键 * @return 门户网站配置类型 */ public HwPortalConfigType selectHwPortalConfigTypeByConfigTypeId(Long configTypeId); /** * 查询门户网站配置类型列表 * * @param hwPortalConfigType 门户网站配置类型 * @return 门户网站配置类型集合 */ public List selectHwPortalConfigTypeList(HwPortalConfigType hwPortalConfigType); /** * 新增门户网站配置类型 * * @param hwPortalConfigType 门户网站配置类型 * @return 结果 */ public int insertHwPortalConfigType(HwPortalConfigType hwPortalConfigType); /** * 修改门户网站配置类型 * * @param hwPortalConfigType 门户网站配置类型 * @return 结果 */ public int updateHwPortalConfigType(HwPortalConfigType hwPortalConfigType); /** * 删除门户网站配置类型 * * @param configTypeId 门户网站配置类型主键 * @return 结果 */ public int deleteHwPortalConfigTypeByConfigTypeId(Long configTypeId); /** * 批量删除门户网站配置类型 * * @param configTypeIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwPortalConfigTypeByConfigTypeIds(Long[] configTypeIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwProductCaseInfoMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwProductCaseInfo; import java.util.List; /** * 案例内容Mapper接口 * * @author xins * @date 2024-12-01 */ public interface HwProductCaseInfoMapper { /** * 查询案例内容 * * @param caseInfoId 案例内容主键 * @return 案例内容 */ public HwProductCaseInfo selectHwProductCaseInfoByCaseInfoId(Long caseInfoId); /** * 查询案例内容列表 * * @param hwProductCaseInfo 案例内容 * @return 案例内容集合 */ public List selectHwProductCaseInfoList(HwProductCaseInfo hwProductCaseInfo); /** * 新增案例内容 * * @param hwProductCaseInfo 案例内容 * @return 结果 */ public int insertHwProductCaseInfo(HwProductCaseInfo hwProductCaseInfo); /** * 修改案例内容 * * @param hwProductCaseInfo 案例内容 * @return 结果 */ public int updateHwProductCaseInfo(HwProductCaseInfo hwProductCaseInfo); /** * 删除案例内容 * * @param caseInfoId 案例内容主键 * @return 结果 */ public int deleteHwProductCaseInfoByCaseInfoId(Long caseInfoId); /** * 批量删除案例内容 * * @param caseInfoIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwProductCaseInfoByCaseInfoIds(Long[] caseInfoIds); /** * 查询案例内容列表,Join portalConfigType * * @param hwProductCaseInfo 案例内容 * @return 案例内容集合 */ public List selectHwProductCaseInfoJoinList(HwProductCaseInfo hwProductCaseInfo); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwProductInfoDetailMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwProductInfoDetail; import java.util.List; /** * 产品信息明细配置Mapper接口 * * @author xins * @date 2024-12-11 */ public interface HwProductInfoDetailMapper { /** * 查询产品信息明细配置 * * @param productInfoDetailId 产品信息明细配置主键 * @return 产品信息明细配置 */ public HwProductInfoDetail selectHwProductInfoDetailByProductInfoDetailId(Long productInfoDetailId); /** * 查询产品信息明细配置列表 * * @param hwProductInfoDetail 产品信息明细配置 * @return 产品信息明细配置集合 */ public List selectHwProductInfoDetailList(HwProductInfoDetail hwProductInfoDetail); /** * 新增产品信息明细配置 * * @param hwProductInfoDetail 产品信息明细配置 * @return 结果 */ public int insertHwProductInfoDetail(HwProductInfoDetail hwProductInfoDetail); /** * 修改产品信息明细配置 * * @param hwProductInfoDetail 产品信息明细配置 * @return 结果 */ public int updateHwProductInfoDetail(HwProductInfoDetail hwProductInfoDetail); /** * 删除产品信息明细配置 * * @param productInfoDetailId 产品信息明细配置主键 * @return 结果 */ public int deleteHwProductInfoDetailByProductInfoDetailId(Long productInfoDetailId); /** * 批量删除产品信息明细配置 * * @param productInfoDetailIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwProductInfoDetailByProductInfoDetailIds(Long[] productInfoDetailIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwProductInfoMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwProductInfo; import java.util.List; /** * 产品信息配置Mapper接口 * * @author xins * @date 2024-12-01 */ public interface HwProductInfoMapper { /** * 查询产品信息配置 * * @param productInfoId 产品信息配置主键 * @return 产品信息配置 */ public HwProductInfo selectHwProductInfoByProductInfoId(Long productInfoId); /** * 查询产品信息配置列表 * * @param hwProductInfo 产品信息配置 * @return 产品信息配置集合 */ public List selectHwProductInfoList(HwProductInfo hwProductInfo); /** * 新增产品信息配置 * * @param hwProductInfo 产品信息配置 * @return 结果 */ public int insertHwProductInfo(HwProductInfo hwProductInfo); /** * 修改产品信息配置 * * @param hwProductInfo 产品信息配置 * @return 结果 */ public int updateHwProductInfo(HwProductInfo hwProductInfo); /** * 删除产品信息配置 * * @param productInfoId 产品信息配置主键 * @return 结果 */ public int deleteHwProductInfoByProductInfoId(Long productInfoId); /** * 批量删除产品信息配置 * * @param productInfoIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwProductInfoByProductInfoIds(Long[] productInfoIds); /** * 查询产品信息配置列表,join product info detail * * @param hwProductInfo 产品信息配置 * @return 产品信息配置集合 */ public List selectHwProductInfoJoinDetailList(HwProductInfo hwProductInfo); /** * 查询产品信息配置列表,join portalConfigType门户网站配置类型 * * @param hwProductInfo 产品信息配置 * @return 产品信息配置集合 */ public List selectHwProductInfoJoinList(HwProductInfo hwProductInfo); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwSearchMapper.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.dto.SearchRawRecord; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 门户搜索 Mapper * * @author ruoyi */ public interface HwSearchMapper { /** * 关键词搜索原始数据 * * @param keyword 关键词 * @return 命中记录 */ List searchByKeyword(@Param("keyword") String keyword); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwWebDocumentMapper.java` ```java package com.ruoyi.portal.mapper; import java.util.List; import com.ruoyi.portal.domain.HwWebDocument; /** * Hw资料文件Mapper接口 * * @author zch * @date 2025-09-22 */ public interface HwWebDocumentMapper { /** * 查询Hw资料文件 * * @param documentId Hw资料文件主键 * @return Hw资料文件 */ public HwWebDocument selectHwWebDocumentByDocumentId(String documentId); /** * 查询Hw资料文件列表 * * @param hwWebDocument Hw资料文件 * @return Hw资料文件集合 */ public List selectHwWebDocumentList(HwWebDocument hwWebDocument); /** * 新增Hw资料文件 * * @param hwWebDocument Hw资料文件 * @return 结果 */ public int insertHwWebDocument(HwWebDocument hwWebDocument); /** * 修改Hw资料文件 * * @param hwWebDocument Hw资料文件 * @return 结果 */ public int updateHwWebDocument(HwWebDocument hwWebDocument); /** * 删除Hw资料文件 * * @param documentId Hw资料文件主键 * @return 结果 */ public int deleteHwWebDocumentByDocumentId(String documentId); /** * 批量删除Hw资料文件 * * @param documentIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwWebDocumentByDocumentIds(String[] documentIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwWebMapper.java` ```java package com.ruoyi.portal.mapper; import java.util.List; import com.ruoyi.portal.domain.HwWeb; /** * haiwei官网jsonMapper接口 * * @author ruoyi * @date 2025-08-18 */ public interface HwWebMapper { /** * 查询haiwei官网json * * @param webId haiwei官网json主键 * @return haiwei官网json */ public HwWeb selectHwWebByWebcode(Long webCode); /** * 查询haiwei官网json列表 * * @param hwWeb haiwei官网json * @return haiwei官网json集合 */ public List selectHwWebList(HwWeb hwWeb); /** * 新增haiwei官网json * * @param hwWeb haiwei官网json * @return 结果 */ public int insertHwWeb(HwWeb hwWeb); /** * 修改haiwei官网json * * @param hwWeb haiwei官网json * @return 结果 */ public int updateHwWeb(HwWeb hwWeb); /** * 删除haiwei官网json * * @param webId haiwei官网json主键 * @return 结果 */ public int deleteHwWebByWebId(Long webId); /** * 批量删除haiwei官网json * * @param webIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwWebByWebIds(Long[] webIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwWebMapper1.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwWeb1; import java.util.List; /** * haiwei官网jsonMapper接口 * * @author ruoyi * @date 2025-08-18 */ public interface HwWebMapper1 { /** * 查询haiwei官网json * * @param webId haiwei官网json主键 * @return haiwei官网json */ public HwWeb1 selectHwWebByWebcode(Long webCode); /** * 查询haiwei官网json列表 * * @param HwWeb1 haiwei官网json * @return haiwei官网json集合 */ public HwWeb1 selectHwWebOne(HwWeb1 hwWeb1); /** * 查询haiwei官网json列表 * * @param HwWeb1 haiwei官网json * @return haiwei官网json集合 */ public List selectHwWebList(HwWeb1 hwWeb1); /** * 新增haiwei官网json * * @param HwWeb1 haiwei官网json * @return 结果 */ public int insertHwWeb(HwWeb1 hwWeb1); /** * 修改haiwei官网json * * @param HwWeb1 haiwei官网json * @return 结果 */ public int updateHwWeb(HwWeb1 hwWeb1); /** * 删除haiwei官网json * * @param webId haiwei官网json主键 * @return 结果 */ public int deleteHwWebByWebId(Long webId); /** * 批量删除haiwei官网json * * @param webIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwWebByWebIds(Long[] webIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper.java` ```java package com.ruoyi.portal.mapper; import java.util.List; import com.ruoyi.portal.domain.HwWebMenu; /** * haiwei官网菜单Mapper接口 * * @author zch * @date 2025-08-18 */ public interface HwWebMenuMapper { /** * 查询haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return haiwei官网菜单 */ public HwWebMenu selectHwWebMenuByWebMenuId(Long webMenuId); /** * 查询haiwei官网菜单列表 * * @param hwWebMenu haiwei官网菜单 * @return haiwei官网菜单集合 */ public List selectHwWebMenuList(HwWebMenu hwWebMenu); /** * 新增haiwei官网菜单 * * @param hwWebMenu haiwei官网菜单 * @return 结果 */ public int insertHwWebMenu(HwWebMenu hwWebMenu); /** * 修改haiwei官网菜单 * * @param hwWebMenu haiwei官网菜单 * @return 结果 */ public int updateHwWebMenu(HwWebMenu hwWebMenu); /** * 删除haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return 结果 */ public int deleteHwWebMenuByWebMenuId(Long webMenuId); /** * 批量删除haiwei官网菜单 * * @param webMenuIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwWebMenuByWebMenuIds(Long[] webMenuIds); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/mapper/HwWebMenuMapper1.java` ```java package com.ruoyi.portal.mapper; import com.ruoyi.portal.domain.HwWebMenu; import com.ruoyi.portal.domain.HwWebMenu1; import com.ruoyi.portal.domain.HwWebMenu1; import java.util.List; /** * haiwei官网菜单Mapper接口 * * @author zch * @date 2025-08-18 */ public interface HwWebMenuMapper1 { /** * 查询haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return haiwei官网菜单 */ public HwWebMenu1 selectHwWebMenuByWebMenuId(Long webMenuId); /** * 查询haiwei官网菜单列表 * * @param HwWebMenu1 haiwei官网菜单 * @return haiwei官网菜单集合 */ public List selectHwWebMenuList(HwWebMenu1 HwWebMenu1); /** * 新增haiwei官网菜单 * * @param HwWebMenu1 haiwei官网菜单 * @return 结果 */ public int insertHwWebMenu(HwWebMenu1 HwWebMenu1); /** * 修改haiwei官网菜单 * * @param HwWebMenu1 haiwei官网菜单 * @return 结果 */ public int updateHwWebMenu(HwWebMenu1 HwWebMenu1); /** * 删除haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return 结果 */ public int deleteHwWebMenuByWebMenuId(Long webMenuId); /** * 批量删除haiwei官网菜单 * * @param webMenuIds 需要删除的数据主键集合 * @return 结果 */ public int deleteHwWebMenuByWebMenuIds(Long[] webMenuIds); /** * 获取菜单树列表 */ public List selectMenuTree(HwWebMenu1 hwWebMenu); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/search/convert/PortalSearchDocConverter.java` ```java package com.ruoyi.portal.search.convert; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.HwWeb; import com.ruoyi.portal.domain.HwWeb1; import com.ruoyi.portal.domain.HwWebDocument; import com.ruoyi.portal.domain.HwWebMenu; import com.ruoyi.portal.search.es.entity.PortalSearchDoc; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * 搜索文档转换器 * * @author ruoyi */ @Component public class PortalSearchDocConverter { public static final String SOURCE_MENU = "menu"; public static final String SOURCE_WEB = "web"; public static final String SOURCE_WEB1 = "web1"; public static final String SOURCE_DOCUMENT = "document"; public static final String SOURCE_CONFIG_TYPE = "configType"; private static final Set SKIP_JSON_KEYS = new HashSet<>(Arrays.asList( "icon", "url", "banner", "banner1", "img", "imglist", "type", "uuid", "filename", "documentaddress", "secretkey", "route", "routequery", "webcode", "deviceid", "typeid", "configtypeid", "id" )); private final ObjectMapper objectMapper = new ObjectMapper(); public PortalSearchDoc fromWebMenu(HwWebMenu menu) { PortalSearchDoc doc = initBase(); String id = "menu:" + menu.getWebMenuId(); doc.setId(id); doc.setDocId(id); doc.setSourceType(SOURCE_MENU); doc.setTitle(menu.getWebMenuName()); doc.setContent(joinText(menu.getWebMenuName(), menu.getAncestors())); doc.setMenuId(String.valueOf(menu.getWebMenuId())); doc.setRoute("/test"); doc.setRouteQueryJson(toJson(Map.of("id", menu.getWebMenuId()))); doc.setUpdatedAt(new Date()); return doc; } public PortalSearchDoc fromWeb(HwWeb web) { PortalSearchDoc doc = initBase(); String webCode = toString(web.getWebCode()); String id = "web:" + webCode; doc.setId(id); doc.setDocId(id); doc.setSourceType(SOURCE_WEB); doc.setTitle("页面#" + webCode); doc.setContent(extractSearchableText(web.getWebJsonString())); doc.setWebCode(webCode); if ("-1".equals(webCode)) { doc.setRoute("/index"); doc.setRouteQueryJson("{}"); } else if ("7".equals(webCode)) { doc.setRoute("/productCenter"); doc.setRouteQueryJson("{}"); } else { doc.setRoute("/test"); doc.setRouteQueryJson(toJson(Map.of("id", webCode))); } doc.setUpdatedAt(new Date()); return doc; } public PortalSearchDoc fromWeb1(HwWeb1 web1) { PortalSearchDoc doc = initBase(); String webCode = toString(web1.getWebCode()); String typeId = toString(web1.getTypeId()); String deviceId = toString(web1.getDeviceId()); String id = String.format("web1:%s:%s:%s", webCode, typeId, deviceId); doc.setId(id); doc.setDocId(id); doc.setSourceType(SOURCE_WEB1); doc.setTitle("详情#" + webCode + "-" + typeId + "-" + deviceId); doc.setContent(extractSearchableText(web1.getWebJsonString())); doc.setWebCode(webCode); doc.setTypeId(typeId); doc.setDeviceId(deviceId); doc.setRoute("/productCenter/detail"); doc.setRouteQueryJson(toJson(Map.of("webCode", webCode, "typeId", typeId, "deviceId", deviceId))); doc.setUpdatedAt(new Date()); return doc; } public PortalSearchDoc fromDocument(HwWebDocument document) { PortalSearchDoc doc = initBase(); String id = "doc:" + document.getDocumentId(); doc.setId(id); doc.setDocId(id); doc.setSourceType(SOURCE_DOCUMENT); String title = StringUtils.isNotBlank(document.getJson()) ? document.getJson() : document.getDocumentId(); doc.setTitle(title); doc.setContent(StringUtils.defaultString(document.getJson())); doc.setDocumentId(document.getDocumentId()); doc.setWebCode(document.getWebCode()); doc.setTypeId(document.getType()); doc.setRoute("/serviceSupport"); doc.setRouteQueryJson(toJson(Map.of("documentId", document.getDocumentId()))); doc.setUpdatedAt(new Date()); return doc; } public PortalSearchDoc fromConfigType(HwPortalConfigType configType) { PortalSearchDoc doc = initBase(); String id = "configType:" + configType.getConfigTypeId(); doc.setId(id); doc.setDocId(id); doc.setSourceType(SOURCE_CONFIG_TYPE); doc.setTitle(configType.getConfigTypeName()); doc.setContent(joinText(configType.getConfigTypeName(), configType.getHomeConfigTypeName(), configType.getConfigTypeDesc())); doc.setTypeId(toString(configType.getConfigTypeId())); doc.setRoute("/productCenter"); doc.setRouteQueryJson(toJson(Map.of("configTypeId", configType.getConfigTypeId()))); doc.setUpdatedAt(new Date()); return doc; } public String extractSearchableText(String text) { if (StringUtils.isBlank(text)) { return StringUtils.EMPTY; } String stripped = stripHtml(text); try { JsonNode root = objectMapper.readTree(text); StringBuilder builder = new StringBuilder(); collectNodeText(root, null, builder); String extracted = normalizeWhitespace(builder.toString()); return StringUtils.isBlank(extracted) ? stripped : extracted; } catch (Exception ignored) { return stripped; } } private void collectNodeText(JsonNode node, String fieldName, StringBuilder out) { if (node == null || node.isNull()) { return; } if (node.isObject()) { node.fields().forEachRemaining(entry -> { if (!shouldSkip(entry.getKey())) { collectNodeText(entry.getValue(), entry.getKey(), out); } }); return; } if (node.isArray()) { for (JsonNode child : node) { collectNodeText(child, fieldName, out); } return; } if (node.isTextual()) { if (shouldSkip(fieldName)) { return; } String value = normalizeWhitespace(stripHtml(node.asText())); if (StringUtils.isBlank(value)) { return; } if (value.startsWith("http://") || value.startsWith("https://")) { return; } out.append(value).append(' '); } } private boolean shouldSkip(String fieldName) { if (StringUtils.isBlank(fieldName)) { return false; } String normalized = fieldName.toLowerCase(); return SKIP_JSON_KEYS.contains(normalized) || normalized.endsWith("url") || normalized.endsWith("icon"); } private PortalSearchDoc initBase() { PortalSearchDoc doc = new PortalSearchDoc(); doc.setIsDelete("0"); return doc; } private String joinText(String... parts) { return Arrays.stream(parts) .filter(StringUtils::isNotBlank) .map(this::normalizeWhitespace) .collect(Collectors.joining(" ")); } private String stripHtml(String text) { if (StringUtils.isBlank(text)) { return StringUtils.EMPTY; } String noTags = text.replaceAll("<[^>]+>", " "); return normalizeWhitespace(noTags); } private String normalizeWhitespace(String value) { if (value == null) { return StringUtils.EMPTY; } return value.replaceAll("\\s+", " ").trim(); } private String toString(Object value) { return value == null ? null : String.valueOf(value); } private String toJson(Map routeQuery) { try { return objectMapper.writeValueAsString(routeQuery); } catch (Exception e) { return "{}"; } } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/search/es/entity/PortalSearchDoc.java` ```java package com.ruoyi.portal.search.es.entity; import org.dromara.easyes.annotation.HighLight; import org.dromara.easyes.annotation.IndexField; import org.dromara.easyes.annotation.IndexId; import org.dromara.easyes.annotation.IndexName; import org.dromara.easyes.annotation.rely.Analyzer; import org.dromara.easyes.annotation.rely.FieldType; import org.dromara.easyes.annotation.rely.IdType; import java.util.Date; /** * 门户搜索文档 * * @author ruoyi */ @IndexName("hw_portal_content") public class PortalSearchDoc { @IndexId(type = IdType.NONE) private String id; @IndexField(fieldType = FieldType.KEYWORD) private String docId; @IndexField(fieldType = FieldType.KEYWORD) private String sourceType; @HighLight(preTag = "", postTag = "") @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_SMART) private String title; @HighLight(preTag = "", postTag = "") @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_SMART) private String content; @IndexField(fieldType = FieldType.KEYWORD) private String webCode; @IndexField(fieldType = FieldType.KEYWORD) private String typeId; @IndexField(fieldType = FieldType.KEYWORD) private String deviceId; @IndexField(fieldType = FieldType.KEYWORD) private String menuId; @IndexField(fieldType = FieldType.KEYWORD) private String documentId; @IndexField(fieldType = FieldType.KEYWORD) private String route; private String routeQueryJson; @IndexField(fieldType = FieldType.KEYWORD) private String isDelete; private Date updatedAt; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDocId() { return docId; } public void setDocId(String docId) { this.docId = docId; } public String getSourceType() { return sourceType; } public void setSourceType(String sourceType) { this.sourceType = sourceType; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getWebCode() { return webCode; } public void setWebCode(String webCode) { this.webCode = webCode; } public String getTypeId() { return typeId; } public void setTypeId(String typeId) { this.typeId = typeId; } public String getDeviceId() { return deviceId; } public void setDeviceId(String deviceId) { this.deviceId = deviceId; } public String getMenuId() { return menuId; } public void setMenuId(String menuId) { this.menuId = menuId; } public String getDocumentId() { return documentId; } public void setDocumentId(String documentId) { this.documentId = documentId; } public String getRoute() { return route; } public void setRoute(String route) { this.route = route; } public String getRouteQueryJson() { return routeQueryJson; } public void setRouteQueryJson(String routeQueryJson) { this.routeQueryJson = routeQueryJson; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } public Date getUpdatedAt() { return updatedAt; } public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/search/es/mapper/PortalSearchMapper.java` ```java package com.ruoyi.portal.search.es.mapper; import com.ruoyi.portal.search.es.entity.PortalSearchDoc; import org.dromara.easyes.core.kernel.BaseEsMapper; /** * 门户搜索 ES Mapper * * @author ruoyi */ public interface PortalSearchMapper extends BaseEsMapper { } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/search/service/impl/PortalSearchEsServiceImpl.java` ```java package com.ruoyi.portal.search.service.impl; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.portal.domain.dto.SearchPageDTO; import com.ruoyi.portal.domain.dto.SearchResultDTO; import com.ruoyi.portal.search.convert.PortalSearchDocConverter; import com.ruoyi.portal.search.es.entity.PortalSearchDoc; import com.ruoyi.portal.search.es.mapper.PortalSearchMapper; import com.ruoyi.portal.search.service.PortalSearchEsService; import org.dromara.easyes.core.biz.EsPageInfo; import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * ES 搜索服务实现 * * @author ruoyi */ @Service public class PortalSearchEsServiceImpl implements PortalSearchEsService { private static final Logger log = LoggerFactory.getLogger(PortalSearchEsServiceImpl.class); private static final Pattern ESCAPE_PATTERN = Pattern.compile("([\\\\.*+\\[\\](){}^$?|])"); private final PortalSearchMapper portalSearchMapper; private final ObjectMapper objectMapper = new ObjectMapper(); public PortalSearchEsServiceImpl(PortalSearchMapper portalSearchMapper) { this.portalSearchMapper = portalSearchMapper; } @Override public SearchPageDTO search(String keyword, Integer pageNum, Integer pageSize, boolean editMode) { LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); wrapper.and(q -> q.match(PortalSearchDoc::getTitle, keyword, 5.0f).or().match(PortalSearchDoc::getContent, keyword, 2.0f)); wrapper.eq(PortalSearchDoc::getIsDelete, "0"); EsPageInfo pageInfo = portalSearchMapper.pageQuery(wrapper, pageNum, pageSize); List rows = pageInfo.getList().stream().map(doc -> toResult(doc, keyword, editMode)).collect(Collectors.toList()); SearchPageDTO page = new SearchPageDTO(); page.setRows(rows); page.setTotal(pageInfo.getTotal()); return page; } private SearchResultDTO toResult(PortalSearchDoc doc, String keyword, boolean editMode) { SearchResultDTO result = new SearchResultDTO(); result.setSourceType(doc.getSourceType()); result.setTitle(doc.getTitle()); result.setSnippet(buildSnippet(doc.getTitle(), doc.getContent(), keyword)); result.setScore(0); result.setRoute(doc.getRoute()); result.setRouteQuery(parseRouteQuery(doc.getRouteQueryJson())); if (editMode) { result.setEditRoute(buildEditRoute(doc.getSourceType(), doc.getWebCode(), doc.getTypeId(), doc.getDeviceId(), doc.getMenuId(), doc.getDocumentId())); } return result; } private Map parseRouteQuery(String json) { if (StringUtils.isBlank(json)) { return new HashMap<>(); } try { return objectMapper.readValue(json, new TypeReference>() { }); } catch (Exception e) { log.warn("parse routeQueryJson failed: {}", json); return new HashMap<>(); } } private String buildSnippet(String title, String content, String keyword) { if (StringUtils.isNotBlank(title) && StringUtils.containsIgnoreCase(title, keyword)) { return highlight(title, keyword); } String normalized = StringUtils.defaultString(content); if (StringUtils.isBlank(normalized)) { return StringUtils.EMPTY; } int idx = StringUtils.indexOfIgnoreCase(normalized, keyword); if (idx < 0) { return StringUtils.substring(normalized, 0, Math.min(120, normalized.length())); } int start = Math.max(0, idx - 60); int end = Math.min(normalized.length(), idx + keyword.length() + 60); String snippet = normalized.substring(start, end); if (start > 0) { snippet = "..." + snippet; } if (end < normalized.length()) { snippet = snippet + "..."; } return highlight(snippet, keyword); } private String highlight(String text, String keyword) { if (StringUtils.isBlank(text) || StringUtils.isBlank(keyword)) { return StringUtils.defaultString(text); } String escaped = ESCAPE_PATTERN.matcher(keyword).replaceAll("\\\\$1"); Matcher matcher = Pattern.compile("(?i)" + escaped).matcher(text); if (!matcher.find()) { return text; } return matcher.replaceAll("$0"); } private String buildEditRoute(String sourceType, String webCode, String typeId, String deviceId, String menuId, String documentId) { if (PortalSearchDocConverter.SOURCE_MENU.equals(sourceType)) { return "/editor?type=1&id=" + menuId; } if (PortalSearchDocConverter.SOURCE_WEB.equals(sourceType)) { if ("7".equals(webCode)) { return "/productCenter/edit"; } if ("-1".equals(webCode)) { return "/editor?type=3&id=-1"; } return "/editor?type=1&id=" + webCode; } if (PortalSearchDocConverter.SOURCE_WEB1.equals(sourceType)) { return "/editor?type=2&id=" + webCode + "," + typeId + "," + deviceId; } if (PortalSearchDocConverter.SOURCE_DOCUMENT.equals(sourceType)) { if (StringUtils.isNotBlank(webCode) && StringUtils.isNotBlank(typeId) && StringUtils.isNotBlank(deviceId)) { return "/editor?type=2&id=" + webCode + "," + typeId + "," + deviceId + "&documentId=" + documentId; } return "/editor?type=2&documentId=" + documentId; } if (PortalSearchDocConverter.SOURCE_CONFIG_TYPE.equals(sourceType)) { return "/productCenter/edit"; } return "/editor"; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/search/service/PortalSearchEsService.java` ```java package com.ruoyi.portal.search.service; import com.ruoyi.portal.domain.dto.SearchPageDTO; /** * ES 搜索服务 * * @author ruoyi */ public interface PortalSearchEsService { /** * ES 查询 * * @param keyword 关键词 * @param pageNum 页码 * @param pageSize 每页条数 * @param editMode 是否编辑端模式 * @return 搜索结果 */ SearchPageDTO search(String keyword, Integer pageNum, Integer pageSize, boolean editMode); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoDetailService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwAboutUsInfoDetail; import java.util.List; /** * 关于我们信息明细Service接口 * * @author ruoyi * @date 2024-12-01 */ public interface IHwAboutUsInfoDetailService { /** * 查询关于我们信息明细 * * @param usInfoDetailId 关于我们信息明细主键 * @return 关于我们信息明细 */ public HwAboutUsInfoDetail selectHwAboutUsInfoDetailByUsInfoDetailId(Long usInfoDetailId); /** * 查询关于我们信息明细列表 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 关于我们信息明细集合 */ public List selectHwAboutUsInfoDetailList(HwAboutUsInfoDetail hwAboutUsInfoDetail); /** * 新增关于我们信息明细 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 结果 */ public int insertHwAboutUsInfoDetail(HwAboutUsInfoDetail hwAboutUsInfoDetail); /** * 修改关于我们信息明细 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 结果 */ public int updateHwAboutUsInfoDetail(HwAboutUsInfoDetail hwAboutUsInfoDetail); /** * 批量删除关于我们信息明细 * * @param usInfoDetailIds 需要删除的关于我们信息明细主键集合 * @return 结果 */ public int deleteHwAboutUsInfoDetailByUsInfoDetailIds(Long[] usInfoDetailIds); /** * 删除关于我们信息明细信息 * * @param usInfoDetailId 关于我们信息明细主键 * @return 结果 */ public int deleteHwAboutUsInfoDetailByUsInfoDetailId(Long usInfoDetailId); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwAboutUsInfoService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwAboutUsInfo; import java.util.List; /** * 关于我们信息Service接口 * * @author xins * @date 2024-12-01 */ public interface IHwAboutUsInfoService { /** * 查询关于我们信息 * * @param aboutUsInfoId 关于我们信息主键 * @return 关于我们信息 */ public HwAboutUsInfo selectHwAboutUsInfoByAboutUsInfoId(Long aboutUsInfoId); /** * 查询关于我们信息列表 * * @param hwAboutUsInfo 关于我们信息 * @return 关于我们信息集合 */ public List selectHwAboutUsInfoList(HwAboutUsInfo hwAboutUsInfo); /** * 新增关于我们信息 * * @param hwAboutUsInfo 关于我们信息 * @return 结果 */ public int insertHwAboutUsInfo(HwAboutUsInfo hwAboutUsInfo); /** * 修改关于我们信息 * * @param hwAboutUsInfo 关于我们信息 * @return 结果 */ public int updateHwAboutUsInfo(HwAboutUsInfo hwAboutUsInfo); /** * 批量删除关于我们信息 * * @param aboutUsInfoIds 需要删除的关于我们信息主键集合 * @return 结果 */ public int deleteHwAboutUsInfoByAboutUsInfoIds(Long[] aboutUsInfoIds); /** * 删除关于我们信息信息 * * @param aboutUsInfoId 关于我们信息主键 * @return 结果 */ public int deleteHwAboutUsInfoByAboutUsInfoId(Long aboutUsInfoId); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwAnalyticsService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.dto.AnalyticsCollectRequest; import com.ruoyi.portal.domain.dto.AnalyticsDashboardDTO; import java.time.LocalDate; /** * 官网访问监控服务 * * @author ruoyi */ public interface IHwAnalyticsService { /** * 采集匿名访问事件 * * @param request 采集请求 * @param requestIp 请求 IP * @param requestUserAgent 请求 UA */ void collect(AnalyticsCollectRequest request, String requestIp, String requestUserAgent); /** * 查询日看板 * * @param statDate 统计日期 * @param rankLimit 排行数量 * @return 看板数据 */ AnalyticsDashboardDTO getDashboard(LocalDate statDate, Integer rankLimit); /** * 刷新日汇总 * * @param statDate 日期 */ void refreshDailyStat(LocalDate statDate); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwContactUsInfoService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwContactUsInfo; import java.util.List; /** * 联系我们信息Service接口 * * @author xins * @date 2024-12-01 */ public interface IHwContactUsInfoService { /** * 查询联系我们信息 * * @param contactUsInfoId 联系我们信息主键 * @return 联系我们信息 */ public HwContactUsInfo selectHwContactUsInfoByContactUsInfoId(Long contactUsInfoId); /** * 查询联系我们信息列表 * * @param hwContactUsInfo 联系我们信息 * @return 联系我们信息集合 */ public List selectHwContactUsInfoList(HwContactUsInfo hwContactUsInfo); /** * 新增联系我们信息 * * @param hwContactUsInfo 联系我们信息 * @return 结果 */ public int insertHwContactUsInfo(HwContactUsInfo hwContactUsInfo); /** * 修改联系我们信息 * * @param hwContactUsInfo 联系我们信息 * @return 结果 */ public int updateHwContactUsInfo(HwContactUsInfo hwContactUsInfo); /** * 批量删除联系我们信息 * * @param contactUsInfoIds 需要删除的联系我们信息主键集合 * @return 结果 */ public int deleteHwContactUsInfoByContactUsInfoIds(Long[] contactUsInfoIds); /** * 删除联系我们信息信息 * * @param contactUsInfoId 联系我们信息主键 * @return 结果 */ public int deleteHwContactUsInfoByContactUsInfoId(Long contactUsInfoId); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwPortalConfigService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwPortalConfig; import java.util.List; /** * 门户网站配置Service接口 * * @author xins * @date 2024-12-01 */ public interface IHwPortalConfigService { /** * 查询门户网站配置 * * @param portalConfigId 门户网站配置主键 * @return 门户网站配置 */ public HwPortalConfig selectHwPortalConfigByPortalConfigId(Long portalConfigId); /** * 查询门户网站配置列表 * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置集合 */ public List selectHwPortalConfigList(HwPortalConfig hwPortalConfig); /** * 新增门户网站配置 * * @param hwPortalConfig 门户网站配置 * @return 结果 */ public int insertHwPortalConfig(HwPortalConfig hwPortalConfig); /** * 修改门户网站配置 * * @param hwPortalConfig 门户网站配置 * @return 结果 */ public int updateHwPortalConfig(HwPortalConfig hwPortalConfig); /** * 批量删除门户网站配置 * * @param portalConfigIds 需要删除的门户网站配置主键集合 * @return 结果 */ public int deleteHwPortalConfigByPortalConfigIds(Long[] portalConfigIds); /** * 删除门户网站配置信息 * * @param portalConfigId 门户网站配置主键 * @return 结果 */ public int deleteHwPortalConfigByPortalConfigId(Long portalConfigId); /** * 查询门户网站配置列表,Join hw_portal_config_type * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置 */ public List selectHwPortalConfigJoinList(HwPortalConfig hwPortalConfig); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwPortalConfigTypeService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.vo.TreeSelect; import java.util.List; /** * 门户网站配置类型Service接口 * * @author xins * @date 2024-12-11 */ public interface IHwPortalConfigTypeService { /** * 查询门户网站配置类型 * * @param configTypeId 门户网站配置类型主键 * @return 门户网站配置类型 */ public HwPortalConfigType selectHwPortalConfigTypeByConfigTypeId(Long configTypeId); /** * 查询门户网站配置类型列表 * * @param hwPortalConfigType 门户网站配置类型 * @return 门户网站配置类型集合 */ public List selectHwPortalConfigTypeList(HwPortalConfigType hwPortalConfigType); /** * 查询门户网站配置类型列表 * * @param hwPortalConfigType 门户网站配置类型 * @return 门户网站配置类型集合 */ public List selectConfigTypeList(HwPortalConfigType hwPortalConfigType); /** * 新增门户网站配置类型 * * @param hwPortalConfigType 门户网站配置类型 * @return 结果 */ public int insertHwPortalConfigType(HwPortalConfigType hwPortalConfigType); /** * 修改门户网站配置类型 * * @param hwPortalConfigType 门户网站配置类型 * @return 结果 */ public int updateHwPortalConfigType(HwPortalConfigType hwPortalConfigType); /** * 批量删除门户网站配置类型 * * @param configTypeIds 需要删除的门户网站配置类型主键集合 * @return 结果 */ public int deleteHwPortalConfigTypeByConfigTypeIds(Long[] configTypeIds); /** * 删除门户网站配置类型信息 * * @param configTypeId 门户网站配置类型主键 * @return 结果 */ public int deleteHwPortalConfigTypeByConfigTypeId(Long configTypeId); /** * 查询门户网站配置类型树结构信息 * * @param portalConfigType 门户网站配置类型信息 * @return 门户网站配置类型树信息集合 */ public List selectPortalConfigTypeTreeList(HwPortalConfigType portalConfigType); /** * 构建前端所需要下拉树结构 * * @param portalConfigTypes 门户网站配置类型列表 * @return 下拉树结构列表 */ public List buildPortalConfigTypeTreeSelect(List portalConfigTypes); /** * 构建前端所需要树结构 * * @param portalConfigTypes 门户网站配置类型列表 * @return 树结构列表 */ public List buildPortalConfigTypeTree(List portalConfigTypes); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwProductCaseInfoService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwProductCaseInfo; import java.util.List; /** * 案例内容Service接口 * * @author xins * @date 2024-12-01 */ public interface IHwProductCaseInfoService { /** * 查询案例内容 * * @param caseInfoId 案例内容主键 * @return 案例内容 */ public HwProductCaseInfo selectHwProductCaseInfoByCaseInfoId(Long caseInfoId); /** * 查询案例内容列表 * * @param hwProductCaseInfo 案例内容 * @return 案例内容集合 */ public List selectHwProductCaseInfoList(HwProductCaseInfo hwProductCaseInfo); /** * 新增案例内容 * * @param hwProductCaseInfo 案例内容 * @return 结果 */ public int insertHwProductCaseInfo(HwProductCaseInfo hwProductCaseInfo); /** * 修改案例内容 * * @param hwProductCaseInfo 案例内容 * @return 结果 */ public int updateHwProductCaseInfo(HwProductCaseInfo hwProductCaseInfo); /** * 批量删除案例内容 * * @param caseInfoIds 需要删除的案例内容主键集合 * @return 结果 */ public int deleteHwProductCaseInfoByCaseInfoIds(Long[] caseInfoIds); /** * 删除案例内容信息 * * @param caseInfoId 案例内容主键 * @return 结果 */ public int deleteHwProductCaseInfoByCaseInfoId(Long caseInfoId); /** * 根据configTypeId获取首页典型案例 * @param hwProductCaseInfo * @return */ public HwProductCaseInfo getTypicalHomeCaseInfo(HwProductCaseInfo hwProductCaseInfo); /** * 查询案例内容列表,join portalConfigType * * @param hwProductCaseInfo 案例内容 * @return 案例内容 */ public List selectHwProductCaseInfoJoinList(HwProductCaseInfo hwProductCaseInfo); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwProductInfoDetailService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwProductInfoDetail; import java.util.List; /** * 产品信息明细配置Service接口 * * @author xins * @date 2024-12-11 */ public interface IHwProductInfoDetailService { /** * 查询产品信息明细配置 * * @param productInfoDetailId 产品信息明细配置主键 * @return 产品信息明细配置 */ public HwProductInfoDetail selectHwProductInfoDetailByProductInfoDetailId(Long productInfoDetailId); /** * 查询产品信息明细配置列表 * * @param hwProductInfoDetail 产品信息明细配置 * @return 产品信息明细配置集合 */ public List selectHwProductInfoDetailList(HwProductInfoDetail hwProductInfoDetail); /** * 新增产品信息明细配置 * * @param hwProductInfoDetail 产品信息明细配置 * @return 结果 */ public int insertHwProductInfoDetail(HwProductInfoDetail hwProductInfoDetail); /** * 修改产品信息明细配置 * * @param hwProductInfoDetail 产品信息明细配置 * @return 结果 */ public int updateHwProductInfoDetail(HwProductInfoDetail hwProductInfoDetail); /** * 批量删除产品信息明细配置 * * @param productInfoDetailIds 需要删除的产品信息明细配置主键集合 * @return 结果 */ public int deleteHwProductInfoDetailByProductInfoDetailIds(Long[] productInfoDetailIds); /** * 删除产品信息明细配置信息 * * @param productInfoDetailId 产品信息明细配置主键 * @return 结果 */ public int deleteHwProductInfoDetailByProductInfoDetailId(Long productInfoDetailId); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwProductInfoService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwProductInfo; import java.util.List; /** * 产品信息配置Service接口 * * @author xins * @date 2024-12-01 */ public interface IHwProductInfoService { /** * 查询产品信息配置 * * @param productInfoId 产品信息配置主键 * @return 产品信息配置 */ public HwProductInfo selectHwProductInfoByProductInfoId(Long productInfoId); /** * 查询产品信息配置列表 * * @param hwProductInfo 产品信息配置 * @return 产品信息配置集合 */ public List selectHwProductInfoList(HwProductInfo hwProductInfo); /** * 新增产品信息配置 * * @param hwProductInfo 产品信息配置 * @return 结果 */ public int insertHwProductInfo(HwProductInfo hwProductInfo); /** * 修改产品信息配置 * * @param hwProductInfo 产品信息配置 * @return 结果 */ public int updateHwProductInfo(HwProductInfo hwProductInfo); /** * 批量删除产品信息配置 * * @param productInfoIds 需要删除的产品信息配置主键集合 * @return 结果 */ public int deleteHwProductInfoByProductInfoIds(Long[] productInfoIds); /** * 删除产品信息配置信息 * * @param productInfoId 产品信息配置主键 * @return 结果 */ public int deleteHwProductInfoByProductInfoId(Long productInfoId); /** * 获取产品中心产品信息(平台简介,hw_product_info获取,(配置模式2左标题+内容,右图片)读取中文标题和英文标题,下面内容从hw_product_info_detail获取,读取标题,内容和图片) * * @param hwProductInfo 产品信息配置 * @return 产品信息配置 */ public List selectHwProductInfoJoinDetailList(HwProductInfo hwProductInfo); /** * 查询产品信息配置列表,join portalConfigType * * @param hwProductInfo 产品信息配置 * @return 产品信息配置 */ public List selectHwProductInfoJoinList(HwProductInfo hwProductInfo); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwSearchRebuildService.java` ```java package com.ruoyi.portal.service; /** * 门户搜索索引重建服务 * * @author ruoyi */ public interface IHwSearchRebuildService { /** * 全量重建搜索索引 */ void rebuildAll(); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwSearchService.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.dto.SearchPageDTO; /** * 门户搜索服务 * * @author ruoyi */ public interface IHwSearchService { /** * 门户搜索 * * @param keyword 关键词 * @param pageNum 页码 * @param pageSize 每页条数 * @return 结果 */ SearchPageDTO search(String keyword, Integer pageNum, Integer pageSize); /** * 编辑端搜索 * * @param keyword 关键词 * @param pageNum 页码 * @param pageSize 每页条数 * @return 结果 */ SearchPageDTO searchForEdit(String keyword, Integer pageNum, Integer pageSize); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwWebDocumentService.java` ```java package com.ruoyi.portal.service; import java.util.List; import com.ruoyi.portal.domain.HwWebDocument; /** * Hw资料文件Service接口 * * @author zch * @date 2025-09-22 */ public interface IHwWebDocumentService { /** * 查询Hw资料文件 * * @param documentId Hw资料文件主键 * @return Hw资料文件 */ public HwWebDocument selectHwWebDocumentByDocumentId(String documentId); /** * 查询Hw资料文件列表 * * @param hwWebDocument Hw资料文件 * @return Hw资料文件集合 */ public List selectHwWebDocumentList(HwWebDocument hwWebDocument); /** * 新增Hw资料文件 * * @param hwWebDocument Hw资料文件 * @return 结果 */ public int insertHwWebDocument(HwWebDocument hwWebDocument); /** * 修改Hw资料文件 * * @param hwWebDocument Hw资料文件 * @return 结果 */ public int updateHwWebDocument(HwWebDocument hwWebDocument); /** * 批量删除Hw资料文件 * * @param documentIds 需要删除的Hw资料文件主键集合 * @return 结果 */ public int deleteHwWebDocumentByDocumentIds(String[] documentIds); /** * 删除Hw资料文件信息 * * @param documentId Hw资料文件主键 * @return 结果 */ public int deleteHwWebDocumentByDocumentId(String documentId); /** * 验证密钥并获取文件地址 * @param documentId 文件ID * @param providedKey 提供的密钥 * @return 文件地址 * @throws Exception 如果密钥不匹配 */ String verifyAndGetDocumentAddress(String documentId, String providedKey) throws Exception; } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwWebMenuService.java` ```java package com.ruoyi.portal.service; import java.util.List; import com.ruoyi.portal.domain.HwWebMenu; /** * haiwei官网菜单Service接口 * * @author zch * @date 2025-08-18 */ public interface IHwWebMenuService { /** * 查询haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return haiwei官网菜单 */ public HwWebMenu selectHwWebMenuByWebMenuId(Long webMenuId); /** * 查询haiwei官网菜单列表 * * @param hwWebMenu haiwei官网菜单 * @return haiwei官网菜单集合 */ public List selectHwWebMenuList(HwWebMenu hwWebMenu); /** * 新增haiwei官网菜单 * * @param hwWebMenu haiwei官网菜单 * @return 结果 */ public int insertHwWebMenu(HwWebMenu hwWebMenu); /** * 修改haiwei官网菜单 * * @param hwWebMenu haiwei官网菜单 * @return 结果 */ public int updateHwWebMenu(HwWebMenu hwWebMenu); /** * 批量删除haiwei官网菜单 * * @param webMenuIds 需要删除的haiwei官网菜单主键集合 * @return 结果 */ public int deleteHwWebMenuByWebMenuIds(Long[] webMenuIds); /** * 删除haiwei官网菜单信息 * * @param webMenuId haiwei官网菜单主键 * @return 结果 */ public int deleteHwWebMenuByWebMenuId(Long webMenuId); /** * 获取菜单树列表 */ public List selectMenuTree(HwWebMenu hwWebMenu); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwWebMenuService1.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwWebMenu1; import com.ruoyi.portal.domain.HwWebMenu1; import java.util.List; /** * haiwei官网菜单Service接口 * * @author zch * @date 2025-08-18 */ public interface IHwWebMenuService1 { /** * 查询haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return haiwei官网菜单 */ public HwWebMenu1 selectHwWebMenuByWebMenuId(Long webMenuId); /** * 查询haiwei官网菜单列表 * * @param HwWebMenu1 haiwei官网菜单 * @return haiwei官网菜单集合 */ public List selectHwWebMenuList(HwWebMenu1 HwWebMenu1); /** * 新增haiwei官网菜单 * * @param HwWebMenu1 haiwei官网菜单 * @return 结果 */ public int insertHwWebMenu(HwWebMenu1 HwWebMenu1); /** * 修改haiwei官网菜单 * * @param HwWebMenu1 haiwei官网菜单 * @return 结果 */ public int updateHwWebMenu(HwWebMenu1 HwWebMenu1); /** * 批量删除haiwei官网菜单 * * @param webMenuIds 需要删除的haiwei官网菜单主键集合 * @return 结果 */ public int deleteHwWebMenuByWebMenuIds(Long[] webMenuIds); /** * 删除haiwei官网菜单信息 * * @param webMenuId haiwei官网菜单主键 * @return 结果 */ public int deleteHwWebMenuByWebMenuId(Long webMenuId); /** * 获取菜单树列表 */ public List selectMenuTree(HwWebMenu1 HwWebMenu1); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwWebService.java` ```java package com.ruoyi.portal.service; import java.util.List; import com.ruoyi.portal.domain.HwWeb; /** * haiwei官网jsonService接口 * * @author ruoyi * @date 2025-08-18 */ public interface IHwWebService { /** * 查询haiwei官网json * * @param webId haiwei官网json主键 * @return haiwei官网json */ public HwWeb selectHwWebByWebcode(Long webCode); /** * 查询haiwei官网json列表 * * @param hwWeb haiwei官网json * @return haiwei官网json集合 */ public List selectHwWebList(HwWeb hwWeb); /** * 新增haiwei官网json * * @param hwWeb haiwei官网json * @return 结果 */ public int insertHwWeb(HwWeb hwWeb); /** * 修改haiwei官网json * * @param hwWeb haiwei官网json * @return 结果 */ public int updateHwWeb(HwWeb hwWeb); /** * 批量删除haiwei官网json * * @param webIds 需要删除的haiwei官网json主键集合 * @return 结果 */ public int deleteHwWebByWebIds(Long[] webIds); /** * 删除haiwei官网json信息 * * @param webId haiwei官网json主键 * @return 结果 */ public int deleteHwWebByWebId(Long webId); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/IHwWebService1.java` ```java package com.ruoyi.portal.service; import com.ruoyi.portal.domain.HwWeb1; import java.util.List; /** * haiwei官网jsonService接口 * * @author ruoyi * @date 2025-08-18 */ public interface IHwWebService1 { /** * 查询haiwei官网json * * @param webId haiwei官网json主键 * @return haiwei官网json */ public HwWeb1 selectHwWebByWebcode(Long webCode); public HwWeb1 selectHwWebOne(HwWeb1 hwWeb1); /** * 查询haiwei官网json列表 * * @param HwWeb1 haiwei官网json * @return haiwei官网json集合 */ public List selectHwWebList(HwWeb1 hwWeb1); /** * 新增haiwei官网json * * @param HwWeb1 haiwei官网json * @return 结果 */ public int insertHwWeb(HwWeb1 hwWeb1); /** * 修改haiwei官网json * * @param HwWeb1 haiwei官网json * @return 结果 */ public int updateHwWeb(HwWeb1 hwWeb1); /** * 批量删除haiwei官网json * * @param webIds 需要删除的haiwei官网json主键集合 * @return 结果 */ public int deleteHwWebByWebIds(Long[] webIds); /** * 删除haiwei官网json信息 * * @param webId haiwei官网json主键 * @return 结果 */ public int deleteHwWebByWebId(Long webId); } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwAboutUsInfoDetailServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.portal.domain.HwAboutUsInfoDetail; import com.ruoyi.portal.mapper.HwAboutUsInfoDetailMapper; import com.ruoyi.portal.service.IHwAboutUsInfoDetailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 关于我们信息明细Service业务层处理 * * @author ruoyi * @date 2024-12-01 */ @Service public class HwAboutUsInfoDetailServiceImpl implements IHwAboutUsInfoDetailService { @Autowired private HwAboutUsInfoDetailMapper hwAboutUsInfoDetailMapper; /** * 查询关于我们信息明细 * * @param usInfoDetailId 关于我们信息明细主键 * @return 关于我们信息明细 */ @Override public HwAboutUsInfoDetail selectHwAboutUsInfoDetailByUsInfoDetailId(Long usInfoDetailId) { return hwAboutUsInfoDetailMapper.selectHwAboutUsInfoDetailByUsInfoDetailId(usInfoDetailId); } /** * 查询关于我们信息明细列表 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 关于我们信息明细 */ @Override public List selectHwAboutUsInfoDetailList(HwAboutUsInfoDetail hwAboutUsInfoDetail) { return hwAboutUsInfoDetailMapper.selectHwAboutUsInfoDetailList(hwAboutUsInfoDetail); } /** * 新增关于我们信息明细 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 结果 */ @Override public int insertHwAboutUsInfoDetail(HwAboutUsInfoDetail hwAboutUsInfoDetail) { hwAboutUsInfoDetail.setCreateTime(DateUtils.getNowDate()); return hwAboutUsInfoDetailMapper.insertHwAboutUsInfoDetail(hwAboutUsInfoDetail); } /** * 修改关于我们信息明细 * * @param hwAboutUsInfoDetail 关于我们信息明细 * @return 结果 */ @Override public int updateHwAboutUsInfoDetail(HwAboutUsInfoDetail hwAboutUsInfoDetail) { hwAboutUsInfoDetail.setUpdateTime(DateUtils.getNowDate()); return hwAboutUsInfoDetailMapper.updateHwAboutUsInfoDetail(hwAboutUsInfoDetail); } /** * 批量删除关于我们信息明细 * * @param usInfoDetailIds 需要删除的关于我们信息明细主键 * @return 结果 */ @Override public int deleteHwAboutUsInfoDetailByUsInfoDetailIds(Long[] usInfoDetailIds) { return hwAboutUsInfoDetailMapper.deleteHwAboutUsInfoDetailByUsInfoDetailIds(usInfoDetailIds); } /** * 删除关于我们信息明细信息 * * @param usInfoDetailId 关于我们信息明细主键 * @return 结果 */ @Override public int deleteHwAboutUsInfoDetailByUsInfoDetailId(Long usInfoDetailId) { return hwAboutUsInfoDetailMapper.deleteHwAboutUsInfoDetailByUsInfoDetailId(usInfoDetailId); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwAboutUsInfoServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.portal.domain.HwAboutUsInfo; import com.ruoyi.portal.mapper.HwAboutUsInfoMapper; import com.ruoyi.portal.service.IHwAboutUsInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 关于我们信息Service业务层处理 * * @author xins * @date 2024-12-01 */ @Service public class HwAboutUsInfoServiceImpl implements IHwAboutUsInfoService { @Autowired private HwAboutUsInfoMapper hwAboutUsInfoMapper; /** * 查询关于我们信息 * * @param aboutUsInfoId 关于我们信息主键 * @return 关于我们信息 */ @Override public HwAboutUsInfo selectHwAboutUsInfoByAboutUsInfoId(Long aboutUsInfoId) { return hwAboutUsInfoMapper.selectHwAboutUsInfoByAboutUsInfoId(aboutUsInfoId); } /** * 查询关于我们信息列表 * * @param hwAboutUsInfo 关于我们信息 * @return 关于我们信息 */ @Override public List selectHwAboutUsInfoList(HwAboutUsInfo hwAboutUsInfo) { return hwAboutUsInfoMapper.selectHwAboutUsInfoList(hwAboutUsInfo); } /** * 新增关于我们信息 * * @param hwAboutUsInfo 关于我们信息 * @return 结果 */ @Override public int insertHwAboutUsInfo(HwAboutUsInfo hwAboutUsInfo) { hwAboutUsInfo.setCreateTime(DateUtils.getNowDate()); return hwAboutUsInfoMapper.insertHwAboutUsInfo(hwAboutUsInfo); } /** * 修改关于我们信息 * * @param hwAboutUsInfo 关于我们信息 * @return 结果 */ @Override public int updateHwAboutUsInfo(HwAboutUsInfo hwAboutUsInfo) { hwAboutUsInfo.setUpdateTime(DateUtils.getNowDate()); return hwAboutUsInfoMapper.updateHwAboutUsInfo(hwAboutUsInfo); } /** * 批量删除关于我们信息 * * @param aboutUsInfoIds 需要删除的关于我们信息主键 * @return 结果 */ @Override public int deleteHwAboutUsInfoByAboutUsInfoIds(Long[] aboutUsInfoIds) { return hwAboutUsInfoMapper.deleteHwAboutUsInfoByAboutUsInfoIds(aboutUsInfoIds); } /** * 删除关于我们信息信息 * * @param aboutUsInfoId 关于我们信息主键 * @return 结果 */ @Override public int deleteHwAboutUsInfoByAboutUsInfoId(Long aboutUsInfoId) { return hwAboutUsInfoMapper.deleteHwAboutUsInfoByAboutUsInfoId(aboutUsInfoId); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwAnalyticsServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.UserAgentUtils; import com.ruoyi.portal.domain.HwWebVisitDaily; import com.ruoyi.portal.domain.HwWebVisitEvent; import com.ruoyi.portal.domain.dto.AnalyticsCollectRequest; import com.ruoyi.portal.domain.dto.AnalyticsDashboardDTO; import com.ruoyi.portal.domain.dto.AnalyticsRankItemDTO; import com.ruoyi.portal.mapper.HwAnalyticsMapper; import com.ruoyi.portal.service.IHwAnalyticsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 官网访问监控服务实现 * * @author ruoyi */ @Service public class HwAnalyticsServiceImpl implements IHwAnalyticsService { private static final Logger log = LoggerFactory.getLogger(HwAnalyticsServiceImpl.class); private static final Set ALLOWED_EVENTS = new HashSet<>(Arrays.asList( "page_view", "page_leave", "search_submit", "download_click", "contact_submit" )); private final HwAnalyticsMapper hwAnalyticsMapper; public HwAnalyticsServiceImpl(HwAnalyticsMapper hwAnalyticsMapper) { this.hwAnalyticsMapper = hwAnalyticsMapper; } @Override public void collect(AnalyticsCollectRequest request, String requestIp, String requestUserAgent) { if (request == null) { throw new ServiceException("请求体不能为空"); } String eventType = normalizeText(request.getEventType(), 32); if (!ALLOWED_EVENTS.contains(eventType)) { throw new ServiceException("不支持的事件类型"); } HwWebVisitEvent event = new HwWebVisitEvent(); event.setEventType(eventType); event.setVisitorId(requireText(request.getVisitorId(), 64, "visitorId不能为空")); event.setSessionId(requireText(request.getSessionId(), 64, "sessionId不能为空")); event.setPath(requireText(request.getPath(), 500, "path不能为空")); event.setReferrer(normalizeText(request.getReferrer(), 500)); event.setUtmSource(normalizeText(request.getUtmSource(), 128)); event.setUtmMedium(normalizeText(request.getUtmMedium(), 128)); event.setUtmCampaign(normalizeText(request.getUtmCampaign(), 128)); event.setKeyword(normalizeText(request.getKeyword(), 128)); event.setStayMs(normalizeStayMs(request.getStayMs())); event.setEventTime(resolveEventTime(request.getEventTime())); String ua = normalizeText(StringUtils.defaultIfBlank(request.getUa(), requestUserAgent), 500); event.setUa(ua); event.setBrowser(normalizeText(StringUtils.defaultIfBlank(request.getBrowser(), UserAgentUtils.getBrowser(ua)), 64)); event.setOs(normalizeText(StringUtils.defaultIfBlank(request.getOs(), UserAgentUtils.getOperatingSystem(ua)), 64)); event.setDevice(normalizeText(StringUtils.defaultIfBlank(request.getDevice(), detectDevice(ua)), 64)); String ipHash = buildIpHash(requestIp); event.setIpHash(ipHash); hwAnalyticsMapper.insertVisitEvent(event); LocalDate statDate = event.getEventTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); refreshDailyStat(statDate); } @Override public AnalyticsDashboardDTO getDashboard(LocalDate statDate, Integer rankLimit) { LocalDate targetDate = statDate == null ? LocalDate.now() : statDate; int topN = normalizeRankLimit(rankLimit); refreshDailyStat(targetDate); HwWebVisitDaily daily = hwAnalyticsMapper.selectDailyByDate(targetDate); AnalyticsDashboardDTO dashboard = new AnalyticsDashboardDTO(); dashboard.setStatDate(targetDate.toString()); dashboard.setPv(daily == null ? 0L : safeLong(daily.getPv())); dashboard.setUv(daily == null ? 0L : safeLong(daily.getUv())); dashboard.setIpUv(daily == null ? 0L : safeLong(daily.getIpUv())); dashboard.setAvgStayMs(daily == null ? 0L : safeLong(daily.getAvgStayMs())); dashboard.setBounceRate(daily == null ? 0D : safeDouble(daily.getBounceRate())); dashboard.setSearchCount(daily == null ? 0L : safeLong(daily.getSearchCount())); dashboard.setDownloadCount(daily == null ? 0L : safeLong(daily.getDownloadCount())); List entryPages = hwAnalyticsMapper.selectTopEntryPages(targetDate, topN); List hotPages = hwAnalyticsMapper.selectTopHotPages(targetDate, topN); List hotKeywords = hwAnalyticsMapper.selectTopKeywords(targetDate, topN); dashboard.setEntryPages(entryPages); dashboard.setHotPages(hotPages); dashboard.setHotKeywords(hotKeywords); return dashboard; } @Override public void refreshDailyStat(LocalDate statDate) { LocalDate targetDate = statDate == null ? LocalDate.now() : statDate; Long pv = safeLong(hwAnalyticsMapper.countEventByType(targetDate, "page_view")); Long uv = safeLong(hwAnalyticsMapper.countDistinctVisitor(targetDate)); Long ipUv = safeLong(hwAnalyticsMapper.countDistinctIp(targetDate)); Long avgStay = safeLong(hwAnalyticsMapper.avgStayMs(targetDate)); Long searchCount = safeLong(hwAnalyticsMapper.countEventByType(targetDate, "search_submit")); Long downloadCount = safeLong(hwAnalyticsMapper.countEventByType(targetDate, "download_click")); Long sessionCount = safeLong(hwAnalyticsMapper.countDistinctSessions(targetDate)); Long singlePageSessionCount = safeLong(hwAnalyticsMapper.countSinglePageSessions(targetDate)); double bounceRate = 0D; if (sessionCount > 0) { bounceRate = (singlePageSessionCount * 100.0D) / sessionCount; bounceRate = Math.round(bounceRate * 100) / 100.0D; } HwWebVisitDaily daily = new HwWebVisitDaily(); daily.setStatDate(java.sql.Date.valueOf(targetDate)); daily.setPv(pv); daily.setUv(uv); daily.setIpUv(ipUv); daily.setAvgStayMs(avgStay); daily.setBounceRate(bounceRate); daily.setSearchCount(searchCount); daily.setDownloadCount(downloadCount); hwAnalyticsMapper.upsertDaily(daily); } private String requireText(String text, int maxLen, String emptyMessage) { String normalized = normalizeText(text, maxLen); if (StringUtils.isBlank(normalized)) { throw new ServiceException(emptyMessage); } return normalized; } private String normalizeText(String text, int maxLen) { String normalized = StringUtils.trim(text); if (StringUtils.isBlank(normalized)) { return null; } if (normalized.length() > maxLen) { normalized = normalized.substring(0, maxLen); } return normalized; } private Long normalizeStayMs(Long stayMs) { if (stayMs == null) { return null; } if (stayMs < 0) { return 0L; } return Math.min(stayMs, 7L * 24 * 3600 * 1000); } private Date resolveEventTime(Long timestamp) { if (timestamp == null || timestamp <= 0) { return new Date(); } try { return Date.from(Instant.ofEpochMilli(timestamp)); } catch (Exception e) { log.warn("invalid eventTime: {}", timestamp); return new Date(); } } private String detectDevice(String ua) { String text = StringUtils.defaultString(ua).toLowerCase(); if (text.contains("ipad") || text.contains("tablet")) { return "Tablet"; } if (text.contains("mobile") || text.contains("android") || text.contains("iphone")) { return "Mobile"; } return "Desktop"; } private String buildIpHash(String ip) { String safeIp = StringUtils.defaultIfBlank(ip, "unknown"); try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest((safeIp + "|hw-portal-analytics").getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte b : hash) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (Exception e) { return Integer.toHexString(safeIp.hashCode()); } } private int normalizeRankLimit(Integer rankLimit) { if (rankLimit == null || rankLimit <= 0) { return 10; } return Math.min(rankLimit, 50); } private long safeLong(Long value) { return value == null ? 0L : value; } private double safeDouble(Double value) { return value == null ? 0D : value; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwContactUsInfoServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.portal.domain.HwContactUsInfo; import com.ruoyi.portal.mapper.HwContactUsInfoMapper; import com.ruoyi.portal.service.IHwContactUsInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 联系我们信息Service业务层处理 * * @author xins * @date 2024-12-01 */ @Service public class HwContactUsInfoServiceImpl implements IHwContactUsInfoService { @Autowired private HwContactUsInfoMapper hwContactUsInfoMapper; /** * 查询联系我们信息 * * @param contactUsInfoId 联系我们信息主键 * @return 联系我们信息 */ @Override public HwContactUsInfo selectHwContactUsInfoByContactUsInfoId(Long contactUsInfoId) { return hwContactUsInfoMapper.selectHwContactUsInfoByContactUsInfoId(contactUsInfoId); } /** * 查询联系我们信息列表 * * @param hwContactUsInfo 联系我们信息 * @return 联系我们信息 */ @Override public List selectHwContactUsInfoList(HwContactUsInfo hwContactUsInfo) { return hwContactUsInfoMapper.selectHwContactUsInfoList(hwContactUsInfo); } /** * 新增联系我们信息 * * @param hwContactUsInfo 联系我们信息 * @return 结果 */ @Override public int insertHwContactUsInfo(HwContactUsInfo hwContactUsInfo) { hwContactUsInfo.setCreateTime(DateUtils.getNowDate()); return hwContactUsInfoMapper.insertHwContactUsInfo(hwContactUsInfo); } /** * 修改联系我们信息 * * @param hwContactUsInfo 联系我们信息 * @return 结果 */ @Override public int updateHwContactUsInfo(HwContactUsInfo hwContactUsInfo) { hwContactUsInfo.setUpdateTime(DateUtils.getNowDate()); return hwContactUsInfoMapper.updateHwContactUsInfo(hwContactUsInfo); } /** * 批量删除联系我们信息 * * @param contactUsInfoIds 需要删除的联系我们信息主键 * @return 结果 */ @Override public int deleteHwContactUsInfoByContactUsInfoIds(Long[] contactUsInfoIds) { return hwContactUsInfoMapper.deleteHwContactUsInfoByContactUsInfoIds(contactUsInfoIds); } /** * 删除联系我们信息信息 * * @param contactUsInfoId 联系我们信息主键 * @return 结果 */ @Override public int deleteHwContactUsInfoByContactUsInfoId(Long contactUsInfoId) { return hwContactUsInfoMapper.deleteHwContactUsInfoByContactUsInfoId(contactUsInfoId); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwPortalConfigServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.portal.domain.HwPortalConfig; import com.ruoyi.portal.mapper.HwPortalConfigMapper; import com.ruoyi.portal.service.IHwPortalConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 门户网站配置Service业务层处理 * * @author xins * @date 2024-12-01 */ @Service public class HwPortalConfigServiceImpl implements IHwPortalConfigService { @Autowired private HwPortalConfigMapper hwPortalConfigMapper; /** * 查询门户网站配置 * * @param portalConfigId 门户网站配置主键 * @return 门户网站配置 */ @Override public HwPortalConfig selectHwPortalConfigByPortalConfigId(Long portalConfigId) { return hwPortalConfigMapper.selectHwPortalConfigByPortalConfigId(portalConfigId); } /** * 查询门户网站配置列表 * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置 */ @Override public List selectHwPortalConfigList(HwPortalConfig hwPortalConfig) { if("2".equals(hwPortalConfig.getPortalConfigType())){ List hwPortalConfigs = hwPortalConfigMapper.selectHwPortalConfigList2(hwPortalConfig); return hwPortalConfigs; } return hwPortalConfigMapper.selectHwPortalConfigList(hwPortalConfig); } /** * 新增门户网站配置 * * @param hwPortalConfig 门户网站配置 * @return 结果 */ @Override public int insertHwPortalConfig(HwPortalConfig hwPortalConfig) { hwPortalConfig.setCreateTime(DateUtils.getNowDate()); return hwPortalConfigMapper.insertHwPortalConfig(hwPortalConfig); } /** * 修改门户网站配置 * * @param hwPortalConfig 门户网站配置 * @return 结果 */ @Override public int updateHwPortalConfig(HwPortalConfig hwPortalConfig) { hwPortalConfig.setUpdateTime(DateUtils.getNowDate()); return hwPortalConfigMapper.updateHwPortalConfig(hwPortalConfig); } /** * 批量删除门户网站配置 * * @param portalConfigIds 需要删除的门户网站配置主键 * @return 结果 */ @Override public int deleteHwPortalConfigByPortalConfigIds(Long[] portalConfigIds) { return hwPortalConfigMapper.deleteHwPortalConfigByPortalConfigIds(portalConfigIds); } /** * 删除门户网站配置信息 * * @param portalConfigId 门户网站配置主键 * @return 结果 */ @Override public int deleteHwPortalConfigByPortalConfigId(Long portalConfigId) { return hwPortalConfigMapper.deleteHwPortalConfigByPortalConfigId(portalConfigId); } /** * 查询门户网站配置列表,Join hw_portal_config_type * * @param hwPortalConfig 门户网站配置 * @return 门户网站配置 */ @Override public List selectHwPortalConfigJoinList(HwPortalConfig hwPortalConfig) { return hwPortalConfigMapper.selectHwPortalConfigJoinList(hwPortalConfig); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwPortalConfigTypeServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.vo.TreeSelect; import com.ruoyi.portal.mapper.HwPortalConfigTypeMapper; import com.ruoyi.portal.service.IHwPortalConfigTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; /** * 门户网站配置类型Service业务层处理 * * @author xins * @date 2024-12-11 */ @Service public class HwPortalConfigTypeServiceImpl implements IHwPortalConfigTypeService { @Autowired private HwPortalConfigTypeMapper hwPortalConfigTypeMapper; /** * 查询门户网站配置类型 * * @param configTypeId 门户网站配置类型主键 * @return 门户网站配置类型 */ @Override public HwPortalConfigType selectHwPortalConfigTypeByConfigTypeId(Long configTypeId) { return hwPortalConfigTypeMapper.selectHwPortalConfigTypeByConfigTypeId(configTypeId); } /** * 查询门户网站配置类型列表 * * @param hwPortalConfigType 门户网站配置类型 * @return 门户网站配置类型 */ @Override public List selectHwPortalConfigTypeList(HwPortalConfigType hwPortalConfigType) { return hwPortalConfigTypeMapper.selectHwPortalConfigTypeList(hwPortalConfigType); } /** * 查询门户网站配置类型列表 * * @param hwPortalConfigType 门户网站配置类型 * @return 门户网站配置类型 */ @Override public List selectConfigTypeList(HwPortalConfigType hwPortalConfigType) { // 如果有 configTypeClassfication 条件,需要特殊处理以确保树形结构完整 if (StringUtils.isNotEmpty(hwPortalConfigType.getConfigTypeClassfication())) { // 查询所有数据 List allList = hwPortalConfigTypeMapper.selectHwPortalConfigTypeList(new HwPortalConfigType()); // 找出指定分类的顶级节点 List topLevelNodes = allList.stream() .filter(item -> hwPortalConfigType.getConfigTypeClassfication().equals(item.getConfigTypeClassfication()) && (item.getParentId() == null || item.getParentId() == 0L)) .collect(Collectors.toList()); // 构建包含所有子孙节点的完整列表 List completeList = new ArrayList<>(); for (HwPortalConfigType topNode : topLevelNodes) { completeList.add(topNode); addAllDescendants(allList, topNode, completeList); } return buildPortalConfigTypeTree(completeList); } else { // 没有特定过滤条件时,直接查询并构建树形结构 List list = hwPortalConfigTypeMapper.selectHwPortalConfigTypeList(hwPortalConfigType); return buildPortalConfigTypeTree(list); } } /** * 递归添加所有子孙节点 */ private void addAllDescendants(List allList, HwPortalConfigType parentNode, List resultList) { for (HwPortalConfigType item : allList) { if (item.getParentId() != null && item.getParentId().equals(parentNode.getConfigTypeId())) { resultList.add(item); addAllDescendants(allList, item, resultList); // 递归添加子节点的子节点 } } } /** * 新增门户网站配置类型 * * @param hwPortalConfigType 门户网站配置类型 * @return 结果 */ @Override public int insertHwPortalConfigType(HwPortalConfigType hwPortalConfigType) { if (hwPortalConfigType.getParentId() == null) { hwPortalConfigType.setParentId(0L); hwPortalConfigType.setAncestors("0"); } else { HwPortalConfigType info = hwPortalConfigTypeMapper.selectHwPortalConfigTypeByConfigTypeId(hwPortalConfigType.getParentId()); hwPortalConfigType.setAncestors(info.getAncestors() + "," + hwPortalConfigType.getParentId()); } hwPortalConfigType.setCreateTime(DateUtils.getNowDate()); hwPortalConfigType.setCreateBy(SecurityUtils.getUsername()); return hwPortalConfigTypeMapper.insertHwPortalConfigType(hwPortalConfigType); } /** * 修改门户网站配置类型 * * @param hwPortalConfigType 门户网站配置类型 * @return 结果 */ @Override public int updateHwPortalConfigType(HwPortalConfigType hwPortalConfigType) { hwPortalConfigType.setUpdateTime(DateUtils.getNowDate()); return hwPortalConfigTypeMapper.updateHwPortalConfigType(hwPortalConfigType); } /** * 批量删除门户网站配置类型 * * @param configTypeIds 需要删除的门户网站配置类型主键 * @return 结果 */ @Override public int deleteHwPortalConfigTypeByConfigTypeIds(Long[] configTypeIds) { return hwPortalConfigTypeMapper.deleteHwPortalConfigTypeByConfigTypeIds(configTypeIds); } /** * 删除门户网站配置类型信息 * * @param configTypeId 门户网站配置类型主键 * @return 结果 */ @Override public int deleteHwPortalConfigTypeByConfigTypeId(Long configTypeId) { return hwPortalConfigTypeMapper.deleteHwPortalConfigTypeByConfigTypeId(configTypeId); } /** * 查询门户网站配置类型树结构信息 * * @param portalConfigType 门户网站配置类型信息 * @return 门户网站配置类型树信息集合 */ @Override public List selectPortalConfigTypeTreeList(HwPortalConfigType portalConfigType) { List portalConfigTypes = this.selectHwPortalConfigTypeList(portalConfigType); return buildPortalConfigTypeTreeSelect(portalConfigTypes); } /** * 构建前端所需要下拉树结构 * * @param portalConfigTypes 门户网站配置类型列表 * @return 下拉树结构列表 */ @Override public List buildPortalConfigTypeTreeSelect(List portalConfigTypes) { List deptTrees = buildPortalConfigTypeTree(portalConfigTypes); return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); } /** * 构建前端所需要树结构 * * @param portalConfigTypes 门户网站配置类型列表 * @return 树结构列表 */ @Override public List buildPortalConfigTypeTree(List portalConfigTypes) { List returnList = new ArrayList(); List tempList = portalConfigTypes.stream().map(HwPortalConfigType::getConfigTypeId).collect(Collectors.toList()); for (HwPortalConfigType portalConfigType : portalConfigTypes) { // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(portalConfigType.getParentId())) { recursionFn(portalConfigTypes, portalConfigType); returnList.add(portalConfigType); } } if (returnList.isEmpty()) { returnList = portalConfigTypes; } return returnList; } /** * 递归列表 */ private void recursionFn(List list, HwPortalConfigType t) { // 得到子节点列表 List childList = getChildList(list, t); t.setChildren(childList); for (HwPortalConfigType tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List getChildList(List list, HwPortalConfigType t) { List tlist = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { HwPortalConfigType n = (HwPortalConfigType) it.next(); if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getConfigTypeId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List list, HwPortalConfigType t) { return getChildList(list, t).size() > 0 ? true : false; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwProductCaseInfoServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.portal.domain.HwProductCaseInfo; import com.ruoyi.portal.mapper.HwProductCaseInfoMapper; import com.ruoyi.portal.service.IHwProductCaseInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; /** * 案例内容Service业务层处理 * * @author xins * @date 2024-12-01 */ @Service public class HwProductCaseInfoServiceImpl implements IHwProductCaseInfoService { @Autowired private HwProductCaseInfoMapper hwProductCaseInfoMapper; /** * 查询案例内容 * * @param caseInfoId 案例内容主键 * @return 案例内容 */ @Override public HwProductCaseInfo selectHwProductCaseInfoByCaseInfoId(Long caseInfoId) { return hwProductCaseInfoMapper.selectHwProductCaseInfoByCaseInfoId(caseInfoId); } /** * 查询案例内容列表 * * @param hwProductCaseInfo 案例内容 * @return 案例内容 */ @Override public List selectHwProductCaseInfoList(HwProductCaseInfo hwProductCaseInfo) { return hwProductCaseInfoMapper.selectHwProductCaseInfoList(hwProductCaseInfo); } /** * 新增案例内容 * * @param hwProductCaseInfo 案例内容 * @return 结果 */ @Override public int insertHwProductCaseInfo(HwProductCaseInfo hwProductCaseInfo) { hwProductCaseInfo.setCreateTime(DateUtils.getNowDate()); return hwProductCaseInfoMapper.insertHwProductCaseInfo(hwProductCaseInfo); } /** * 修改案例内容 * * @param hwProductCaseInfo 案例内容 * @return 结果 */ @Override public int updateHwProductCaseInfo(HwProductCaseInfo hwProductCaseInfo) { hwProductCaseInfo.setUpdateTime(DateUtils.getNowDate()); return hwProductCaseInfoMapper.updateHwProductCaseInfo(hwProductCaseInfo); } /** * 批量删除案例内容 * * @param caseInfoIds 需要删除的案例内容主键 * @return 结果 */ @Override public int deleteHwProductCaseInfoByCaseInfoIds(Long[] caseInfoIds) { return hwProductCaseInfoMapper.deleteHwProductCaseInfoByCaseInfoIds(caseInfoIds); } /** * 删除案例内容信息 * * @param caseInfoId 案例内容主键 * @return 结果 */ @Override public int deleteHwProductCaseInfoByCaseInfoId(Long caseInfoId) { return hwProductCaseInfoMapper.deleteHwProductCaseInfoByCaseInfoId(caseInfoId); } /** * 根据configTypeId获取首页典型案例 * @param hwProductCaseInfo * @return */ @Override public HwProductCaseInfo getTypicalHomeCaseInfo(HwProductCaseInfo hwProductCaseInfo){ hwProductCaseInfo.setHomeTypicalFlag("1"); List productCaseInfoList = hwProductCaseInfoMapper.selectHwProductCaseInfoList(hwProductCaseInfo); List typicalProductCaseInfoList = productCaseInfoList.stream().filter(pci -> pci.getTypicalFlag().equals("1")).collect(Collectors.toList()); if(typicalProductCaseInfoList!=null && ! typicalProductCaseInfoList.isEmpty()){ return typicalProductCaseInfoList.get(0); }else if (productCaseInfoList!=null && !productCaseInfoList.isEmpty()){ return productCaseInfoList.get(0); } return new HwProductCaseInfo(); } /** * 查询案例内容列表,join portalConfigType * * @param hwProductCaseInfo 案例内容 * @return 案例内容 */ @Override public List selectHwProductCaseInfoJoinList(HwProductCaseInfo hwProductCaseInfo) { return hwProductCaseInfoMapper.selectHwProductCaseInfoJoinList(hwProductCaseInfo); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwProductInfoDetailServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.HwProductInfoDetail; import com.ruoyi.portal.mapper.HwProductInfoDetailMapper; import com.ruoyi.portal.service.IHwProductInfoDetailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 产品信息明细配置Service业务层处理 * * @author xins * @date 2024-12-11 */ @Service public class HwProductInfoDetailServiceImpl implements IHwProductInfoDetailService { @Autowired private HwProductInfoDetailMapper hwProductInfoDetailMapper; /** * 查询产品信息明细配置 * * @param productInfoDetailId 产品信息明细配置主键 * @return 产品信息明细配置 */ @Override public HwProductInfoDetail selectHwProductInfoDetailByProductInfoDetailId(Long productInfoDetailId) { return hwProductInfoDetailMapper.selectHwProductInfoDetailByProductInfoDetailId(productInfoDetailId); } /** * 查询产品信息明细配置列表 * * @param hwProductInfoDetail 产品信息明细配置 * @return 产品信息明细配置 */ @Override public List selectHwProductInfoDetailList(HwProductInfoDetail hwProductInfoDetail) { return hwProductInfoDetailMapper.selectHwProductInfoDetailList(hwProductInfoDetail); } /** * 新增产品信息明细配置 * * @param hwProductInfoDetail 产品信息明细配置 * @return 结果 */ @Override public int insertHwProductInfoDetail(HwProductInfoDetail hwProductInfoDetail) { if (hwProductInfoDetail.getParentId() == null) { hwProductInfoDetail.setParentId(0L); hwProductInfoDetail.setAncestors("0"); }else if(hwProductInfoDetail.getParentId() == 0L) { hwProductInfoDetail.setParentId(0L); hwProductInfoDetail.setAncestors("0"); } else { HwProductInfoDetail info = hwProductInfoDetailMapper.selectHwProductInfoDetailByProductInfoDetailId(hwProductInfoDetail.getParentId()); hwProductInfoDetail.setAncestors(info.getAncestors() + "," + hwProductInfoDetail.getParentId()); } hwProductInfoDetail.setCreateTime(DateUtils.getNowDate()); hwProductInfoDetail.setCreateBy(SecurityUtils.getUsername()); return hwProductInfoDetailMapper.insertHwProductInfoDetail(hwProductInfoDetail); } /** * 修改产品信息明细配置 * * @param hwProductInfoDetail 产品信息明细配置 * @return 结果 */ @Override public int updateHwProductInfoDetail(HwProductInfoDetail hwProductInfoDetail) { hwProductInfoDetail.setUpdateTime(DateUtils.getNowDate()); return hwProductInfoDetailMapper.updateHwProductInfoDetail(hwProductInfoDetail); } /** * 批量删除产品信息明细配置 * * @param productInfoDetailIds 需要删除的产品信息明细配置主键 * @return 结果 */ @Override public int deleteHwProductInfoDetailByProductInfoDetailIds(Long[] productInfoDetailIds) { return hwProductInfoDetailMapper.deleteHwProductInfoDetailByProductInfoDetailIds(productInfoDetailIds); } /** * 删除产品信息明细配置信息 * * @param productInfoDetailId 产品信息明细配置主键 * @return 结果 */ @Override public int deleteHwProductInfoDetailByProductInfoDetailId(Long productInfoDetailId) { return hwProductInfoDetailMapper.deleteHwProductInfoDetailByProductInfoDetailId(productInfoDetailId); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwProductInfoServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.constant.HwPortalConstants; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.portal.domain.HwProductInfo; import com.ruoyi.portal.domain.HwProductInfoDetail; import com.ruoyi.portal.mapper.HwProductInfoMapper; import com.ruoyi.portal.service.IHwProductInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; /** * 产品信息配置Service业务层处理 * * @author xins * @date 2024-12-01 */ @Service public class HwProductInfoServiceImpl implements IHwProductInfoService { @Autowired private HwProductInfoMapper hwProductInfoMapper; /** * 查询产品信息配置 * * @param productInfoId 产品信息配置主键 * @return 产品信息配置 */ @Override public HwProductInfo selectHwProductInfoByProductInfoId(Long productInfoId) { return hwProductInfoMapper.selectHwProductInfoByProductInfoId(productInfoId); } /** * 查询产品信息配置列表 * * @param hwProductInfo 产品信息配置 * @return 产品信息配置 */ @Override public List selectHwProductInfoList(HwProductInfo hwProductInfo) { return hwProductInfoMapper.selectHwProductInfoList(hwProductInfo); } /** * 新增产品信息配置 * * @param hwProductInfo 产品信息配置 * @return 结果 */ @Override public int insertHwProductInfo(HwProductInfo hwProductInfo) { hwProductInfo.setCreateTime(DateUtils.getNowDate()); return hwProductInfoMapper.insertHwProductInfo(hwProductInfo); } /** * 修改产品信息配置 * * @param hwProductInfo 产品信息配置 * @return 结果 */ @Override public int updateHwProductInfo(HwProductInfo hwProductInfo) { hwProductInfo.setUpdateTime(DateUtils.getNowDate()); return hwProductInfoMapper.updateHwProductInfo(hwProductInfo); } /** * 批量删除产品信息配置 * * @param productInfoIds 需要删除的产品信息配置主键 * @return 结果 */ @Override public int deleteHwProductInfoByProductInfoIds(Long[] productInfoIds) { return hwProductInfoMapper.deleteHwProductInfoByProductInfoIds(productInfoIds); } /** * 删除产品信息配置信息 * * @param productInfoId 产品信息配置主键 * @return 结果 */ @Override public int deleteHwProductInfoByProductInfoId(Long productInfoId) { return hwProductInfoMapper.deleteHwProductInfoByProductInfoId(productInfoId); } /** * 获取产品中心产品信息(平台简介,hw_product_info获取,(配置模式2左标题+内容,右图片)读取中文标题和英文标题,下面内容从hw_product_info_detail获取,读取标题,内容和图片) * * @param hwProductInfo 产品信息配置 * @return 产品信息配置 */ @Override public List selectHwProductInfoJoinDetailList(HwProductInfo hwProductInfo) { List hwProductInfoJoinDetailList = hwProductInfoMapper.selectHwProductInfoJoinDetailList(hwProductInfo); // 若配置模式configModal为13,hwProductInfoDetailList应该变为树形结构 if ("13".equals(hwProductInfo.getConfigModal())) { for (HwProductInfo productInfo : hwProductInfoJoinDetailList) { if (productInfo.getHwProductInfoDetailList() != null && !productInfo.getHwProductInfoDetailList().isEmpty()) { // 将每个产品信息的明细列表转换为树形结构 List treeStructureList = buildProductInfoDetailTree(productInfo.getHwProductInfoDetailList()); productInfo.setHwProductInfoDetailList(treeStructureList); } } } for (HwProductInfo productInfo : hwProductInfoJoinDetailList) { List hwProductInfoDetailList = productInfo.getHwProductInfoDetailList(); for (HwProductInfoDetail hwProductInfoDetail : hwProductInfoDetailList) { if ("13".equals(hwProductInfoDetail.getConfigModel())){ // 将每个产品信息的明细列表转换为树形结构 List treeStructureList = buildProductInfoDetailTree(productInfo.getHwProductInfoDetailList()); productInfo.setHwProductInfoDetailList(treeStructureList); } } } return hwProductInfoJoinDetailList; } /** * 构建前端所需要树结构 * * @param productInfoDetails 产品明细列表 * @return 树结构列表 */ public List buildProductInfoDetailTree(List productInfoDetails) { List returnList = new ArrayList<>(); List tempList = productInfoDetails.stream().map(HwProductInfoDetail::getProductInfoDetailId).collect(Collectors.toList()); for (HwProductInfoDetail hwProductInfoDetail : productInfoDetails) { /* // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(hwProductInfoDetail.getParentId())) {*/ // 如果是顶级节点(parentId为null、0或者不在当前列表中), 遍历该父节点的所有子节点 if (hwProductInfoDetail.getParentId() == null || hwProductInfoDetail.getParentId() == 0L || !tempList.contains(hwProductInfoDetail.getParentId())) { recursionFn(productInfoDetails, hwProductInfoDetail); returnList.add(hwProductInfoDetail); } } if (returnList.isEmpty()) { returnList = productInfoDetails; } return returnList; } /** * 递归列表 */ private void recursionFn(List list, HwProductInfoDetail t) { // 得到子节点列表 List childList = getChildList(list, t); // 设置TreeEntity的children字段 t.setChildren(childList); // 设置HwProductInfoDetail的hwProductInfoDetailList字段 t.setHwProductInfoDetailList(childList); for (HwProductInfoDetail tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List getChildList(List list, HwProductInfoDetail t) { List tlist = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { HwProductInfoDetail n = (HwProductInfoDetail) it.next(); if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getProductInfoDetailId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List list, HwProductInfoDetail t) { return getChildList(list, t).size() > 0 ? true : false; } /** * 查询产品信息配置列表,join portalConfigType * * @param hwProductInfo 产品信息配置 * @return 产品信息配置 */ @Override public List selectHwProductInfoJoinList(HwProductInfo hwProductInfo) { return hwProductInfoMapper.selectHwProductInfoJoinList(hwProductInfo); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwSearchRebuildServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.portal.domain.HwPortalConfigType; import com.ruoyi.portal.domain.HwWeb; import com.ruoyi.portal.domain.HwWeb1; import com.ruoyi.portal.domain.HwWebDocument; import com.ruoyi.portal.domain.HwWebMenu; import com.ruoyi.portal.mapper.HwPortalConfigTypeMapper; import com.ruoyi.portal.mapper.HwWebDocumentMapper; import com.ruoyi.portal.mapper.HwWebMapper; import com.ruoyi.portal.mapper.HwWebMapper1; import com.ruoyi.portal.mapper.HwWebMenuMapper; import com.ruoyi.portal.search.convert.PortalSearchDocConverter; import com.ruoyi.portal.search.es.entity.PortalSearchDoc; import com.ruoyi.portal.search.es.mapper.PortalSearchMapper; import com.ruoyi.portal.service.IHwSearchRebuildService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * 搜索索引重建实现 * * @author ruoyi */ @Service public class HwSearchRebuildServiceImpl implements IHwSearchRebuildService { private static final Logger log = LoggerFactory.getLogger(HwSearchRebuildServiceImpl.class); private static final String INDEX_NAME = "hw_portal_content"; private final PortalSearchMapper portalSearchMapper; private final PortalSearchDocConverter converter; private final HwWebMenuMapper hwWebMenuMapper; private final HwWebMapper hwWebMapper; private final HwWebMapper1 hwWebMapper1; private final HwWebDocumentMapper hwWebDocumentMapper; private final HwPortalConfigTypeMapper hwPortalConfigTypeMapper; public HwSearchRebuildServiceImpl(PortalSearchMapper portalSearchMapper, PortalSearchDocConverter converter, HwWebMenuMapper hwWebMenuMapper, HwWebMapper hwWebMapper, HwWebMapper1 hwWebMapper1, HwWebDocumentMapper hwWebDocumentMapper, HwPortalConfigTypeMapper hwPortalConfigTypeMapper) { this.portalSearchMapper = portalSearchMapper; this.converter = converter; this.hwWebMenuMapper = hwWebMenuMapper; this.hwWebMapper = hwWebMapper; this.hwWebMapper1 = hwWebMapper1; this.hwWebDocumentMapper = hwWebDocumentMapper; this.hwPortalConfigTypeMapper = hwPortalConfigTypeMapper; } @Override public void rebuildAll() { try { if (portalSearchMapper.existsIndex(INDEX_NAME)) { portalSearchMapper.deleteIndex(INDEX_NAME); } portalSearchMapper.createIndex(); List docs = collectDocs(); if (!docs.isEmpty()) { portalSearchMapper.insertBatch(docs); } log.info("rebuild search index finished. docs={}", docs.size()); } catch (Exception e) { throw new ServiceException("重建搜索索引失败: " + e.getMessage()); } } private List collectDocs() { List docs = new ArrayList<>(); List menus = hwWebMenuMapper.selectHwWebMenuList(new HwWebMenu()); menus.forEach(item -> docs.add(converter.fromWebMenu(item))); List webs = hwWebMapper.selectHwWebList(new HwWeb()); webs.forEach(item -> docs.add(converter.fromWeb(item))); List web1List = hwWebMapper1.selectHwWebList(new HwWeb1()); web1List.forEach(item -> docs.add(converter.fromWeb1(item))); List documents = hwWebDocumentMapper.selectHwWebDocumentList(new HwWebDocument()); documents.forEach(item -> docs.add(converter.fromDocument(item))); List configTypes = hwPortalConfigTypeMapper.selectHwPortalConfigTypeList(new HwPortalConfigType()); configTypes.forEach(item -> docs.add(converter.fromConfigType(item))); return docs; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwSearchServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.portal.domain.dto.SearchPageDTO; import com.ruoyi.portal.domain.dto.SearchRawRecord; import com.ruoyi.portal.domain.dto.SearchResultDTO; import com.ruoyi.portal.mapper.HwSearchMapper; import com.ruoyi.portal.search.convert.PortalSearchDocConverter; import com.ruoyi.portal.search.service.PortalSearchEsService; import com.ruoyi.portal.service.IHwSearchService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * 门户搜索服务实现 * * @author ruoyi */ @Service public class HwSearchServiceImpl implements IHwSearchService { private static final Logger log = LoggerFactory.getLogger(HwSearchServiceImpl.class); private static final Pattern ESCAPE_PATTERN = Pattern.compile("([\\\\.*+\\[\\](){}^$?|])"); private final HwSearchMapper hwSearchMapper; private final PortalSearchDocConverter converter; private final PortalSearchEsService portalSearchEsService; @Value("${search.engine:mysql}") private String searchEngine; @Value("${search.es.enabled:false}") private boolean esEnabled; public HwSearchServiceImpl(HwSearchMapper hwSearchMapper, PortalSearchDocConverter converter, @Autowired(required = false) PortalSearchEsService portalSearchEsService) { this.hwSearchMapper = hwSearchMapper; this.converter = converter; this.portalSearchEsService = portalSearchEsService; } @Override public SearchPageDTO search(String keyword, Integer pageNum, Integer pageSize) { return doSearch(keyword, pageNum, pageSize, false); } @Override public SearchPageDTO searchForEdit(String keyword, Integer pageNum, Integer pageSize) { return doSearch(keyword, pageNum, pageSize, true); } private SearchPageDTO doSearch(String keyword, Integer pageNum, Integer pageSize, boolean editMode) { String normalizedKeyword = validateKeyword(keyword); int normalizedPageNum = normalizePageNum(pageNum); int normalizedPageSize = normalizePageSize(pageSize); if (useEsEngine()) { try { return portalSearchEsService.search(normalizedKeyword, normalizedPageNum, normalizedPageSize, editMode); } catch (Exception e) { log.error("ES search failed, fallback to mysql. keyword={}", normalizedKeyword, e); } } return searchByMysql(normalizedKeyword, normalizedPageNum, normalizedPageSize, editMode); } private boolean useEsEngine() { return esEnabled && portalSearchEsService != null && "es".equalsIgnoreCase(searchEngine); } private SearchPageDTO searchByMysql(String keyword, int pageNum, int pageSize, boolean editMode) { List rawRecords = hwSearchMapper.searchByKeyword(keyword); if (rawRecords == null || rawRecords.isEmpty()) { return new SearchPageDTO(); } List all = new ArrayList<>(); for (SearchRawRecord raw : rawRecords) { SearchResultDTO dto = toResult(raw, keyword, editMode); if (dto != null) { all.add(dto); } } all = all.stream().sorted(Comparator.comparing(SearchResultDTO::getScore).reversed()).collect(Collectors.toList()); SearchPageDTO page = new SearchPageDTO(); page.setTotal(all.size()); int from = Math.max(0, (pageNum - 1) * pageSize); if (from >= all.size()) { page.setRows(new ArrayList<>()); return page; } int to = Math.min(all.size(), from + pageSize); page.setRows(all.subList(from, to)); return page; } private SearchResultDTO toResult(SearchRawRecord raw, String keyword, boolean editMode) { String sourceType = raw.getSourceType(); String content = StringUtils.defaultString(raw.getContent()); if (PortalSearchDocConverter.SOURCE_WEB.equals(sourceType) || PortalSearchDocConverter.SOURCE_WEB1.equals(sourceType)) { content = converter.extractSearchableText(content); if (!containsIgnoreCase(raw.getTitle(), keyword) && !containsIgnoreCase(content, keyword)) { return null; } } else if (!containsIgnoreCase(raw.getTitle(), keyword) && !containsIgnoreCase(content, keyword)) { return null; } SearchResultDTO dto = new SearchResultDTO(); dto.setSourceType(sourceType); dto.setTitle(raw.getTitle()); dto.setSnippet(buildSnippet(raw.getTitle(), content, keyword)); dto.setScore(calculateScore(raw, keyword)); dto.setRoute(buildRoute(sourceType, raw.getWebCode())); dto.setRouteQuery(buildRouteQuery(raw)); if (editMode) { dto.setEditRoute(buildEditRoute(raw)); } return dto; } private int calculateScore(SearchRawRecord raw, String keyword) { int base = raw.getScore() == null ? 0 : raw.getScore(); String title = StringUtils.defaultString(raw.getTitle()); String content = StringUtils.defaultString(raw.getContent()); if (containsIgnoreCase(title, keyword)) { base += 20; } if (containsIgnoreCase(content, keyword)) { base += 10; } return base; } private String buildRoute(String sourceType, String webCode) { if (PortalSearchDocConverter.SOURCE_MENU.equals(sourceType)) { return "/test"; } if (PortalSearchDocConverter.SOURCE_WEB.equals(sourceType)) { if ("-1".equals(webCode)) { return "/index"; } if ("7".equals(webCode)) { return "/productCenter"; } return "/test"; } if (PortalSearchDocConverter.SOURCE_WEB1.equals(sourceType)) { return "/productCenter/detail"; } if (PortalSearchDocConverter.SOURCE_DOCUMENT.equals(sourceType)) { return "/serviceSupport"; } if (PortalSearchDocConverter.SOURCE_CONFIG_TYPE.equals(sourceType)) { return "/productCenter"; } return "/index"; } private Map buildRouteQuery(SearchRawRecord raw) { Map query = new HashMap<>(); String sourceType = raw.getSourceType(); if (PortalSearchDocConverter.SOURCE_MENU.equals(sourceType)) { query.put("id", raw.getMenuId()); return query; } if (PortalSearchDocConverter.SOURCE_WEB.equals(sourceType) && !"-1".equals(raw.getWebCode()) && !"7".equals(raw.getWebCode())) { query.put("id", raw.getWebCode()); return query; } if (PortalSearchDocConverter.SOURCE_WEB1.equals(sourceType)) { query.put("webCode", raw.getWebCode()); query.put("typeId", raw.getTypeId()); query.put("deviceId", raw.getDeviceId()); return query; } if (PortalSearchDocConverter.SOURCE_DOCUMENT.equals(sourceType)) { query.put("documentId", raw.getDocumentId()); query.put("webCode", raw.getWebCode()); query.put("typeId", raw.getTypeId()); return query; } if (PortalSearchDocConverter.SOURCE_CONFIG_TYPE.equals(sourceType)) { query.put("configTypeId", raw.getTypeId()); return query; } return query; } private String buildEditRoute(SearchRawRecord raw) { String sourceType = raw.getSourceType(); if (PortalSearchDocConverter.SOURCE_MENU.equals(sourceType)) { return "/editor?type=1&id=" + raw.getMenuId(); } if (PortalSearchDocConverter.SOURCE_WEB.equals(sourceType)) { if ("7".equals(raw.getWebCode())) { return "/productCenter/edit"; } if ("-1".equals(raw.getWebCode())) { return "/editor?type=3&id=-1"; } return "/editor?type=1&id=" + raw.getWebCode(); } if (PortalSearchDocConverter.SOURCE_WEB1.equals(sourceType)) { return "/editor?type=2&id=" + raw.getWebCode() + "," + raw.getTypeId() + "," + raw.getDeviceId(); } if (PortalSearchDocConverter.SOURCE_DOCUMENT.equals(sourceType)) { if (StringUtils.isNotBlank(raw.getWebCode()) && StringUtils.isNotBlank(raw.getTypeId()) && StringUtils.isNotBlank(raw.getDeviceId())) { return "/editor?type=2&id=" + raw.getWebCode() + "," + raw.getTypeId() + "," + raw.getDeviceId() + "&documentId=" + raw.getDocumentId(); } return "/editor?type=2&documentId=" + raw.getDocumentId(); } if (PortalSearchDocConverter.SOURCE_CONFIG_TYPE.equals(sourceType)) { return "/productCenter/edit"; } return "/editor"; } private String buildSnippet(String title, String content, String keyword) { if (StringUtils.isNotBlank(title) && containsIgnoreCase(title, keyword)) { return highlight(title, keyword); } if (StringUtils.isBlank(content)) { return StringUtils.EMPTY; } String normalized = content.replaceAll("\\s+", " ").trim(); int index = StringUtils.indexOfIgnoreCase(normalized, keyword); if (index < 0) { return StringUtils.substring(normalized, 0, Math.min(120, normalized.length())); } int start = Math.max(0, index - 60); int end = Math.min(normalized.length(), index + keyword.length() + 60); String snippet = normalized.substring(start, end); if (start > 0) { snippet = "..." + snippet; } if (end < normalized.length()) { snippet = snippet + "..."; } return highlight(snippet, keyword); } private String highlight(String text, String keyword) { if (StringUtils.isBlank(text) || StringUtils.isBlank(keyword)) { return StringUtils.defaultString(text); } String escaped = ESCAPE_PATTERN.matcher(keyword).replaceAll("\\\\$1"); Matcher matcher = Pattern.compile("(?i)" + escaped).matcher(text); if (!matcher.find()) { return text; } return matcher.replaceAll("$0"); } private boolean containsIgnoreCase(String text, String keyword) { return StringUtils.isNotBlank(text) && StringUtils.isNotBlank(keyword) && StringUtils.containsIgnoreCase(text, keyword); } private int normalizePageNum(Integer pageNum) { if (pageNum == null || pageNum <= 0) { return 1; } return pageNum; } private int normalizePageSize(Integer pageSize) { if (pageSize == null || pageSize <= 0) { return 20; } return Math.min(pageSize, 50); } private String validateKeyword(String keyword) { String normalized = StringUtils.trim(keyword); if (StringUtils.isBlank(normalized)) { throw new ServiceException("关键词不能为空"); } if (normalized.length() > 50) { throw new ServiceException("关键词长度不能超过50"); } return normalized; } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwWebDocumentServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import java.util.List; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.portal.mapper.HwWebDocumentMapper; import com.ruoyi.portal.domain.HwWebDocument; import com.ruoyi.portal.service.IHwSearchRebuildService; import com.ruoyi.portal.service.IHwWebDocumentService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Hw资料文件Service业务层处理 * * @author zch * @date 2025-09-22 */ @Service public class HwWebDocumentServiceImpl implements IHwWebDocumentService { private static final Logger log = LoggerFactory.getLogger(HwWebDocumentServiceImpl.class); @Autowired private HwWebDocumentMapper hwWebDocumentMapper; @Autowired(required = false) private IHwSearchRebuildService hwSearchRebuildService; /** * 查询Hw资料文件 * * @param documentId Hw资料文件主键 * @return Hw资料文件 */ @Override public HwWebDocument selectHwWebDocumentByDocumentId(String documentId) { return hwWebDocumentMapper.selectHwWebDocumentByDocumentId(documentId); } /** * 查询Hw资料文件列表 * * @param hwWebDocument Hw资料文件 * @return Hw资料文件 */ @Override public List selectHwWebDocumentList(HwWebDocument hwWebDocument) { return hwWebDocumentMapper.selectHwWebDocumentList(hwWebDocument); } /** * 新增Hw资料文件 * * @param hwWebDocument Hw资料文件 * @return 结果 */ @Override public int insertHwWebDocument(HwWebDocument hwWebDocument) { hwWebDocument.setCreateTime(DateUtils.getNowDate()); int rows = hwWebDocumentMapper.insertHwWebDocument(hwWebDocument); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 修改Hw资料文件 * * @param hwWebDocument Hw资料文件 * @return 结果 */ @Override public int updateHwWebDocument(HwWebDocument hwWebDocument) { // 特殊处理 secretKey:前端不传或传 null 时清空数据库密钥 // 将 null 转换为空字符串,触发 Mapper 更新条件 if (hwWebDocument.getSecretKey() == null) { hwWebDocument.setSecretKey(""); } int rows = hwWebDocumentMapper.updateHwWebDocument(hwWebDocument); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 批量删除Hw资料文件 * * @param documentIds 需要删除的Hw资料文件主键 * @return 结果 */ @Override public int deleteHwWebDocumentByDocumentIds(String[] documentIds) { int rows = hwWebDocumentMapper.deleteHwWebDocumentByDocumentIds(documentIds); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 删除Hw资料文件信息 * * @param documentId Hw资料文件主键 * @return 结果 */ @Override public int deleteHwWebDocumentByDocumentId(String documentId) { int rows = hwWebDocumentMapper.deleteHwWebDocumentByDocumentId(documentId); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } @Override public String verifyAndGetDocumentAddress(String documentId, String providedKey) throws Exception { HwWebDocument document = selectHwWebDocumentByDocumentId(documentId); if (document == null) { throw new ServiceException("文件不存在"); } String secretKey = document.getSecretKey(); String address = document.getDocumentAddress(); // 若数据库密钥为空,则直接返回文件地址 if (secretKey == null || secretKey.trim().isEmpty()) { return address; } // 若密钥不为空,则需要验证提供的密钥是否相等 String trimmedProvided = providedKey == null ? null : providedKey.trim(); if (trimmedProvided == null || trimmedProvided.isEmpty()) { throw new ServiceException("密钥不能为空"); } if (secretKey.trim().equals(trimmedProvided)) { return address; } else { throw new ServiceException("密钥错误"); } } private void rebuildSearchIndexQuietly() { if (hwSearchRebuildService == null) { return; } try { hwSearchRebuildService.rebuildAll(); } catch (Exception e) { log.error("rebuild portal search index failed after hw_web_document changed", e); } } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwWebMenuServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.portal.domain.HwProductInfoDetail; import com.ruoyi.portal.service.IHwSearchRebuildService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.portal.mapper.HwWebMenuMapper; import com.ruoyi.portal.domain.HwWebMenu; import com.ruoyi.portal.service.IHwWebMenuService; /** * haiwei官网菜单Service业务层处理 * * @author zch * @date 2025-08-18 */ @Service public class HwWebMenuServiceImpl implements IHwWebMenuService { private static final Logger log = LoggerFactory.getLogger(HwWebMenuServiceImpl.class); @Autowired private HwWebMenuMapper hwWebMenuMapper; @Autowired(required = false) private IHwSearchRebuildService hwSearchRebuildService; /** * 查询haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return haiwei官网菜单 */ @Override public HwWebMenu selectHwWebMenuByWebMenuId(Long webMenuId) { return hwWebMenuMapper.selectHwWebMenuByWebMenuId(webMenuId); } /** * 查询haiwei官网菜单列表 * * @param hwWebMenu haiwei官网菜单 * @return haiwei官网菜单 */ @Override public List selectHwWebMenuList(HwWebMenu hwWebMenu) { List hwWebMenus = hwWebMenuMapper.selectHwWebMenuList(hwWebMenu); return hwWebMenus; } /** * 获取菜单树列表 */ @Override public List selectMenuTree(HwWebMenu hwWebMenu) { List hwWebMenus = hwWebMenuMapper.selectHwWebMenuList(hwWebMenu); return buildWebMenuTree(hwWebMenus); } /** * 新增haiwei官网菜单 * * @param hwWebMenu haiwei官网菜单 * @return 结果 */ @Override public int insertHwWebMenu(HwWebMenu hwWebMenu) { int rows = hwWebMenuMapper.insertHwWebMenu(hwWebMenu); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 修改haiwei官网菜单 * * @param hwWebMenu haiwei官网菜单 * @return 结果 */ @Override public int updateHwWebMenu(HwWebMenu hwWebMenu) { int rows = hwWebMenuMapper.updateHwWebMenu(hwWebMenu); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 批量删除haiwei官网菜单 * * @param webMenuIds 需要删除的haiwei官网菜单主键 * @return 结果 */ @Override public int deleteHwWebMenuByWebMenuIds(Long[] webMenuIds) { int rows = hwWebMenuMapper.deleteHwWebMenuByWebMenuIds(webMenuIds); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 删除haiwei官网菜单信息 * * @param webMenuId haiwei官网菜单主键 * @return 结果 */ @Override public int deleteHwWebMenuByWebMenuId(Long webMenuId) { int rows = hwWebMenuMapper.deleteHwWebMenuByWebMenuId(webMenuId); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 构建前端所需要树结构(根据传入的平铺菜单列表构造树) * * @param menus 菜单列表 * @return 树结构列表 */ public List buildWebMenuTree(List menus) { List returnList = new ArrayList<>(); List tempList = menus.stream().map(HwWebMenu::getWebMenuId).collect(Collectors.toList()); for (HwWebMenu menu : menus) { // 如果是顶级节点(parent为null、0或者不在当前列表中), 遍历该父节点的所有子节点 if (menu.getParent() == null || menu.getParent() == 0L || !tempList.contains(menu.getParent())) { recursionFn(menus, menu); returnList.add(menu); } } if (returnList.isEmpty()) { returnList = menus; } return returnList; } /** * 递归设置子节点 */ private void recursionFn(List list, HwWebMenu t) { // 得到子节点列表 List childList = getChildList(list, t); t.setChildren(childList); for (HwWebMenu tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List getChildList(List list, HwWebMenu t) { List tlist = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { HwWebMenu n = it.next(); if (StringUtils.isNotNull(n.getParent()) && n.getParent().longValue() == t.getWebMenuId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List list, HwWebMenu t) { return !getChildList(list, t).isEmpty(); } private void rebuildSearchIndexQuietly() { if (hwSearchRebuildService == null) { return; } try { hwSearchRebuildService.rebuildAll(); } catch (Exception e) { log.error("rebuild portal search index failed after hw_web_menu changed", e); } } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwWebMenuServiceImpl1.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.portal.domain.HwWebMenu1; import com.ruoyi.portal.mapper.HwWebMenuMapper1; import com.ruoyi.portal.service.IHwWebMenuService1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; /** * haiwei官网菜单Service业务层处理 * * @author zch * @date 2025-08-18 */ @Service public class HwWebMenuServiceImpl1 implements IHwWebMenuService1 { @Autowired private HwWebMenuMapper1 HwWebMenuMapper1; /** * 查询haiwei官网菜单 * * @param webMenuId haiwei官网菜单主键 * @return haiwei官网菜单 */ @Override public HwWebMenu1 selectHwWebMenuByWebMenuId(Long webMenuId) { return HwWebMenuMapper1.selectHwWebMenuByWebMenuId(webMenuId); } /** * 查询haiwei官网菜单列表 * * @param HwWebMenu1 haiwei官网菜单 * @return haiwei官网菜单 */ @Override public List selectHwWebMenuList(HwWebMenu1 HwWebMenu1) { List hwWebMenus = HwWebMenuMapper1.selectHwWebMenuList(HwWebMenu1); return hwWebMenus; } /** * 获取菜单树列表 */ @Override public List selectMenuTree(HwWebMenu1 HwWebMenu1) { List hwWebMenus = HwWebMenuMapper1.selectHwWebMenuList(HwWebMenu1); return buildWebMenuTree(hwWebMenus); } /** * 新增haiwei官网菜单 * * @param HwWebMenu1 haiwei官网菜单 * @return 结果 */ @Override public int insertHwWebMenu(HwWebMenu1 HwWebMenu1) { return HwWebMenuMapper1.insertHwWebMenu(HwWebMenu1); } /** * 修改haiwei官网菜单 * * @param HwWebMenu1 haiwei官网菜单 * @return 结果 */ @Override public int updateHwWebMenu(HwWebMenu1 HwWebMenu1) { return HwWebMenuMapper1.updateHwWebMenu(HwWebMenu1); } /** * 批量删除haiwei官网菜单 * * @param webMenuIds 需要删除的haiwei官网菜单主键 * @return 结果 */ @Override public int deleteHwWebMenuByWebMenuIds(Long[] webMenuIds) { return HwWebMenuMapper1.deleteHwWebMenuByWebMenuIds(webMenuIds); } /** * 删除haiwei官网菜单信息 * * @param webMenuId haiwei官网菜单主键 * @return 结果 */ @Override public int deleteHwWebMenuByWebMenuId(Long webMenuId) { return HwWebMenuMapper1.deleteHwWebMenuByWebMenuId(webMenuId); } /** * 构建前端所需要树结构(根据传入的平铺菜单列表构造树) * * @param menus 菜单列表 * @return 树结构列表 */ public List buildWebMenuTree(List menus) { List returnList = new ArrayList<>(); List tempList = menus.stream().map(HwWebMenu1::getWebMenuId).collect(Collectors.toList()); for (HwWebMenu1 menu : menus) { // 如果是顶级节点(parent为null、0或者不在当前列表中), 遍历该父节点的所有子节点 if (menu.getParent() == null || menu.getParent() == 0L || !tempList.contains(menu.getParent())) { recursionFn(menus, menu); returnList.add(menu); } } if (returnList.isEmpty()) { returnList = menus; } return returnList; } /** * 递归设置子节点 */ private void recursionFn(List list, HwWebMenu1 t) { // 得到子节点列表 List childList = getChildList(list, t); t.setChildren(childList); for (HwWebMenu1 tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List getChildList(List list, HwWebMenu1 t) { List tlist = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { HwWebMenu1 n = it.next(); if (StringUtils.isNotNull(n.getParent()) && n.getParent().longValue() == t.getWebMenuId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List list, HwWebMenu1 t) { return !getChildList(list, t).isEmpty(); } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwWebServiceImpl.java` ```java package com.ruoyi.portal.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.portal.mapper.HwWebMapper; import com.ruoyi.portal.domain.HwWeb; import com.ruoyi.portal.service.IHwWebService; import com.ruoyi.portal.service.IHwSearchRebuildService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; /** * haiwei官网jsonService业务层处理 * * @author ruoyi * @date 2025-08-18 */ @Service public class HwWebServiceImpl implements IHwWebService { private static final Logger log = LoggerFactory.getLogger(HwWebServiceImpl.class); @Autowired private HwWebMapper hwWebMapper; @Autowired(required = false) private IHwSearchRebuildService hwSearchRebuildService; /** * 查询haiwei官网json * * @param webId haiwei官网json主键 * @return haiwei官网json */ @Override public HwWeb selectHwWebByWebcode(Long webCode) { HwWeb hwWeb = hwWebMapper.selectHwWebByWebcode(webCode); return hwWeb; } /** * 查询haiwei官网json列表 * * @param hwWeb haiwei官网json * @return haiwei官网json */ @Override public List selectHwWebList(HwWeb hwWeb) { return hwWebMapper.selectHwWebList(hwWeb); } /** * 新增haiwei官网json * * @param hwWeb haiwei官网json * @return 结果 */ @Override public int insertHwWeb(HwWeb hwWeb) { int rows = hwWebMapper.insertHwWeb(hwWeb); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 修改haiwei官网json * * @param hwWeb haiwei官网json * @return 结果 */ @Override @Transactional( rollbackFor = Exception.class ) public int updateHwWeb(HwWeb hwWeb) { HwWeb codeWeb = new HwWeb(); //编号唯一 codeWeb.setWebCode(hwWeb.getWebCode()); List exists = hwWebMapper.selectHwWebList(codeWeb); if (!exists.isEmpty()) { Long[] webIds = exists.stream().map(HwWeb::getWebId).toArray(Long[]::new); //逻辑删除旧纪录 hwWebMapper.deleteHwWebByWebIds(webIds); } // 插入新记录,避免复用旧主键 // hwWeb.setWebId(null); hwWeb.setIsDelete("0"); int rows = hwWebMapper.insertHwWeb(hwWeb); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 批量删除haiwei官网json * * @param webIds 需要删除的haiwei官网json主键 * @return 结果 */ @Override public int deleteHwWebByWebIds(Long[] webIds) { int rows = hwWebMapper.deleteHwWebByWebIds(webIds); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 删除haiwei官网json信息 * * @param webId haiwei官网json主键 * @return 结果 */ @Override public int deleteHwWebByWebId(Long webId) { int rows = hwWebMapper.deleteHwWebByWebId(webId); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } private void rebuildSearchIndexQuietly() { if (hwSearchRebuildService == null) { return; } try { hwSearchRebuildService.rebuildAll(); } catch (Exception e) { log.error("rebuild portal search index failed after hw_web changed", e); } } } ``` ### `ruoyi-portal/src/main/java/com/ruoyi/portal/service/impl/HwWebServiceImpl1.java` ```java package com.ruoyi.portal.service.impl; import com.ruoyi.portal.mapper.HwWebMapper1; import com.ruoyi.portal.service.IHwSearchRebuildService; import com.ruoyi.portal.service.IHwWebService1; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import com.ruoyi.portal.domain.HwWeb1; import com.ruoyi.portal.domain.HwWeb; import org.springframework.transaction.annotation.Transactional; /** * haiwei官网jsonService业务层处理 * * @author ruoyi * @date 2025-08-18 */ @Service public class HwWebServiceImpl1 implements IHwWebService1 { private static final Logger log = LoggerFactory.getLogger(HwWebServiceImpl1.class); @Autowired private HwWebMapper1 hwWebMapper1; @Autowired(required = false) private IHwSearchRebuildService hwSearchRebuildService; /** * 查询haiwei官网json * * @param webId haiwei官网json主键 * @return haiwei官网json */ @Override public HwWeb1 selectHwWebByWebcode(Long webCode) { return hwWebMapper1.selectHwWebByWebcode(webCode); } @Override public HwWeb1 selectHwWebOne(HwWeb1 hwWeb1) { return hwWebMapper1.selectHwWebOne(hwWeb1); } /** * 查询haiwei官网json列表 * * @param HwWeb1 haiwei官网json * @return haiwei官网json */ @Override public List selectHwWebList(HwWeb1 hwWeb1) { return hwWebMapper1.selectHwWebList(hwWeb1); } /** * 新增haiwei官网json * * @param HwWeb1 haiwei官网json * @return 结果 */ @Override public int insertHwWeb(HwWeb1 hwWeb1) { int rows = hwWebMapper1.insertHwWeb(hwWeb1); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 修改haiwei官网json * * @param HwWeb1 haiwei官网json * @return 结果 */ @Override @Transactional( rollbackFor = Exception.class ) public int updateHwWeb(HwWeb1 hwWeb1) { HwWeb1 codeWeb = new HwWeb1(); // 编号、typeid、deviceID保证唯一 codeWeb.setWebCode(hwWeb1.getWebCode()); codeWeb.setTypeId(hwWeb1.getTypeId()); codeWeb.setDeviceId(hwWeb1.getDeviceId()); List exists = hwWebMapper1.selectHwWebList(codeWeb); if (!exists.isEmpty()) { Long[] webIds = exists.stream().map(HwWeb1::getWebId).toArray(Long[]::new); //逻辑删除旧纪录 hwWebMapper1.deleteHwWebByWebIds(webIds); } // 插入新记录,避免复用旧主键 // hwWeb1.setWebId(null); hwWeb1.setIsDelete("0"); int rows = hwWebMapper1.insertHwWeb(hwWeb1); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 批量删除haiwei官网json * * @param webIds 需要删除的haiwei官网json主键 * @return 结果 */ @Override public int deleteHwWebByWebIds(Long[] webIds) { int rows = hwWebMapper1.deleteHwWebByWebIds(webIds); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } /** * 删除haiwei官网json信息 * * @param webId haiwei官网json主键 * @return 结果 */ @Override public int deleteHwWebByWebId(Long webId) { int rows = hwWebMapper1.deleteHwWebByWebId(webId); if (rows > 0) { rebuildSearchIndexQuietly(); } return rows; } private void rebuildSearchIndexQuietly() { if (hwSearchRebuildService == null) { return; } try { hwSearchRebuildService.rebuildAll(); } catch (Exception e) { log.error("rebuild portal search index failed after hw_web1 changed", e); } } } ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwAboutUsInfoDetailMapper.xml` ```xml select us_info_detail_id, about_us_info_id, us_info_detail_title, us_info_detail_desc, us_info_detail_order, us_info_detail_pic, create_time, create_by, update_time, update_by from hw_about_us_info_detail insert into hw_about_us_info_detail about_us_info_id, us_info_detail_title, us_info_detail_desc, us_info_detail_order, us_info_detail_pic, create_time, create_by, update_time, update_by, #{aboutUsInfoId}, #{usInfoDetailTitle}, #{usInfoDetailDesc}, #{usInfoDetailOrder}, #{usInfoDetailPic}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_about_us_info_detail about_us_info_id = #{aboutUsInfoId}, us_info_detail_title = #{usInfoDetailTitle}, us_info_detail_desc = #{usInfoDetailDesc}, us_info_detail_order = #{usInfoDetailOrder}, us_info_detail_pic = #{usInfoDetailPic}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where us_info_detail_id = #{usInfoDetailId} delete from hw_about_us_info_detail where us_info_detail_id = #{usInfoDetailId} delete from hw_about_us_info_detail where us_info_detail_id in #{usInfoDetailId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwAboutUsInfoMapper.xml` ```xml select about_us_info_id, about_us_info_type, about_us_info_title, about_us_info_etitle,about_us_info_desc, about_us_info_order,display_modal, about_us_info_pic, create_time, create_by, update_time, update_by from hw_about_us_info insert into hw_about_us_info about_us_info_type, about_us_info_etitle, about_us_info_title, about_us_info_desc, about_us_info_order, display_modal, about_us_info_pic, create_time, create_by, update_time, update_by, #{aboutUsInfoType}, #{aboutUsInfoEtitle}, #{aboutUsInfoTitle}, #{aboutUsInfoDesc}, #{aboutUsInfoOrder}, #{displayModal}, #{aboutUsInfoPic}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_about_us_info about_us_info_type = #{aboutUsInfoType}, about_us_info_etitle = #{aboutUsInfoEtitle}, about_us_info_title = #{aboutUsInfoTitle}, about_us_info_desc = #{aboutUsInfoDesc}, about_us_info_order = #{aboutUsInfoOrder}, display_modal = #{displayModal}, about_us_info_pic = #{aboutUsInfoPic}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where about_us_info_id = #{aboutUsInfoId} delete from hw_about_us_info where about_us_info_id = #{aboutUsInfoId} delete from hw_about_us_info where about_us_info_id in #{aboutUsInfoId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwAnalyticsMapper.xml` ```xml INSERT INTO hw_web_visit_event ( event_type, visitor_id, session_id, path, referrer, utm_source, utm_medium, utm_campaign, keyword, ip_hash, ua, device, browser, os, stay_ms, event_time, created_at ) VALUES ( #{eventType}, #{visitorId}, #{sessionId}, #{path}, #{referrer}, #{utmSource}, #{utmMedium}, #{utmCampaign}, #{keyword}, #{ipHash}, #{ua}, #{device}, #{browser}, #{os}, #{stayMs}, #{eventTime}, NOW() ) INSERT INTO hw_web_visit_daily ( stat_date, pv, uv, ip_uv, avg_stay_ms, bounce_rate, search_count, download_count, created_at, updated_at ) VALUES ( #{statDate}, #{pv}, #{uv}, #{ipUv}, #{avgStayMs}, #{bounceRate}, #{searchCount}, #{downloadCount}, NOW(), NOW() ) ON DUPLICATE KEY UPDATE pv = VALUES(pv), uv = VALUES(uv), ip_uv = VALUES(ip_uv), avg_stay_ms = VALUES(avg_stay_ms), bounce_rate = VALUES(bounce_rate), search_count = VALUES(search_count), download_count = VALUES(download_count), updated_at = NOW() ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwContactUsInfoMapper.xml` ```xml select contact_us_info_id, user_name, user_email, user_phone, user_ip, remark,create_time, create_by, update_time, update_by from hw_contact_us_info insert into hw_contact_us_info user_name, user_email, user_phone, user_ip, remark, create_time, create_by, update_time, update_by, #{userName}, #{userEmail}, #{userPhone}, #{userIp}, #{remark}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_contact_us_info user_name = #{userName}, user_email = #{userEmail}, user_phone = #{userPhone}, user_ip = #{userIp}, remark = #{remark}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where contact_us_info_id = #{contactUsInfoId} delete from hw_contact_us_info where contact_us_info_id = #{contactUsInfoId} delete from hw_contact_us_info where contact_us_info_id in #{contactUsInfoId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwPortalConfigMapper.xml` ```xml select portal_config_id, portal_config_type,portal_config_type_id, portal_config_title, portal_config_order, portal_config_desc, button_name, router_address, portal_config_pic, create_time, create_by, update_time, update_by from hw_portal_config select hpc.portal_config_id, hpc.portal_config_type,hpc.portal_config_type_id, hpc.portal_config_title, hpc.portal_config_order, hpc.portal_config_desc, hpc.button_name, hpc.router_address, hpc.portal_config_pic, hpc.create_time, hpc.create_by, hpc.update_time, hpc.update_by, hpct.config_type_name, hpct.home_config_type_pic, hpct.config_type_icon, hpct.home_config_type_name, hpct.config_type_classfication, hpct.parent_id, hpct.ancestors from hw_portal_config hpc left join hw_portal_config_type hpct on hpc.portal_config_type_id = hpct.config_type_id insert into hw_portal_config portal_config_type, portal_config_type_id, portal_config_title, portal_config_order, portal_config_desc, button_name, router_address, portal_config_pic, create_time, create_by, update_time, update_by, #{portalConfigType}, #{portalConfigTypeId}, #{portalConfigTitle}, #{portalConfigOrder}, #{portalConfigDesc}, #{buttonName}, #{routerAddress}, #{portalConfigPic}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_portal_config portal_config_type = #{portalConfigType}, portal_config_type_id = #{portalConfigTypeId}, portal_config_title = #{portalConfigTitle}, portal_config_order = #{portalConfigOrder}, portal_config_desc = #{portalConfigDesc}, button_name = #{buttonName}, router_address = #{routerAddress}, portal_config_pic = #{portalConfigPic}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where portal_config_id = #{portalConfigId} delete from hw_portal_config where portal_config_id = #{portalConfigId} delete from hw_portal_config where portal_config_id in #{portalConfigId} select hpc.portal_config_id, hpc.portal_config_type,hpc.portal_config_type_id, hpc.portal_config_title, hpc.portal_config_order, hpc.portal_config_desc, hpc.button_name, hpc.router_address, hpc.portal_config_pic, hpc.create_time, hpc.create_by, hpc.update_time, hpc.update_by,hpct.config_type_name from hw_portal_config hpc left join hw_portal_config_type hpct on hpc.portal_config_type_id = hpct.config_type_id ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwPortalConfigTypeMapper.xml` ```xml select config_type_id, config_type_classfication, config_type_name, home_config_type_name, config_type_desc, config_type_icon, home_config_type_pic, parent_id, ancestors, create_time, create_by, update_time, update_by from hw_portal_config_type insert into hw_portal_config_type config_type_classfication, config_type_name, home_config_type_name, config_type_desc, config_type_icon, home_config_type_pic, parent_id, ancestors, create_time, create_by, update_time, update_by, #{configTypeClassfication}, #{configTypeName}, #{homeConfigTypeName}, #{configTypeDesc}, #{configTypeIcon}, #{homeConfigTypePic}, #{parentId}, #{ancestors}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_portal_config_type config_type_classfication = #{configTypeClassfication}, config_type_name = #{configTypeName}, home_config_type_name = #{homeConfigTypeName}, config_type_desc = #{configTypeDesc}, config_type_icon = #{configTypeIcon}, home_config_type_pic = #{homeConfigTypePic}, parent_id = #{parentId}, ancestors = #{ancestors}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where config_type_id = #{configTypeId} delete from hw_portal_config_type where config_type_id = #{configTypeId} delete from hw_portal_config_type where config_type_id in #{configTypeId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwProductCaseInfoMapper.xml` ```xml select case_info_id, case_info_title, config_type_id, typical_flag, case_info_desc, case_info_pic, case_info_html, create_time, create_by, update_time, update_by from hw_product_case_info hpci select case_info_id, case_info_title, config_type_id, typical_flag, case_info_desc, case_info_pic, create_time, create_by, update_time, update_by from hw_product_case_info hpci insert into hw_product_case_info case_info_title, config_type_id, typical_flag, case_info_desc, case_info_pic, case_info_html, create_time, create_by, update_time, update_by, #{caseInfoTitle}, #{configTypeId}, #{typicalFlag}, #{caseInfoDesc}, #{caseInfoPic}, #{caseInfoHtml}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_product_case_info case_info_title = #{caseInfoTitle}, config_type_id = #{configTypeId}, typical_flag = #{typicalFlag}, case_info_desc = #{caseInfoDesc}, case_info_pic = #{caseInfoPic}, case_info_html = #{caseInfoHtml}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where case_info_id = #{caseInfoId} delete from hw_product_case_info where case_info_id = #{caseInfoId} delete from hw_product_case_info where case_info_id in #{caseInfoId} select hpci.case_info_id, hpci.case_info_title, hpci.config_type_id, hpci.typical_flag, hpci.case_info_desc, hpci.case_info_pic, hpci.create_time, hpci.create_by, hpci.update_time, hpci.update_by,hpct.config_type_name from hw_product_case_info hpci left join hw_portal_config_type hpct on hpci.config_type_id=hpct.config_type_id ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwProductInfoDetailMapper.xml` ```xml select product_info_detail_id, parent_id, product_info_id, config_modal, product_info_detail_title, product_info_detail_desc, product_info_detail_order, product_info_detail_pic, ancestors, create_time, create_by, update_time, update_by from hw_product_info_detail insert into hw_product_info_detail parent_id, product_info_id, config_modal, product_info_detail_title, product_info_detail_desc, product_info_detail_order, product_info_detail_pic, ancestors, create_time, create_by, update_time, update_by, #{parentId}, #{productInfoId}, #{configModal}, #{productInfoDetailTitle}, #{productInfoDetailDesc}, #{productInfoDetailOrder}, #{productInfoDetailPic}, #{ancestors}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_product_info_detail parent_id = #{parentId}, product_info_id = #{productInfoId}, config_modal = #{configModal}, product_info_detail_title = #{productInfoDetailTitle}, product_info_detail_desc = #{productInfoDetailDesc}, product_info_detail_order = #{productInfoDetailOrder}, product_info_detail_pic = #{productInfoDetailPic}, ancestors = #{ancestors}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where product_info_detail_id = #{productInfoDetailId} delete from hw_product_info_detail where product_info_detail_id = #{productInfoDetailId} delete from hw_product_info_detail where product_info_detail_id in #{productInfoDetailId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwProductInfoMapper.xml` ```xml select product_info_id, config_type_id, tab_flag, config_modal, product_info_etitle, product_info_ctitle, product_info_order, create_time, create_by, update_time, update_by from hw_product_info insert into hw_product_info config_type_id, tab_flag, config_modal, product_info_etitle, product_info_ctitle, product_info_order, create_time, create_by, update_time, update_by, #{configTypeId}, #{tabFlag}, #{configModal}, #{productInfoEtitle}, #{productInfoCtitle}, #{productInfoOrder}, #{createTime}, #{createBy}, #{updateTime}, #{updateBy}, update hw_product_info config_type_id = #{configTypeId}, tab_flag = #{tabFlag}, config_modal = #{configModal}, product_info_etitle = #{productInfoEtitle}, product_info_ctitle = #{productInfoCtitle}, product_info_order = #{productInfoOrder}, create_time = #{createTime}, create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, where product_info_id = #{productInfoId} delete from hw_product_info where product_info_id = #{productInfoId} delete from hw_product_info where product_info_id in #{productInfoId} select hpi.product_info_id, hpi.config_type_id, hpi.tab_flag, hpi.config_modal, hpi.product_info_etitle, hpi.product_info_ctitle, hpi.product_info_order, hpi.create_time, hpi.create_by, hpi.update_time, hpi.update_by,hpct.config_type_name from hw_product_info hpi left join hw_portal_config_type hpct on hpi.config_type_id=hpct.config_type_id ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwSearchMapper.xml` ```xml ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwWebDocumentMapper.xml` ```xml select document_id, tenant_id, document_address, create_time, web_code, secretKey , json, type, is_delete from hw_web_document insert into hw_web_document document_id, tenant_id, document_address, create_time, web_code, secretKey, json, type, is_delete, #{documentId}, #{tenantId}, #{documentAddress}, #{createTime}, #{webCode}, #{secretKey}, #{json}, #{type}, #{isDelete}, '0', update hw_web_document document_id = #{documentId}, tenant_id = #{tenantId}, document_address = #{documentAddress}, create_time = #{createTime}, web_code = #{webCode}, secretKey = NULL #{secretKey} , json = #{json}, type = #{type}, where document_id = #{documentId} update hw_web_document set is_delete = '1' where document_id = #{documentId} update hw_web_document set is_delete = '1' where document_id in #{documentId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwWebMapper.xml` ```xml select web_id, web_json, web_json_string, web_code, web_json_english, is_delete from hw_web insert into hw_web web_json, web_json_string, web_code, web_json_english, is_delete, #{webJson}, #{webJsonString}, #{webCode}, #{webJsonEnglish}, #{isDelete}, '0', update hw_web web_json = #{webJson}, web_json_string = #{webJsonString}, web_json_english = #{webJsonEnglish}, where web_code = #{webCode} update hw_web set is_delete = '1' where web_id = #{webId} update hw_web set is_delete = '1' where web_id in #{webId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwWebMapper1.xml` ```xml select web_id, web_json, web_json_string, web_code, device_id, typeId, web_json_english, is_delete from hw_web1 insert into hw_web1 web_json, web_json_string, web_code, device_id, typeId, web_json_english, is_delete, #{webJson}, #{webJsonString}, #{webCode}, #{deviceId}, #{typeId}, #{webJsonEnglish}, #{isDelete}, '0', update hw_web1 web_json = #{webJson}, web_json_string = #{webJsonString}, web_json_english = #{webJsonEnglish}, where web_code = #{webCode} and device_id = #{deviceId} and typeId = #{typeId} update hw_web1 set is_delete = '1' where web_id = #{webId} update hw_web1 set is_delete = '1' where web_id in #{webId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwWebMenuMapper.xml` ```xml select web_menu_id, parent, ancestors, status, web_menu_name, tenant_id, web_menu__pic, web_menu_type, order, web_menu_name_english, is_delete from hw_web_menu insert into hw_web_menu web_menu_id, parent, ancestors, status, web_menu_name, tenant_id, web_menu__pic, web_menu_type, `order`, web_menu_name_english, is_delete, #{webMenuId}, #{parent}, #{ancestors}, #{status}, #{webMenuName}, #{tenantId}, #{webMenuPic}, #{webMenuType}, #{order}, #{webMenuNameEnglish}, #{isDelete}, '0', update hw_web_menu parent = #{parent}, ancestors = #{ancestors}, status = #{status}, web_menu_name = #{webMenuName}, tenant_id = #{tenantId}, web_menu__pic = #{webMenuPic}, web_menu_type = #{webMenuType}, `order` = #{order}, web_menu_name_english = #{webMenuNameEnglish}, where web_menu_id = #{webMenuId} update hw_web_menu set is_delete = '1' where web_menu_id = #{webMenuId} update hw_web_menu set is_delete = '1' where web_menu_id in #{webMenuId} ``` ### `ruoyi-portal/src/main/resources/mapper/portal/HwWebMenuMapper1.xml` ```xml select web_menu_id, parent, ancestors, status, web_menu_name, tenant_id, web_menu__pic, value, web_menu_type, web_menu_name_english, is_delete from hw_web_menu1 insert into hw_web_menu1 web_menu_id, parent, ancestors, status, web_menu_name, tenant_id, web_menu__pic, web_menu_type, value, web_menu_name_english, is_delete, #{webMenuId}, #{parent}, #{ancestors}, #{status}, #{webMenuName}, #{tenantId}, #{webMenuPic}, #{webMenuType}, #{value}, #{webMenuNameEnglish}, #{isDelete}, '0', update hw_web_menu1 parent = #{parent}, ancestors = #{ancestors}, status = #{status}, web_menu_name = #{webMenuName}, tenant_id = #{tenantId}, web_menu__pic = #{webMenuPic}, web_menu_type = #{webMenuType}, value = #{value}, web_menu_name_english = #{webMenuNameEnglish}, where web_menu_id = #{webMenuId} update hw_web_menu1 set is_delete = '1' where web_menu_id = #{webMenuId} update hw_web_menu1 set is_delete = '1' where web_menu_id in #{webMenuId} ```