diff --git a/dl_admin/pom.xml b/dl_admin/pom.xml index 3419081..6f16c4d 100644 --- a/dl_admin/pom.xml +++ b/dl_admin/pom.xml @@ -10,7 +10,7 @@ ruoyi http://www.ruoyi.vip - 通告快接管理后台 + 成事达管理后台 3.8.9 @@ -37,6 +37,8 @@ 5.3.39 5.8.26 3.5.1 + 3.17.4 + 4.5.13 @@ -229,7 +231,18 @@ ruoyi-common ${ruoyi.version} - + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.sdk.oss.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + diff --git a/dl_admin/ruoyi-admin/pom.xml b/dl_admin/ruoyi-admin/pom.xml index 544ff2b..8666b85 100644 --- a/dl_admin/ruoyi-admin/pom.xml +++ b/dl_admin/ruoyi-admin/pom.xml @@ -9,13 +9,25 @@ 4.0.0 jar - ruoyi-admin + nuxt-site web服务入口 + + + com.aliyun.oss + aliyun-sdk-oss + 3.17.4 + + + + commons-io + commons-io + 2.11.0 + @@ -106,6 +118,38 @@ weixin-java-common 4.6.0 + + + com.aliyun.oss + aliyun-sdk-oss + + + + org.apache.httpcomponents + httpclient + + + org.springframework + spring-websocket + 5.3.31 + + + + org.lionsoul + ip2region + 2.7.0 + + + org.jsoup + jsoup + 1.11.3 + + + + com.google.api-ads + google-ads + 38.0.0 + diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseAppController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseAppController.java new file mode 100644 index 0000000..86536a7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseAppController.java @@ -0,0 +1,112 @@ +package com.ruoyi.base.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BaseApp; +import com.ruoyi.base.service.IBaseAppService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * app版本管理Controller + * + * @author vinjor-m + * @date 2025-08-25 + */ +@RestController +@RequestMapping("/base/app") +public class BaseAppController extends BaseController +{ + @Autowired + private IBaseAppService baseAppService; + + /** + * 查询app版本管理列表 + */ + @PreAuthorize("@ss.hasPermi('base:app:list')") + @GetMapping("/list") + public AjaxResult list(BaseApp baseApp, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = baseAppService.queryListPage(baseApp,page); + return success(list); + } + + /** + * 导出app版本管理列表 + */ + @PreAuthorize("@ss.hasPermi('base:app:export')") + @Log(title = "app版本管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BaseApp baseApp) + { + List list = baseAppService.list(); + ExcelUtil util = new ExcelUtil(BaseApp.class); + util.exportExcel(response, list, "app版本管理数据"); + } + + /** + * 获取app版本管理详细信息 + */ + @PreAuthorize("@ss.hasPermi('base:app:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(baseAppService.getById(id)); + } + + /** + * 新增app版本管理 + */ + @PreAuthorize("@ss.hasPermi('base:app:add')") + @Log(title = "app版本管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BaseApp baseApp) + { + return toAjax(baseAppService.save(baseApp)); + } + + /** + * 修改app版本管理 + */ + @PreAuthorize("@ss.hasPermi('base:app:edit')") + @Log(title = "app版本管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BaseApp baseApp) + { + return toAjax(baseAppService.updateById(baseApp)); + } + + /** + * 删除app版本管理 + */ + @PreAuthorize("@ss.hasPermi('base:app:remove')") + @Log(title = "app版本管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(baseAppService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseInquiryController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseInquiryController.java new file mode 100644 index 0000000..be221d9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseInquiryController.java @@ -0,0 +1,74 @@ +package com.ruoyi.base.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BaseInquiry; +import com.ruoyi.base.service.IBaseInquiryService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 在线询盘设置Controller + * + * @author vinjor-m + * @date 2025-06-24 + */ +@RestController +@RequestMapping("/base/inquiry") +public class BaseInquiryController extends BaseController +{ + @Autowired + private IBaseInquiryService baseInquiryService; + + /** + * 获取在线询盘设置详细信息 + */ + @PreAuthorize("@ss.hasPermi('base:inquiry:query')") + @GetMapping(value = "/getInquiry") + public AjaxResult getInquiry(String tenantId) + { + return success(baseInquiryService.getInquiry(tenantId)); + } + + /** + * 新增在线询盘设置 + */ + @PreAuthorize("@ss.hasPermi('base:inquiry:add')") + @Log(title = "在线询盘设置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BaseInquiry baseInquiry) + { + return toAjax(baseInquiryService.saveOrUpdate(baseInquiry)); + } + + /** + * 修改在线询盘设置 + */ + @PreAuthorize("@ss.hasPermi('base:inquiry:edit')") + @Log(title = "在线询盘设置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BaseInquiry baseInquiry) + { + return toAjax(baseInquiryService.saveOrUpdate(baseInquiry)); + } + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseManagerController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseManagerController.java new file mode 100644 index 0000000..39eb5e7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseManagerController.java @@ -0,0 +1,118 @@ +package com.ruoyi.base.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.vo.ManagerVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BaseManager; +import com.ruoyi.base.service.IBaseManagerService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 站点分配Controller + * + * @author vinjor-m + * @date 2025-08-11 + */ +@RestController +@RequestMapping("/base/manager") +public class BaseManagerController extends BaseController +{ + @Autowired + private IBaseManagerService baseManagerService; + + /** + * 查询站点分配列表 + */ + @PreAuthorize("@ss.hasPermi('base:manager:list')") + @GetMapping("/list") + public AjaxResult list(ManagerVO baseManager, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = baseManagerService.queryListPage(baseManager,page); + return success(list); + } + + /** + * 导出站点分配列表 + */ + @PreAuthorize("@ss.hasPermi('base:manager:export')") + @Log(title = "站点分配", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BaseManager baseManager) + { + List list = baseManagerService.list(); + ExcelUtil util = new ExcelUtil(BaseManager.class); + util.exportExcel(response, list, "站点分配数据"); + } + + /** + * 获取站点分配详细信息 + */ + @PreAuthorize("@ss.hasPermi('base:manager:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(baseManagerService.getById(id)); + } + + /** + * 新增站点分配 + */ + @PreAuthorize("@ss.hasPermi('base:manager:add')") + @Log(title = "站点分配", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ManagerVO baseManager) { + baseManager.setTenantId(baseManager.getSiteId()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(BaseManager::getTenantId,baseManager.getSiteId()); + baseManagerService.remove(lambdaQueryWrapper); + return toAjax(baseManagerService.save(baseManager)); + } + + /** + * 修改站点分配 + */ + @PreAuthorize("@ss.hasPermi('base:manager:edit')") + @Log(title = "站点分配", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BaseManager baseManager) + { + return toAjax(baseManagerService.updateById(baseManager)); + } + + /** + * 删除站点分配 + */ + @PreAuthorize("@ss.hasPermi('base:manager:remove')") + @Log(title = "站点分配", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(baseManagerService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BasePicController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BasePicController.java new file mode 100644 index 0000000..b760788 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BasePicController.java @@ -0,0 +1,112 @@ +package com.ruoyi.base.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BasePic; +import com.ruoyi.base.service.IBasePicService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 轮播图管理Controller + * + * @author vinjor-m + * @date 2025-06-23 + */ +@RestController +@RequestMapping("/base/pic") +public class BasePicController extends BaseController +{ + @Autowired + private IBasePicService basePicService; + + /** + * 查询轮播图管理列表 + */ + @PreAuthorize("@ss.hasPermi('base:pic:list')") + @GetMapping("/list") + public AjaxResult list(BasePic basePic, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = basePicService.queryListPage(basePic,page); + return success(list); + } + + /** + * 导出轮播图管理列表 + */ + @PreAuthorize("@ss.hasPermi('base:pic:export')") + @Log(title = "轮播图管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BasePic basePic) + { + List list = basePicService.list(); + ExcelUtil util = new ExcelUtil(BasePic.class); + util.exportExcel(response, list, "轮播图管理数据"); + } + + /** + * 获取轮播图管理详细信息 + */ + @PreAuthorize("@ss.hasPermi('base:pic:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(basePicService.getById(id)); + } + + /** + * 新增轮播图管理 + */ + @PreAuthorize("@ss.hasPermi('base:pic:add')") + @Log(title = "轮播图管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BasePic basePic) + { + return toAjax(basePicService.save(basePic)); + } + + /** + * 修改轮播图管理 + */ + @PreAuthorize("@ss.hasPermi('base:pic:edit')") + @Log(title = "轮播图管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BasePic basePic) + { + return toAjax(basePicService.updateById(basePic)); + } + + /** + * 删除轮播图管理 + */ + @PreAuthorize("@ss.hasPermi('base:pic:remove')") + @Log(title = "轮播图管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(basePicService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BasePicsController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BasePicsController.java new file mode 100644 index 0000000..7982696 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BasePicsController.java @@ -0,0 +1,118 @@ +package com.ruoyi.base.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.vo.PicsVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BasePics; +import com.ruoyi.base.service.IBasePicsService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 图片库Controller + * + * @author vinjor-m + * @date 2025-06-24 + */ +@RestController +@RequestMapping("/base/pics") +public class BasePicsController extends BaseController +{ + @Autowired + private IBasePicsService basePicsService; + + /** + * 查询图片库列表 + */ + @PreAuthorize("@ss.hasPermi('base:pics:list')") + @GetMapping("/list") + public AjaxResult list(BasePics basePics, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = basePicsService.queryListPage(basePics,page); + return success(list); + } + + /** + * 导出图片库列表 + */ + @PreAuthorize("@ss.hasPermi('base:pics:export')") + @Log(title = "图片库", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BasePics basePics) + { + List list = basePicsService.list(); + ExcelUtil util = new ExcelUtil(BasePics.class); + util.exportExcel(response, list, "图片库数据"); + } + + /** + * 获取图片库详细信息 + */ + @PreAuthorize("@ss.hasPermi('base:pics:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(basePicsService.getById(id)); + } + + /** + * 新增图片库 + */ + @PreAuthorize("@ss.hasPermi('base:pics:add')") + @Log(title = "图片库", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody PicsVO basePics) + { + List basePicsList = basePics.getFileList(); + basePicsList.forEach(item->{ + item.setFileType(basePics.getFileType()); + item.setTenantId(basePics.getTenantId()); + }); + return toAjax(basePicsService.saveBatch(basePicsList)); + } + + /** + * 修改图片库 + */ + @PreAuthorize("@ss.hasPermi('base:pics:edit')") + @Log(title = "图片库", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BasePics basePics) + { + return toAjax(basePicsService.updateById(basePics)); + } + + /** + * 删除图片库 + */ + @PreAuthorize("@ss.hasPermi('base:pics:remove')") + @Log(title = "图片库", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(basePicsService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSeoController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSeoController.java new file mode 100644 index 0000000..73e7437 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSeoController.java @@ -0,0 +1,88 @@ +package com.ruoyi.base.controller; + +import java.util.*; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.vo.KeywordVO; +import com.ruoyi.busi.service.GoogleKeywordService; +import com.ruoyi.common.config.GoogleConfig; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BaseSeo; +import com.ruoyi.base.service.IBaseSeoService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +import static com.ruoyi.constant.StrConstants.COUNTRY; +import static com.ruoyi.constant.StrConstants.LANGUAGE; + +/** + * SEO用到的国家和语言Controller + * + * @author vinjor-m + * @date 2025-08-04 + */ +@RestController +@RequestMapping("/base/seo") +public class BaseSeoController extends BaseController { + @Autowired + private GoogleConfig googleConfig; + @Autowired + private IBaseSeoService baseSeoService; + @Autowired + private GoogleKeywordService googleKeywordService; + + /** + * 查询SEO用到的国家和语言列表 + */ + @GetMapping("/list") + public AjaxResult list() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().orderByAsc(BaseSeo::getSort); + List list = baseSeoService.list(queryWrapper); + List languageList = list.stream().filter(item -> LANGUAGE.equals(item.getDataType())).collect(Collectors.toList()); + List countryList = list.stream().filter(item -> COUNTRY.equals(item.getDataType())).collect(Collectors.toList()); + languageList.forEach(item->item.setTitle(item.getTitle()+"("+item.getCn()+")")); + countryList.forEach(item->item.setTitle(item.getTitle()+"("+item.getCn()+")")); + Map rtnMap = new HashMap<>(); + rtnMap.put("language", languageList); + rtnMap.put("country", countryList); + return success(rtnMap); + } + + /** + * 获取google关键词 + * + * @param language 语言 + * @param country 国家 + * @param title 关键词 + * @param url 产品预览网址 + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 17:51 2025/8/4 + **/ + @GetMapping("/getKeywords") + public AjaxResult getKeywords(String language, String country, String title, String url) { + Map rtnMap = new HashMap<>(); + rtnMap.put("searchDown",googleConfig.getSearchDown()); + rtnMap.put("dataList",googleKeywordService.getKeywords(language, country, title, url)); + return success(rtnMap); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java index a06b7a4..8e98259 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java @@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletResponse; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.vo.SiteVO; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -48,7 +49,7 @@ public class BaseSiteController extends BaseController { @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNum, pageSize); - IPage list = baseSiteService.queryListPage(baseSite, page); + IPage list = baseSiteService.queryListPage(baseSite, page); return success(list); } @@ -61,7 +62,7 @@ public class BaseSiteController extends BaseController { **/ @GetMapping("/listAll") public AjaxResult list() { - return success(baseSiteService.list()); + return success(baseSiteService.getMySiteList()); } /** diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteInfoController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteInfoController.java index fc442dd..8e7add3 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteInfoController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteInfoController.java @@ -39,41 +39,15 @@ public class BaseSiteInfoController extends BaseController @Autowired private IBaseSiteInfoService baseSiteInfoService; - /** - * 查询站点基础信息列表 - */ - @PreAuthorize("@ss.hasPermi('base:info:list')") - @GetMapping("/list") - public AjaxResult list(BaseSiteInfo baseSiteInfo, - @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) - { - Page page = new Page<>(pageNum, pageSize); - IPage list = baseSiteInfoService.queryListPage(baseSiteInfo,page); - return success(list); - } - - /** - * 导出站点基础信息列表 - */ - @PreAuthorize("@ss.hasPermi('base:info:export')") - @Log(title = "站点基础信息", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, BaseSiteInfo baseSiteInfo) - { - List list = baseSiteInfoService.list(); - ExcelUtil util = new ExcelUtil(BaseSiteInfo.class); - util.exportExcel(response, list, "站点基础信息数据"); - } /** * 获取站点基础信息详细信息 */ @PreAuthorize("@ss.hasPermi('base:info:query')") - @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") String id) + @GetMapping(value = "/getSiteInfo") + public AjaxResult getInfo(String tenantId) { - return success(baseSiteInfoService.getById(id)); + return success(baseSiteInfoService.getSiteInfo(tenantId)); } /** @@ -84,7 +58,7 @@ public class BaseSiteInfoController extends BaseController @PostMapping public AjaxResult add(@RequestBody BaseSiteInfo baseSiteInfo) { - return toAjax(baseSiteInfoService.save(baseSiteInfo)); + return toAjax(baseSiteInfoService.saveOrUpdate(baseSiteInfo)); } /** @@ -98,15 +72,4 @@ public class BaseSiteInfoController extends BaseController return toAjax(baseSiteInfoService.updateById(baseSiteInfo)); } - /** - * 删除站点基础信息 - */ - @PreAuthorize("@ss.hasPermi('base:info:remove')") - @Log(title = "站点基础信息", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable String[] ids) - { - List list = new ArrayList<>(Arrays.asList(ids)); - return toAjax(baseSiteInfoService.removeByIds(list)); - } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseTempController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseTempController.java new file mode 100644 index 0000000..08a514b --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseTempController.java @@ -0,0 +1,112 @@ +package com.ruoyi.base.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.base.domain.BaseTemp; +import com.ruoyi.base.service.IBaseTempService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 模板库Controller + * + * @author pqz + * @date 2025-08-07 + */ +@RestController +@RequestMapping("/base/temp") +public class BaseTempController extends BaseController +{ + @Autowired + private IBaseTempService baseTempService; + + /** + * 查询模板库列表 + */ + @PreAuthorize("@ss.hasPermi('base:temp:list')") + @GetMapping("/list") + public AjaxResult list(BaseTemp baseTemp, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = baseTempService.queryListPage(baseTemp,page); + return success(list); + } + + /** + * 导出模板库列表 + */ + @PreAuthorize("@ss.hasPermi('base:temp:export')") + @Log(title = "模板库", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BaseTemp baseTemp) + { + List list = baseTempService.list(); + ExcelUtil util = new ExcelUtil(BaseTemp.class); + util.exportExcel(response, list, "模板库数据"); + } + + /** + * 获取模板库详细信息 + */ + @PreAuthorize("@ss.hasPermi('base:temp:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(baseTempService.getById(id)); + } + + /** + * 新增模板库有3万块钱的购物卡么 + */ + @PreAuthorize("@ss.hasPermi('base:temp:add')") + @Log(title = "模板库", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BaseTemp baseTemp) + { + return toAjax(baseTempService.save(baseTemp)); + } + + /** + * 修改模板库 + */ + @PreAuthorize("@ss.hasPermi('base:temp:edit')") + @Log(title = "模板库", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BaseTemp baseTemp) + { + return toAjax(baseTempService.updateById(baseTemp)); + } + + /** + * 删除模板库 + */ + @PreAuthorize("@ss.hasPermi('base:temp:remove')") + @Log(title = "模板库", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(baseTempService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/ChatController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/ChatController.java new file mode 100644 index 0000000..7ae39d2 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/ChatController.java @@ -0,0 +1,91 @@ +package com.ruoyi.base.controller; + +import cn.hutool.json.JSONArray; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.service.IBusiChatItemService; +import com.ruoyi.busi.service.IBusiChatMainService; +import com.ruoyi.busi.utils.CommonUtils; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 会话接口 专用Controller + * + * @author vinjor-m + * @date 2025-06-23 + */ +@Api("会话接口") +@RestController +@RequestMapping("/chat") +public class ChatController { + @Autowired + private IBusiChatMainService busiChatMainService; + @Autowired + private CommonUtils commonUtils; + @Autowired + private IBusiChatItemService busiChatItemService; + /** + * 创建新会话 + */ + @PostMapping("/newChat") + public AjaxResult createSession(@RequestBody BusiChatMain busiChatMain, HttpServletRequest request) { + Map ipMap = commonUtils.getIPAndCountry(request); + busiChatMain.setIp(ipMap.get("ip")); + busiChatMain.setNational(ipMap.get("national")); + busiChatMain.setOceania(ipMap.get("oceania")); + return AjaxResult.success(busiChatMainService.createSession(busiChatMain)); + } + /** + * 发送消息 + */ + @PostMapping("/newMes") + public AjaxResult sendMessage(@RequestBody BusiChatItem message) { + return AjaxResult.success(busiChatItemService.sendMessage(message)); + } + + /** + * 查询用户活跃会话 + */ + @GetMapping("/active") + public AjaxResult getActiveSession(String tenantId, String deviceCode,@RequestParam(value = "prodId", required = false) String prodId, HttpServletRequest request) { + BusiChatMain session = busiChatMainService.selectActiveSession(tenantId, CommonUtils.getIpAddr(request), deviceCode,prodId); + return AjaxResult.success(session); + } + + /** + * 结束会话 + */ + @PutMapping("/close/{sessionId}") + public AjaxResult closeSession(@PathVariable String sessionId) { + boolean success = busiChatMainService.closeSession(sessionId); + return success ? AjaxResult.success() : AjaxResult.error("结束会话失败"); + } + + /** + * 根据会话ID查询消息列表 + */ + @GetMapping("/session/{sessionId}") + public AjaxResult getBySessionId(@PathVariable String sessionId) { + List messages = busiChatItemService.selectBySessionId(sessionId); + return AjaxResult.success(messages); + } + + /** + * 标记消息为已读 + */ + @PutMapping("/read/{sessionId}") + public AjaxResult markAsRead(@PathVariable String sessionId, @RequestParam String receiverId) { + busiChatItemService.markAsRead(sessionId, receiverId); + return AjaxResult.success(); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java new file mode 100644 index 0000000..2c7060c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java @@ -0,0 +1,526 @@ +package com.ruoyi.base.controller; + +import cn.hutool.json.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseApp; +import com.ruoyi.base.domain.BaseInquiry; +import com.ruoyi.base.domain.BasePic; +import com.ruoyi.base.domain.BaseSiteInfo; +import com.ruoyi.base.service.*; +import com.ruoyi.busi.domain.*; +import com.ruoyi.busi.service.*; +import com.ruoyi.busi.utils.CommonUtils; +import com.ruoyi.busi.vo.BusiCategoryVO; +import com.ruoyi.busi.vo.SiteMapVO; +import com.ruoyi.busi.vo.WebDetailVO; +import com.ruoyi.common.config.GoogleConfig; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.service.ISysDictDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.util.*; + +import static com.ruoyi.constant.DictConstants.*; +import static com.ruoyi.constant.DictConstants.CATG_TYPE_WZ; + +/** + * Web 专用Controller + * + * @author vinjor-m + * @date 2025-06-23 + */ +@Api("站点接口") +@RestController +@RequestMapping("/web") +public class WebController extends BaseController { + @Autowired + private IBasePicService basePicService; + @Autowired + private IBaseInquiryService baseInquiryService; + @Autowired + private IBusiCategoryService categoryService; + @Autowired + private IBaseSiteInfoService siteInfoService; + @Autowired + private IBusiProdNewService prodNewService; + @Autowired + private IBusiInquiryItemService inquiryItemService; + @Autowired + private IBusiChatMainService busiChatMainService; + @Autowired + private IBusiPageService pageService; + @Autowired + private CommonUtils commonUtils; + @Autowired + private ISysDictDataService dictDataService; + @Autowired + private IBaseAppService appService; + @Autowired + private GoogleConfig googleConfig; + + /** + * 导航栏接口--所有分类 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("获取站点分类树--所有分类") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/category") + public R> categoryList(@RequestParam(required = true) String tenantId) { + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + List busiCategoryVOList = categoryService.treeCategory(category); + return R.ok(categoryService.dealFirstId(busiCategoryVOList)); + } + + /** + * 获取站点产品分类树--产品分类 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("获取站点分类树--根据一级分类ID查询所有子级分类树") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "catgId", value = "一级分类ID", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) + @GetMapping("/prodCategory") + public R> prodCategoryList(@RequestParam(required = true) String tenantId, @RequestParam(required = true) String catgId) { + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + List busiCategoryVOList = categoryService.treeCategory(category); + for (BusiCategoryVO categoryVO : busiCategoryVOList) { + if (catgId.equals(categoryVO.getId())) { + return R.ok(categoryVO.getChildren()); + } + } + //最顶级的产品分类不反回 + return R.ok(); + } + + /** + * @param id 查询单个分类栏目详情--单页面栏目和询盘栏目使用 + * @return com.ruoyi.common.core.domain.R + * @author vinjor-M + * @date 15:44 2025/7/8 + **/ + @ApiOperation("查询单个分类栏目详情--单页面栏目和询盘栏目使用") + @ApiImplicitParam(name = "id", value = "主键ID", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/categoryInfo") + public R categoryInfo(@RequestParam(required = true) String id) { + return R.ok(categoryService.getById(id)); + } + + /** + * 轮播图 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("轮播图") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/pic") + public R> picList(@RequestParam(required = true) String tenantId) { + return R.ok(basePicService.list(tenantId)); + } + + /** + * 公司介绍-富文本-首页展示区域 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("公司介绍-富文本-首页展示区域") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/indexCompanyInfo") + public R> indexCompanyInfo(@RequestParam(required = true) String tenantId) { + BaseSiteInfo baseSiteInfo = siteInfoService.getSiteInfo(tenantId); + Map map = new HashMap<>(); + map.put("content", baseSiteInfo.getCompanyInfo()); + map.put("contentApp", baseSiteInfo.getCompanyInfoApp()); + return R.ok(map); + } + + /** + * 热门产品-前10 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("热门产品-前10") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/hotProduct") + public R> hotProduct(@RequestParam(required = true) String tenantId) { + return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, true)); + } + + /** + * 普通产品-前10 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("普通产品-前10") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/product") + public R> product(@RequestParam(required = true) String tenantId) { + return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, false)); + } + + /** + * 热门新闻-前10 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("热门新闻-前10") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/hotNews") + public R> hotNews(@RequestParam(required = true) String tenantId) { + return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_NEWS, true)); + } + + /** + * 页面底部 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("页面底部") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/footerInfo") + public R footerInfo(@RequestParam(required = true) String tenantId) { + return R.ok(siteInfoService.getSiteInfo(tenantId)); + } + + /** + * 产品列表分页 + * + * @param tenantId 租户id + * @param catgId 分类ID + * @param pageNum + * @param pageSize + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 15:17 2025/7/8 + **/ + @ApiOperation("产品列表分页") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "pageNum", value = "页码(1开始)", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "catgId", value = "分类id", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) + @GetMapping("/prodPageList") + public R> prodPageList(String tenantId, String catgId, String text, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNum, pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BusiProdNew::getDataType, DATA_TYPE_PRODUCT) + .eq(BusiProdNew::getIfPublic, true) + .eq(BusiProdNew::getTenantId, tenantId); + if (StringUtils.isNotEmpty(text)) { + queryWrapper.and(wq -> wq + .like(BusiProdNew::getTitle, text) + .or().like(BusiProdNew::getDescription, text) + .or().like(BusiProdNew::getContent, text) + ); + } + if (StringUtils.isNotEmpty(catgId)) { + List catgIdList = new ArrayList<>(); + catgIdList.add(catgId); + catgIdList.addAll(categoryService.getAllChildrenId(catgId)); + queryWrapper.in(BusiProdNew::getCatgId, catgIdList); + } + queryWrapper.orderByDesc(BusiProdNew::getSort); + //查所有栏目 + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + category.setCatgType(CATG_TYPE_CP); + List busiCategoryVOList = categoryService.treeCategory(category); + //转map + Map catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList); + IPage rtnPage = prodNewService.page(page, queryWrapper); + rtnPage.getRecords().forEach(item -> item.setMaxCatgId(catgMap.getOrDefault(item.getCatgId(), ""))); + return R.ok(rtnPage); + } + + /** + * 新闻列表分页 + * + * @param tenantId 租户id + * @param catgId 分类ID + * @param pageNum + * @param pageSize + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 15:17 2025/7/8 + **/ + @ApiOperation("新闻列表分页") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "pageNum", value = "页码(1开始)", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "catgId", value = "分类id", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) + @GetMapping("/newsPageList") + public R> newsPageList(String tenantId, String catgId, String text, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNum, pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BusiProdNew::getDataType, DATA_TYPE_NEWS) + .eq(BusiProdNew::getIfPublic, true) + .eq(BusiProdNew::getTenantId, tenantId); + if (StringUtils.isNotEmpty(text)) { + queryWrapper.and(wq -> wq + .like(BusiProdNew::getTitle, text) + .or().like(BusiProdNew::getDescription, text) + .or().like(BusiProdNew::getContent, text) + ); + } + if (StringUtils.isNotEmpty(catgId)) { + List catgIdList = new ArrayList<>(); + catgIdList.add(catgId); + catgIdList.addAll(categoryService.getAllChildrenId(catgId)); + queryWrapper.in(BusiProdNew::getCatgId, catgIdList); + } + queryWrapper.orderByDesc(BusiProdNew::getSort); + //查所有栏目 + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + category.setCatgType(CATG_TYPE_WZ); + List busiCategoryVOList = categoryService.treeCategory(category); + //转map + Map catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList); + IPage rtnPage = prodNewService.page(page, queryWrapper); + rtnPage.getRecords().forEach(item -> item.setMaxCatgId(catgMap.getOrDefault(item.getCatgId(), ""))); + return R.ok(rtnPage); + } + + /** + * 产品或新闻详情 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("产品或新闻详情") + @ApiImplicitParam(name = "id", value = "产品或新闻ID", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/prodNewsInfo") + public R prodNewsInfo(@RequestParam(required = true) String id) { + return R.ok(prodNewService.getProdNewInfo(id)); + } + + /** + * 全站搜索 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("全站搜索") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "pageNum", value = "页码(1开始)", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "text", value = "搜索内容", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) + @GetMapping("/searchText") + public R> searchText(String tenantId, String text, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNum, pageSize); + return R.ok(prodNewService.searchTextAll(tenantId, text, page)); + } + + /** + * 查询盘设置-都有哪些字段需要填写,是否必填 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("查询盘设置-都有哪些字段需要填写,是否必填") + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/inquirySet") + public R inquirySet(@RequestParam(required = true) String tenantId, HttpServletRequest request) { + String ip = CommonUtils.getIpAddr(request); + return R.ok(baseInquiryService.getInquiry(tenantId)); + } + + /** + * 提交在线询盘表单 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("提交在线询盘表单") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "companyName", value = "公司名称", required = false, paramType = "body"), + @ApiImplicitParam(name = "name", value = "姓名", required = false, paramType = "body"), + @ApiImplicitParam(name = "tel", value = "电话或WhatsApp", required = false, paramType = "body"), + @ApiImplicitParam(name = "title", value = "标题", required = false, paramType = "body"), + @ApiImplicitParam(name = "content", value = "内容", required = true, paramType = "body"), + @ApiImplicitParam(name = "email", value = "email", required = false, paramType = "body"), + @ApiImplicitParam(name = "tenantId", value = "站点编码", required = true, paramType = "body"), + @ApiImplicitParam(name = "equipment", value = "设备类型(移动端|电脑端)", required = true, paramType = "body") + }) + @PostMapping("/inquirySave") + public R inquirySave(@ApiIgnore @RequestBody BusiInquiryItem inquiryItem, HttpServletRequest request) { + Map ipMap = commonUtils.getIPAndCountry(request); + inquiryItem.setIp(ipMap.get("ip")); + inquiryItem.setNational(ipMap.get("national")); + inquiryItem.setOceania(ipMap.get("oceania")); + inquiryItemService.save(inquiryItem); + return R.ok(); + } + + /** + * 导航栏接口--所有分类 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("站点地图使用接口") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "catgType", value = "栏目类型", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "tenantId", value = "站点编码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) + @GetMapping("/siteMap") + public R> siteMap(@RequestParam(required = true) String tenantId, @RequestParam(required = true) String catgType) { + return R.ok(prodNewService.getSiteMap(tenantId, catgType)); + } + + /** + * 记录网页访问次数 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("记录网页访问次数") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "url", value = "网页地址", required = true, paramType = "body"), + @ApiImplicitParam(name = "tenantId", value = "站点编码", required = true, paramType = "body"), + @ApiImplicitParam(name = "equipment", value = "设备类型(移动端|电脑端)", required = true, paramType = "body") + }) + @PostMapping("/pageSave") + public R pageSave(@ApiIgnore @RequestBody BusiPage busiPage, HttpServletRequest request) { + busiPage.setIp(CommonUtils.getIpAddr(request)); + busiPage.setCreateTime(new Date()); + pageService.pageSave(busiPage); + return R.ok(); + } + + @ApiOperation("查询栏目id-APP专用(APP默认主站-main,本接口无需传站点编码,其他接口因需要PC端共用还是要传的)") + @ApiImplicitParam(name = "catgName", value = "栏目名称(Products|News|About|Contact)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @GetMapping("/getCatgIdApp") + public R getCatgIdApp(@RequestParam(required = true) String catgName) { + return R.ok(dictDataService.selectDictLabel(APP_MENU_KEY,catgName)); + } + + @ApiOperation("查询最新版本APP") + @GetMapping("/getNewApp") + public R getNewApp() { + return R.ok(appService.selectNewApp()); + } + + @ApiOperation("下载APK文件") + @GetMapping("/downloadApk") + public void downloadApk(HttpServletResponse response) { + try { + // APK文件路径 + File file = new File(googleConfig.getAppDownload()); + + // 检查文件是否存在 + if (!file.exists()) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + response.getWriter().write("文件不存在"); + return; + } + + // 设置响应头 + response.setContentType("application/vnd.android.package-archive"); + response.setHeader("Content-Disposition", "attachment; filename=truck.apk"); + response.setHeader("Content-Length", String.valueOf(file.length())); + + // 写入响应流 + FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream(); + + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + + fis.close(); + os.flush(); + os.close(); + } catch (Exception e) { + try { + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + response.getWriter().write("文件下载失败: " + e.getMessage()); + } catch (Exception ex) { + logger.error("下载APK文件时发生错误", ex); + } + } + } + + /** + * 保存在线聊天内容 + * + * @param busiChatMain {@link BusiChatMain} + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 15:24 2025/7/17 + **/ + @PostMapping("/chatMain") + public AjaxResult saveChatMain(@RequestBody BusiChatMain busiChatMain, HttpServletRequest request) { + String ip = CommonUtils.getIpAddr(request); + ip = StringUtils.isNotEmpty(ip) ? ip : "未知"; + BusiChatMain result = busiChatMainService.queryByIpAndCusCode(ip, busiChatMain.getCusCode(), busiChatMain.getProdId()); + if (result != null) { + return success(result); + } else { + Map ipMap = commonUtils.getIPAndCountry(request); + busiChatMain.setIp(ipMap.get("ip")); + busiChatMain.setNational(ipMap.get("national")); + busiChatMain.setOceania(ipMap.get("oceania")); + busiChatMainService.save(busiChatMain); + return success(busiChatMain); + } + } + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java new file mode 100644 index 0000000..4483bc7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java @@ -0,0 +1,40 @@ +package com.ruoyi.base.domain; + +import java.math.BigDecimal; +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * app版本管理对象 dl_base_app + * + * @author vinjor-m + * @date 2025-08-25 + */ +@TableName("dl_base_app") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BaseApp extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 版本 */ + @Excel(name = "版本") + private String version; + + /** 本次升级描述 */ + @Excel(name = "本次升级描述") + private String content; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseInquiry.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseInquiry.java new file mode 100644 index 0000000..939d1d7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseInquiry.java @@ -0,0 +1,95 @@ +package com.ruoyi.base.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 在线询盘设置对象 dl_base_inquiry + * + * @author vinjor-m + * @date 2025-06-24 + */ +@TableName("dl_base_inquiry") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "BaseInquiry", description = "询盘设置实体") +public class BaseInquiry extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + @ApiModelProperty("主键") + private String id; + + /** 是否开启填写公司名称 */ + @Excel(name = "公司名称") + @ApiModelProperty("公司名称字段是否显示") + private Boolean company; + + /** 公司名称是否必填 */ + @Excel(name = "公司名称是否必填") + @ApiModelProperty("公司名称是否必填") + private Boolean companyMust; + + /** 是否开启填写email */ + @Excel(name = "是否开启填写email") + @ApiModelProperty("email字段是否显示") + private Boolean email; + + /** email是否必填 */ + @Excel(name = "email是否必填") + @ApiModelProperty("email字段是否必填") + private Boolean emailMust; + + /** 是否开启填写电话/WhatsApp */ + @Excel(name = "电话/WhatsApp") + @ApiModelProperty("电话/WhatsApp字段是否显示") + private Boolean tel; + + /** 是否必填 */ + @Excel(name = "是否必填") + @ApiModelProperty("电话/WhatsApp字段是否必填") + private Boolean telMust; + + /** 是否开启填写标题 */ + @Excel(name = "标题") + @ApiModelProperty("标题字段是否显示") + private Boolean title; + + /** 是否必填 */ + @Excel(name = "是否必填") + @ApiModelProperty("标题字段是否必填") + private Boolean titleMust; + + /** 是否开启填写姓名 */ + @Excel(name = "姓名") + @ApiModelProperty("姓名字段是否显示") + private Boolean name; + + /** 是否必填 */ + @Excel(name = "是否必填") + @ApiModelProperty("姓名字段是否必填") + private Boolean nameMust; + + /** 提示文字(内容) */ + @Excel(name = "提示文字", readConverterExp = "内=容") + @ApiModelProperty("提示文字(以placeholder形式显示在多行文本框中,要求输入内容时,这个提示以其他方式显示在多行文本框上方或下方)") + private String content; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseManager.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseManager.java new file mode 100644 index 0000000..9c764fc --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseManager.java @@ -0,0 +1,39 @@ +package com.ruoyi.base.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 站点分配对象 dl_base_manager + * + * @author vinjor-m + * @date 2025-08-11 + */ +@TableName("dl_base_manager") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BaseManager extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 用户id */ + @Excel(name = "用户id") + private Long userId; + + /** 站点唯一编码 */ + @Excel(name = "站点唯一编码") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseNational.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseNational.java new file mode 100644 index 0000000..7b1ca15 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseNational.java @@ -0,0 +1,38 @@ +package com.ruoyi.base.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 国家列对象 dl_base_national + * + * @author vinjor-m + * @date 2025-07-11 + */ +@TableName("dl_base_national") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BaseNational +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private Integer id; + + /** 国家 */ + @Excel(name = "国家") + private String national; + + /** 洲 */ + @Excel(name = "洲") + private String oceania; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BasePic.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BasePic.java new file mode 100644 index 0000000..7682caa --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BasePic.java @@ -0,0 +1,55 @@ +package com.ruoyi.base.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 轮播图管理对象 dl_base_pic + * + * @author vinjor-m + * @date 2025-06-23 + */ +@TableName("dl_base_pic") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "BasePic", description = "轮播图") +public class BasePic extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + @ApiModelProperty("主键") + private String id; + + /** 标题 */ + @Excel(name = "标题") + @ApiModelProperty("标题") + private String title; + + /** 排序 */ + @Excel(name = "排序") + @ApiModelProperty("排序") + private Long sort; + + /** 图片 */ + @Excel(name = "图片") + @ApiModelProperty("图片路径") + private String pic; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BasePics.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BasePics.java new file mode 100644 index 0000000..6b655e7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BasePics.java @@ -0,0 +1,64 @@ +package com.ruoyi.base.domain; + +import java.math.BigDecimal; +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 图片库对象 dl_base_pics + * + * @author vinjor-m + * @date 2025-06-24 + */ +@TableName("dl_base_pics") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BasePics extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 所属分类 */ + @Excel(name = "所属分类") + private String fileType; + + /** 图片名称 */ + @Excel(name = "图片名称") + private String name; + + /** 图片路径 */ + @Excel(name = "图片路径") + private String url; + + /** 图片大小 */ + @Excel(name = "图片大小") + private BigDecimal size; + + /** 图片宽 */ + @Excel(name = "图片宽") + private Long width; + + /** 图片高 */ + @Excel(name = "图片高") + private Long height; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSeo.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSeo.java new file mode 100644 index 0000000..8ab03dc --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSeo.java @@ -0,0 +1,59 @@ +package com.ruoyi.base.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * SEO用到的国家和语言对象 dl_base_seo + * + * @author vinjor-m + * @date 2025-08-04 + */ +@TableName("dl_base_seo") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BaseSeo extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private Long id; + + /** 数据类型(language-语言|country-国家) */ + @Excel(name = "数据类型", readConverterExp = "l=anguage-语言|country-国家") + private String dataType; + + /** 排序 */ + @Excel(name = "排序") + private Long sort; + + /** 标题 */ + @Excel(name = "标题") + private String title; + + /** 值 */ + @Excel(name = "值") + private String content; + + /** 描述 */ + @Excel(name = "描述") + private String description; + + /** 图片 */ + @Excel(name = "图片") + private String pic; + + /** 中文 */ + @Excel(name = "中文") + private String cn; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSiteInfo.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSiteInfo.java index 3482723..1ca2cef 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSiteInfo.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseSiteInfo.java @@ -4,6 +4,8 @@ import com.ruoyi.common.annotation.Excel; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.*; import com.ruoyi.common.core.domain.DlBaseEntity; @@ -20,64 +22,101 @@ import com.ruoyi.common.core.domain.DlBaseEntity; @Builder @NoArgsConstructor @AllArgsConstructor +@ApiModel(value = "BaseSiteInfo", description = "站点信息实体") public class BaseSiteInfo extends DlBaseEntity { private static final long serialVersionUID = 1L; /** 主键 */ @TableId(type = IdType.ASSIGN_UUID) + @ApiModelProperty("主键") private String id; /** 公司名称 */ @Excel(name = "公司名称") + @ApiModelProperty("公司名称") private String companyName; /** 传真号码 */ @Excel(name = "传真号码") + @ApiModelProperty("传真号码") private String faxNumber; /** 品牌名称 */ @Excel(name = "品牌名称") + @ApiModelProperty("品牌名称") private String brandName; /** 手机号码(发询盘短信要用到,格式:+8618612345678 或者 +886970123456) */ @Excel(name = "手机号码(发询盘短信要用到,格式:+8618612345678 或者 +886970123456)") + @ApiModelProperty("手机号码") private String tel; + /** whatsapp号码(询盘用) */ + @Excel(name = "whatsapp号码(询盘用)") + @ApiModelProperty("whatsapp号码(询盘用)") + private String whatsapp; /** Email(询盘用) */ @Excel(name = "Email", readConverterExp = "询=盘用") + @ApiModelProperty("Email") private String email; /** Teams账号(询盘用) */ @Excel(name = "Teams账号", readConverterExp = "询=盘用") + @ApiModelProperty("Teams账号") private String teams; /** 版权文字 */ @Excel(name = "版权文字") + @ApiModelProperty("版权文字") private String copyright; /** 联系地址 */ @Excel(name = "联系地址") + @ApiModelProperty("联系地址") private String address; /** 站点icon */ @Excel(name = "站点icon") + @ApiModelProperty("站点icon") private String icon; /** 站点logo */ @Excel(name = "站点logo") + @ApiModelProperty("站点logo") private String logo; + /** 站点logo-移动端 */ + @Excel(name = "站点logo-移动端") + @ApiModelProperty("站点logo-移动端") + private String mobileLogo; + /** 询盘logo */ + @Excel(name = "询盘logo") + @ApiModelProperty("询盘logo") + private String formLogo; /** 站点二维码(或手机访问二维码) */ @Excel(name = "站点二维码", readConverterExp = "或=手机访问二维码") + @ApiModelProperty("站点二维码") private String qrCode; /** 站点联系方式html */ @Excel(name = "站点联系方式html") + @ApiModelProperty("站点联系方式html") private String contactUs; + /** 公司介绍 */ + @Excel(name = "公司介绍") + @ApiModelProperty("公司介绍") + private String companyInfo; + + /** 公司介绍-移动端 */ + @Excel(name = "公司介绍-移动端") + @ApiModelProperty("公司介绍-移动端") + private String companyInfoApp; + /** 站点唯一编码(租户id) */ @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") private String tenantId; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseTemp.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseTemp.java new file mode 100644 index 0000000..1b1eed3 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseTemp.java @@ -0,0 +1,47 @@ +package com.ruoyi.base.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 模板库对象 dl_base_temp + * + * @author pqz + * @date 2025-08-07 + */ +@TableName("dl_base_temp") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BaseTemp extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 标题 */ + @Excel(name = "标题") + private String title; + + /** 图片 */ + @Excel(name = "图片") + private String file; + + /** 描述 */ + @Excel(name = "描述") + private String remark; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseAppMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseAppMapper.java new file mode 100644 index 0000000..e9bfd76 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseAppMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseApp; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * app版本管理Mapper接口 + * + * @author vinjor-m + * @date 2025-08-25 + */ +@Mapper +public interface BaseAppMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BaseApp entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseInquiryMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseInquiryMapper.java new file mode 100644 index 0000000..b7a0d22 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseInquiryMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseInquiry; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 在线询盘设置Mapper接口 + * + * @author vinjor-m + * @date 2025-06-24 + */ +@Mapper +public interface BaseInquiryMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BaseInquiry entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseManagerMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseManagerMapper.java new file mode 100644 index 0000000..3108f7b --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseManagerMapper.java @@ -0,0 +1,25 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseManager; +import com.ruoyi.base.vo.ManagerVO; +import com.ruoyi.common.core.domain.entity.SysUser; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 站点分配Mapper接口 + * + * @author vinjor-m + * @date 2025-08-11 + */ +@Mapper +public interface BaseManagerMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") ManagerVO entity, Page page); + + List selectManagerUserByTenantId(@Param("tenantId")String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseNationalMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseNationalMapper.java new file mode 100644 index 0000000..0020c21 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseNationalMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseNational; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 国家列Mapper接口 + * + * @author vinjor-m + * @date 2025-07-11 + */ +@Mapper +public interface BaseNationalMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BaseNational entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BasePicMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BasePicMapper.java new file mode 100644 index 0000000..7357591 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BasePicMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BasePic; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 轮播图管理Mapper接口 + * + * @author vinjor-m + * @date 2025-06-23 + */ +@Mapper +public interface BasePicMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BasePic entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BasePicsMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BasePicsMapper.java new file mode 100644 index 0000000..04a95c9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BasePicsMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BasePics; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 图片库Mapper接口 + * + * @author vinjor-m + * @date 2025-06-24 + */ +@Mapper +public interface BasePicsMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BasePics entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSeoMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSeoMapper.java new file mode 100644 index 0000000..a7fd614 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSeoMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseSeo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * SEO用到的国家和语言Mapper接口 + * + * @author vinjor-m + * @date 2025-08-04 + */ +@Mapper +public interface BaseSeoMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BaseSeo entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSiteMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSiteMapper.java index 38b351c..213aa86 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSiteMapper.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseSiteMapper.java @@ -4,6 +4,7 @@ import java.util.List; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.base.domain.BaseSite; +import com.ruoyi.base.vo.SiteVO; import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -17,5 +18,7 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface BaseSiteMapper extends BaseMapper { - IPage queryListPage(@Param("entity") BaseSite entity, Page page); + IPage queryListPage(@Param("entity") BaseSite entity, Page page); + + List selectByUserId(@Param("userId")Long userId); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseTempMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseTempMapper.java new file mode 100644 index 0000000..9b01fbb --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/mapper/BaseTempMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.base.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseTemp; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 模板库Mapper接口 + * + * @author pqz + * @date 2025-08-07 + */ +@Mapper +public interface BaseTempMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BaseTemp entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseAppService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseAppService.java new file mode 100644 index 0000000..c0a0dc0 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseAppService.java @@ -0,0 +1,20 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BaseApp; + +/** + * app版本管理Service接口 + * + * @author vinjor-m + * @date 2025-08-25 + */ +public interface IBaseAppService extends IService +{ + IPage queryListPage(BaseApp pageReqVO, Page page); + + BaseApp selectNewApp(); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseInquiryService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseInquiryService.java new file mode 100644 index 0000000..1665c7c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseInquiryService.java @@ -0,0 +1,27 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BaseInquiry; + +/** + * 在线询盘设置Service接口 + * + * @author vinjor-m + * @date 2025-06-24 + */ +public interface IBaseInquiryService extends IService +{ + IPage queryListPage(BaseInquiry pageReqVO, Page page); + + /** + * 查询站点询盘设置 + * @author vinjor-M + * @date 11:01 2025/6/24 + * @param tenantId 租户id + * @return com.ruoyi.base.domain.BaseInquiry + **/ + BaseInquiry getInquiry(String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseManagerService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseManagerService.java new file mode 100644 index 0000000..39f31ab --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseManagerService.java @@ -0,0 +1,30 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BaseManager; +import com.ruoyi.base.vo.ManagerVO; +import com.ruoyi.common.core.domain.entity.SysUser; + +/** + * 站点分配Service接口 + * + * @author vinjor-m + * @date 2025-08-11 + */ +public interface IBaseManagerService extends IService { + IPage queryListPage(ManagerVO pageReqVO, Page page); + + /** + * 根据站点编码查负责的用户 + * @author vinjor-M + * @date 15:33 2025/8/11 + * @param tenantId TODO + * @return java.util.List + **/ + List getManagerUserByTenantId(String tenantId); + + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseNationalService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseNationalService.java new file mode 100644 index 0000000..d6936ef --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseNationalService.java @@ -0,0 +1,28 @@ +package com.ruoyi.base.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BaseNational; + +/** + * 国家列Service接口 + * + * @author vinjor-m + * @date 2025-07-11 + */ +public interface IBaseNationalService extends IService +{ + IPage queryListPage(BaseNational pageReqVO, Page page); + + /** + * 返回所有国家列表map + * @author vinjor-M + * @date 11:36 2025/7/11 + * @return java.util.Map + **/ + Map getNationalMap(); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBasePicService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBasePicService.java new file mode 100644 index 0000000..00430ec --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBasePicService.java @@ -0,0 +1,27 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BasePic; + +/** + * 轮播图管理Service接口 + * + * @author vinjor-m + * @date 2025-06-23 + */ +public interface IBasePicService extends IService +{ + IPage queryListPage(BasePic pageReqVO, Page page); + + /** + * 查询轮播图列表,不分页 + * @author vinjor-M + * @date 10:33 2025/7/8 + * @param tenantId 租户id + * @return java.util.List + **/ + List list(String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBasePicsService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBasePicsService.java new file mode 100644 index 0000000..cc3c905 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBasePicsService.java @@ -0,0 +1,18 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BasePics; + +/** + * 图片库Service接口 + * + * @author vinjor-m + * @date 2025-06-24 + */ +public interface IBasePicsService extends IService +{ + IPage queryListPage(BasePics pageReqVO, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSeoService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSeoService.java new file mode 100644 index 0000000..0d435f6 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSeoService.java @@ -0,0 +1,18 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BaseSeo; + +/** + * SEO用到的国家和语言Service接口 + * + * @author vinjor-m + * @date 2025-08-04 + */ +public interface IBaseSeoService extends IService +{ + IPage queryListPage(BaseSeo pageReqVO, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteInfoService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteInfoService.java index dcc890d..336e61c 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteInfoService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteInfoService.java @@ -15,4 +15,13 @@ import com.ruoyi.base.domain.BaseSiteInfo; public interface IBaseSiteInfoService extends IService { IPage queryListPage(BaseSiteInfo pageReqVO, Page page); + + /** + * 查询站点详情 + * @author vinjor-M + * @date 11:47 2025/6/23 + * @param tenantId TODO + * @return com.ruoyi.base.domain.BaseSiteInfo + **/ + BaseSiteInfo getSiteInfo(String tenantId); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteService.java index 473ea77..0585154 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseSiteService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.base.domain.BaseSite; +import com.ruoyi.base.vo.SiteVO; /** * 站点管理Service接口 @@ -14,5 +15,13 @@ import com.ruoyi.base.domain.BaseSite; */ public interface IBaseSiteService extends IService { - IPage queryListPage(BaseSite pageReqVO, Page page); + IPage queryListPage(BaseSite pageReqVO, Page page); + + /** + * 查询本人可以管理的站点 + * @author vinjor-M + * @date 16:17 2025/8/11 + * @return java.util.List + **/ + List getMySiteList(); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseTempService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseTempService.java new file mode 100644 index 0000000..a0d48a7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/IBaseTempService.java @@ -0,0 +1,18 @@ +package com.ruoyi.base.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.base.domain.BaseTemp; + +/** + * 模板库Service接口 + * + * @author pqz + * @date 2025-08-07 + */ +public interface IBaseTempService extends IService +{ + IPage queryListPage(BaseTemp pageReqVO, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseAppServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseAppServiceImpl.java new file mode 100644 index 0000000..1522cdd --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseAppServiceImpl.java @@ -0,0 +1,40 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.DlBaseEntity; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BaseAppMapper; +import com.ruoyi.base.domain.BaseApp; +import com.ruoyi.base.service.IBaseAppService; + +/** + * app版本管理Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-25 + */ +@Service +public class BaseAppServiceImpl extends ServiceImpl implements IBaseAppService +{ + @Autowired + private BaseAppMapper baseAppMapper; + + @Override + public IPage queryListPage(BaseApp pageReqVO, Page page) { + return baseAppMapper.queryListPage(pageReqVO, page); + } + + @Override + public BaseApp selectNewApp() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().orderByDesc(BaseApp::getVersion).orderByDesc(DlBaseEntity::getCreateTime); + List list = this.list(queryWrapper); + return list.isEmpty()?null:list.get(0); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseInquiryServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseInquiryServiceImpl.java new file mode 100644 index 0000000..a5da9d7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseInquiryServiceImpl.java @@ -0,0 +1,49 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.base.domain.BaseSiteInfo; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BaseInquiryMapper; +import com.ruoyi.base.domain.BaseInquiry; +import com.ruoyi.base.service.IBaseInquiryService; + +/** + * 在线询盘设置Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-24 + */ +@Service +public class BaseInquiryServiceImpl extends ServiceImpl implements IBaseInquiryService +{ + @Autowired + private BaseInquiryMapper baseInquiryMapper; + + @Override + public IPage queryListPage(BaseInquiry pageReqVO, Page page) { + return baseInquiryMapper.queryListPage(pageReqVO, page); + } + + /** + * 查询站点询盘设置 + * + * @param tenantId 租户id + * @return com.ruoyi.base.domain.BaseInquiry + * @author vinjor-M + * @date 11:01 2025/6/24 + **/ + @Override + public BaseInquiry getInquiry(String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BaseInquiry::getTenantId,tenantId); + List list = this.list(queryWrapper); + return list.isEmpty()?null:list.get(0); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseManagerServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseManagerServiceImpl.java new file mode 100644 index 0000000..f7db0c7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseManagerServiceImpl.java @@ -0,0 +1,46 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; + +import com.ruoyi.base.vo.ManagerVO; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BaseManagerMapper; +import com.ruoyi.base.domain.BaseManager; +import com.ruoyi.base.service.IBaseManagerService; + +/** + * 站点分配Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-11 + */ +@Service +public class BaseManagerServiceImpl extends ServiceImpl implements IBaseManagerService +{ + @Autowired + private BaseManagerMapper baseManagerMapper; + + @Override + public IPage queryListPage(ManagerVO pageReqVO, Page page) { + return baseManagerMapper.queryListPage(pageReqVO, page); + } + + /** + * 根据站点编码查负责的用户 + * + * @param tenantId TODO + * @return java.util.List + * @author vinjor-M + * @date 15:33 2025/8/11 + **/ + @Override + public List getManagerUserByTenantId(String tenantId) { + return baseManagerMapper.selectManagerUserByTenantId(tenantId); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseNationalServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseNationalServiceImpl.java new file mode 100644 index 0000000..8372fe0 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseNationalServiceImpl.java @@ -0,0 +1,46 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BaseNationalMapper; +import com.ruoyi.base.domain.BaseNational; +import com.ruoyi.base.service.IBaseNationalService; + +/** + * 国家列Service业务层处理 + * + * @author vinjor-m + * @date 2025-07-11 + */ +@Service +public class BaseNationalServiceImpl extends ServiceImpl implements IBaseNationalService +{ + @Autowired + private BaseNationalMapper baseNationalMapper; + + @Override + public IPage queryListPage(BaseNational pageReqVO, Page page) { + return baseNationalMapper.queryListPage(pageReqVO, page); + } + + /** + * 返回所有国家列表map + * + * @return java.util.Map + * @author vinjor-M + * @date 11:36 2025/7/11 + **/ + @Override + @Cacheable("national_map") + public Map getNationalMap() { + return this.list().stream().collect(Collectors.toMap(BaseNational::getNational,BaseNational::getOceania)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BasePicServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BasePicServiceImpl.java new file mode 100644 index 0000000..bb33792 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BasePicServiceImpl.java @@ -0,0 +1,48 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BasePicMapper; +import com.ruoyi.base.domain.BasePic; +import com.ruoyi.base.service.IBasePicService; + +/** + * 轮播图管理Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-23 + */ +@Service +public class BasePicServiceImpl extends ServiceImpl implements IBasePicService +{ + @Autowired + private BasePicMapper basePicMapper; + + @Override + public IPage queryListPage(BasePic pageReqVO, Page page) { + return basePicMapper.queryListPage(pageReqVO, page); + } + + /** + * 查询轮播图列表,不分页 + * + * @param tenantId 租户id + * @return java.util.List + * @author vinjor-M + * @date 10:33 2025/7/8 + **/ + @Override + public List list(String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BasePic::getTenantId,tenantId) + .orderByDesc(BasePic::getSort); + return this.list(queryWrapper); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BasePicsServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BasePicsServiceImpl.java new file mode 100644 index 0000000..9d805c2 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BasePicsServiceImpl.java @@ -0,0 +1,30 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BasePicsMapper; +import com.ruoyi.base.domain.BasePics; +import com.ruoyi.base.service.IBasePicsService; + +/** + * 图片库Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-24 + */ +@Service +public class BasePicsServiceImpl extends ServiceImpl implements IBasePicsService +{ + @Autowired + private BasePicsMapper basePicsMapper; + + @Override + public IPage queryListPage(BasePics pageReqVO, Page page) { + return basePicsMapper.queryListPage(pageReqVO, page); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSeoServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSeoServiceImpl.java new file mode 100644 index 0000000..88007ed --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSeoServiceImpl.java @@ -0,0 +1,30 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BaseSeoMapper; +import com.ruoyi.base.domain.BaseSeo; +import com.ruoyi.base.service.IBaseSeoService; + +/** + * SEO用到的国家和语言Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-04 + */ +@Service +public class BaseSeoServiceImpl extends ServiceImpl implements IBaseSeoService +{ + @Autowired + private BaseSeoMapper baseSeoMapper; + + @Override + public IPage queryListPage(BaseSeo pageReqVO, Page page) { + return baseSeoMapper.queryListPage(pageReqVO, page); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteInfoServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteInfoServiceImpl.java index d3b7d20..1d38975 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteInfoServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.base.service.impl; import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.utils.DateUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -27,4 +29,20 @@ public class BaseSiteInfoServiceImpl extends ServiceImpl queryListPage(BaseSiteInfo pageReqVO, Page page) { return baseSiteInfoMapper.queryListPage(pageReqVO, page); } + + /** + * 查询站点详情 + * + * @param tenantId TODO + * @return com.ruoyi.base.domain.BaseSiteInfo + * @author vinjor-M + * @date 11:47 2025/6/23 + **/ + @Override + public BaseSiteInfo getSiteInfo(String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BaseSiteInfo::getTenantId,tenantId); + List list = this.list(queryWrapper); + return list.isEmpty()?null:list.get(0); + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java index a77ea7e..df30c94 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java @@ -1,9 +1,12 @@ package com.ruoyi.base.service.impl; import java.util.List; + +import com.ruoyi.base.vo.SiteVO; import com.ruoyi.common.utils.DateUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -24,7 +27,24 @@ public class BaseSiteServiceImpl extends ServiceImpl i private BaseSiteMapper baseSiteMapper; @Override - public IPage queryListPage(BaseSite pageReqVO, Page page) { + public IPage queryListPage(BaseSite pageReqVO, Page page) { return baseSiteMapper.queryListPage(pageReqVO, page); } + + /** + * 查询本人可以管理的站点 + * + * @return java.util.List + * @author vinjor-M + * @date 16:17 2025/8/11 + **/ + @Override + public List getMySiteList() { + Long userId = SecurityUtils.getUserId(); + if(1==userId){ + //超级管理员,查所有站点 + return this.list(); + } + return baseSiteMapper.selectByUserId(userId); + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseTempServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseTempServiceImpl.java new file mode 100644 index 0000000..bd36870 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseTempServiceImpl.java @@ -0,0 +1,30 @@ +package com.ruoyi.base.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.base.mapper.BaseTempMapper; +import com.ruoyi.base.domain.BaseTemp; +import com.ruoyi.base.service.IBaseTempService; + +/** + * 模板库Service业务层处理 + * + * @author pqz + * @date 2025-08-07 + */ +@Service +public class BaseTempServiceImpl extends ServiceImpl implements IBaseTempService +{ + @Autowired + private BaseTempMapper baseTempMapper; + + @Override + public IPage queryListPage(BaseTemp pageReqVO, Page page) { + return baseTempMapper.queryListPage(pageReqVO, page); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/KeywordVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/KeywordVO.java new file mode 100644 index 0000000..9f01778 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/KeywordVO.java @@ -0,0 +1,27 @@ +package com.ruoyi.base.vo; + +import com.ruoyi.base.domain.BasePics; +import lombok.Data; + +import java.util.List; + +/** + * 谷歌关键词规划师VO + * @author vinjor-M + * @date 17:53 2025/8/4 +**/ +@Data +public class KeywordVO { + /** + * 关键词 + **/ + private String title; + /** + * 月搜索量 + **/ + private Long searchMonth; + /** + * 竞争程度 + **/ + private String competition; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/ManagerVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/ManagerVO.java new file mode 100644 index 0000000..cdaf9c4 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/ManagerVO.java @@ -0,0 +1,25 @@ +package com.ruoyi.base.vo; + +import com.ruoyi.base.domain.BaseManager; +import com.ruoyi.base.domain.BasePics; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ManagerVO extends BaseManager { + /** + * 站点名称 + **/ + private String siteName; + /** + * 用户名称 + **/ + private String userName; + /** + * 站点名称 + **/ + private String siteId; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/PicsVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/PicsVO.java new file mode 100644 index 0000000..a143262 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/PicsVO.java @@ -0,0 +1,17 @@ +package com.ruoyi.base.vo; + +import com.ruoyi.base.domain.BasePics; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PicsVO extends BasePics { + + /** + * 批量传的图片 + **/ + private List fileList; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/SiteVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/SiteVO.java new file mode 100644 index 0000000..b8b4ad5 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/vo/SiteVO.java @@ -0,0 +1,14 @@ +package com.ruoyi.base.vo; + +import com.ruoyi.base.domain.BaseSite; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class SiteVO extends BaseSite { + /** + * 站点管理人姓名 + **/ + private String managerUser; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiCategoryController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiCategoryController.java index e325fd4..930ecdb 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiCategoryController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiCategoryController.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; + import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.security.access.prepost.PreAuthorize; @@ -28,84 +29,67 @@ import com.ruoyi.common.core.page.TableDataInfo; /** * 网站栏目Controller - * - * @author vinjor-m + * + * @author pqz * @date 2025-06-19 */ @RestController @RequestMapping("/busi/category") -public class BusiCategoryController extends BaseController -{ +public class BusiCategoryController extends BaseController { @Autowired private IBusiCategoryService busiCategoryService; /** - * 查询网站栏目列表 - */ - @PreAuthorize("@ss.hasPermi('busi:category:list')") + * 网站栏目树形结构 + * + * @param busiCategory {@link BusiCategory} + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 14:01 2025/6/23 + **/ @GetMapping("/list") - public AjaxResult list(BusiCategory busiCategory, - @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) - { - Page page = new Page<>(pageNum, pageSize); - IPage list = busiCategoryService.queryListPage(busiCategory,page); - return success(list); + public AjaxResult list(BusiCategory busiCategory) { + return success(busiCategoryService.treeCategory(busiCategory)); } - /** - * 导出网站栏目列表 - */ - @PreAuthorize("@ss.hasPermi('busi:category:export')") - @Log(title = "网站栏目", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, BusiCategory busiCategory) - { - List list = busiCategoryService.list(); - ExcelUtil util = new ExcelUtil(BusiCategory.class); - util.exportExcel(response, list, "网站栏目数据"); - } /** - * 获取网站栏目详细信息 - */ - @PreAuthorize("@ss.hasPermi('busi:category:query')") + * 获取网站栏目信息 + * @author PQZ + * @date 11:54 2025/6/30 + * @param id id + * @return com.ruoyi.common.core.domain.AjaxResult + **/ @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") String id) - { + public AjaxResult getInfo(@PathVariable("id") String id) { return success(busiCategoryService.getById(id)); } /** - * 新增网站栏目 - */ - @PreAuthorize("@ss.hasPermi('busi:category:add')") + * 保存网站栏目 + * @author PQZ + * @date 11:54 2025/6/30 + * @param busiCategory {@link BusiCategory} + * @return com.ruoyi.common.core.domain.AjaxResult + **/ @Log(title = "网站栏目", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody BusiCategory busiCategory) - { - return toAjax(busiCategoryService.save(busiCategory)); + public AjaxResult add(@RequestBody BusiCategory busiCategory) { + return toAjax(busiCategoryService.saveOrUpdate(busiCategory)); } - /** - * 修改网站栏目 - */ - @PreAuthorize("@ss.hasPermi('busi:category:edit')") - @Log(title = "网站栏目", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody BusiCategory busiCategory) - { - return toAjax(busiCategoryService.updateById(busiCategory)); - } + /** * 删除网站栏目 - */ - @PreAuthorize("@ss.hasPermi('busi:category:remove')") + * @author PQZ + * @date 11:55 2025/6/30 + * @param ids 删除id + * @return com.ruoyi.common.core.domain.AjaxResult + **/ @Log(title = "网站栏目", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable String[] ids) - { + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) { List list = new ArrayList<>(Arrays.asList(ids)); return toAjax(busiCategoryService.removeByIds(list)); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatItemController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatItemController.java new file mode 100644 index 0000000..d5e3180 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatItemController.java @@ -0,0 +1,63 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.busi.service.IBusiChatItemService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 在线聊天记录Controller + * + * @author vinjor-m + * @date 2025-07-03 + */ +@RestController +@RequestMapping("/busi/chatItem") +public class BusiChatItemController extends BaseController +{ + @Autowired + private IBusiChatItemService busiChatItemService; + + /** + * 查询在线聊天记录列表 + */ + @GetMapping("/list") + public AjaxResult list(BusiChatItem busiChatItem) + { + return success(busiChatItemService.queryList(busiChatItem)); + } + + /** + * 导出在线聊天记录列表 + */ + @Log(title = "在线聊天记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiChatItem busiChatItem) + { + List list = busiChatItemService.list(); + ExcelUtil util = new ExcelUtil(BusiChatItem.class); + util.exportExcel(response, list, "在线聊天记录数据"); + } + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java new file mode 100644 index 0000000..e95f9a7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java @@ -0,0 +1,129 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.busi.service.IBusiChatItemService; +import com.ruoyi.busi.vo.ChatMainVO; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.service.IBusiChatMainService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 在线聊天Controller + * + * @author vinjor-m + * @date 2025-07-03 + */ +@RestController +@RequestMapping("/busi/chatMain") +public class BusiChatMainController extends BaseController +{ + @Autowired + private IBusiChatMainService busiChatMainService; + @Autowired + private IBusiChatItemService busiChatItemService; + + /** + * 查询在线聊天列表 + */ + @PreAuthorize("@ss.hasPermi('busi:chatMain:list')") + @GetMapping("/list") + public AjaxResult list(ChatMainVO busiChatMain, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = busiChatMainService.queryListPage(busiChatMain,page); + return success(list); + } + + /** + * 导出在线聊天列表 + */ + @PreAuthorize("@ss.hasPermi('busi:chatMain:export')") + @Log(title = "在线聊天", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiChatMain busiChatMain) + { + List list = busiChatMainService.list(); + ExcelUtil util = new ExcelUtil(BusiChatMain.class); + util.exportExcel(response, list, "在线聊天数据"); + } + + /** + * 获取在线聊天详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:chatMain:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiChatMainService.getById(id)); + } + + /** + * 新增在线聊天 + */ + @PreAuthorize("@ss.hasPermi('busi:chatMain:add')") + @Log(title = "在线聊天", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BusiChatMain busiChatMain) + { + return toAjax(busiChatMainService.save(busiChatMain)); + } + + /** + * 修改在线聊天 + */ + @PreAuthorize("@ss.hasPermi('busi:chatMain:edit')") + @Log(title = "在线聊天", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiChatMain busiChatMain) + { + return toAjax(busiChatMainService.updateById(busiChatMain)); + } + + /** + * 删除在线聊天 + */ + @PreAuthorize("@ss.hasPermi('busi:chatMain:remove')") + @Log(title = "在线聊天", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiChatMainService.removeByIds(list)); + } + + /** + * 根据客服ID查询会话列表---只有服务端使用,所以挪过来 + */ + @GetMapping("/service") + public AjaxResult getByServiceId() { + LoginUser loginUser = SecurityUtils.getLoginUser(); + List sessions = busiChatMainService.selectByServiceId(loginUser.getUserId()); + return AjaxResult.success(sessions); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiInquiryItemController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiInquiryItemController.java new file mode 100644 index 0000000..e2b091c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiInquiryItemController.java @@ -0,0 +1,113 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.vo.InquiryItemVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiInquiryItem; +import com.ruoyi.busi.service.IBusiInquiryItemService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 在线询盘记录Controller + * + * @author vinjor-m + * @date 2025-07-10 + */ +@RestController +@RequestMapping("/busi/inquiryItem") +public class BusiInquiryItemController extends BaseController +{ + @Autowired + private IBusiInquiryItemService busiInquiryItemService; + + /** + * 查询在线询盘记录列表 + */ + @PreAuthorize("@ss.hasPermi('busi:inquiryItem:list')") + @GetMapping("/list") + public AjaxResult list(InquiryItemVO busiInquiryItem, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = busiInquiryItemService.queryListPage(busiInquiryItem,page); + return success(list); + } + + /** + * 导出在线询盘记录列表 + */ + @PreAuthorize("@ss.hasPermi('busi:inquiryItem:export')") + @Log(title = "在线询盘记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiInquiryItem busiInquiryItem) + { + List list = busiInquiryItemService.list(); + ExcelUtil util = new ExcelUtil(BusiInquiryItem.class); + util.exportExcel(response, list, "在线询盘记录数据"); + } + + /** + * 获取在线询盘记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:inquiryItem:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiInquiryItemService.getById(id)); + } + + /** + * 新增在线询盘记录 + */ + @PreAuthorize("@ss.hasPermi('busi:inquiryItem:add')") + @Log(title = "在线询盘记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BusiInquiryItem busiInquiryItem) + { + return toAjax(busiInquiryItemService.save(busiInquiryItem)); + } + + /** + * 修改在线询盘记录 + */ + @PreAuthorize("@ss.hasPermi('busi:inquiryItem:edit')") + @Log(title = "在线询盘记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiInquiryItem busiInquiryItem) + { + return toAjax(busiInquiryItemService.updateById(busiInquiryItem)); + } + + /** + * 删除在线询盘记录 + */ + @PreAuthorize("@ss.hasPermi('busi:inquiryItem:remove')") + @Log(title = "在线询盘记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiInquiryItemService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiKeywordItemController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiKeywordItemController.java new file mode 100644 index 0000000..a15f029 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiKeywordItemController.java @@ -0,0 +1,126 @@ +package com.ruoyi.busi.controller; + +import java.util.*; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.vo.BusiKeywordItemQueryVO; +import com.ruoyi.busi.vo.BusiKeywordRankStatVO; +import com.ruoyi.busi.vo.ChartDataVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiKeywordItem; +import com.ruoyi.busi.service.IBusiKeywordItemService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 关键词排名明细Controller + * + * @author vinjor-m + * @date 2025-08-21 + */ +@RestController +@RequestMapping("/busi/keywordItem") +public class BusiKeywordItemController extends BaseController +{ + @Autowired + private IBusiKeywordItemService busiKeywordItemService; + + /** + * 查询关键词排名明细列表 + */ + @PreAuthorize("@ss.hasPermi('busi:keywordItem:list')") + @GetMapping("/rankStat") + public AjaxResult inquiryCountryList(BusiKeywordItemQueryVO queryVO, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize){ + Page page = new Page<>(pageNum, pageSize); + IPage result = busiKeywordItemService.selectKeywordRankStatPage(page, queryVO); + return success(result); + } + + /** + * 统计当天1-10名和11-20名的关键词数量 + */ + @GetMapping("/todayRankStat") + public AjaxResult todayRankStat(String tenantId) { + if (tenantId == null || tenantId.isEmpty()) { + return AjaxResult.error("租户ID不能为空"); + } + + Map result = busiKeywordItemService.selectTodayRankStat( tenantId); + return AjaxResult.success(result); + } + /** + * 导出关键词排名明细列表 + */ + @PreAuthorize("@ss.hasPermi('busi:keywordItem:export')") + @Log(title = "关键词排名明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiKeywordItem busiKeywordItem) + { + List list = busiKeywordItemService.list(); + ExcelUtil util = new ExcelUtil(BusiKeywordItem.class); + util.exportExcel(response, list, "关键词排名明细数据"); + } + + /** + * 获取关键词排名明细详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:keywordItem:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiKeywordItemService.getById(id)); + } + + /** + * 新增关键词排名明细 + */ + @PreAuthorize("@ss.hasPermi('busi:keywordItem:add')") + @Log(title = "关键词排名明细", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BusiKeywordItem busiKeywordItem) + { + return toAjax(busiKeywordItemService.save(busiKeywordItem)); + } + + /** + * 修改关键词排名明细 + */ + @PreAuthorize("@ss.hasPermi('busi:keywordItem:edit')") + @Log(title = "关键词排名明细", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiKeywordItem busiKeywordItem) + { + return toAjax(busiKeywordItemService.updateById(busiKeywordItem)); + } + + /** + * 删除关键词排名明细 + */ + @PreAuthorize("@ss.hasPermi('busi:keywordItem:remove')") + @Log(title = "关键词排名明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiKeywordItemService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java new file mode 100644 index 0000000..c83dc4c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java @@ -0,0 +1,203 @@ +package com.ruoyi.busi.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.service.IBasePicsService; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.service.IBusiProdNewService; +import com.ruoyi.busi.service.IBusiProdRandomService; +import com.ruoyi.busi.utils.SimHash; +import com.ruoyi.busi.utils.TextPreprocessor; +import com.ruoyi.busi.vo.ProdNewVO; +import com.ruoyi.busi.vo.ProdRandomVO; +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.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.ruoyi.constant.DictConstants.*; + +/** + * 新闻Controller + * + * @author vinjor-m + * @date 2025-06-25 + */ +@RestController +@RequestMapping("/busi/new") +public class BusiNewController extends BaseController +{ + @Autowired + private IBusiProdNewService busiProdNewService; + @Autowired + private IBasePicsService basePicsService; + @Autowired + private IBusiProdRandomService prodRandomService; + + /** + * 查询新闻列表 + */ + @PreAuthorize("@ss.hasPermi('busi:new:list')") + @GetMapping("/list") + public AjaxResult list(ProdNewVO busiProdNew, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + //只查新闻 + busiProdNew.setDataType(DATA_TYPE_NEWS); + IPage list = busiProdNewService.queryListPage(busiProdNew,page); + return success(list); + } + + /** + * 查某新闻的随机关联产品 + * @author vinjor-M + * @date 16:35 2025/6/27 + * @return com.ruoyi.common.core.domain.AjaxResult + * + **/ + @GetMapping("/randomList") + public AjaxResult randomList(BusiProdRandom prodRandom){ + return success(prodRandomService.randomList(prodRandom)); + } + + /** + * 导出新闻列表 + */ + @PreAuthorize("@ss.hasPermi('busi:new:export')") + @Log(title = "新闻", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiProdNew busiProdNew) + { + List list = busiProdNewService.list(); + ExcelUtil util = new ExcelUtil(BusiProdNew.class); + util.exportExcel(response, list, "文章数据"); + } + + /** + * 获取新闻详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:new:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiProdNewService.getById(id)); + } + + /** + * 获取新闻表当前最大排序 + */ + @GetMapping(value = "/getMaxSort") + public AjaxResult getMaxSort(String tenantId) + { + return success(busiProdNewService.getMaxSort(tenantId,DATA_TYPE_NEWS)); + } + + /** + * 新增新闻 + */ + @PreAuthorize("@ss.hasPermi('busi:new:add')") + @Log(title = "新闻", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdNewVO prodNewVO){ + prodNewVO.setDataType(DATA_TYPE_NEWS); + prodNewVO.setSimHash(SimHash.compute(TextPreprocessor.combineFields(prodNewVO.getTitle(),prodNewVO.getDescription(),prodNewVO.getContent()))); + busiProdNewService.save(prodNewVO); + if(null!=prodNewVO.getFileList() && !prodNewVO.getFileList().isEmpty()){ + prodNewVO.getFileList().forEach(item->{ + item.setTenantId(prodNewVO.getTenantId()); + item.setFileType(FILE_TYPE_NEWS); + }); + basePicsService.saveBatch(prodNewVO.getFileList()); + } + busiProdNewService.setAmount(prodNewVO.getTenantId()); + return success(); + } + + /** + * 修改新闻 + */ + @PreAuthorize("@ss.hasPermi('busi:new:edit')") + @Log(title = "新闻", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdNewVO prodNewVO){ + prodNewVO.setDataType(DATA_TYPE_NEWS); + prodNewVO.setSimHash(SimHash.compute(TextPreprocessor.combineFields(prodNewVO.getTitle(),prodNewVO.getDescription(),prodNewVO.getContent()))); + busiProdNewService.updateById(prodNewVO); + if(null!=prodNewVO.getFileList() && !prodNewVO.getFileList().isEmpty()){ + prodNewVO.getFileList().forEach(item->{ + item.setTenantId(prodNewVO.getTenantId()); + item.setFileType(FILE_TYPE_NEWS); + }); + basePicsService.saveBatch(prodNewVO.getFileList()); + } + return success(); + } + + /** + * 删除新闻 + */ + @PreAuthorize("@ss.hasPermi('busi:new:remove')") + @Log(title = "新闻", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids){ + List list = new ArrayList<>(Arrays.asList(ids)); + BusiProdNew prodNew = busiProdNewService.getById(list.get(0)); + busiProdNewService.removeByIds(list); + busiProdNewService.setAmount(prodNew.getTenantId()); + return success(); + } + + /** + * 保存新闻关联的随机产品 + * @author vinjor-M + * @date 17:41 2025/6/27 + * @param randomVO TODO + * @return com.ruoyi.common.core.domain.AjaxResult + **/ + @PostMapping("/saveRandom") + public AjaxResult add(@RequestBody ProdRandomVO randomVO){ + List randomList = new ArrayList<>(); + randomVO.getRandomIdList().forEach(item->{ + BusiProdRandom random = new ProdRandomVO(); + random.setProdId(randomVO.getProdId()); + random.setRandomId(item); + random.setTenantId(randomVO.getTenantId()); + randomList.add(random); + }); + prodRandomService.saveBatch(randomList); + return success(); + } + + /** + * 删除新闻关联的随机产品 + * @author vinjor-M + * @date 9:38 2025/6/30 + * @return com.ruoyi.common.core.domain.AjaxResult + **/ + @PostMapping("/delProdRandom") + public AjaxResult delProdRandom(@RequestBody ProdRandomVO randomVO){ + prodRandomService.delProdRandom(randomVO.getProdId(),randomVO.getRandomId(),randomVO.getTenantId()); + return success(); + } + + /** + * 相似度检测 + */ + @PostMapping("/checkContent") + public AjaxResult checkContent(@RequestBody ProdNewVO prodNewVO){ + prodNewVO.setDataType(DATA_TYPE_NEWS); + return success(busiProdNewService.checkContent(prodNewVO)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java new file mode 100644 index 0000000..30c9ef8 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java @@ -0,0 +1,108 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.vo.BusiPageVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiPage; +import com.ruoyi.busi.service.IBusiPageService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 全站网页访问次数统计Controller + * + * @author vinjor-m + * @date 2025-08-07 + */ +@RestController +@RequestMapping("/busi/page") +public class BusiPageController extends BaseController +{ + @Autowired + private IBusiPageService busiPageService; + + /** + * 查询全站网页访问次数统计列表---排名前10 + */ + @PreAuthorize("@ss.hasPermi('busi:page:list')") + @GetMapping("/list") + public AjaxResult list(BusiPageVO busiPage){ + return success(busiPageService.queryListNum(busiPage)); + } + + /** + * 导出全站网页访问次数统计列表 + */ + @PreAuthorize("@ss.hasPermi('busi:page:export')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiPage busiPage) + { + List list = busiPageService.list(); + ExcelUtil util = new ExcelUtil(BusiPage.class); + util.exportExcel(response, list, "全站网页访问次数统计数据"); + } + + /** + * 获取全站网页访问次数统计详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:page:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(busiPageService.getById(id)); + } + + /** + * 新增全站网页访问次数统计 + */ + @PreAuthorize("@ss.hasPermi('busi:page:add')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BusiPage busiPage) + { + return toAjax(busiPageService.save(busiPage)); + } + + /** + * 修改全站网页访问次数统计 + */ + @PreAuthorize("@ss.hasPermi('busi:page:edit')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiPage busiPage) + { + return toAjax(busiPageService.updateById(busiPage)); + } + + /** + * 删除全站网页访问次数统计 + */ + @PreAuthorize("@ss.hasPermi('busi:page:remove')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiPageService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java new file mode 100644 index 0000000..46b6039 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java @@ -0,0 +1,214 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.service.IBasePicsService; +import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.service.IBusiProdRandomService; +import com.ruoyi.busi.utils.SimHash; +import com.ruoyi.busi.utils.TextPreprocessor; +import com.ruoyi.busi.vo.ProdNewVO; +import com.ruoyi.busi.vo.ProdRandomVO; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.service.IBusiProdNewService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +import static com.ruoyi.constant.DictConstants.*; + +/** + * 产品Controller + * + * @author vinjor-m + * @date 2025-06-25 + */ +@RestController +@RequestMapping("/busi/prod") +public class BusiProdController extends BaseController +{ + @Autowired + private IBusiProdNewService busiProdNewService; + @Autowired + private IBasePicsService basePicsService; + @Autowired + private IBusiProdRandomService prodRandomService; + + /** + * 查询产品列表 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:list')") + @GetMapping("/list") + public AjaxResult list(ProdNewVO busiProdNew, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + //只查产品 + busiProdNew.setDataType(DATA_TYPE_PRODUCT); + IPage list = busiProdNewService.queryListPage(busiProdNew,page); + return success(list); + } + + /** + * 查某产品的随机关联产品 + * @author vinjor-M + * @date 16:35 2025/6/27 + * @return com.ruoyi.common.core.domain.AjaxResult + * + **/ + @GetMapping("/randomList") + public AjaxResult randomList(BusiProdRandom prodRandom){ + return success(prodRandomService.randomList(prodRandom)); + } + + /** + * 导出产品列表 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:export')") + @Log(title = "产品", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiProdNew busiProdNew) + { + List list = busiProdNewService.list(); + ExcelUtil util = new ExcelUtil(BusiProdNew.class); + util.exportExcel(response, list, "产品、文章数据"); + } + + /** + * 获取产品详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiProdNewService.getById(id)); + } + + /** + * 获取产品表当前最大排序 + */ + @GetMapping(value = "/getMaxSort") + public AjaxResult getMaxSort(String tenantId) + { + return success(busiProdNewService.getMaxSort(tenantId,DATA_TYPE_PRODUCT)); + } + + /** + * 新增产品 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:add')") + @Log(title = "产品", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdNewVO prodNewVO){ + prodNewVO.setDataType(DATA_TYPE_PRODUCT); + prodNewVO.setSimHash(SimHash.compute(TextPreprocessor.combineFields(prodNewVO.getTitle(),prodNewVO.getDescription(),prodNewVO.getContent()))); + busiProdNewService.save(prodNewVO); + if(null!=prodNewVO.getFileList() && !prodNewVO.getFileList().isEmpty()){ + prodNewVO.getFileList().forEach(item->{ + item.setTenantId(prodNewVO.getTenantId()); + item.setFileType(FILE_TYPE_PRODUCT); + }); + basePicsService.saveBatch(prodNewVO.getFileList()); + } + busiProdNewService.setAmount(prodNewVO.getTenantId()); + return success(); + } + + /** + * 修改产品 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:edit')") + @Log(title = "产品", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdNewVO prodNewVO){ + prodNewVO.setDataType(DATA_TYPE_PRODUCT); + prodNewVO.setSimHash(SimHash.compute(TextPreprocessor.combineFields(prodNewVO.getTitle(),prodNewVO.getDescription(),prodNewVO.getContent()))); + busiProdNewService.updateById(prodNewVO); + if(null!=prodNewVO.getFileList() && !prodNewVO.getFileList().isEmpty()){ + prodNewVO.getFileList().forEach(item->{ + item.setTenantId(prodNewVO.getTenantId()); + item.setFileType(FILE_TYPE_PRODUCT); + }); + basePicsService.saveBatch(prodNewVO.getFileList()); + } + return success(); + } + + /** + * 删除产品 + */ + @PreAuthorize("@ss.hasPermi('busi:prod:remove')") + @Log(title = "产品", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids){ + List list = new ArrayList<>(Arrays.asList(ids)); + BusiProdNew prodNew = busiProdNewService.getById(list.get(0)); + busiProdNewService.removeByIds(list); + busiProdNewService.setAmount(prodNew.getTenantId()); + return success(); + } + + /** + * 保存产品关联的随机产品 + * @author vinjor-M + * @date 17:41 2025/6/27 + * @param randomVO TODO + * @return com.ruoyi.common.core.domain.AjaxResult + **/ + @PostMapping("/saveRandom") + public AjaxResult add(@RequestBody ProdRandomVO randomVO){ + List randomList = new ArrayList<>(); + randomVO.getRandomIdList().forEach(item->{ + BusiProdRandom random = new ProdRandomVO(); + random.setProdId(randomVO.getProdId()); + random.setRandomId(item); + random.setTenantId(randomVO.getTenantId()); + randomList.add(random); + }); + prodRandomService.saveBatch(randomList); + return success(); + } + + /** + * 删除产品关联的随机产品 + * @author vinjor-M + * @date 9:38 2025/6/30 + * @return com.ruoyi.common.core.domain.AjaxResult + **/ + @PostMapping("/delProdRandom") + public AjaxResult delProdRandom(@RequestBody ProdRandomVO randomVO){ + prodRandomService.delProdRandom(randomVO.getProdId(),randomVO.getRandomId(),randomVO.getTenantId()); + return success(); + } + + /** + * 相似度检测 + */ + @PostMapping("/checkContent") + public AjaxResult checkContent(@RequestBody ProdNewVO prodNewVO){ + prodNewVO.setDataType(DATA_TYPE_PRODUCT); + return success(busiProdNewService.checkContent(prodNewVO)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java new file mode 100644 index 0000000..13eb083 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java @@ -0,0 +1,125 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.vo.RelationVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiRelation; +import com.ruoyi.busi.service.IBusiRelationService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 产品、新闻等与员工关系Controller + * + * @author vinjor-m + * @date 2025-06-30 + */ +@RestController +@RequestMapping("/busi/relation") +public class BusiRelationController extends BaseController +{ + @Autowired + private IBusiRelationService busiRelationService; + + /** + * 查询产品、新闻等与员工关系列表 + */ + @PreAuthorize("@ss.hasPermi('busi:relation:list')") + @GetMapping("/list") + public AjaxResult list(BusiRelation busiRelation, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = busiRelationService.queryListPage(busiRelation,page); + return success(list); + } + + /** + * 导出产品、新闻等与员工关系列表 + */ + @PreAuthorize("@ss.hasPermi('busi:relation:export')") + @Log(title = "产品、新闻等与员工关系", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiRelation busiRelation) + { + List list = busiRelationService.list(); + ExcelUtil util = new ExcelUtil(BusiRelation.class); + util.exportExcel(response, list, "产品、新闻等与员工关系数据"); + } + + /** + * 获取产品、新闻等与员工关系详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:relation:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiRelationService.getById(id)); + } + + /** + * 新增产品、新闻等与员工关系 + */ + @PreAuthorize("@ss.hasPermi('busi:relation:add')") + @Log(title = "产品、新闻等与员工关系", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody RelationVO busiRelation) + { + List userIdList = Arrays.asList(busiRelation.getLeaderId().split(",")); + List busiRelationList = new ArrayList<>(); + userIdList.forEach(item->{ + BusiRelation relation = new BusiRelation(); + relation.setUserId(item); + relation.setProdId(busiRelation.getProdId()); + relation.setTenantId(busiRelation.getTenantId()); + busiRelationList.add(relation); + }); + //先删除原来的负责人 + busiRelationService.deleteByProdId(busiRelation.getProdId(),busiRelation.getTenantId()); + busiRelationService.saveBatch(busiRelationList); + return success(); + } + + /** + * 修改产品、新闻等与员工关系 + */ + @PreAuthorize("@ss.hasPermi('busi:relation:edit')") + @Log(title = "产品、新闻等与员工关系", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiRelation busiRelation) + { + return toAjax(busiRelationService.updateById(busiRelation)); + } + + /** + * 删除产品、新闻等与员工关系 + */ + @PreAuthorize("@ss.hasPermi('busi:relation:remove')") + @Log(title = "产品、新闻等与员工关系", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiRelationService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiThirdItemController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiThirdItemController.java new file mode 100644 index 0000000..3627d1f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiThirdItemController.java @@ -0,0 +1,109 @@ +package com.ruoyi.busi.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.vo.ThirdVO; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.busi.domain.BusiThirdItem; +import com.ruoyi.busi.service.IBusiThirdItemService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 三方程序跳转记录Controller + * + * @author vinjor-m + * @date 2025-07-02 + */ +@RestController +@RequestMapping("/busi/thirdItem") +public class BusiThirdItemController extends BaseController +{ + @Autowired + private IBusiThirdItemService busiThirdItemService; + + /** + * 查询三方程序跳转记录列表 + */ + @PreAuthorize("@ss.hasPermi('busi:thirdItem:list')") + @GetMapping("/list") + public AjaxResult list(ThirdVO busiThirdItem, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = busiThirdItemService.queryListPage(busiThirdItem,page); + return success(list); + } + + /** + * 导出三方程序跳转记录列表 + */ + @PreAuthorize("@ss.hasPermi('busi:thirdItem:export')") + @Log(title = "三方程序跳转记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiThirdItem busiThirdItem) + { + List list = busiThirdItemService.list(); + ExcelUtil util = new ExcelUtil(BusiThirdItem.class); + util.exportExcel(response, list, "三方程序跳转记录数据"); + } + + /** + * 获取三方程序跳转记录详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return success(busiThirdItemService.getById(id)); + } + + /** + * 新增三方程序跳转记录 + */ + @Log(title = "三方程序跳转记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BusiThirdItem busiThirdItem) + { + return toAjax(busiThirdItemService.save(busiThirdItem)); + } + + /** + * 修改三方程序跳转记录 + */ + @Log(title = "三方程序跳转记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiThirdItem busiThirdItem) + { + return toAjax(busiThirdItemService.updateById(busiThirdItem)); + } + + /** + * 删除三方程序跳转记录 + */ + @Log(title = "三方程序跳转记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiThirdItemService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/StatisticsController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/StatisticsController.java new file mode 100644 index 0000000..fe00fe9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/StatisticsController.java @@ -0,0 +1,89 @@ +package com.ruoyi.busi.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiThirdItem; +import com.ruoyi.busi.service.IBusiProdNewService; +import com.ruoyi.busi.service.IBusiThirdItemService; +import com.ruoyi.busi.vo.ChartDataVO; +import com.ruoyi.busi.vo.ThirdVO; +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.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * 数据统计Controller + * + * @author vinjor-m + * @date 2025-07-02 + */ +@RestController +@RequestMapping("/statistics") +public class StatisticsController extends BaseController +{ + @Autowired + private IBusiThirdItemService busiThirdItemService; + @Autowired + private IBusiProdNewService prodNewService; + + /** + * 首页数据统计 + */ + @GetMapping("/indexData") + public AjaxResult list(String tenantId){ + Map rtnMap = new HashMap<>(); + //文章、产品数量 + rtnMap.put("prodNews",prodNewService.getIndexData(tenantId)); + //询盘流量 + rtnMap.put("ipInquiry",busiThirdItemService.inquiryMap(tenantId)); + //询盘来源前十国家 + rtnMap.put("nationalData",busiThirdItemService.nationalData(tenantId,null,null,10)); + //询盘设备 + rtnMap.put("equipmentData",busiThirdItemService.equipmentData(tenantId)); + //近一个月询盘数 + rtnMap.put("dataList",busiThirdItemService.dataList(tenantId)); + return success(rtnMap); + } + + /** + * 询盘走势图,指定时间范围 + */ + @GetMapping("/inquiryChart") + public AjaxResult inquiryChart(String tenantId,String startDate,String endDate){ + return success(busiThirdItemService.inquiryChart(tenantId,startDate,endDate)); + } + /** + * 询盘国家分布,指定时间范围 + */ + @GetMapping("/countryChart") + public AjaxResult countryChart(String tenantId,String startDate,String endDate){ + return success(busiThirdItemService.nationalData(tenantId,startDate,endDate,10)); + } + + /** + * 询盘国家列表--分页表格 + */ + @GetMapping("/inquiryCountryList") + public AjaxResult inquiryCountryList(@RequestParam(name = "tenantId",required = true) String tenantId, + @RequestParam(name = "startDate", required = false) String startDate, + @RequestParam(name = "endDate", required = false) String endDate, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize){ + List list = busiThirdItemService.nationalData(tenantId,startDate,endDate,null); + int startIndex = (pageNum-1)*pageSize; + int endIndex = Math.min(startIndex+pageSize,list.size()); + Map rtnMap = new HashMap<>(); + rtnMap.put("records",list.subList(startIndex,endIndex)); + rtnMap.put("current",pageNum); + rtnMap.put("total",list.size()); + return success(rtnMap); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiCategory.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiCategory.java index 8f7ac3d..0362542 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiCategory.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiCategory.java @@ -1,16 +1,19 @@ package com.ruoyi.busi.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.common.annotation.Excel; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.*; import com.ruoyi.common.core.domain.DlBaseEntity; /** * 网站栏目对象 dl_busi_category * - * @author vinjor-m + * @author pqz * @date 2025-06-19 */ @TableName("dl_busi_category") @@ -20,72 +23,93 @@ import com.ruoyi.common.core.domain.DlBaseEntity; @Builder @NoArgsConstructor @AllArgsConstructor +@ApiModel(value = "BusiCategory", description = "网站栏目分类") public class BusiCategory extends DlBaseEntity { private static final long serialVersionUID = 1L; /** 主键 */ @TableId(type = IdType.ASSIGN_UUID) + @ApiModelProperty("主键") private String id; - /** 栏目code */ - @Excel(name = "栏目code") - private String code; - /** 栏目名称 */ @Excel(name = "栏目名称") + @ApiModelProperty("栏目名称") private String catgName; /** 栏目级别 */ @Excel(name = "栏目级别") + @ApiModelProperty("栏目级别") private Long catgLevel; /** 栏目类型(一级才栏目才设置) */ @Excel(name = "栏目类型(一级才栏目才设置)") + @ApiModelProperty("栏目类型(一级才栏目才设置)") private String catgType; /** 上级栏目id */ @Excel(name = "上级栏目id") + @ApiModelProperty("上级栏目id") private String parentId; /** 直接下级产品数 */ @Excel(name = "直接下级产品数") - private Long prodsJunior; + private Integer prodsJunior; /** 递归产品数 */ @Excel(name = "递归产品数") - private Long prodsAll; + private Integer prodsAll; /** 页面title */ @Excel(name = "页面title") + @ApiModelProperty("页面title") private String title; /** 页面keyword */ @Excel(name = "页面keyword") + @ApiModelProperty("页面keyword") private String keyword; /** 页面description */ @Excel(name = "页面description") + @ApiModelProperty("页面description") private String description; /** 排序 */ @Excel(name = "排序") + @ApiModelProperty("排序") private Long sort; /** 内容html(适用于单页面+询盘) */ @Excel(name = "内容html", readConverterExp = "适=用于单页面+询盘") + @ApiModelProperty("内容html") private String content; + /** 内容html-移动端(适用于单页面+询盘) */ + @Excel(name = "内容html-移动端", readConverterExp = "适=用于单页面+询盘") + @ApiModelProperty("内容html-移动端") + private String contentApp; /** 产品上方内容html(适用于产品) */ @Excel(name = "产品上方内容html", readConverterExp = "适=用于产品") + @ApiModelProperty("产品上方内容html") private String prodUp; + /** 产品上方内容html-移动端(适用于产品) */ + @Excel(name = "产品上方内容html-移动端", readConverterExp = "适=用于产品") + @ApiModelProperty("产品上方内容html-移动端") + private String prodUpApp; /** 产品下方内容html(适用于产品) */ @Excel(name = "产品下方内容html", readConverterExp = "适=用于产品") + @ApiModelProperty("产品下方内容html") private String prodDown; + /** 产品下方内容html-移动端(适用于产品) */ + @Excel(name = "产品下方内容html-移动端", readConverterExp = "适=用于产品") + @ApiModelProperty("产品下方内容html-移动端") + private String prodDownApp; /** 站点唯一编码(租户id) */ @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") private String tenantId; - } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiChatItem.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiChatItem.java new file mode 100644 index 0000000..1022ffa --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiChatItem.java @@ -0,0 +1,56 @@ +package com.ruoyi.busi.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +import java.util.Date; + +/** + * 在线聊天记录对象 dl_busi_chat_item + * + * @author vinjor-m + * @date 2025-07-03 + */ +@TableName("dl_busi_chat_item") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiChatItem { + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 会话id */ + @Excel(name = "会话id") + private String mainId; + + /** 发送方(customer-客户|platform-平台) */ + @Excel(name = "发送方(customer-客户|platform-平台)") + private String dataFrom; + + /** 发送者ID */ + private String senderId; + + /** 接收者ID */ + private String receiverId; + + /** 聊天内容 */ + @Excel(name = "聊天内容") + private String content; + + /** 是否已读(0-未读,1-已读) */ + @Excel(name = "是否已读(0-未读,1-已读)") + private Integer isRead; + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiChatMain.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiChatMain.java new file mode 100644 index 0000000..763fa3b --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiChatMain.java @@ -0,0 +1,87 @@ +package com.ruoyi.busi.domain; + +import cn.hutool.json.JSONArray; +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import io.swagger.models.auth.In; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +import java.util.Date; + +/** + * 在线聊天对象 dl_busi_chat_main + * + * @author vinjor-m + * @date 2025-07-03 + */ +@TableName("dl_busi_chat_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiChatMain extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 产品id */ + @Excel(name = "产品id") + private String prodId; + + /** 来源IP */ + @Excel(name = "来源IP") + private String ip; + + /** 来源国家 */ + @Excel(name = "来源国家") + private String national; + + /** 来源洲 */ + @Excel(name = "来源洲") + private String oceania; + + /** 浏览器唯一编码(客户方) */ + @Excel(name = "浏览器唯一编码", readConverterExp = "客=户方") + private String cusCode; + + /** 设备类型 */ + @Excel(name = "设备类型") + private String equipment; + + /** 状态:0-未开始,1-进行中,2-已结束 */ + @Excel(name = "状态:0-未开始,1-进行中,2-已结束") + private Integer status; + + /** 员工id */ + @Excel(name = "员工id") + private Long userId; + + /** 最后一条消息 */ + @Excel(name = "最后一条消息", readConverterExp = "最后一条消息") + private String lastMessage; + + /** 最后消息时间 */ + @Excel(name = "最后消息时间", readConverterExp = "最后消息时间") + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date lastTime; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + + /** 未读消息数量 */ + @TableField(exist = false) + private Integer unreadCount; + + /** 产品名称 */ + @TableField(exist = false) + private String prodName; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiInquiryItem.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiInquiryItem.java new file mode 100644 index 0000000..d8f1b9f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiInquiryItem.java @@ -0,0 +1,90 @@ +package com.ruoyi.busi.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 在线询盘记录对象 dl_busi_inquiry_item + * + * @author vinjor-m + * @date 2025-07-10 + */ +@TableName("dl_busi_inquiry_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "BusiInquiryItem", description = "在线询盘实体") +public class BusiInquiryItem extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 公司名称 */ + @Excel(name = "公司名称") + @ApiModelProperty("公司名称") + private String companyName; + + /** 姓名 */ + @Excel(name = "姓名") + @ApiModelProperty("姓名") + private String name; + + /** 电话 */ + @Excel(name = "电话") + @ApiModelProperty("电话") + private String tel; + + /** 标题 */ + @Excel(name = "标题") + @ApiModelProperty("标题") + private String title; + + /** 内容 */ + @Excel(name = "内容") + @ApiModelProperty("内容") + private String content; + + /** 电子邮件 */ + @Excel(name = "电子邮件") + @ApiModelProperty("电子邮件") + private String email; + + /** 来源IP */ + @Excel(name = "来源IP") + @ApiModelProperty("来源IP") + private String ip; + + /** 来源国家 */ + @Excel(name = "来源国家") + @ApiModelProperty("来源国家") + private String national; + + /** 洲 */ + @Excel(name = "洲") + @ApiModelProperty("洲") + private String oceania; + /** 设备类型 */ + @Excel(name = "设备类型") + private String equipment; + + /** 页面路径 */ + private String pageUrl; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiKeyword.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiKeyword.java new file mode 100644 index 0000000..8e07e9d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiKeyword.java @@ -0,0 +1,40 @@ +package com.ruoyi.busi.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +import java.util.Date; + +/** + * 站点使用的关键词对象 dl_busi_keyword + * + * @author vinjor-m + * @date 2025-08-21 + */ +@TableName("dl_busi_keyword") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiKeyword +{ + private static final long serialVersionUID = 1L; + + /** 关键词 */ + @TableId + private String id; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租户id") + private String tenantId; + + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiKeywordItem.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiKeywordItem.java new file mode 100644 index 0000000..4abb11c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiKeywordItem.java @@ -0,0 +1,49 @@ +package com.ruoyi.busi.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 关键词排名明细对象 dl_busi_keyword_item + * + * @author vinjor-m + * @date 2025-08-21 + */ +@TableName("dl_busi_keyword_item") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiKeywordItem +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 关键词 */ + @Excel(name = "关键词") + private String title; + + /** 日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date selectDate; + + /** 排名 */ + @Excel(name = "排名") + private Integer ranking; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java new file mode 100644 index 0000000..9d26e54 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java @@ -0,0 +1,64 @@ +package com.ruoyi.busi.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +import java.util.Date; + +/** + * 全站网页访问次数统计对象 dl_busi_page + * + * @author vinjor-m + * @date 2025-08-07 + */ +@TableName("dl_busi_page") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "BusiPage", description = "网页访问次数实体") +public class BusiPage +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 网页地址 */ + @Excel(name = "网页地址") + @ApiModelProperty("网页地址") + private String url; + + /** 设备类型 */ + @Excel(name = "设备类型") + @ApiModelProperty("设备类型") + private String equipment; + + /** 来源IP */ + @Excel(name = "来源IP") + private String ip; + + /** 来源国家 */ + @Excel(name = "来源国家") + private String national; + /** 洲 */ + @Excel(name = "洲") + private String oceania; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") + private String tenantId; + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java new file mode 100644 index 0000000..d9edbc9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java @@ -0,0 +1,124 @@ +package com.ruoyi.busi.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +import java.util.Date; + +/** + * 产品、文章对象 dl_busi_prod_new + * + * @author vinjor-m + * @date 2025-06-25 + */ +@TableName("dl_busi_prod_new") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "BusiProdNew", description = "产品或新闻实体") +public class BusiProdNew extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + @ApiModelProperty("主键") + private String id; + + /** 所属栏目id */ + @Excel(name = "所属栏目id") + @ApiModelProperty("所属栏目id") + private String catgId; + + /** 数据类型 */ + @Excel(name = "数据类型") + @ApiModelProperty("数据类型") + private String dataType; + + /** 产品名称或文章标题 */ + @Excel(name = "产品名称或文章标题") + @ApiModelProperty("产品名称或文章标题") + private String title; + + /** 页面title */ + @Excel(name = "页面title") + @ApiModelProperty("页面title") + private String prodTitle; + + /** 页面keyword */ + @Excel(name = "页面keyword") + @ApiModelProperty("页面keyword") + private String prodKeyword; + + /** 页面description */ + @Excel(name = "页面description") + @ApiModelProperty("页面description") + private String prodDescription; + + /** 文章来源 */ + @Excel(name = "文章来源") + @ApiModelProperty("文章来源") + private String newsFrom; + + /** 文章发布日期 */ + @Excel(name = "文章发布日期") + @ApiModelProperty("文章发布日期") + private Date publicDate; + + /** 产品主图或文章图片 */ + @Excel(name = "产品主图或文章图片") + @ApiModelProperty("产品主图或文章图片") + private String mainPic; + + /** 产品图(多张) */ + @Excel(name = "产品图", readConverterExp = "多张") + @ApiModelProperty("产品图") + private String pics; + + /** 产品简介或文章简介(支持换行符) */ + @Excel(name = "产品简介或文章简介", readConverterExp = "支=持换行符") + @ApiModelProperty("产品简介或文章简介") + private String description; + + /** 产品内容或文章内容(富文本) */ + @ApiModelProperty("产品内容或文章内容(富文本)") + private String content; + + /** 排序 */ + @ApiModelProperty("排序") + private Long sort; + + /** simHash值 */ + @ApiModelProperty("simHash值") + private Long simHash; + + /** 是否首页推荐显示 */ + @Excel(name = "是否首页推荐显示") + @ApiModelProperty("是否首页推荐显示") + private Boolean ifReco; + + /** 是否发布(未发布的在草稿箱) */ + @Excel(name = "是否发布", readConverterExp = "未=发布的在草稿箱") + @ApiModelProperty("是否发布") + private Boolean ifPublic; + + /** 站点唯一编码(租户id) */ + @ApiModelProperty("站点唯一编码(租户id)") + private String tenantId; + + /** 最父级分类id */ + @ApiModelProperty("最父级分类id") + @TableField(exist = false) + private String maxCatgId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdRandom.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdRandom.java new file mode 100644 index 0000000..ec4556d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdRandom.java @@ -0,0 +1,43 @@ +package com.ruoyi.busi.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 随机产品关联关系对象 dl_busi_prod_random + * + * @author vinjor-m + * @date 2025-06-27 + */ +@TableName("dl_busi_prod_random") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiProdRandom extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 产品或文章id */ + @Excel(name = "产品或文章id") + private String prodId; + + /** 关联的随机产品id */ + @Excel(name = "关联的随机产品id") + private String randomId; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java new file mode 100644 index 0000000..f85af2f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java @@ -0,0 +1,43 @@ +package com.ruoyi.busi.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 产品、新闻等与员工关系对象 dl_busi_relation + * + * @author vinjor-m + * @date 2025-06-30 + */ +@TableName("dl_busi_relation") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiRelation extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 用户id */ + @Excel(name = "用户id") + private String userId; + + /** 产品、新闻id */ + @Excel(name = "产品、新闻id") + private String prodId; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java new file mode 100644 index 0000000..8a99f01 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java @@ -0,0 +1,66 @@ +package com.ruoyi.busi.domain; + +import com.ruoyi.common.annotation.Excel; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +/** + * 三方程序跳转记录对象 dl_busi_third_item + * + * @author vinjor-m + * @date 2025-07-02 + */ +@TableName("dl_busi_third_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BusiThirdItem extends DlBaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 产品id */ + @Excel(name = "产品id") + private String prodId; + + /** 三方程序类型 */ + @Excel(name = "三方程序类型") + private String thirdSoft; + + /** 来源国家 */ + @Excel(name = "来源国家") + private String national; + + /** 所属email/电话/teams账户 */ + @Excel(name = "所属email/电话/teams账户") + private String thirdAccount; + + /** 浏览记录 */ + @Excel(name = "浏览记录") + private String viewType; + + /** 页面路径 */ + private String pageUrl; + + /** 设备类型 */ + @Excel(name = "设备类型") + private String equipment; + + /** 来源IP */ + @Excel(name = "来源IP") + private String ip; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + private String tenantId; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiCategoryMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiCategoryMapper.java index f4e216c..6ee6bec 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiCategoryMapper.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiCategoryMapper.java @@ -1,21 +1,20 @@ package com.ruoyi.busi.mapper; -import java.util.List; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.busi.domain.BusiCategory; -import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.busi.domain.BusiCategory; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 网站栏目Mapper接口 - * + * * @author vinjor-m * @date 2025-06-19 */ @Mapper -public interface BusiCategoryMapper extends BaseMapper -{ - IPage queryListPage(@Param("entity") BusiCategory entity, Page page); +public interface BusiCategoryMapper extends BaseMapper { + + List selectAllChildren(@Param("id")String id); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatItemMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatItemMapper.java new file mode 100644 index 0000000..c6ee0a7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatItemMapper.java @@ -0,0 +1,47 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.busi.vo.ChatItemVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 在线聊天记录Mapper接口 + * + * @author vinjor-m + * @date 2025-07-03 + */ +@Mapper +public interface BusiChatItemMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiChatItem entity, Page page); + + List selectListData(@Param("entity")BusiChatItem entity); + + /** + * 根据会话ID查询消息列表 + * @param sessionId 会话ID + * @return 消息列表 + */ + List selectBySessionId(@Param("sessionId") String sessionId); + + /** + * 查询未读消息数量 + * @param mainId 会话id + * @param senderType 发送者类型 + * @return 未读消息数量 + */ + int selectUnreadCount(@Param("mainId") String mainId, @Param("senderType") String senderType); + + /** + * 标记消息为已读 + * @param sessionId 会话ID + * @param receiverId 接收者ID + * @return 影响行数 + */ + int updateReadStatus(@Param("sessionId") String sessionId, @Param("receiverId") String receiverId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java new file mode 100644 index 0000000..2745b8f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java @@ -0,0 +1,67 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.vo.ChartDataVO; +import com.ruoyi.busi.vo.ChatMainVO; +import com.ruoyi.busi.vo.ThirdSoftVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 在线聊天Mapper接口 + * + * @author vinjor-m + * @date 2025-07-03 + */ +@Mapper +public interface BusiChatMainMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") ChatMainVO entity, Page page); + + /** + * 查询IP数量 + * @author vinjor-M + * @date 16:29 2025/7/11 + * @param tenantId TODO + * @param startDate TODO + * @param endDate TODO + * @return java.lang.Integer + **/ + Integer selectIpCount(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); + + List selectNationalSortList(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); + + /** + * 查询询盘设备 + * @author vinjor-M + * @date 10:49 2025/7/16 + * @param tenantId 站点ID + * @return java.util.List + **/ + List selectEquipmentSortList(@Param("tenantId")String tenantId); + + List selectChatVO(@Param("tenantId")String tenantId); + + List selectLineChart(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); + + /** + * 根据客服ID查询会话列表 + * @param serviceId 客服ID + * @return 会话列表 + */ + List selectByServiceId(@Param("serviceId") Long serviceId); + + /** + * 根据用户标识查询活跃会话 + * @param tenantId 租户ID + * @param deviceCode 设备编码 + * @return 会话信息 + */ + BusiChatMain selectActiveSession(@Param("tenantId") String tenantId, + @Param("deviceCode") String deviceCode, + @Param("prodId") String prodId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiInquiryItemMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiInquiryItemMapper.java new file mode 100644 index 0000000..07644c0 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiInquiryItemMapper.java @@ -0,0 +1,57 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiInquiryItem; +import com.ruoyi.busi.vo.ChartDataVO; +import com.ruoyi.busi.vo.InquiryItemVO; +import com.ruoyi.busi.vo.ThirdSoftVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 在线询盘记录Mapper接口 + * + * @author vinjor-m + * @date 2025-07-10 + */ +@Mapper +public interface BusiInquiryItemMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") InquiryItemVO entity, Page page); + + /** + * 查询IP数量 + * @author vinjor-M + * @date 16:29 2025/7/11 + * @param tenantId TODO + * @param startDate TODO + * @param endDate TODO + * @return java.lang.Integer + **/ + Integer selectIpCount(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); + + List selectNationalSortList(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); + + /** + * 查询询盘设备 + * @author vinjor-M + * @date 10:49 2025/7/16 + * @param tenantId 站点ID + * @return java.util.List + **/ + List selectEquipmentSortList(@Param("tenantId")String tenantId); + + /** + * 查询在线询盘-近30天 + * @author vinjor-M + * @date 16:19 2025/7/16 + * @param tenantId 站点编码 + * @return java.util.List + **/ + List selectinquiryItemVO(@Param("tenantId")String tenantId); + + List selectLineChart(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java new file mode 100644 index 0000000..080a2f1 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.busi.mapper; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiKeywordItem; +import com.ruoyi.busi.vo.BusiKeywordRankStatVO; +import lombok.Data; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 关键词排名明细Mapper接口 + * + * @author vinjor-m + * @date 2025-08-21 + */ +@Mapper +public interface BusiKeywordItemMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiKeywordItem entity, Page page); + + int deleteBySelectDateInt(@Param("date") String date); + + /** + * 分页查询关键词基础信息 + */ + IPage selectKeywordPage( + IPage page, + @Param("title") String title, + @Param("tenantId") String tenantId + ); + + /** + * 查询关键词在时间范围内的排名数据 + */ + List selectRankDataByKeywordIds( + @Param("keywordIds") List keywordIds, + @Param("beginDate") Date beginDate, + @Param("endDate") Date endDate, + @Param("tenantId") String tenantId + ); + + @Data + class KeywordRankData { + private String keywordId; + private String selectDate; + private Integer ranking; + } + + /** + * 统计指定日期1-10名和11-20名的关键词数量 + * @param selectDate 选择日期 + * @param tenantId 租户ID + * @return 排名区间统计列表 + */ + List> selectTodayRankStat( + @Param("selectDate") Date selectDate, + @Param("tenantId") String tenantId + ); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java new file mode 100644 index 0000000..5c616e3 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java @@ -0,0 +1,29 @@ +package com.ruoyi.busi.mapper; + +import java.util.Date; +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiKeyword; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 站点使用的关键词Mapper接口 + * + * @author vinjor-m + * @date 2025-08-21 + */ +@Mapper +public interface BusiKeywordMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiKeyword entity, Page page); + /** + * 最新一次添加关键词的 时间 + * @author vinjor-M + * @date 14:32 2025/8/21 + **/ + Date selectNewDate(); + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java new file mode 100644 index 0000000..735202e --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java @@ -0,0 +1,24 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiPage; +import com.ruoyi.busi.vo.BusiPageVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 全站网页访问次数统计Mapper接口 + * + * @author vinjor-m + * @date 2025-08-07 + */ +@Mapper +public interface BusiPageMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiPage entity, Page page); + + List selectListCus(@Param("entity")BusiPageVO busiPageVO); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdNewMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdNewMapper.java new file mode 100644 index 0000000..4c29ada --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdNewMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.busi.mapper; + +import java.util.Date; +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.vo.ProdNewVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 产品、文章Mapper接口 + * + * @author vinjor-m + * @date 2025-06-25 + */ +@Mapper +public interface BusiProdNewMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") ProdNewVO entity, Page page); + + List selectCusList(@Param("entity") ProdNewVO entity); + + Long selectMaxSort(@Param("tenantId")String tenantId,@Param("dataType")String dataType); + + /** + * 统计分类下产品数量 + * @author PQZ + * @date 14:06 2025/6/30 + * @return java.util.List + **/ + List getCatgAmount(@Param("tenantId")String tenantId); + + /** + * 查询上一个下一个产品或新闻 + * @author vinjor-M + * @date 16:16 2025/7/8 + * @param dataType 数据类型 + * @param sort 排序 + * @param sortType 上一个或下一个 + * @param tenantId 站点ID + * @param catgId 分类ID + * @return com.ruoyi.busi.domain.BusiProdNew + **/ + BusiProdNew selectPreOrNext(@Param("dataType") String dataType,@Param("sort") Long sort,@Param("sortType") String sortType, + @Param("tenantId") String tenantId,@Param("catgId") String catgId); + /** + * 查数据库中最新编辑的时间 + * @author vinjor-M + * @date 14:29 2025/8/21 + * @return java.util.Date + **/ + Date selectNewDate(); + + /** + * 查询更新时间晚于或等于某个时间的数据 + * @author vinjor-M + * @date 14:36 2025/8/21 + * @param updateTime 某个时间 + * @return java.util.List + **/ + List selectDataByUpdateTime(@Param("updateTime")String updateTime); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdRandomMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdRandomMapper.java new file mode 100644 index 0000000..35335e2 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiProdRandomMapper.java @@ -0,0 +1,40 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.vo.ProdNewVO; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 随机产品关联关系Mapper接口 + * + * @author vinjor-m + * @date 2025-06-27 + */ +@Mapper +public interface BusiProdRandomMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiProdRandom entity, Page page); + + /** + * 查某产品管理的随机产品 + * @author vinjor-M + * @date 16:36 2025/6/27 + * @return java.util.List + **/ + List selectRandomList(@Param("map") BusiProdRandom prodRandom); + /** + * 删除产品关联的随机产品 + * + * @param prodId 产品id + * @param randomId 随机产品id + * @param tenantId 租户id + * @author vinjor-M + * @date 9:40 2025/6/30 + **/ + Integer deleteProdRandom(@Param("prodId") String prodId,@Param("randomId") String randomId, @Param("tenantId") String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiRelationMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiRelationMapper.java new file mode 100644 index 0000000..aa77c1e --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiRelationMapper.java @@ -0,0 +1,23 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiRelation; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 产品、新闻等与员工关系Mapper接口 + * + * @author vinjor-m + * @date 2025-06-30 + */ +@Mapper +public interface BusiRelationMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiRelation entity, Page page); + + Integer deleteByProdId(@Param("prodId")String prodId,@Param("tenantId")String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiThirdItemMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiThirdItemMapper.java new file mode 100644 index 0000000..2461d98 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiThirdItemMapper.java @@ -0,0 +1,54 @@ +package com.ruoyi.busi.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiThirdItem; +import com.ruoyi.busi.vo.*; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 三方程序跳转记录Mapper接口 + * + * @author vinjor-m + * @date 2025-07-02 + */ +@Mapper +public interface BusiThirdItemMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") ThirdVO entity, Page page); + /** + * 查询IP数量 + * @author vinjor-M + * @date 16:29 2025/7/11 + * @param tenantId TODO + * @param startDate TODO + * @param endDate TODO + * @return java.lang.Integer + **/ + Integer selectIpCount(@Param("tenantId")String tenantId,@Param("thirdSoft")String thirdSoft,@Param("startDate")String startDate,@Param("endDate")String endDate); + + /** + * 查询盘三方来源国家数量,按国家分组计数 + * @author vinjor-M + * @date 10:49 2025/7/16 + * @param tenantId 站点ID + * @return java.util.List + **/ + List selectNationalSortList(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); + + /** + * 查询询盘设备 + * @author vinjor-M + * @date 10:49 2025/7/16 + * @param tenantId 站点ID + * @return java.util.List + **/ + List selectEquipmentSortList(@Param("tenantId")String tenantId); + + List selectThirdSoft(@Param("tenantId")String tenantId); + + List selectLineChart(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/GoogleKeywordService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/GoogleKeywordService.java new file mode 100644 index 0000000..d6eb733 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/GoogleKeywordService.java @@ -0,0 +1,157 @@ +package com.ruoyi.busi.service; + +import cn.hutool.core.util.StrUtil; +import com.google.ads.googleads.lib.GoogleAdsClient; +import com.google.ads.googleads.v20.enums.KeywordPlanNetworkEnum; +import com.google.ads.googleads.v20.services.*; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.auth.oauth2.ServiceAccountCredentials; +import com.ruoyi.base.vo.KeywordVO; +import com.ruoyi.common.config.GoogleConfig; +import com.ruoyi.constant.CompetitionEnum; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.*; + +@Service +public class GoogleKeywordService { + @Autowired + private GoogleConfig googleConfig; + + /** + * 获取谷歌关键词规划师规划的关键词 + * + * @param language 语言编码 + * @param country 国家编码,多个英文逗号隔开 + * @param title 关键词,多个英文逗号分隔 + * @param url url + * @return java.util.List + * @author vinjor-M + * @date 17:55 2025/8/4 + **/ + public List getKeywords(String language, String country, String title, String url) { + List keywordList = new ArrayList<>(); + try { + // 1. 检查文件是否存在 + File file = ResourceUtils.getFile("file:" + googleConfig.getJsonPath()); + boolean fileExists = file.exists(); + System.out.println("JSON 文件是否存在: " + fileExists); + + // 2. 加载 JSON 凭证 + GoogleCredentials credentials = ServiceAccountCredentials.fromStream( + new FileInputStream(file) + ); + // 2. 构建 GoogleAdsClient(自动读取环境变量) + GoogleAdsClient googleAdsClient = GoogleAdsClient.newBuilder() + .setCredentials(credentials) + .setDeveloperToken(googleConfig.getDeveloperToken()) + .setLoginCustomerId(googleConfig.getCustomerId()) + .build(); + + // 2. 设置参数 + List seedKeywords = Arrays.asList(title.split(StrUtil.COMMA)); + // 语言 + language = "languageConstants/"+language; + // 国家/地区 + List geoTargetList = new ArrayList<>(); + for (String item:country.split(StrUtil.COMMA)){ + geoTargetList.add("geoTargetConstants/"+item); + } + // 3. 获取关键词提示 + List keywordIdeas = generateKeywordIdeas( + googleAdsClient, googleConfig.getCustomerId(), seedKeywords, language, geoTargetList,url); + + // 4. 输出结果 + for (GenerateKeywordIdeaResult idea : keywordIdeas) { + // 获取关键词文本 + String text = idea.getText(); + KeywordVO keywordVO = new KeywordVO(); + keywordVO.setTitle(text); + // 获取关键词指标(可选) + if (idea.hasKeywordIdeaMetrics()) { + long avgMonthlySearches = idea.getKeywordIdeaMetrics().getAvgMonthlySearches(); + String competition = String.valueOf(idea.getKeywordIdeaMetrics().getCompetition()); + if(avgMonthlySearches>=googleConfig.getSearchDown()){ + //大于要求的最低月搜索量,返回 + keywordVO.setSearchMonth(avgMonthlySearches); + keywordVO.setCompetition(CompetitionEnum.getTitleByCode(competition).getTitle()); + keywordList.add(keywordVO); + } + } + } + } catch (IOException e) { + System.err.printf("初始化 Google Ads 客户端失败: %s%n", e.getMessage()); + } + // 倒序排列 + keywordList.sort((o1, o2) -> Long.compare(o2.getSearchMonth(), o1.getSearchMonth())); + return keywordList; + } + + /** + * 生成关键词提示 + * + * @param googleAdsClient Google Ads 客户端 + * @param customerId 客户ID + * @param seedKeywords 种子关键词列表 + * @param language 语言常量 (如 "languageConstants/1000" 表示英语) + * @param geoTargets 地理位置目标常量 (如 "geoTargetConstants/2840" 表示美国) + * @param url 网址 + * @return 关键词提示列表 + * @throws IOException 如果API调用失败 + */ + public static List generateKeywordIdeas( + GoogleAdsClient googleAdsClient, + long customerId, + List seedKeywords, + String language, + List geoTargets,String url) throws IOException { + List allKeywordIdeas = new ArrayList<>(); + //分页token + String nextPageToken = null; + //组装关键词请求体 + KeywordAndUrlSeed urlSeed = null; + KeywordSeed seed = null; + if(StringUtils.isNotEmpty(url)){ + urlSeed = KeywordAndUrlSeed.newBuilder() + .addAllKeywords(seedKeywords) + .setUrl(url) + .build(); + }else{ + seed = KeywordSeed.newBuilder() + .addAllKeywords(seedKeywords) + .build(); + } + do { + try (KeywordPlanIdeaServiceClient client = + googleAdsClient.getLatestVersion().createKeywordPlanIdeaServiceClient()) { + GenerateKeywordIdeasRequest.Builder requestBuilder = GenerateKeywordIdeasRequest.newBuilder() + .setCustomerId(Long.toString(customerId)) + .setLanguage(language) + .addAllGeoTargetConstants(geoTargets) + .setKeywordPlanNetwork(KeywordPlanNetworkEnum.KeywordPlanNetwork.GOOGLE_SEARCH_AND_PARTNERS); + if(StringUtils.isNotEmpty(url)){ + requestBuilder.setKeywordAndUrlSeed(urlSeed); + }else{ + requestBuilder.setKeywordSeed(seed); + } + // 仅在非首次请求时设置 pageToken + if (nextPageToken != null) { + requestBuilder.setPageToken(nextPageToken); + } + GenerateKeywordIdeasRequest request = requestBuilder.build(); + GenerateKeywordIdeaResponse response = client.generateKeywordIdeasCallable().call(request); + allKeywordIdeas.addAll(response.getResultsList()); + nextPageToken = response.getNextPageToken(); + } + } while (StringUtils.isNotEmpty(nextPageToken)); + System.out.println("关键词总数:" + allKeywordIdeas.size()); + return allKeywordIdeas; + } + +} \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiCategoryService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiCategoryService.java index 9f5ae59..2007913 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiCategoryService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiCategoryService.java @@ -1,18 +1,63 @@ package com.ruoyi.busi.service; -import java.util.List; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.busi.domain.BusiCategory; +import com.ruoyi.busi.vo.BusiCategoryVO; +import com.ruoyi.busi.vo.ProdNewVO; + +import java.util.List; +import java.util.Map; /** * 网站栏目Service接口 - * - * @author vinjor-m + * + * @author pqz * @date 2025-06-19 */ -public interface IBusiCategoryService extends IService -{ - IPage queryListPage(BusiCategory pageReqVO, Page page); +public interface IBusiCategoryService extends IService { + + /** + * 树形结构查询网站栏目 + * + * @param category {@link BusiCategory} + * @return java.util.List + * @author PQZ + * @date 14:06 2025/6/23 + **/ + List treeCategory(BusiCategory category); + + + /** + * 设置直接产品数、递归产品数 + * @author PQZ + * @date 14:12 2025/6/30 + **/ + void setCategoryAmount(List list,String tenantId); + + /** + * + * @author vinjor-M + * @date 15:30 2025/7/8 + * @param id 查询的栏目ID + * @return java.util.List + **/ + List getAllChildrenId(String id); + + /** + * 给所有子级设置最父级ID + * @author vinjor-M + * @date 11:23 2025/7/19 + * @param busiCategoryVOList TODO + * @return java.util.List + **/ + List dealFirstId(List busiCategoryVOList); + + /** + * 给所有子级设置最父级ID并且反回map格式 + * @author vinjor-M + * @date 11:23 2025/7/19 + * @param busiCategoryVOList 栏目树 + * @return java.util.List + **/ + Map dealFirstIdRtnMap(List busiCategoryVOList); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatItemService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatItemService.java new file mode 100644 index 0000000..821b74f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatItemService.java @@ -0,0 +1,49 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.busi.vo.ChatItemVO; + +/** + * 在线聊天记录Service接口 + * + * @author vinjor-m + * @date 2025-07-03 + */ +public interface IBusiChatItemService extends IService +{ + List queryList(BusiChatItem pageReqVO); + + /** + * 发送消息 + * @param message 消息内容 + * @return 消息ID + */ + BusiChatItem sendMessage(BusiChatItem message); + + /** + * 根据会话ID查询消息列表 + * @param sessionId 会话ID + * @return 消息列表 + */ + List selectBySessionId(String sessionId); + + /** + * 查询未读消息数量 + * @param mainId 会话id + * @param senderType 发送者类型 + * @return 未读消息数量 + */ + int selectUnreadCount(String mainId, String senderType); + + /** + * 标记消息为已读 + * @param sessionId 会话ID + * @param receiverId 接收者ID + * @return 操作结果 + */ + boolean markAsRead(String sessionId, String receiverId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java new file mode 100644 index 0000000..7f2425d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java @@ -0,0 +1,61 @@ +package com.ruoyi.busi.service; + +import java.util.List; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.vo.ChatMainVO; + +/** + * 在线聊天Service接口 + * + * @author vinjor-m + * @date 2025-07-03 + */ +public interface IBusiChatMainService extends IService { + IPage queryListPage(ChatMainVO pageReqVO, Page page); + + /** + * 校验是否需要新增 + * + * @param ip ip + * @param cusCode 浏览器唯一编码 + * @return void + * @author PQZ + * @date 15:31 2025/7/17 + **/ + BusiChatMain queryByIpAndCusCode(String ip, String cusCode,String prodId); + + + /** + * 创建新会话 + * @param session 会话信息 + * @return 会话ID + */ + BusiChatMain createSession(BusiChatMain session); + + /** + * 根据客服ID查询会话列表 + * @param serviceId 客服ID + * @return 会话列表 + */ + List selectByServiceId(Long serviceId); + + /** + * 根据用户标识查询活跃会话 + * @param tenantId 租户ID + * @param userIp 用户IP + * @param deviceCode 设备编码 + * @return 会话信息 + */ + BusiChatMain selectActiveSession(String tenantId, String userIp, String deviceCode,String prodId); + + /** + * 结束会话 + * @param sessionId 会话ID + * @return 操作结果 + */ + boolean closeSession(String sessionId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiInquiryItemService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiInquiryItemService.java new file mode 100644 index 0000000..0c360ef --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiInquiryItemService.java @@ -0,0 +1,19 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiInquiryItem; +import com.ruoyi.busi.vo.InquiryItemVO; + +/** + * 在线询盘记录Service接口 + * + * @author vinjor-m + * @date 2025-07-10 + */ +public interface IBusiInquiryItemService extends IService +{ + IPage queryListPage(InquiryItemVO pageReqVO, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java new file mode 100644 index 0000000..bab1d0c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java @@ -0,0 +1,46 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiKeywordItem; +import com.ruoyi.busi.vo.BusiKeywordItemQueryVO; +import com.ruoyi.busi.vo.BusiKeywordRankStatVO; + +/** + * 关键词排名明细Service接口 + * + * @author vinjor-m + * @date 2025-08-21 + */ +public interface IBusiKeywordItemService extends IService +{ + IPage queryListPage(BusiKeywordItem pageReqVO, Page page); + + /** + * 获取所有关键词的google排名 + * @author vinjor-M + * @date 15:10 2025/8/21 + **/ + void getKeywordRanking(); + + /** + * 分页查询关键词排名统计 + * @param page 分页参数 + * @param queryVO 查询参数 + * @return 分页结果 + */ + IPage selectKeywordRankStatPage(IPage page, BusiKeywordItemQueryVO queryVO); + + /** + * 统计当天1-10名和11-20名的关键词数量 + * @param selectDate 选择日期 + * @param tenantId 租户ID + * @return Map形式的统计结果 {key1: 1-10名数量, key2: 11-20名数量} + */ + Map selectTodayRankStat( String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordService.java new file mode 100644 index 0000000..af744d9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordService.java @@ -0,0 +1,23 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiKeyword; + +/** + * 站点使用的关键词Service接口 + * + * @author vinjor-m + * @date 2025-08-21 + */ +public interface IBusiKeywordService extends IService { + IPage queryListPage(BusiKeyword pageReqVO, Page page); + /** + * 检索全站使用的关键词 + * @author vinjor-M + * @date 14:26 2025/8/21 + **/ + void getAllKeyword(); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java new file mode 100644 index 0000000..7609302 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java @@ -0,0 +1,40 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiPage; +import com.ruoyi.busi.vo.BusiPageVO; + +import javax.servlet.http.HttpServletRequest; + +/** + * 全站网页访问次数统计Service接口 + * + * @author vinjor-m + * @date 2025-08-07 + */ +public interface IBusiPageService extends IService +{ + IPage queryListPage(BusiPage pageReqVO, Page page); + + /** + * 保存网页访问记录 + * @author vinjor-M + * @date 11:13 2025/8/7 + * @param busiPage TODO + **/ + void pageSave(BusiPage busiPage); + + /** + * 查全站访问网页前十 + * @author vinjor-M + * @date 16:52 2025/8/7 + * @param busiPage TODO + * @return java.util.List + **/ + List queryListNum(BusiPageVO busiPage); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java new file mode 100644 index 0000000..9866acc --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java @@ -0,0 +1,97 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.vo.ProdNewVO; +import com.ruoyi.busi.vo.SiteMapVO; +import com.ruoyi.busi.vo.WebDetailVO; + +/** + * 产品、文章Service接口 + * + * @author vinjor-m + * @date 2025-06-25 + */ +public interface IBusiProdNewService extends IService +{ + IPage queryListPage(ProdNewVO pageReqVO, Page page); + + /** + * 获取产品表当前最大排序 + * @author vinjor-M + * @date 16:15 2025/6/25 + * @param tenantId 站点id + * @return java.lang.Long + **/ + Long getMaxSort(String tenantId,String dataType); + + + /** + * 为网站栏目中递归产品数和下级产品数赋值 + * @author PQZ + * @date 14:03 2025/6/30 + **/ + void setAmount(String tenantId); + + /** + * 首页数据统计接口 + * @author vinjor-M + * @date 16:48 2025/7/4 + * @param tenantId TODO + * @return java.util.Map + **/ + Map getIndexData(String tenantId); + + /** + * 首页查询热门产品 + * @author vinjor-M + * @date 11:33 2025/7/8 + * @param tenantId 租户id + * @return java.util.List + **/ + List hotProdOrNews(String tenantId,String dateType,Boolean ifHot); + + /** + * web站点查看详情 + * @author vinjor-M + * @date 16:10 2025/7/8 + * @param id TODO + * @return com.ruoyi.busi.vo.WebDetailVO + **/ + WebDetailVO getProdNewInfo(String id); + + /** + * 全站搜索产品和文章 + * @author vinjor-M + * @date 13:55 2025/7/9 + * @param tenantId 站点ID + * @param text 搜索内容 + * @param page 分页对象 + * @return com.baomidou.mybatisplus.core.metadata.IPage + **/ + IPage searchTextAll(String tenantId, String text,Page page); + + /** + * 相似度检测 + * @author vinjor-M + * @date 10:24 2025/7/18 + * @param prodNewVO + * @return java.util.List + **/ + List checkContent(ProdNewVO prodNewVO); + + /** + * 获取站点分类地图 + * @author vinjor-M + * @date 14:12 2025/8/4 + * @param tenantId 站点编码 + * @param catgType 栏目类型 + * @return java.util.List + **/ + List getSiteMap(String tenantId, String catgType); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdRandomService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdRandomService.java new file mode 100644 index 0000000..f02de05 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdRandomService.java @@ -0,0 +1,37 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.vo.ProdNewVO; + +/** + * 随机产品关联关系Service接口 + * + * @author vinjor-m + * @date 2025-06-27 + */ +public interface IBusiProdRandomService extends IService +{ + IPage queryListPage(BusiProdRandom pageReqVO, Page page); + + /** + * 查某产品的随机关联产品 + * @author vinjor-M + * @date 16:35 2025/6/27 + * @return java.util.List + **/ + List randomList(BusiProdRandom prodRandom); + + /** + * 删除产品关联的随机产品 + * @author vinjor-M + * @date 9:40 2025/6/30 + * @param prodId 产品id + * @param randomId 随机产品id + * @param tenantId 租户id + **/ + void delProdRandom(String prodId, String randomId, String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiRelationService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiRelationService.java new file mode 100644 index 0000000..f671cb3 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiRelationService.java @@ -0,0 +1,28 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiRelation; + +/** + * 产品、新闻等与员工关系Service接口 + * + * @author vinjor-m + * @date 2025-06-30 + */ +public interface IBusiRelationService extends IService +{ + IPage queryListPage(BusiRelation pageReqVO, Page page); + + /** + * 删除某产品的负责人 + * @author vinjor-M + * @date 13:48 2025/6/30 + * @param prodId TODO + * @param tenantId TODO + * @return java.lang.Integer + **/ + Integer deleteByProdId(String prodId,String tenantId); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiThirdItemService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiThirdItemService.java new file mode 100644 index 0000000..feab1d9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiThirdItemService.java @@ -0,0 +1,80 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import java.util.Map; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiThirdItem; +import com.ruoyi.busi.vo.ChartDataVO; +import com.ruoyi.busi.vo.IndexInquiryVO; +import com.ruoyi.busi.vo.ThirdVO; + +/** + * 三方程序跳转记录Service接口 + * + * @author vinjor-m + * @date 2025-07-02 + */ +public interface IBusiThirdItemService extends IService +{ + IPage queryListPage(ThirdVO pageReqVO, Page page); + + /** + * 首页询盘总流量 + * @author vinjor-M + * @date 16:25 2025/7/11 + * @param tenantId TODO + * @return java.util.Map + **/ + Map inquiryMap(String tenantId); + + /** + * 查询询盘来源前十国家 + * @author vinjor-M + * @date 10:47 2025/7/16 + * @param tenantId 站点编码 + * @return java.util.List + **/ + List nationalData(String tenantId,String startDate,String endDate,Integer num); + + /** + * 查询盘设备 + * @author vinjor-M + * @date 15:15 2025/7/16 + * @param tenantId 站点编码 + * @return java.util.List + **/ + List equipmentData(String tenantId); + + /** + * 首页查询近30天询盘数 + * @author vinjor-M + * @date 15:26 2025/7/16 + * @param tenantId 站点编码 + * @return java.util.List + **/ + List dataList(String tenantId); + + /** + * 询盘走势 + * @author vinjor-M + * @date 17:12 2025/7/16 + * @param tenantId 站点编码 + * @param startDate 开始日期 + * @param endDate 结束日期 + * @return java.util.Map + **/ + Map inquiryChart(String tenantId,String startDate,String endDate); + /** + * 询盘国家分布 + * @author vinjor-M + * @date 17:12 2025/7/16 + * @param tenantId 站点编码 + * @param startDate 开始日期 + * @param endDate 结束日期 + * @return java.util.Map + **/ + Map countryChart(String tenantId, String startDate, String endDate); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java index 525dc44..776a40b 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java @@ -1,30 +1,261 @@ package com.ruoyi.busi.service.impl; -import java.util.List; -import com.ruoyi.common.utils.DateUtils; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.domain.BusiCategory; +import com.ruoyi.busi.mapper.BusiCategoryMapper; +import com.ruoyi.busi.service.IBusiCategoryService; +import com.ruoyi.busi.vo.BusiCategoryVO; +import com.ruoyi.busi.vo.ProdNewVO; +import com.ruoyi.common.core.domain.DlBaseEntity; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.busi.mapper.BusiCategoryMapper; -import com.ruoyi.busi.domain.BusiCategory; -import com.ruoyi.busi.service.IBusiCategoryService; + +import java.util.*; +import java.util.stream.Collectors; /** * 网站栏目Service业务层处理 - * - * @author vinjor-m + * + * @author pqz * @date 2025-06-19 */ @Service -public class BusiCategoryServiceImpl extends ServiceImpl implements IBusiCategoryService -{ +public class BusiCategoryServiceImpl extends ServiceImpl implements IBusiCategoryService { @Autowired private BusiCategoryMapper busiCategoryMapper; + + /** + * 树形结构查询网站栏目 + * + * @param category {@link BusiCategory} + * @return java.util.List + * @author PQZ + * @date 14:06 2025/6/23 + **/ @Override - public IPage queryListPage(BusiCategory pageReqVO, Page page) { - return busiCategoryMapper.queryListPage(pageReqVO, page); + public List treeCategory(BusiCategory category) { + //查询全部栏目 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(DlBaseEntity::getDelFlag,0) + .eq(BusiCategory::getTenantId,category.getTenantId()); + if(StringUtils.isNotEmpty(category.getCatgType())){ + lambdaQueryWrapper.eq(BusiCategory::getCatgType,category.getCatgType()); + } + if (!StringUtils.isEmpty(category.getCatgName())) { + lambdaQueryWrapper.like(BusiCategory::getCatgName, category.getCatgName()); + } + lambdaQueryWrapper.orderByAsc(BusiCategory::getSort); + List list = list(lambdaQueryWrapper); + List rtnList = buildCategoryTree(list); + return rtnList.stream().sorted(Comparator.comparing(BusiCategoryVO::getSort, + Comparator.nullsLast(Comparator.reverseOrder()))) + .collect(Collectors.toList()); + } + + /** + * 设置直接产品数、递归产品数 + * + * @author PQZ + * @date 14:12 2025/6/30 + **/ + @Override + public void setCategoryAmount(List list, String tenantId) { + Map idToProdsJunior = new HashMap<>(); + list.forEach(item -> { + idToProdsJunior.put(item.getCatgId(), item.getAmount()); + }); + //查询全部栏目 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(DlBaseEntity::getDelFlag, 0) + .eq(BusiCategory::getTenantId, tenantId); + List categoryList = list(lambdaQueryWrapper); + //遍历赋值 + categoryList.forEach(item -> { + item.setProdsJunior(idToProdsJunior.getOrDefault(item.getId(), 0)); + }); + List saveResult = computeProdsAll(categoryList); + updateBatchById(saveResult); + + } + + /** + * 统计每个节点的递归产品数,并返回更新后的列表 + * + * @param categoryList List + * @return java.util.List + * @author PQZ + * @date 15:07 2025/6/30 + **/ + private List computeProdsAll(List categoryList) { + if (categoryList == null || categoryList.isEmpty()) { + return categoryList; + } + + // 找到所有根节点(parentId为null) + List roots = new ArrayList<>(); + for (BusiCategory category : categoryList) { + if (category.getParentId() == null) { + roots.add(category); + } + } + // 遍历每个根节点,递归统计 + for (BusiCategory root : roots) { + calculateProdsAll(root, categoryList); + } + return categoryList; + } + + /** + * 递归计算子节点数据 + * + * @param node 根节点 + * @param categories 全部数据 + * @return java.lang.Integer + * @author PQZ + * @date 15:24 2025/6/30 + **/ + private static Integer calculateProdsAll(BusiCategory node, List categories) { + if (node == null) { + return 0; + } + Integer sum = 0; + for (BusiCategory child : getChildren(node, categories)) { + sum += calculateProdsAll(child, categories); + } + Integer currentProdsJunior = (node.getProdsJunior() != null) ? node.getProdsJunior() : 0; + node.setProdsAll(sum + currentProdsJunior); + return node.getProdsAll(); + } + + /** + * 获取某节点的子节点 + * + * @param parent 父节点 + * @param categories 所有栏目 + * @return java.util.List + * @author PQZ + * @date 15:24 2025/6/30 + **/ + private static List getChildren(BusiCategory parent, List categories) { + List children = new ArrayList<>(); + for (BusiCategory cat : categories) { + if (parent.getId().equals(cat.getParentId())) { + children.add(cat); + } + } + return children; + } + + + /** + * 生成树结构 + * + * @param list 网站栏目列表 + * @return java.util.List + * @author PQZ + * @date 14:11 2025/6/23 + **/ + private List buildCategoryTree(List list) { + // Map存放id到VO的映射 + Map idToNodeMap = new HashMap<>(); + // 先将所有节点转换为VO,并放入Map + for (BusiCategory category : list) { + BusiCategoryVO vo = new BusiCategoryVO(); + BeanUtils.copyProperties(category,vo); + vo.setId(category.getId()); + vo.setLabel(category.getCatgName()); + idToNodeMap.put(vo.getId(), vo); + } + List roots = new ArrayList<>(); + // 构建树 + for (BusiCategoryVO node : idToNodeMap.values()) { + String parentId = node.getParentId(); + if (parentId == null || parentId.trim().isEmpty() || !idToNodeMap.containsKey(parentId)) { + // 根节点 + roots.add(node); + } else { + // 作为父节点的子节点 + BusiCategoryVO parent = idToNodeMap.get(parentId); + parent.getChildren().add(node); + } + } + return roots; + } + + /** + * @param id 查询的栏目ID + * @return java.util.List + * @author vinjor-M + * @date 15:30 2025/7/8 + **/ + @Override + public List getAllChildrenId(String id) { + return baseMapper.selectAllChildren(id); + } + + /** + * 给所有子级设置最父级ID + * + * @param busiCategoryVOList TODO + * @return java.util.List + * @author vinjor-M + * @date 11:22 2025/7/19 + **/ + @Override + public List dealFirstId(List busiCategoryVOList) { + busiCategoryVOList.forEach(item->{ + String thisMaxParentId = item.getId(); + item.setMaxParentId(thisMaxParentId); + if(null!=item.getChildren() && !item.getChildren().isEmpty()){ + //有子级 + this.setChildMaxParentId(item.getChildren(),thisMaxParentId); + } + }); + return busiCategoryVOList; + } + + private void setChildMaxParentId(List childList,String maxParentId){ + childList.forEach(item->{ + item.setMaxParentId(maxParentId); + if(null!=item.getChildren()&& !item.getChildren().isEmpty()){ + this.setChildMaxParentId(item.getChildren(),maxParentId); + } + }); + } + + /** + * 给所有子级设置最父级ID并且反回map格式 + * @author vinjor-M + * @date 11:23 2025/7/19 + * @param busiCategoryVOList 栏目树 + * @return java.util.List + **/ + @Override + public Map dealFirstIdRtnMap(List busiCategoryVOList){ + Map rtnMap = new HashMap<>(); + busiCategoryVOList.forEach(item->{ + String thisMaxParentId = item.getId(); + item.setMaxParentId(thisMaxParentId); + rtnMap.put(item.getId(),thisMaxParentId); + if(null!=item.getChildren() && !item.getChildren().isEmpty()){ + //有子级 + this.setChildMaxParentIdMap(item.getChildren(),thisMaxParentId,rtnMap); + } + }); + return rtnMap; + } + + private void setChildMaxParentIdMap(List childList,String maxParentId,Map rtnMap){ + childList.forEach(item->{ + item.setMaxParentId(maxParentId); + rtnMap.put(item.getId(),maxParentId); + if(null!=item.getChildren()&& !item.getChildren().isEmpty()){ + this.setChildMaxParentIdMap(item.getChildren(),maxParentId,rtnMap); + } + }); } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatItemServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatItemServiceImpl.java new file mode 100644 index 0000000..20da8e0 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatItemServiceImpl.java @@ -0,0 +1,163 @@ +package com.ruoyi.busi.service.impl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.mapper.BusiChatMainMapper; +import com.ruoyi.busi.vo.ChatItemVO; +import com.ruoyi.common.core.domain.DlBaseEntity; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiChatItemMapper; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.busi.service.IBusiChatItemService; +import org.springframework.transaction.annotation.Transactional; + +import static com.ruoyi.constant.DictConstants.DATA_FROM_CUSTOMER; + +/** + * 在线聊天记录Service业务层处理 + * + * @author vinjor-m + * @date 2025-07-03 + */ +@Service +public class BusiChatItemServiceImpl extends ServiceImpl implements IBusiChatItemService +{ + @Autowired + private BusiChatItemMapper busiChatItemMapper; + @Autowired + private BusiChatMainMapper busiChatMainMapper; + @Autowired + private RedisCache redisCache; + + private static final String MESSAGE_CACHE_KEY = "im:messages:"; + // 24小时 + private static final Integer MESSAGE_CACHE_EXPIRE = 24 * 60 * 60; + + private static final String UNREAD_COUNT_KEY = "im:unread:"; + + @Override + public List queryList(BusiChatItem pageReqVO) { + return busiChatItemMapper.selectListData(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public BusiChatItem sendMessage(BusiChatItem message) { + message.setCreateTime(new Date()); + // 初始为未读 + message.setIsRead(0); + + baseMapper.insert(message); + + // 更新会话最后一条消息 + BusiChatMain session = new BusiChatMain(); + session.setId(message.getMainId()); + session.setLastMessage(message.getContent()); + session.setLastTime(new Date()); + session.setUpdateTime(new Date()); + busiChatMainMapper.updateById(session); + + // 更新缓存 + String messageCacheKey = MESSAGE_CACHE_KEY + message.getMainId(); + if(redisCache.hasKey(messageCacheKey)){ + redisCache.rightPush(messageCacheKey, message); + }else{ + List msgList = new ArrayList<>(); + msgList.add(message); + redisCache.setCacheList(messageCacheKey,msgList); + } + redisCache.expire(messageCacheKey, MESSAGE_CACHE_EXPIRE, TimeUnit.SECONDS); + + // 更新会话缓存 + String sessionCacheKey = "im:session:" + message.getMainId(); + redisCache.deleteObject(sessionCacheKey); + + // 更新未读计数 + String unreadKey = UNREAD_COUNT_KEY + message.getReceiverId() + ":" + message.getDataFrom(); + if (redisCache.hasKey(unreadKey)) { + redisCache.increment(unreadKey, 1); + }else{ + redisCache.setCacheObject(unreadKey, 1); + } + redisCache.expire(unreadKey, MESSAGE_CACHE_EXPIRE, TimeUnit.SECONDS); + + // 清除会话列表缓存 + if (DATA_FROM_CUSTOMER.equals(message.getDataFrom())) { + // 用户发送的消息,清除客服的会话列表缓存 + String serviceSessionsKey = "im:service_sessions:" + message.getReceiverId(); + redisCache.deleteObject(serviceSessionsKey); + } else { + // 客服发送的消息,不需要清除缓存,因为用户会话列表不常更新,可以根据实际需求决定是否清除 + } + + return message; + } + + @Override + public List selectBySessionId(String sessionId) { + // 先查缓存 + String cacheKey = MESSAGE_CACHE_KEY + sessionId; + List messages = redisCache.getCacheList(cacheKey); + + if (messages == null || messages.isEmpty()) { + // 缓存未命中,查数据库 + messages = busiChatItemMapper.selectBySessionId(sessionId); + if (messages != null && !messages.isEmpty()) { + // 存入缓存 + redisCache.setCacheList(cacheKey, messages); + redisCache.expire(cacheKey, MESSAGE_CACHE_EXPIRE, TimeUnit.SECONDS); + }else{ + messages = new ArrayList<>(); + } + } + return messages; + } + + @Override + public int selectUnreadCount(String mainId, String senderType) { + String cacheKey = UNREAD_COUNT_KEY + mainId + ":" + senderType; + Integer count = redisCache.getCacheObject(cacheKey); + + if (count == null) { + // 缓存未命中,查数据库 + count = busiChatItemMapper.selectUnreadCount(mainId, senderType); + redisCache.setCacheObject(cacheKey, count, MESSAGE_CACHE_EXPIRE, TimeUnit.SECONDS); + } + + return count != null ? count : 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean markAsRead(String sessionId, String receiverId) { + int rows = busiChatItemMapper.updateReadStatus(sessionId, receiverId); + + if (rows > 0) { + // 清除消息缓存,下次查询时会从数据库获取最新状态 + String messageCacheKey = MESSAGE_CACHE_KEY + sessionId; + redisCache.deleteObject(messageCacheKey); + + // 重新计算未读总数并更新缓存 + // 这里简化处理,实际可以只减去本次标记的数量 + // 用户发来的未读消息 + String unreadKeyUser = UNREAD_COUNT_KEY + receiverId + ":0"; + redisCache.deleteObject(unreadKeyUser); + int newCount = busiChatItemMapper.selectUnreadCount(receiverId, DATA_FROM_CUSTOMER); + redisCache.setCacheObject(unreadKeyUser, newCount, MESSAGE_CACHE_EXPIRE, TimeUnit.SECONDS); + } + + return rows > 0; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java new file mode 100644 index 0000000..d697ba8 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java @@ -0,0 +1,174 @@ +package com.ruoyi.busi.service.impl; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.base.service.IBaseManagerService; +import com.ruoyi.busi.mapper.BusiChatItemMapper; +import com.ruoyi.busi.service.IBusiChatItemService; +import com.ruoyi.busi.vo.ChatMainVO; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiChatMainMapper; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.service.IBusiChatMainService; +import org.springframework.transaction.annotation.Transactional; + +import static com.ruoyi.constant.DictConstants.DATA_FROM_CUSTOMER; + +/** + * 在线聊天Service业务层处理 + * + * @author vinjor-m + * @date 2025-07-03 + */ +@Service +public class BusiChatMainServiceImpl extends ServiceImpl implements IBusiChatMainService +{ + @Autowired + private BusiChatMainMapper busiChatMainMapper; + @Autowired + private IBusiChatItemService busiChatItemService; + @Autowired + private IBaseManagerService baseManagerService; + @Autowired + private RedisCache redisCache; + + private static final String SESSION_CACHE_KEY = "im:session:"; + // 24小时 + private static final Integer SESSION_CACHE_EXPIRE = 24 * 60 * 60; + + @Override + public IPage queryListPage(ChatMainVO pageReqVO, Page page) { + return busiChatMainMapper.queryListPage(pageReqVO, page); + } + + /** + * 校验是否需要新增 + * + * @param ip ip + * @param cusCode 浏览器唯一编码 + * @return void + * @author PQZ + * @date 15:31 2025/7/17 + **/ + @Override + public BusiChatMain queryByIpAndCusCode(String ip, String cusCode,String prodId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(BusiChatMain::getCusCode,cusCode) + .eq(BusiChatMain::getIp,ip); + //对应产品 + if (StringUtils.isNotEmpty(prodId)) { + lambdaQueryWrapper.eq(BusiChatMain::getProdId,prodId); + } + BusiChatMain chatMain = getOne(lambdaQueryWrapper); + return chatMain; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public BusiChatMain createSession(BusiChatMain session) { + // 为会话分配客服 + List userList = baseManagerService.getManagerUserByTenantId(session.getTenantId()); + //默认管理员为客服 + Long userId = 1L; + if(!userList.isEmpty()){ + userId = userList.get(0).getUserId(); + } + + session.setUserId(userId); + // 回话进行中 + session.setStatus(1); + session.setCreateTime(new Date()); + session.setUpdateTime(new Date()); + baseMapper.insert(session); + + // 更新缓存 + redisCache.setCacheObject(SESSION_CACHE_KEY + session.getId(), session, SESSION_CACHE_EXPIRE, TimeUnit.SECONDS); + return session; + } + + @Override + public List selectByServiceId(Long serviceId) { + // 先查缓存 + String cacheKey = "im:service_sessions:" + serviceId; + List sessions = redisCache.getCacheList(cacheKey); + + if (sessions == null || sessions.isEmpty()) { + // 缓存未命中,查数据库 + sessions = busiChatMainMapper.selectByServiceId(serviceId); + if(null!= sessions && sessions.size()>0){ + // 存入缓存,设置较短过期时间,避免缓存与数据库不一致 + redisCache.setCacheList(cacheKey, sessions); + redisCache.expire(cacheKey, 5, TimeUnit.MINUTES); + }else{ + sessions = new ArrayList<>(); + } + } + for (BusiChatMain session : sessions) { + session.setUnreadCount(busiChatItemService.selectUnreadCount(session.getId(),DATA_FROM_CUSTOMER)); + } + //对会话未读消息数量进行倒叙排列 + sessions.sort((o1, o2) -> o2.getUnreadCount() - o1.getUnreadCount()); + return sessions; + } + + @Override + public BusiChatMain selectActiveSession(String tenantId, String userIp, String deviceCode,String prodId) { + // 先查缓存 + String cacheKey = "im:active_session:" + tenantId + ":" + deviceCode; + if(null!=prodId){ + cacheKey+=":"+prodId; + } + BusiChatMain session = redisCache.getCacheObject(cacheKey); + + if (session == null) { + // 缓存未命中,查数据库 + session = busiChatMainMapper.selectActiveSession(tenantId, deviceCode,prodId); + if (session != null) { + // 存入缓存 + redisCache.setCacheObject(cacheKey, session, SESSION_CACHE_EXPIRE, TimeUnit.SECONDS); + } + } + + return session; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean closeSession(String sessionId) { + BusiChatMain session = baseMapper.selectById(sessionId); + if (session == null) { + return false; + } + // 已结束 + session.setStatus(2); + session.setUpdateTime(new Date()); + int rows = baseMapper.updateById(session); + + if (rows > 0) { + // 更新缓存 + redisCache.setCacheObject(SESSION_CACHE_KEY + sessionId, session, SESSION_CACHE_EXPIRE, TimeUnit.SECONDS); + // 清除相关缓存 + String serviceCacheKey = "im:service_sessions:" + session.getUserId(); + redisCache.deleteObject(serviceCacheKey); + + String activeCacheKey = "im:active_session:" + session.getTenantId() + ":" + session.getCusCode(); + if(StringUtils.isNotEmpty(session.getProdId())){ + activeCacheKey+=":"+session.getProdId(); + } + redisCache.deleteObject(activeCacheKey); + } + return rows > 0; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiInquiryItemServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiInquiryItemServiceImpl.java new file mode 100644 index 0000000..99e8106 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiInquiryItemServiceImpl.java @@ -0,0 +1,32 @@ +package com.ruoyi.busi.service.impl; + +import java.util.List; + +import com.ruoyi.busi.vo.InquiryItemVO; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiInquiryItemMapper; +import com.ruoyi.busi.domain.BusiInquiryItem; +import com.ruoyi.busi.service.IBusiInquiryItemService; + +/** + * 在线询盘记录Service业务层处理 + * + * @author vinjor-m + * @date 2025-07-10 + */ +@Service +public class BusiInquiryItemServiceImpl extends ServiceImpl implements IBusiInquiryItemService +{ + @Autowired + private BusiInquiryItemMapper busiInquiryItemMapper; + + @Override + public IPage queryListPage(InquiryItemVO pageReqVO, Page page) { + return busiInquiryItemMapper.queryListPage(pageReqVO, page); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java new file mode 100644 index 0000000..1f77150 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java @@ -0,0 +1,153 @@ +package com.ruoyi.busi.service.impl; + +import java.util.*; +import java.util.stream.Collectors; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiKeyword; +import com.ruoyi.busi.service.IBusiKeywordService; +import com.ruoyi.busi.vo.BusiKeywordItemQueryVO; +import com.ruoyi.busi.vo.BusiKeywordRankStatVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiKeywordItemMapper; +import com.ruoyi.busi.domain.BusiKeywordItem; +import com.ruoyi.busi.service.IBusiKeywordItemService; + +/** + * 关键词排名明细Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-21 + */ +@Service +public class BusiKeywordItemServiceImpl extends ServiceImpl implements IBusiKeywordItemService +{ + @Autowired + private BusiKeywordItemMapper busiKeywordItemMapper; + @Autowired + private IBusiKeywordService busiKeywordService; + + @Override + public IPage queryListPage(BusiKeywordItem pageReqVO, Page page) { + return busiKeywordItemMapper.queryListPage(pageReqVO, page); + } + + /** + * 获取所有关键词的google排名 + * + * @author vinjor-M + * @date 15:10 2025/8/21 + **/ + @Override + public void getKeywordRanking() { + Date nowDate = new Date(); + List keywordList = busiKeywordService.list(); + //删除今日所有的排名数据 + busiKeywordItemMapper.deleteBySelectDateInt(DateUtil.formatDate(nowDate)); + List insertList = new ArrayList<>(); + for (BusiKeyword keyword : keywordList) { + BusiKeywordItem busiKeywordItem = new BusiKeywordItem(); + busiKeywordItem.setTitle(keyword.getId()); + busiKeywordItem.setSelectDate(nowDate); + //TODO 调朱哥的接口获取排名 + busiKeywordItem.setRanking(1); + busiKeywordItem.setTenantId(keyword.getTenantId()); + insertList.add(busiKeywordItem); + } + if(!insertList.isEmpty()){ + this.saveBatch(insertList); + } + } + + @Override + public IPage selectKeywordRankStatPage(IPage page, BusiKeywordItemQueryVO queryVO) { + // 查询关键词数据 + IPage resultPage = busiKeywordItemMapper.selectKeywordPage( + page, + queryVO.getTitle(), + queryVO.getTenantId() + ); + + // 生成查询日期范围内的所有日期列表 + List dateList = generateDateList(queryVO.getBeginDate(), queryVO.getEndDate()); + + // 查询每个关键词的详细排名数据 + if (resultPage.getRecords() != null && !resultPage.getRecords().isEmpty()) { + List keywordIds = resultPage.getRecords().stream() + .map(BusiKeywordRankStatVO::getId) + .collect(Collectors.toList()); + + List rankDataList = busiKeywordItemMapper.selectRankDataByKeywordIds( + keywordIds, + queryVO.getBeginDate(), + queryVO.getEndDate(), + queryVO.getTenantId() + ); + + // 按关键词ID分组排名数据 + Map> keywordRankMap = + rankDataList.stream().collect(Collectors.groupingBy(BusiKeywordItemMapper.KeywordRankData::getKeywordId)); + + // 为每个关键词构建每日排名映射 + resultPage.getRecords().forEach(record -> { + Map dailyRankings = new LinkedHashMap<>(); + + // 初始化查询日期范围内的每一天,排名设为null + dateList.forEach(date -> dailyRankings.put(date, null)); + + // 填充实际有数据的排名 + List dataList = keywordRankMap.getOrDefault(record.getId(), new ArrayList<>()); + dataList.forEach(data -> dailyRankings.put(data.getSelectDate(), data.getRanking())); + + record.setDailyRankings(dailyRankings); + }); + } + return resultPage; + } + + + /** + * 生成日期范围内的所有日期列表 + * @param beginDate 开始日期 + * @param endDate 结束日期 + * @return 日期字符串列表 (yyyy-MM-dd格式) + */ + private List generateDateList(Date beginDate, Date endDate) { + List dateList = new ArrayList<>(); + if (beginDate == null || endDate == null) { + return dateList; + } + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(beginDate); + + while (!calendar.getTime().after(endDate)) { + dateList.add(DateUtil.format(calendar.getTime(), "yyyy-MM-dd")); + calendar.add(Calendar.DAY_OF_MONTH, 1); + } + + return dateList; + } + + @Override + public Map selectTodayRankStat(String tenantId) { + List> resultList = busiKeywordItemMapper.selectTodayRankStat(new Date(), tenantId); + + Map resultMap = new HashMap<>(); + resultMap.put("key1", 0); // 1-10名默认为0 + resultMap.put("key2", 0); // 11-20名默认为0 + + for (Map row : resultList) { + String rangeKey = (String) row.get("rangeKey"); + Integer count = ((Long) row.get("count")).intValue(); + resultMap.put(rangeKey, count); + } + + return resultMap; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java new file mode 100644 index 0000000..d6c86e7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java @@ -0,0 +1,80 @@ +package com.ruoyi.busi.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.mapper.BusiProdNewMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiKeywordMapper; +import com.ruoyi.busi.domain.BusiKeyword; +import com.ruoyi.busi.service.IBusiKeywordService; + +/** + * 站点使用的关键词Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-21 + */ +@Service +public class BusiKeywordServiceImpl extends ServiceImpl implements IBusiKeywordService +{ + @Autowired + private BusiKeywordMapper busiKeywordMapper; + @Autowired + private BusiProdNewMapper busiProdNewMapper; + + @Override + public IPage queryListPage(BusiKeyword pageReqVO, Page page) { + return busiKeywordMapper.queryListPage(pageReqVO, page); + } + + /** + * 检索全站使用的关键词 + * + * @author vinjor-M + * @date 14:26 2025/8/21 + **/ + @Override + public void getAllKeyword() { + //最近一次编辑产品或文章的时间 + Date newDate = busiProdNewMapper.selectNewDate(); + if(null==newDate){ + //没有新增或编辑文章,不需要采集 + return; + } + //最近一次插入关键词的时间 + Date insertDate = busiKeywordMapper.selectNewDate(); + if (null==insertDate || newDate.after(insertDate)) { + //当前时间 + Date nowDate = new Date(); + //编辑文章的时间晚于最近关键词插入的时间,需要采集关键词 + List dataList = busiProdNewMapper.selectDataByUpdateTime(null==insertDate?null:insertDate.toString()); + if(!dataList.isEmpty()){ + //使用的关键词不为空 + List insertList = new ArrayList<>(); + for (BusiProdNew prodNew : dataList){ + List thisKeywordList = Arrays.asList(prodNew.getProdKeyword().split(StrUtil.COMMA)); + thisKeywordList.forEach(item -> { + BusiKeyword keywordItem = new BusiKeyword(); + keywordItem.setId(item); + keywordItem.setTenantId(prodNew.getTenantId()); + keywordItem.setCreateTime(nowDate); + insertList.add(keywordItem); + }); + } + if(!insertList.isEmpty()){ + this.saveOrUpdateBatch(insertList); + } + } + } + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java new file mode 100644 index 0000000..acb5d13 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java @@ -0,0 +1,104 @@ +package com.ruoyi.busi.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.busi.utils.CommonUtils; +import com.ruoyi.busi.vo.BusiPageVO; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.constant.StrConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiPageMapper; +import com.ruoyi.busi.domain.BusiPage; +import com.ruoyi.busi.service.IBusiPageService; + +import javax.servlet.http.HttpServletRequest; + +/** + * 全站网页访问次数统计Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-07 + */ +@Service +public class BusiPageServiceImpl extends ServiceImpl implements IBusiPageService +{ + @Autowired + private BusiPageMapper busiPageMapper; + @Autowired + private CommonUtils commonUtils; + + @Override + public IPage queryListPage(BusiPage pageReqVO, Page page) { + return busiPageMapper.queryListPage(pageReqVO, page); + } + + /** + * 保存网页访问记录 + * + * @param busiPage TODO + * @author vinjor-M + * @date 11:13 2025/8/7 + **/ + @Override + public void pageSave(BusiPage busiPage) { + // 2. 异步保存到数据库(RuoYi已内置线程池) + CompletableFuture.runAsync(() -> { + Map ipMap = commonUtils.getCountryByIp(busiPage.getIp()); + busiPage.setNational(ipMap.get("national")); + busiPage.setOceania(ipMap.get("oceania")); + this.save(busiPage); + }); + } + + /** + * 查全站访问网页前十 + * + * @param busiPage TODO + * @return java.util.List + * @author vinjor-M + * @date 16:52 2025/8/7 + **/ + @Override + public List queryListNum(BusiPageVO busiPage) { + if(StringUtils.isNotEmpty(busiPage.getStartDate())){ + busiPage.setStartDate(busiPage.getStartDate()+ StrConstants.START_DATE); + } + if(StringUtils.isNotEmpty(busiPage.getEndDate())){ + busiPage.setEndDate(busiPage.getEndDate()+StrConstants.END_DATE); + } + List rtnList = new ArrayList<>(); + List dataList = busiPageMapper.selectListCus(busiPage); + // 1. 按 url 分组并统计数量 + Map countMap = dataList.stream() + .collect(Collectors.groupingBy( + // 分组字段 + BusiPageVO::getUrl, + // 统计数量 + Collectors.counting() + )); + // 2. 按数量降序排序,并取前10 + List> top10 = countMap.entrySet().stream() + // 降序排序 + .sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue())) + // 取前10 + .limit(10) + .collect(Collectors.toList()); + top10.forEach(item->{ + BusiPageVO pageVO = new BusiPageVO(); + pageVO.setUrl(item.getKey()); + pageVO.setNum(item.getValue()); + rtnList.add(pageVO); + }); + return rtnList; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdNewServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdNewServiceImpl.java new file mode 100644 index 0000000..151d338 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdNewServiceImpl.java @@ -0,0 +1,311 @@ +package com.ruoyi.busi.service.impl; + +import java.util.*; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ruoyi.busi.domain.BusiCategory; +import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.mapper.BusiProdRandomMapper; +import com.ruoyi.busi.service.IBusiCategoryService; +import com.ruoyi.busi.utils.SimHash; +import com.ruoyi.busi.utils.TextPreprocessor; +import com.ruoyi.busi.vo.*; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiProdNewMapper; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.service.IBusiProdNewService; + +import static com.ruoyi.constant.DictConstants.*; +import static com.ruoyi.constant.StrConstants.HASH_BITS; +import static com.ruoyi.constant.StrConstants.MAX_HAMMING_DISTANCE; + +/** + * 产品、文章Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-25 + */ +@Service +public class BusiProdNewServiceImpl extends ServiceImpl implements IBusiProdNewService +{ + @Autowired + private BusiProdNewMapper busiProdNewMapper; + @Autowired + private IBusiCategoryService categoryService; + @Autowired + private BusiProdRandomMapper prodRandomMapper; + + @Override + public IPage queryListPage(ProdNewVO pageReqVO, Page page) { + IPage newVOIPage = busiProdNewMapper.queryListPage(pageReqVO, page); + newVOIPage.getRecords().forEach(item->{ + if(null!=item.getPics() && !item.getPics().isEmpty()){ + //将附图追加到主图中 + item.setMainPic(item.getMainPic()+","+item.getPics()); + } + }); + return newVOIPage; + } + + /** + * 获取产品表当前最大排序 + * + * @param tenantId 站点id + * @return java.lang.Long + * @author vinjor-M + * @date 16:15 2025/6/25 + **/ + @Override + public Long getMaxSort(String tenantId,String dataType) { + Long sort = busiProdNewMapper.selectMaxSort(tenantId,dataType); + return null==sort?1:sort+1; + } + + /** + * 为网站栏目中递归产品数和下级产品数赋值 + * + * @author PQZ + * @date 14:03 2025/6/30 + **/ + @Override + public void setAmount(String tenantId) { + //统计各分类产品数量 + List list = busiProdNewMapper.getCatgAmount(tenantId); + if (!list.isEmpty()) { + categoryService.setCategoryAmount(list,tenantId); + } + } + + /** + * 首页数据统计接口 + * + * @param tenantId TODO + * @return java.util.Map + * @author vinjor-M + * @date 16:34 2025/7/4 + **/ + @Override + public Map getIndexData(String tenantId) { + Map rtnMap = new HashMap<>(); + Integer prodAll = 0; + Integer newsAll = 0; + Integer prodAdd = 0; + Integer prodEdit = 0; + Integer newsAdd = 0; + Integer newsEdit = 0; + List list = this.list(new LambdaQueryWrapper().eq(BusiProdNew::getTenantId,tenantId)); + //当前日期 + String nowDate = DateUtil.formatDate(new Date()); + for (BusiProdNew item:list){ + if(DATA_TYPE_PRODUCT.equals(item.getDataType())){ + //产品 + prodAll++; + if(null!=item.getCreateTime() && nowDate.equals(DateUtil.formatDate(item.getCreateTime()))){ + //今天添加的 + prodAdd++; + } + if(null!=item.getUpdateTime() && nowDate.equals(DateUtil.formatDate(item.getUpdateTime()))){ + prodEdit++; + } + }else if(DATA_TYPE_NEWS.equals(item.getDataType())){ + //文章 + newsAll++; + if(null!=item.getCreateTime() && nowDate.equals(DateUtil.formatDate(item.getCreateTime()))){ + //今天添加的 + newsAdd++; + } + if(null!=item.getUpdateTime() && nowDate.equals(DateUtil.formatDate(item.getUpdateTime()))){ + newsEdit++; + } + } + } + rtnMap.put("prodAll",prodAll); + rtnMap.put("newsAll",newsAll); + rtnMap.put("prodAdd",prodAdd); + rtnMap.put("prodEdit",prodEdit); + rtnMap.put("newsAdd",newsAdd); + rtnMap.put("newsEdit",newsEdit); + return rtnMap; + } + + /** + * 首页查询热门产品 + * + * @param tenantId 租户id + * @return java.util.List + * @author vinjor-M + * @date 11:33 2025/7/8 + **/ + @Override + public List hotProdOrNews(String tenantId,String dateType,Boolean ifHot) { + Page page = new Page<>(1, 10); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BusiProdNew::getTenantId,tenantId) + .eq(BusiProdNew::getDataType,dateType) + .eq(BusiProdNew::getIfPublic,true) + .eq(BusiProdNew::getIfReco,ifHot) + .orderByDesc(BusiProdNew::getSort); + //查所有栏目 + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + category.setCatgType(DATA_TYPE_PRODUCT.equals(dateType)?CATG_TYPE_CP:CATG_TYPE_WZ); + List busiCategoryVOList = categoryService.treeCategory(category); + //转map + Map catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList); + List rtnList= this.page(page,queryWrapper).getRecords(); + rtnList.forEach(item->item.setMaxCatgId(catgMap.getOrDefault(item.getCatgId(),""))); + return rtnList; + } + + /** + * web站点查看详情 + * + * @param id TODO + * @return com.ruoyi.busi.vo.WebDetailVO + * @author vinjor-M + * @date 16:07 2025/7/8 + **/ + @Override + public WebDetailVO getProdNewInfo(String id) { + WebDetailVO webDetailVO = new WebDetailVO(); + BusiProdNew prodNew = this.getById(id); + webDetailVO.setBusiProdNew(prodNew); + //关联的产品 + BusiProdRandom prodRandom = new ProdRandomVO(); + prodRandom.setProdId(id); + List randomList = prodRandomMapper.selectRandomList(prodRandom); + webDetailVO.setRandomList(randomList); + //上一个产品或新闻 + webDetailVO.setPrevious(busiProdNewMapper.selectPreOrNext(prodNew.getDataType(),prodNew.getSort(),"previous",prodNew.getTenantId(),prodNew.getCatgId())); + //下一个产品或新闻 + webDetailVO.setNext(busiProdNewMapper.selectPreOrNext(prodNew.getDataType(),prodNew.getSort(),"next",prodNew.getTenantId(),prodNew.getCatgId())); + return webDetailVO; + } + + /** + * 全站搜索产品和文章 + * + * @param tenantId 站点ID + * @param text 搜索内容 + * @param page 分页对象 + * @return com.baomidou.mybatisplus.core.metadata.IPage + * @author vinjor-M + * @date 13:55 2025/7/9 + **/ + @Override + public IPage searchTextAll(String tenantId, String text, Page page) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BusiProdNew::getTenantId,tenantId) + .eq(BusiProdNew::getIfPublic,true) + .and(wq->wq + .like(BusiProdNew::getTitle,text) + .or().like(BusiProdNew::getDescription,text) + .or().like(BusiProdNew::getContent,text)) + .orderByDesc(BusiProdNew::getSort); + IPage rtnPage = this.page(page,queryWrapper); + //查所有栏目 + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + List busiCategoryVOList = categoryService.treeCategory(category); + //转map + Map catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList); + rtnPage.getRecords().forEach(item->item.setMaxCatgId(catgMap.getOrDefault(item.getCatgId(),""))); + return rtnPage; + } + + /** + * 相似度检测 + * + * @param prodNewVO + * @return java.util.List + * @author vinjor-M + * @date 10:24 2025/7/18 + **/ + @Override + public List checkContent(ProdNewVO prodNewVO) { + //查出除了本产品/新闻以外的所有其他产品/新闻 + prodNewVO.setIfPublic(true); + if(StringUtils.isNotEmpty(prodNewVO.getId())){ + prodNewVO.setExcludeProdId(prodNewVO.getId()); + } + List list = busiProdNewMapper.selectCusList(prodNewVO); + //本产品/新闻的hash值 + long thisHash = SimHash.compute(TextPreprocessor.combineFields(prodNewVO.getTitle(),prodNewVO.getDescription(),prodNewVO.getContent())); + //相似的文章 + List similarArticles = new ArrayList<>(); + //遍历每一个产品/新闻 + for (ProdNewVO prodItem:list){ + if(null!=prodItem.getSimHash()){ + if (SimHash.isSimilar(thisHash, prodItem.getSimHash(), MAX_HAMMING_DISTANCE)) { + double similarity = 1 - (SimHash.hammingDistance(thisHash, prodItem.getSimHash()) / (double)HASH_BITS); + prodItem.setSimilarity(similarity); + prodItem.setSimilarityStr(String.format("%.2f%%", similarity * 100)); + similarArticles.add(prodItem); + } + } + } + // 按相似度降序排序 + similarArticles.sort((a, b) -> Double.compare(b.getSimilarity(), a.getSimilarity())); + return similarArticles; + } + + /** + * 获取站点分类地图 + * + * @param tenantId 站点编码 + * @param catgType 栏目类型 + * @return java.util.List + * @author vinjor-M + * @date 14:12 2025/8/4 + **/ + @Override + public List getSiteMap(String tenantId, String catgType) { + List rtnList = new ArrayList<>(); + //查所有栏目 + BusiCategory category = new BusiCategory(); + category.setTenantId(tenantId); + List busiCategoryVOList = categoryService.treeCategory(category); + //转map + Map catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList); + if(CATG_TYPE_XP.equals(catgType) || CATG_TYPE_DYM.equals(catgType)){ + //查所有询盘或单页面栏目 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BusiCategory::getTenantId,tenantId) + .eq(BusiCategory::getCatgType,catgType) + .orderByDesc(BusiCategory::getSort); + List list = categoryService.list(queryWrapper); + list.forEach(item->{ + SiteMapVO siteMapVO = new SiteMapVO(); + siteMapVO.setId(item.getId()); + siteMapVO.setTitle(item.getCatgName()); + siteMapVO.setUpdateTime(item.getUpdateTime()); + siteMapVO.setMaxCatgId(catgMap.getOrDefault(item.getId(),"")); + rtnList.add(siteMapVO); + }); + }else{ + //产品或文章 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(BusiProdNew::getTenantId,tenantId) + .eq(BusiProdNew::getDataType,CATG_TYPE_CP.equals(catgType)?DATA_TYPE_PRODUCT:DATA_TYPE_NEWS) + .eq(BusiProdNew::getIfPublic,true) + .orderByDesc(BusiProdNew::getSort); + List list = this.list(queryWrapper); + list.forEach(item->{ + SiteMapVO siteMapVO = new SiteMapVO(); + BeanUtils.copyProperties(item,siteMapVO); + siteMapVO.setMaxCatgId(catgMap.getOrDefault(item.getCatgId(),"")); + rtnList.add(siteMapVO); + }); + } + return rtnList; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdRandomServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdRandomServiceImpl.java new file mode 100644 index 0000000..193e086 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiProdRandomServiceImpl.java @@ -0,0 +1,58 @@ +package com.ruoyi.busi.service.impl; + +import java.util.List; + +import com.ruoyi.busi.vo.ProdNewVO; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiProdRandomMapper; +import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.service.IBusiProdRandomService; + +/** + * 随机产品关联关系Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-27 + */ +@Service +public class BusiProdRandomServiceImpl extends ServiceImpl implements IBusiProdRandomService +{ + @Autowired + private BusiProdRandomMapper busiProdRandomMapper; + + @Override + public IPage queryListPage(BusiProdRandom pageReqVO, Page page) { + return busiProdRandomMapper.queryListPage(pageReqVO, page); + } + + /** + * 查某产品的随机关联产品 + * + * @return java.util.List + * @author vinjor-M + * @date 16:35 2025/6/27 + **/ + @Override + public List randomList(BusiProdRandom prodRandom) { + return busiProdRandomMapper.selectRandomList(prodRandom); + } + + /** + * 删除产品关联的随机产品 + * + * @param prodId 产品id + * @param randomId 随机产品id + * @param tenantId 租户id + * @author vinjor-M + * @date 9:40 2025/6/30 + **/ + @Override + public void delProdRandom(String prodId, String randomId, String tenantId) { + busiProdRandomMapper.deleteProdRandom(prodId,randomId,tenantId); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiRelationServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiRelationServiceImpl.java new file mode 100644 index 0000000..22dfe51 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiRelationServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.busi.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiRelationMapper; +import com.ruoyi.busi.domain.BusiRelation; +import com.ruoyi.busi.service.IBusiRelationService; + +/** + * 产品、新闻等与员工关系Service业务层处理 + * + * @author vinjor-m + * @date 2025-06-30 + */ +@Service +public class BusiRelationServiceImpl extends ServiceImpl implements IBusiRelationService +{ + @Autowired + private BusiRelationMapper busiRelationMapper; + + @Override + public IPage queryListPage(BusiRelation pageReqVO, Page page) { + return busiRelationMapper.queryListPage(pageReqVO, page); + } + + /** + * 删除某产品的负责人 + * + * @param prodId TODO + * @param tenantId TODO + * @return java.lang.Integer + * @author vinjor-M + * @date 13:48 2025/6/30 + **/ + @Override + public Integer deleteByProdId(String prodId, String tenantId) { + return busiRelationMapper.deleteByProdId(prodId,tenantId); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiThirdItemServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiThirdItemServiceImpl.java new file mode 100644 index 0000000..8f03d48 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiThirdItemServiceImpl.java @@ -0,0 +1,369 @@ +package com.ruoyi.busi.service.impl; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.domain.BusiInquiryItem; +import com.ruoyi.busi.mapper.BusiChatMainMapper; +import com.ruoyi.busi.mapper.BusiInquiryItemMapper; +import com.ruoyi.busi.utils.CommonUtils; +import com.ruoyi.busi.vo.ChartDataVO; +import com.ruoyi.busi.vo.IndexInquiryVO; +import com.ruoyi.busi.vo.ThirdSoftVO; +import com.ruoyi.busi.vo.ThirdVO; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.constant.DictConstants; +import com.ruoyi.constant.StrConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiThirdItemMapper; +import com.ruoyi.busi.domain.BusiThirdItem; +import com.ruoyi.busi.service.IBusiThirdItemService; + +/** + * 三方程序跳转记录Service业务层处理 + * + * @author vinjor-m + * @date 2025-07-02 + */ +@Service +public class BusiThirdItemServiceImpl extends ServiceImpl implements IBusiThirdItemService +{ + @Autowired + private BusiThirdItemMapper busiThirdItemMapper; + @Autowired + private BusiInquiryItemMapper inquiryItemMapper; + @Autowired + private BusiChatMainMapper chatMainMapper; + + @Override + public IPage queryListPage(ThirdVO pageReqVO, Page page) { + if(StringUtils.isNotEmpty(pageReqVO.getStartDate())){ + pageReqVO.setStartDate(pageReqVO.getStartDate()+ StrConstants.START_DATE); + } + if(StringUtils.isNotEmpty(pageReqVO.getEndDate())){ + pageReqVO.setEndDate(pageReqVO.getEndDate()+StrConstants.END_DATE); + } + return busiThirdItemMapper.queryListPage(pageReqVO, page); + } + + /** + * 首页询盘总流量 + * + * @param tenantId TODO + * @return java.util.Map + * @author vinjor-M + * @date 16:25 2025/7/11 + **/ + @Override + public Map inquiryMap(String tenantId) { + Map rtnMap = new HashMap<>(); + /*1.所有日期*/ + //当前日期 + String nowDay = DateUtil.formatDate(new Date()); + String todayStart = nowDay+StrConstants.START_DATE; + String todayEnd = nowDay+StrConstants.END_DATE; + //昨日日期 + String yesterday = DateUtil.formatDate(DateUtil.offsetDay(new Date(),-1)); + String yesterdayStart = yesterday+StrConstants.START_DATE; + String yesterdayEnd = yesterday+StrConstants.END_DATE; + //近30日开始日期 + String monthStart = DateUtil.formatDate(DateUtil.offsetDay(new Date(),-30))+StrConstants.START_DATE; + String monthEnd = nowDay+StrConstants.END_DATE; + + /*2.1 三方IP数据*/ + //三方的IP总数 + Integer thirdNum = busiThirdItemMapper.selectIpCount(tenantId,null,null,null); + //今日三方IP总数 + Integer thirdNumToday = busiThirdItemMapper.selectIpCount(tenantId,null,todayStart,todayEnd); + //昨日三方IP总数 + Integer thirdNumYesterday = busiThirdItemMapper.selectIpCount(tenantId,null,yesterdayStart,yesterdayEnd); + //近30日三方IP总数 + Integer thirdNumMonth = busiThirdItemMapper.selectIpCount(tenantId,null,monthStart,monthEnd); + /*2.2 在线询盘IP数据*/ + //在线询盘的IP总数 + Integer formNum = inquiryItemMapper.selectIpCount(tenantId,null,null); + //今日在线询盘的IP总数 + Integer formNumToday = inquiryItemMapper.selectIpCount(tenantId,todayStart,todayEnd); + //昨日在线询盘IP总数 + Integer formNumYesterday = inquiryItemMapper.selectIpCount(tenantId,yesterdayStart,yesterdayEnd); + //近30日在线询盘IP总数 + Integer formNumMonth = inquiryItemMapper.selectIpCount(tenantId,monthStart,monthEnd); + /*2.3 在线聊天IP数据*/ + //在线询盘的IP总数 + Integer chatNum = chatMainMapper.selectIpCount(tenantId,null,null); + //今日在线询盘的IP总数 + Integer chatNumToday = chatMainMapper.selectIpCount(tenantId,todayStart,todayEnd); + //昨日在线询盘IP总数 + Integer chatNumYesterday = chatMainMapper.selectIpCount(tenantId,yesterdayStart,yesterdayEnd); + //近30日在线询盘IP总数 + Integer chatNumMonth = chatMainMapper.selectIpCount(tenantId,monthStart,monthEnd); + //组装IP数量 + rtnMap.put("ipNum",thirdNum+formNum+chatNum); + rtnMap.put("ipNumToday",thirdNumToday+formNumToday+chatNumToday); + rtnMap.put("ipNumYesterday",thirdNumYesterday+formNumYesterday+chatNumYesterday); + rtnMap.put("ipNumMonth",thirdNumMonth+formNumMonth+chatNumMonth); + + /*3.1 Teams 记录数*/ + Integer teamsNum = busiThirdItemMapper.selectIpCount(tenantId,"Teams",null,null); + /*3.2 WhatsApp 记录数*/ + Integer whatsAppNum = busiThirdItemMapper.selectIpCount(tenantId,"WhatsApp",null,null); + /*3.2 Email 记录数*/ + Integer emailNum = busiThirdItemMapper.selectIpCount(tenantId,"Email",null,null); + //组装询盘数量 + rtnMap.put("formNum",formNum); + rtnMap.put("chatNum",chatNum); + rtnMap.put("teamsNum",teamsNum); + rtnMap.put("whatsAppNum",whatsAppNum); + rtnMap.put("emailNum",emailNum); + rtnMap.put("inquiryNum",formNum+chatNum+teamsNum+whatsAppNum+emailNum); + return rtnMap; + } + + /** + * 查询询盘来源前十国家 + * + * @param tenantId 站点编码 + * @return java.util.List + * @author vinjor-M + * @date 10:47 2025/7/16 + **/ + @Override + public List nationalData(String tenantId,String startDate,String endDate,Integer num) { + //开始日期 + String startDateStr = null==startDate?null:startDate+StrConstants.START_DATE; + //截止日期 + String endDateStr = null==endDate?null:endDate+StrConstants.END_DATE; + //三方系统跳转 + List thirdList = busiThirdItemMapper.selectNationalSortList(tenantId,startDateStr,endDateStr); + //在线询盘 + List inquiryList = inquiryItemMapper.selectNationalSortList(tenantId,startDateStr,endDateStr); + //在线聊天 + List chatList = chatMainMapper.selectNationalSortList(tenantId,startDateStr,endDateStr); + //数据合并 + Map nationalMap = new HashMap<>(); + this.dealMapFun(thirdList,nationalMap); + this.dealMapFun(inquiryList,nationalMap); + this.dealMapFun(chatList,nationalMap); + //转list + List dataVOList = new ArrayList<>(nationalMap.values()) + .stream().sorted(Comparator.comparingInt(ChartDataVO::getValue).reversed()).collect(Collectors.toList()); + if(null!=num && dataVOList.size()>num){ + return dataVOList.subList(0,num); + } + return dataVOList; + } + + /** + * 通用将数据追加到map的方法 + * @author vinjor-M + * @date 10:58 2025/7/16 + * @param dataList 数据列表 + * @param nationalMap 国家map + **/ + private void dealMapFun(List dataList,Map nationalMap){ + dataList.forEach(item->{ + if(nationalMap.containsKey(item.getName())){ + ChartDataVO temp = nationalMap.get(item.getName()); + temp.setValue(temp.getValue()+item.getValue()); + nationalMap.put(item.getName(),temp); + }else{ + nationalMap.put(item.getName(),item); + } + }); + } + + /** + * 查询盘设备 + * + * @param tenantId 站点编码 + * @return java.util.List + * @author vinjor-M + * @date 15:15 2025/7/16 + **/ + @Override + public List equipmentData(String tenantId) { + //三方系统跳转 + List thirdList = busiThirdItemMapper.selectEquipmentSortList(tenantId); + //在线询盘 + List inquiryList = inquiryItemMapper.selectEquipmentSortList(tenantId); + //在线聊天 + List chatList = chatMainMapper.selectEquipmentSortList(tenantId); + //数据合并 + Map nationalMap = new HashMap<>(); + this.dealMapFun(thirdList,nationalMap); + this.dealMapFun(inquiryList,nationalMap); + this.dealMapFun(chatList,nationalMap); + //转list + List dataVOList = new ArrayList<>(nationalMap.values()) + .stream().sorted(Comparator.comparingInt(ChartDataVO::getValue).reversed()).collect(Collectors.toList()); + return dataVOList; + } + + /** + * 首页查询近30天询盘数 + * + * @param tenantId 站点编码 + * @return java.util.List + * @author vinjor-M + * @date 15:26 2025/7/16 + **/ + @Override + public List dataList(String tenantId) { + //三方软件按日期、类型数量列表 + List thirdSoftVOList = busiThirdItemMapper.selectThirdSoft(tenantId); + Map> thirdSoftMap = thirdSoftVOList.stream().collect(Collectors.groupingBy(ThirdSoftVO::getDate)); + //在线询盘的 + List inquiryItemVOList = inquiryItemMapper.selectinquiryItemVO(tenantId); + Map> inquiryItemMap = inquiryItemVOList.stream().collect(Collectors.groupingBy(ThirdSoftVO::getDate)); + //在线聊天的 + List chatVOList = chatMainMapper.selectChatVO(tenantId); + Map> chatVOmMap = chatVOList.stream().collect(Collectors.groupingBy(ThirdSoftVO::getDate)); + //返回数据类型 + List rtnList = new ArrayList<>(); + // 初始化一个日期变量,设置为今天 + DateTime date = DateUtil.date(); + // 遍历近30天,每天输出一次日期 + for (int i = 0; i < 30; i++) { + //当天日期 + String dateStr = DateUtil.formatDate(date); + IndexInquiryVO inquiryVO = new IndexInquiryVO(); + inquiryVO.setDate(dateStr); + //在线询盘数 + if(inquiryItemMap.containsKey(dateStr)){ + //有 + inquiryVO.setXunpan(inquiryItemMap.get(dateStr).get(0).getNum()); + }else{ + inquiryVO.setXunpan(0); + } + //在线聊天数 + if(chatVOmMap.containsKey(dateStr)){ + //有 + inquiryVO.setChat(chatVOmMap.get(dateStr).get(0).getNum()); + }else{ + inquiryVO.setChat(0); + } + if(thirdSoftMap.containsKey(dateStr)){ + //有数据 + Map thisMap = thirdSoftMap.get(dateStr).stream().collect(Collectors.toMap(ThirdSoftVO::getThirdSoft,ThirdSoftVO::getNum)); + inquiryVO.setTeams(thisMap.getOrDefault(DictConstants.THIRD_SOFT_TEAMS, 0)); + inquiryVO.setWhatsApp(thisMap.getOrDefault(DictConstants.THIRD_SOFT_WHATSAPP, 0)); + inquiryVO.setEmail(thisMap.getOrDefault(DictConstants.THIRD_SOFT_EMAIL, 0)); + }else{ + inquiryVO.setEmail(0); + inquiryVO.setWhatsApp(0); + inquiryVO.setTeams(0); + } + rtnList.add(inquiryVO); + // 将日期向前偏移一天 + date = DateUtil.offsetDay(date, -1); + } + return rtnList; + } + + /** + * 询盘走势 + * + * @param tenantId 站点编码 + * @param startDate 开始日期 + * @param endDate 结束日期 + * @return java.util.Map + * @author vinjor-M + * @date 17:12 2025/7/16 + **/ + @Override + public Map inquiryChart(String tenantId, String startDate, String endDate) { + Map rtnMap = new HashMap<>(); + //开始日期 + String startDateStr = startDate+StrConstants.START_DATE; + //截止日期 + String endDateStr = endDate+StrConstants.END_DATE; + //先查出这段时间所有三方询盘数据 + List thirdItemList = busiThirdItemMapper.selectLineChart(tenantId,startDateStr,endDateStr); + //这段时间所有在线询盘数据 + List inquiryItemList = inquiryItemMapper.selectLineChart(tenantId, startDateStr, endDateStr); + //这段时间所有在线聊天的数据 + List chatMainList = chatMainMapper.selectLineChart(tenantId, startDateStr, endDateStr); + //所有月份 + List yearMonthList = CommonUtils.getAllYearMonth(startDate, endDate); + List allNumList = new ArrayList<>(); + List emailNumList = new ArrayList<>(); + List whatsAppNumList = new ArrayList<>(); + List teamsNumList = new ArrayList<>(); + List chatNumList = new ArrayList<>(); + List inquiryNumList = new ArrayList<>(); + //遍历每个月份 + yearMonthList.forEach(item->{ + //本月总数 + Integer allNum = 0; + Integer emailNum = 0; + Integer whatsAppNum = 0; + Integer teamsNum = 0; + //先过滤三方询盘的 + List thirdFilterList = thirdItemList.stream().filter(thirdItem -> DateUtil.formatDate(thirdItem.getCreateTime()).contains(item)).collect(Collectors.toList()); + for (BusiThirdItem filter:thirdFilterList){ + if(DictConstants.THIRD_SOFT_EMAIL.equals(filter.getThirdSoft())){ + //email + emailNum++; + }else if(DictConstants.THIRD_SOFT_TEAMS.equals(filter.getThirdSoft())){ + //teams + teamsNum++; + }else if(DictConstants.THIRD_SOFT_WHATSAPP.equals(filter.getThirdSoft())){ + //whatsApp + whatsAppNum++; + } + } + //在线聊天数 + Integer chatNum = (int) chatMainList.stream().filter(thirdItem -> DateUtil.formatDate(thirdItem.getCreateTime()).contains(item)).count(); + //在线询盘数 + Integer inquiryNum = (int) inquiryItemList.stream().filter(thirdItem -> DateUtil.formatDate(thirdItem.getCreateTime()).contains(item)).count(); + allNum=emailNum+teamsNum+whatsAppNum+chatNum+inquiryNum; + allNumList.add(allNum); + emailNumList.add(emailNum); + whatsAppNumList.add(whatsAppNum); + teamsNumList.add(teamsNum); + chatNumList.add(chatNum); + inquiryNumList.add(inquiryNum); + }); + rtnMap.put("month",yearMonthList); + rtnMap.put("allNum",allNumList); + rtnMap.put("emailNum",emailNumList); + rtnMap.put("whatsAppNum",whatsAppNumList); + rtnMap.put("teamsNum",teamsNumList); + rtnMap.put("chatNum",chatNumList); + rtnMap.put("inquiryNum",inquiryNumList); + return rtnMap; + } + + /** + * 询盘国家分布 + * + * @param tenantId 站点编码 + * @param startDate 开始日期 + * @param endDate 结束日期 + * @return java.util.Map + * @author vinjor-M + * @date 17:12 2025/7/16 + **/ + @Override + public Map countryChart(String tenantId, String startDate, String endDate) { + Map rtnMap = new HashMap<>(); + //开始日期 + String startDateStr = startDate+StrConstants.START_DATE; + //截止日期 + String endDateStr = endDate+StrConstants.END_DATE; + //先查出这段时间所有三方询盘国家分布情况 + + return rtnMap; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java new file mode 100644 index 0000000..e4d75ce --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java @@ -0,0 +1,167 @@ +package com.ruoyi.busi.utils; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.base.service.IBaseNationalService; +import com.ruoyi.common.utils.StringUtils; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.lionsoul.ip2region.xdb.Searcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; +/** + * 通用方法 + * @author 马文杰 + * @version 1.0 + */ +@Component +@Slf4j +public class CommonUtils { + + @Autowired + private IBaseNationalService nationalService; + + private static final String UNKNOWN = "unknown"; + + /** + * 获取 IP地址 + * 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址 + * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址, + * X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; + } + + @SneakyThrows + public static String getAddr(String ip){ + ClassPathResource resource = new ClassPathResource("ip2region.xdb"); + InputStream inputStream = resource.getInputStream(); + String dbPath = "src/main/resources/ip2region.xdb"; + // 1、从 dbPath 加载整个 xdb 到内存。 + byte[] cBuff; + try { + cBuff = IOUtils.toByteArray(inputStream); + } catch (Exception e) { + log.info("failed to load content from %s: %s\n", dbPath, e); + return null; + } + + // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 + Searcher searcher; + try { + searcher = Searcher.newWithBuffer(cBuff); + } catch (Exception e) { + log.info("failed to create content cached searcher: %s\n", e); + return null; + } + // 3、查询 + try { + String region = searcher.search(ip); + return region; + } catch (Exception e) { + log.info("failed to search(%s): %s\n", ip, e); + } + return null; + } + + /** + * 获取给定的一个时间范围内的所有月份 + * @author vinjor-M + * @date 15:24 2025/7/17 + * @param startDate 开始日期 + * @param endDate 结束日期 + * @return java.util.List + **/ + public static List getAllYearMonth(String startDate,String endDate){ + //定期起始日期 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate startDateObj = LocalDate.parse(startDate,formatter); + LocalDate endDateObj = LocalDate.parse(endDate,formatter); + //获取所有年月 + List yearMonthList = new ArrayList<>(); + // 从起始日期开始,遍历到结束日期 + while (!startDateObj.isAfter(endDateObj)) { + // 只要startDate不晚于endDate 获取年-月格式 + yearMonthList.add(startDateObj.getYear() + "-" + String.format("%02d", startDateObj.getMonthValue())); + // 增加一个月 + startDateObj = startDateObj.plusMonths(1); + } + return yearMonthList; + } + + /** + * 根据请求查询IP、所属国家和洲 + * @author vinjor-M + * @date 15:48 2025/8/7 + * @return java.util.Map + **/ + public Map getIPAndCountry(HttpServletRequest request){ + Map rtnMap = new HashMap<>(); + String ip = ""; + String nationalStr = ""; + try { + ip = CommonUtils.getIpAddr(request); + nationalStr = CommonUtils.getAddr(ip); + } catch (Exception e) { + log.error("识别所属国家失败"); + } + ip = StringUtils.isNotEmpty(ip) ? ip : "未知"; + nationalStr = StringUtils.isNotEmpty(nationalStr) ? nationalStr : "未知"; + String national = nationalStr.split("\\|")[0]; + String oceania = "未知"; + Map nationalMap = nationalService.getNationalMap(); + if (nationalMap.containsKey(national)) { + oceania = nationalMap.get(national); + } + rtnMap.put("ip",ip); + rtnMap.put("national",national); + rtnMap.put("oceania",oceania); + return rtnMap; + } + + /** + * 根据IP查询所属国家和洲 + * @author vinjor-M + * @date 15:48 2025/8/7 + * @return java.util.Map + **/ + public Map getCountryByIp(String ip){ + Map rtnMap = new HashMap<>(); + String nationalStr = ""; + try { + nationalStr = CommonUtils.getAddr(ip); + } catch (Exception e) { + log.error("识别所属国家失败"); + } + nationalStr = StringUtils.isNotEmpty(nationalStr) ? nationalStr : "未知"; + String national = nationalStr.split("\\|")[0]; + String oceania = "未知"; + Map nationalMap = nationalService.getNationalMap(); + if (nationalMap.containsKey(national)) { + oceania = nationalMap.get(national); + } + rtnMap.put("national",national); + rtnMap.put("oceania",oceania); + return rtnMap; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java deleted file mode 100644 index 0737c58..0000000 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/NoticeUtils.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.ruoyi.busi.utils; -import cn.hutool.core.util.StrUtil; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; -/** - * 文本相似度对比 - * @author 朱春云 - * @version 1.0 - */ -@Component -public class NoticeUtils { - - /** - * 比较两个文本字符串的相似度 - * @param str1 文本1 - * @param str2 文本2 - * @return 相似度值,范围在0到1之间,值越大相似度越高 - */ - public static double computeJaccardSimilarity(String str1, String str2) { - if (str1 == null || str2 == null || (str1.isEmpty() && str2.isEmpty())) { - return 1.0; // 空字符串认为完全相同 - } - if (str1.isEmpty() || str2.isEmpty()) { - return 0.0; // 一个为空另一个非空,认为完全不同 - } - - Set set1 = Arrays.stream(str1.split("\\s+")).collect(Collectors.toSet()); - Set set2 = Arrays.stream(str2.split("\\s+")).collect(Collectors.toSet()); - - Set intersection = new HashSet<>(set1); - intersection.retainAll(set2); - - Set union = new HashSet<>(set1); - union.addAll(set2); // 正确的并集 - - if (union.isEmpty()) { - return 0.0; // 安全处理,避免除以零 - } - - return (double) intersection.size() / union.size(); - } - - /** - * 翻译通告的博主类型字典 - * @author vinjor-M - * @date 17:10 2025/3/25 - * @return java.lang.String - **/ - public String translateBloggerTypes(String bloggerTypes, Map categoryMap){ - List rtnList = new ArrayList<>(); - List bloggerTypeList = Arrays.asList(bloggerTypes.split(StrUtil.COMMA)); - bloggerTypeList.forEach(item->{ - if(categoryMap.get(item)!=null){ - rtnList.add(categoryMap.get(item)); - } - }); - return String.join(" ",rtnList); - } - - -} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/SimHash.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/SimHash.java new file mode 100644 index 0000000..24499a9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/SimHash.java @@ -0,0 +1,111 @@ +package com.ruoyi.busi.utils; +import java.util.*; + +import static com.ruoyi.constant.StrConstants.HASH_BITS; +import static com.ruoyi.constant.StrConstants.TOP_N; + +/** + * SimHash实现类 + * @author vinjor-M + * @date 17:25 2025/7/17 +**/ +public class SimHash { + + + /** + * 计算文本的SimHash值 + */ + public static long compute(String text) { + if (text == null || text.trim().isEmpty()) { + return 0L; + } + // 1. 分词并计算词频 + Map words = tokenize(text); + // 2. 初始化向量 + int[] v = new int[HASH_BITS]; + // 3. 计算每个词的哈希贡献 + for (Map.Entry entry : words.entrySet()) { + String word = entry.getKey(); + int weight = entry.getValue(); + // 计算词的哈希值 + long hash = hash(word); + // 更新向量 + for (int i = 0; i < HASH_BITS; i++) { + long mask = 1L << i; + if ((hash & mask) != 0) { + v[i] += weight; + } else { + v[i] -= weight; + } + } + } + // 4. 生成最终的SimHash值 + long simHash = 0; + for (int i = 0; i < HASH_BITS; i++) { + if (v[i] > 0) { + simHash |= 1L << i; + } + } + return simHash; + } + + /** + * 计算两个SimHash值的海明距离 + */ + public static int hammingDistance(long hash1, long hash2) { + long diff = hash1 ^ hash2; + int distance = 0; + + while (diff != 0) { + distance += diff & 1; + diff >>>= 1; + } + + return distance; + } + + /** + * 判断是否相似(根据海明距离) + */ + public static boolean isSimilar(long hash1, long hash2, int maxDistance) { + return hammingDistance(hash1, hash2) <= maxDistance; + } + + // 辅助方法:分词并计算词频(简化版,实际项目中可以使用更专业的分词工具) + private static Map tokenize(String text) { + String[] words = text.split("\\s+"); + Map wordCounts = new HashMap<>(); + + for (String word : words) { + if (word.length() > 1) { + // 忽略单字 + wordCounts.put(word, wordCounts.getOrDefault(word, 0) + 1); + } + } + + // 按词频排序,取权重最高的前TOP_N个词 + List> entries = new ArrayList<>(wordCounts.entrySet()); + entries.sort((a, b) -> b.getValue().compareTo(a.getValue())); + + Map topWords = new HashMap<>(); + for (int i = 0; i < Math.min(TOP_N, entries.size()); i++) { + topWords.put(entries.get(i).getKey(), entries.get(i).getValue()); + } + + return topWords; + } + + // 辅助方法:计算字符串的哈希值 + private static long hash(String source) { + if (source == null || source.isEmpty()) { + return 0; + } + + long hash = 0; + for (char c : source.toCharArray()) { + hash = (hash << 5) - hash + c; + } + + return hash; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/TextPreprocessor.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/TextPreprocessor.java new file mode 100644 index 0000000..442da82 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/TextPreprocessor.java @@ -0,0 +1,45 @@ +package com.ruoyi.busi.utils; +import org.apache.commons.lang3.StringUtils; +import org.jsoup.Jsoup; +/** + * 文本预处理工具类 + * @author vinjor-M + * @date 17:23 2025/7/17 +**/ +public class TextPreprocessor { + /** + * 预处理文本:清除HTML、转小写、去除非文字字符 + */ + public static String preprocess(String htmlContent) { + if (htmlContent == null || htmlContent.trim().isEmpty()) { + return ""; + } + // 1. 清除HTML标签 + String text = Jsoup.parse(htmlContent).text(); + // 2. 转换为小写 + text = text.toLowerCase(); + // 3. 移除标点符号和特殊字符(保留中文和英文) + text = text.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", " "); + // 4. 去除多余空格 + text = StringUtils.normalizeSpace(text); + return text; + } + + /** + * 合并多个字段的文本 + */ + public static String combineFields(String title, String summary, String content) { + StringBuilder sb = new StringBuilder(); + if (!StringUtils.isBlank(title)) { + sb.append(preprocess(title)).append(" "); + } + if (!StringUtils.isBlank(summary)) { + sb.append(preprocess(summary)).append(" "); + } + if (!StringUtils.isBlank(content)) { + // 内容字段已经包含HTML,需要特殊处理 + sb.append(preprocess(content)); + } + return sb.toString(); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiCategoryVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiCategoryVO.java new file mode 100644 index 0000000..8a7a461 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiCategoryVO.java @@ -0,0 +1,39 @@ +package com.ruoyi.busi.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.ruoyi.busi.domain.BusiCategory; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.DlBaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 网站栏目VO + * @author PQZ + * @date 14:03 2025/6/23 +**/ +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "BusiCategoryVO", description = "网站栏目分类") +@Data +public class BusiCategoryVO extends BusiCategory { + + private String label; + /** + * 最父级ID + */ + @ApiModelProperty("最父级ID") + private String maxParentId; + + /** + * 子集 + */ + @ApiModelProperty("子级栏目") + private List children = new ArrayList<>(); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiKeywordItemQueryVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiKeywordItemQueryVO.java new file mode 100644 index 0000000..b55ea24 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiKeywordItemQueryVO.java @@ -0,0 +1,26 @@ +package com.ruoyi.busi.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * 关键词排名查询参数VO + */ +@Data +public class BusiKeywordItemQueryVO { + /** 关键词模糊查询 */ + private String title; + + /** 查询开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date beginDate; + + /** 查询结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + /** 租户ID */ + private String tenantId; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiKeywordRankStatVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiKeywordRankStatVO.java new file mode 100644 index 0000000..ef75d0d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiKeywordRankStatVO.java @@ -0,0 +1,24 @@ + +package com.ruoyi.busi.vo; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 关键词排名统计结果VO + */ +@Data +public class BusiKeywordRankStatVO { + /** 关键词ID */ + private String id; + + /** 关键词标题 */ + private String title; + + /** 每日排名数据 Map<日期, 排名> */ + private Map dailyRankings; +} \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiPageVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiPageVO.java new file mode 100644 index 0000000..187a66d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiPageVO.java @@ -0,0 +1,19 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiPage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BusiPageVO extends BusiPage { + + /** 时间范围-开始 */ + private String startDate; + /** 时间范围-结束 */ + private String endDate; + /** 访问次数 */ + private Long num; + /** 是否归属中国 */ + private Boolean ifChina; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChartDataVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChartDataVO.java new file mode 100644 index 0000000..bf87046 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChartDataVO.java @@ -0,0 +1,16 @@ +package com.ruoyi.busi.vo; + +import lombok.Data; + +/** + * 国家分布饼图实体 + * @author vinjor-M + * @date 16:28 2025/7/17 +**/ +@Data +public class ChartDataVO { + /** 国家名称 */ + private String name; + /** 数量 */ + private Integer value; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatItemVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatItemVO.java new file mode 100644 index 0000000..67b0ed0 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatItemVO.java @@ -0,0 +1,13 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiChatItem; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ChatItemVO extends BusiChatItem { + /** 用户头像 */ + private String userImg; +} + diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatMainVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatMainVO.java new file mode 100644 index 0000000..d010375 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatMainVO.java @@ -0,0 +1,22 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiChatMain; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ChatMainVO extends BusiChatMain { + /** 产品名称 */ + private String prodName; + /** 用户名称 */ + private String userName; + + /** 站点名称 */ + private String siteName; + + /** 时间范围-开始 */ + private String startDate; + /** 时间范围-结束 */ + private String endDate; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/IndexInquiryVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/IndexInquiryVO.java new file mode 100644 index 0000000..dfd463c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/IndexInquiryVO.java @@ -0,0 +1,36 @@ +package com.ruoyi.busi.vo; + +import lombok.Data; + +/** + * 首页询盘数实体 + * @author vinjor-M + * @date 15:25 2025/7/16 +**/ +@Data +public class IndexInquiryVO { + /** + * 日期 + */ + private String date; + /** + * 在线询盘数 + */ + private Integer xunpan; + /** + * email数 + */ + private Integer email; + /** + * whatsApp数 + */ + private Integer whatsApp; + /** + * teams数 + */ + private Integer teams; + /** + * 在线聊天数 + */ + private Integer chat; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/InquiryItemVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/InquiryItemVO.java new file mode 100644 index 0000000..efc2345 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/InquiryItemVO.java @@ -0,0 +1,15 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiInquiryItem; +import com.ruoyi.busi.domain.BusiThirdItem; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class InquiryItemVO extends BusiInquiryItem { + /** 时间范围-开始 */ + private String startDate; + /** 时间范围-结束 */ + private String endDate; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdNewVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdNewVO.java new file mode 100644 index 0000000..98fe363 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdNewVO.java @@ -0,0 +1,52 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.base.domain.BasePics; +import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.common.annotation.Excel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +/** + * 产品、文章VO + * @author vinjor-M + * @date 14:49 2025/6/25 +**/ +@EqualsAndHashCode(callSuper = true) +@Data +public class ProdNewVO extends BusiProdNew { + /** 查询使用-需要排除的产品id,多个英文逗号隔开 */ + private String excludeProdId; + + /** 默认不可编辑-表格行内编辑标识 */ + private Boolean flag; + + /** 所属栏目名称 */ + @Excel(name = "所属栏目名称") + private String catgName; + + /** 产品发布者 */ + @Excel(name = "产品发布者") + private String userName; + + /** 产品负责人-多个英文逗号隔开 */ + @Excel(name = "产品负责人") + private String leaderName; + /** 产品负责人id-多个英文逗号隔开 */ + private String leaderId; + + /** 随机产品数量 */ + private Integer randomNum; + + /**同分类下产品数量*/ + private Integer amount; + /**文章相似度*/ + private Double similarity; + /**文章相似度*/ + private String similarityStr; + /** + * 批量传的图片 + **/ + private List fileList; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdRandomVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdRandomVO.java new file mode 100644 index 0000000..83a58ab --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ProdRandomVO.java @@ -0,0 +1,14 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiProdRandom; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ProdRandomVO extends BusiProdRandom { + /** 新增的关联产品id数组 */ + private List randomIdList; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/RelationVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/RelationVO.java new file mode 100644 index 0000000..65e29cc --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/RelationVO.java @@ -0,0 +1,12 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiRelation; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class RelationVO extends BusiRelation { + /** 产品负责人id-多个英文逗号隔开 */ + private String leaderId; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/SiteMapVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/SiteMapVO.java new file mode 100644 index 0000000..d49a6cd --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/SiteMapVO.java @@ -0,0 +1,42 @@ +package com.ruoyi.busi.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 站点地图使用VO + * @author vinjor-M + * @date 14:09 2025/8/4 +**/ +@Data +@ApiModel(value = "SiteMapVO", description = "站点地图使用VO") +public class SiteMapVO { + /** + * ID + */ + @ApiModelProperty("ID") + private String id; + /** + * 标题 + */ + @ApiModelProperty("标题") + private String title; + /** + * 所属栏目id + */ + @ApiModelProperty("所属栏目id") + private String catgId; + /** + * 最父级栏目ID + */ + @ApiModelProperty("最父级栏目ID") + private String maxCatgId; + /** + * 最后更新时间 + */ + @ApiModelProperty("最后更新时间") + private Date updateTime; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ThirdSoftVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ThirdSoftVO.java new file mode 100644 index 0000000..31fed6a --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ThirdSoftVO.java @@ -0,0 +1,19 @@ +package com.ruoyi.busi.vo; + +import lombok.Data; + +@Data +public class ThirdSoftVO { + /** + * 日期 + */ + private String date; + /** + * 三方软件 + */ + private String thirdSoft; + /** + * 数量 + */ + private Integer num; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ThirdVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ThirdVO.java new file mode 100644 index 0000000..107a4d4 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ThirdVO.java @@ -0,0 +1,19 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiThirdItem; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ThirdVO extends BusiThirdItem { + /** 产品名称 */ + private String prodName; + /** 时间范围-开始 */ + private String startDate; + /** 时间范围-结束 */ + private String endDate; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/WebDetailVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/WebDetailVO.java new file mode 100644 index 0000000..18c0861 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/WebDetailVO.java @@ -0,0 +1,39 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiCategory; +import com.ruoyi.busi.domain.BusiProdNew; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + + +@ApiModel(value = "WebDetailVO", description = "产品或新闻详情") +@Data +public class WebDetailVO { + /** + * 产品或文章详情 + */ + @ApiModelProperty("产品或文章详情") + private BusiProdNew busiProdNew; + + /** + * 关联的产品列表 + */ + @ApiModelProperty("关联的产品列表") + private List randomList; + + /** + * 上一个产品或新闻 + */ + @ApiModelProperty("上一个产品或新闻") + private BusiProdNew previous; + + /** + * 下一个产品或新闻 + */ + @ApiModelProperty("下一个产品或新闻") + private BusiProdNew next; +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/CompetitionEnum.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/CompetitionEnum.java new file mode 100644 index 0000000..e58c8d8 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/CompetitionEnum.java @@ -0,0 +1,58 @@ +package com.ruoyi.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 竞争程度枚举值 + * + * @author vinjor-m + */ +@AllArgsConstructor +@Getter +public enum CompetitionEnum { + /** + *UNSPECIFIED-未知 + */ + UNSPECIFIED("UNSPECIFIED","未知"), + /** + *UNKNOWN-未知 + */ + UNKNOWN("UNKNOWN","未知"), + /** + *LOW-低 + */ + LOW("LOW","低"), + /** + *MEDIUM-中 + */ + MEDIUM("MEDIUM","中"), + /** + *HIGH-高 + */ + HIGH("HIGH","高"); + + /** + * code + */ + private String code; + /** + * 标题 + */ + private String title; + /** + * 根据code返回对应的枚举 + * @author vinjor-M + * @date 14:23 2024/10/16 + * @param code code + **/ + public static CompetitionEnum getTitleByCode(String code) { + for (CompetitionEnum thisEnum : CompetitionEnum.values()) { + if (thisEnum.getCode().equalsIgnoreCase(code)) { + // 找到对应的枚举 + return thisEnum; + } + } + throw new IllegalArgumentException("无效的code:" + code); + } + } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java index 50e1060..46bed09 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/DictConstants.java @@ -12,11 +12,91 @@ import java.util.Locale; public class DictConstants { /** - * 博主类型字典key + * 图片所属分类字典-KEY */ - public static final String BLOGGER_TYPES_KEY ="dl_blogger_type"; + public static final String FILE_TYPE_KEY ="file_type"; + + /** + * 图片所属分类字典-产品 + */ + public static final String FILE_TYPE_PRODUCT ="product"; + /** + * 图片所属分类字典-新闻 + */ + public static final String FILE_TYPE_NEWS ="news"; + /** + * 图片所属分类字典-其他 + */ + public static final String FILE_TYPE_OTHER ="other"; + + /** + * 数据类型字典-KEY + */ + public static final String DATA_TYPE_KEY ="data_type"; + /** + * 数据类型字典-产品 + */ + public static final String DATA_TYPE_PRODUCT ="product"; + /** + * 数据类型字典-新闻 + */ + public static final String DATA_TYPE_NEWS ="news"; + /** + * 设备类型字典-KEY + */ + public static final String EQUIPMENT_TYPE_KEY ="equipment_type"; + /** + * 设备类型字典-移动端 + */ + public static final String EQUIPMENT_TYPE_PHONE ="移动端"; + /** + * 设备类型字典-电脑端 + */ + public static final String EQUIPMENT_TYPE_PC ="电脑端"; + + /** + * 三方软件类型字典-KEY + */ + public static final String THIRD_SOFT_KEY ="third_soft"; + /** + * 三方软件类型字典-Teams + */ + public static final String THIRD_SOFT_TEAMS ="Teams"; + /** + * 三方软件类型字典-WhatsApp + */ + public static final String THIRD_SOFT_WHATSAPP ="WhatsApp"; + /** + * 三方软件类型字典-Email + */ + public static final String THIRD_SOFT_EMAIL ="Email"; + + /** + * 栏目类型字典-KEY + */ + public static final String CATG_TYPE_KEY ="third_soft"; + /** + * 栏目类型字典-产品 + */ + public static final String CATG_TYPE_CP ="cp"; + /** + * 栏目类型字典-文章 + */ + public static final String CATG_TYPE_WZ ="wz"; + /** + * 栏目类型字典-询盘 + */ + public static final String CATG_TYPE_XP ="xp"; + /** + * 栏目类型字典-单页面 + */ + public static final String CATG_TYPE_DYM ="dym"; + /** + * APP菜单栏配置字典-KEY + */ + public static final String APP_MENU_KEY ="app_menu"; /** * 是否字典--是 */ @@ -25,4 +105,14 @@ public class DictConstants * 是否字典--否 */ public static final Integer YES_NO_NO = 0; + + + /** + * 消息发送方字典-KEY + */ + public static final String DATA_FROM_KEY ="data_from"; + /** + * 消息发送方字典-客户 + */ + public static final String DATA_FROM_CUSTOMER ="customer"; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java index f525007..2fa5edf 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/constant/StrConstants.java @@ -5,9 +5,35 @@ package com.ruoyi.constant; * * @author ruoyi */ -public class StrConstants -{ - +public class StrConstants { + /** + * 开始时间 + */ + public static final String START_DATE =" 00:00:00"; + /** + * 结束时间 + */ + public static final String END_DATE =" 23:59:59"; + /** + * 相似度阈值(海明距离),值越小越严格 + */ + public static final int MAX_HAMMING_DISTANCE = 3; + /** + * 哈希位数 + */ + public static final int HASH_BITS = 64; + /** + * 取权重最高的前N个词 + */ + public static final int TOP_N = 3; + /** + * 语言 + */ + public static final String LANGUAGE = "language"; + /** + * 国家 + */ + public static final String COUNTRY = "country"; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java new file mode 100644 index 0000000..260a51c --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java @@ -0,0 +1,39 @@ +package com.ruoyi.task; + +import cn.hutool.core.date.DateUtil; +import com.ruoyi.busi.service.IBusiKeywordItemService; +import com.ruoyi.busi.service.IBusiKeywordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 业务模块定时任务调度 + * + * @author vinjor-m + */ +@Component("busiTask") +public class BusiTask { + @Autowired + private IBusiKeywordService busiKeywordService; + @Autowired + private IBusiKeywordItemService busiKeywordItemService; + /** + * 更新本站使用的关键词 + * @author vinjor-M + * @date 14:51 2025/8/21 + **/ + public void updateKeyword() { + busiKeywordService.getAllKeyword(); + System.out.println("【"+ DateUtil.now() +"】执行更新本站使用关键词成功"); + } + + /** + * 更新本站使用的关键词的google排名 + * @author vinjor-M + * @date 14:51 2025/8/21 + **/ + public void updateKeywordRanking() { + busiKeywordItemService.getKeywordRanking(); + System.out.println("【"+ DateUtil.now() +"】执行更新本站使用关键词google排名成功"); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java index b0c1d9a..8b908b0 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java @@ -2,8 +2,10 @@ package com.ruoyi.ueditorConfig; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.framework.config.ServerConfig; +import com.ruoyi.web.controller.common.CommonController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,9 +31,11 @@ public class UeditorController { @Autowired private ServerConfig serverConfig; + @Autowired + private CommonController commonController; @RequestMapping(value = "/exec") - public String config(HttpServletRequest request, HttpServletResponse response, String action, MultipartFile[] upfile) throws IOException { + public String config(HttpServletRequest request, HttpServletResponse response, String action, MultipartFile[] upfile) throws Exception { if (action.equals("config")) { request.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "text/html"); @@ -43,42 +47,33 @@ public class UeditorController { } else if (action.equals("uploadimage")) { Map result = new HashMap(); for (MultipartFile multipartFile : upfile) { - String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile); - System.out.println("upload = " + upload); - System.out.println("upload.sub= " + upload.substring(upload.lastIndexOf("/"))); - result.put("title", upload.substring(upload.lastIndexOf("/")+1)); + AjaxResult ajaxResult = commonController.uploadFile(multipartFile); + result.put("title", multipartFile.getOriginalFilename()); result.put("original", multipartFile.getOriginalFilename()); result.put("state", "SUCCESS"); - result.put("url", serverConfig.getUrl()+upload); - String jStr = JSON.toJSONString(result); - return jStr; + result.put("url", ajaxResult.get("url")); + return JSON.toJSONString(result); } return null; }else if(action.equals("uploadvideo")){ Map result = new HashMap(); for (MultipartFile multipartFile : upfile) { - String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile); - System.out.println("upload = " + upload); - System.out.println("upload.sub = " + upload.substring(upload.lastIndexOf("/"))); - result.put("title", upload.substring(upload.lastIndexOf("/")+1)); + AjaxResult ajaxResult = commonController.uploadFile(multipartFile); + result.put("title", multipartFile.getOriginalFilename()); result.put("original", multipartFile.getOriginalFilename()); result.put("state", "SUCCESS"); - result.put("url", serverConfig.getUrl()+upload); - String jStr = JSON.toJSONString(result); - return jStr; + result.put("url", ajaxResult.get("url")); + return JSON.toJSONString(result); } }else{ Map result = new HashMap(); for (MultipartFile multipartFile : upfile) { - String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile); - System.out.println("upload = " + upload); - System.out.println("upload.sub= " + upload.substring(upload.lastIndexOf("/"))); - result.put("title", upload.substring(upload.lastIndexOf("/")+1)); + AjaxResult ajaxResult = commonController.uploadFile(multipartFile); + result.put("title", multipartFile.getOriginalFilename()); result.put("original", multipartFile.getOriginalFilename()); result.put("state", "SUCCESS"); - result.put("url", serverConfig.getUrl()+upload); - String jStr = JSON.toJSONString(result); - return jStr; + result.put("url", ajaxResult.get("url")); + return JSON.toJSONString(result); } } return null; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java new file mode 100644 index 0000000..076317d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java @@ -0,0 +1,13 @@ +package com.ruoyi.upload.service; + +import org.springframework.web.multipart.MultipartFile; + +public interface FileService { + /** + * 阿里云OSS文件上传 + * @param file + * @return + */ + String upload(MultipartFile file); + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..defbadd --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java @@ -0,0 +1,81 @@ +package com.ruoyi.upload.service.impl; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.PutObjectResult; +import com.ruoyi.common.config.OssConfig; +import com.ruoyi.upload.service.FileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +/** + * 文件上传业务类 + * + * @author lixiang + */ +@Service +@Slf4j +public class FileServiceImpl implements FileService { + @Autowired + private OssConfig ossConfig; + /** + * 阿里云OSS文件上传 + * + * @param file + * @return + */ + @Override + public String upload(MultipartFile file) { + //获取相关配置 + String bucketName = ossConfig.getBucketName(); + String endPoint = ossConfig.getEndPoint(); + String accessKeyId = ossConfig.getAccessKeyId(); + String accessKeySecret = ossConfig.getAccessKeySecret(); + + //创建OSS对象 + OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret); + + //获取原生文件名 + String originalFilename = file.getOriginalFilename(); + //JDK8的日期格式 + LocalDateTime time = LocalDateTime.now(); + DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + + //拼装OSS上存储的路径 + String folder = dft.format(time); + String fileName = generateUUID(); + String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); + + //在OSS上bucket下的文件名 + String uploadFileName = "user/" + folder + "/" + fileName + extension; + + try { + PutObjectResult result = ossClient.putObject(bucketName, uploadFileName, file.getInputStream()); + //拼装返回路径 + if (result != null) { + return "https://"+bucketName+"."+endPoint+"/"+uploadFileName; + } + } catch (IOException e) { + log.error("文件上传失败:{}",e.getMessage()); + } finally { + //OSS关闭服务,不然会造成OOM + ossClient.shutdown(); + } + return null; + } + + /** + * 获取随机字符串 + * @return + */ + private String generateUUID() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index cec5006..91dd1ca 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -1,9 +1,17 @@ package com.ruoyi.web.controller.common; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.upload.service.FileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +42,10 @@ public class CommonController @Autowired private ServerConfig serverConfig; + @Autowired + private ISysConfigService sysConfigService; + @Autowired + private FileService fileService; private static final String FILE_DELIMETER = ","; @@ -79,13 +91,32 @@ public class CommonController { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); - // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, file); - String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); - ajax.put("url", url); - ajax.put("fileName", fileName); - ajax.put("newFileName", FileUtils.getName(fileName)); + // 上传并返回新文件名称 + String uploadType = sysConfigService.selectConfigByKey("uploadType"); + if ("local".equals(uploadType)){ + //本地上传方式 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + }else if ("aliOss".equals(uploadType)){ + //阿里oss上传方式 + String fileUrl = fileService.upload(file); + long size = file.getSize()/1024; + BufferedImage bufferedImage = ImageIO.read(file.getInputStream()); + if(null!=bufferedImage){ + int width = bufferedImage.getWidth(); + int height = bufferedImage.getHeight(); + ajax.put("width", width); + ajax.put("height", height); + } + ajax.put("name", file.getOriginalFilename()); + ajax.put("size", size); + ajax.put("url", fileUrl); + ajax.put("fileName", fileUrl); + } ajax.put("originalFilename", file.getOriginalFilename()); return ajax; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java deleted file mode 100644 index 529f860..0000000 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ruoyi.web.controller.cos; - -import com.ruoyi.system.service.CosStsService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.security.PermitAll; -import java.util.Map; - -/** - * @Description: sts - * @Author: 86187 - * @Date: 2025/03/20 16:34 - * @Version: 1.0 - */ -@RestController -@RequestMapping("/cos") -@RequiredArgsConstructor -public class CosStsController { - - private final CosStsService cosStsService; - - /** - * 获取cos临时密钥 - * - * @return sts - */ - @GetMapping("/sts") - @PermitAll - public Map getCosSts() { - return cosStsService.getTempKeys(); - } -} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index ac11e40..3bccc03 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -7,6 +7,7 @@ import java.security.NoSuchAlgorithmException; import java.security.spec.AlgorithmParameterSpec; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Set; import com.alibaba.fastjson2.JSONObject; @@ -76,9 +77,10 @@ public class SysLoginController { AjaxResult ajax = AjaxResult.success(); // 生成令牌 - String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + Map map = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid()); - ajax.put(Constants.TOKEN, token); + ajax.put(Constants.TOKEN, map.get("token")); + ajax.put(Constants.JWT_USERID,map.get("userId")); return ajax; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java index b4f6bac..ca4d77b 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java @@ -27,7 +27,6 @@ import io.swagger.annotations.ApiOperation; * * @author ruoyi */ -@Api("用户信息管理") @RestController @RequestMapping("/test/user") public class TestController extends BaseController @@ -38,7 +37,6 @@ public class TestController extends BaseController users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); } - @ApiOperation("获取用户列表") @GetMapping("/list") public R> userList() { @@ -46,8 +44,6 @@ public class TestController extends BaseController return R.ok(userList); } - @ApiOperation("获取用户详细") - @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) @GetMapping("/{userId}") public R getUser(@PathVariable Integer userId) { @@ -61,13 +57,6 @@ public class TestController extends BaseController } } - @ApiOperation("新增用户") - @ApiImplicitParams({ - @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), - @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), - @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), - @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) - }) @PostMapping("/save") public R save(UserEntity user) { @@ -79,7 +68,6 @@ public class TestController extends BaseController return R.ok(); } - @ApiOperation("更新用户") @PutMapping("/update") public R update(@RequestBody UserEntity user) { @@ -96,8 +84,6 @@ public class TestController extends BaseController return R.ok(); } - @ApiOperation("删除用户信息") - @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) @DeleteMapping("/{userId}") public R delete(@PathVariable Integer userId) { diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java index 42ab510..9d4c616 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -113,9 +113,9 @@ public class SwaggerConfig // 用ApiInfoBuilder进行定制 return new ApiInfoBuilder() // 设置标题 - .title("标题:通告快接管理后台_接口文档") + .title("标题:成事达管理后台_接口文档") // 描述 - .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") +// .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") // 作者信息 .contact(new Contact(ruoyiConfig.getName(), null, null)) // 版本 diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/ImWebSocketServer.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/ImWebSocketServer.java new file mode 100644 index 0000000..ee0a6be --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/ImWebSocketServer.java @@ -0,0 +1,225 @@ +package com.ruoyi.webSocket; + +import com.alibaba.fastjson2.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * @Date: 2019/1/11 11:48 + * @Description: websocket 服务类 + */ + +/** + * + * @ServerEndpoint 这个注解有什么作用? + * + * 这个注解用于标识作用在类上,它的主要功能是把当前类标识成一个WebSocket的服务端 + * 注解的值用户客户端连接访问的URL地址 + * + */ + +@Component +@ServerEndpoint("/ws/asset/{userId}") +public class ImWebSocketServer { + + private static final Logger log = LoggerFactory.getLogger(ImWebSocketServer.class); + + // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 + private static int onlineCount = 0; + + // concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 + private static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + + // 存放客服对应的用户会话 + private static ConcurrentHashMap> serviceUserMap = new ConcurrentHashMap<>(); + + // 与某个客户端的连接会话,需要通过它来给客户端发送数据 + private Session session; + + // 连接的用户ID + private String userId; + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("userId") String userId) { + this.session = session; + this.userId = userId; + + // 添加到连接映射 + if (webSocketMap.containsKey(userId)) { + webSocketMap.remove(userId); + webSocketMap.put(userId, this); + } else { + webSocketMap.put(userId, this); + addOnlineCount(); // 在线数加1 + } + + log.info("用户连接:" + userId + ",当前在线人数为:" + getOnlineCount()); + + try { + sendMessage("连接成功"); + } catch (IOException e) { + log.error("用户:" + userId + ",网络异常!!!!!!"); + } + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose() { + if (webSocketMap.containsKey(userId)) { + webSocketMap.remove(userId); + subOnlineCount(); // 在线数减1 + } + + // 清除客服-用户映射 + for (CopyOnWriteArraySet userSet : serviceUserMap.values()) { + if (userSet.contains(userId)) { + userSet.remove(userId); + break; + } + } + + log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount()); + } + + /** + * 收到客户端消息后调用的方法 + * + * @param message 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String message, Session session) { + + // 可以群发消息 + // 消息解析 + try { + JSONObject jsonObject = JSONObject.parseObject(message); + // 消息类型:1-普通消息,2-建立会话,3-关闭会话 + int type = jsonObject.getIntValue("type"); + String toUserId = jsonObject.getString("toUserId"); + String content = jsonObject.getString("content"); + + // 根据消息类型处理 + switch (type) { + case 1: + // 普通消息,转发给目标用户 + sendToUser(toUserId, message); + break; + case 2: + // 建立会话,记录客服与用户关系 + String sessionId = jsonObject.getString("sessionId"); + addServiceUserRelation(toUserId, userId); + // 通知客服有新会话 + JSONObject notifyObj = new JSONObject(); + notifyObj.put("type", 3); // 新会话通知 + notifyObj.put("sessionId", sessionId); + notifyObj.put("fromUserId", userId); + notifyObj.put("message", "有新的咨询请求"); + sendToUser(toUserId, notifyObj.toString()); + break; + case 3: + // 关闭会话,清除客服与用户关系 + removeServiceUserRelation(toUserId, userId); + sendToUser(toUserId, message); + break; + default: + // 其他类型消息处理 + break; + } + } catch (Exception e) { + log.error("消息处理异常", e); + } + } + + /** + * 发生错误时调用 + */ + @OnError + public void onError(Session session, Throwable error) { + log.error("用户错误:" + this.userId + ",原因:" + error.getMessage()); + error.printStackTrace(); + } + + /** + * 向客户端发送消息 + */ + public void sendMessage(String message) throws IOException { + this.session.getBasicRemote().sendText(message); + } + + /** + * 发送消息给指定用户 + */ + public static void sendToUser(String userId, String message) { + if (webSocketMap.containsKey(userId)) { + try { + webSocketMap.get(userId).sendMessage(message); + } catch (IOException e) { + log.error("发送消息给用户[" + userId + "]失败", e); + } + } else { + log.warn("用户[" + userId + "]不在线"); + } + } + + /** + * 发送消息给客服的所有用户 + */ + public static void sendToServiceUsers(String serviceId, String message) { + CopyOnWriteArraySet userSet = serviceUserMap.get(serviceId); + if (userSet != null && !userSet.isEmpty()) { + for (String userId : userSet) { + sendToUser(userId, message); + } + } + } + + /** + * 添加客服与用户的关系 + */ + private void addServiceUserRelation(String serviceId, String userId) { + CopyOnWriteArraySet userSet = serviceUserMap.get(serviceId); + if (userSet == null) { + userSet = new CopyOnWriteArraySet<>(); + serviceUserMap.put(serviceId, userSet); + } + userSet.add(userId); + } + + /** + * 移除客服与用户的关系 + */ + private void removeServiceUserRelation(String serviceId, String userId) { + CopyOnWriteArraySet userSet = serviceUserMap.get(serviceId); + if (userSet != null) { + userSet.remove(userId); + if (userSet.isEmpty()) { + serviceUserMap.remove(serviceId); + } + } + } + + public static synchronized int getOnlineCount() { + return onlineCount; + } + + public static synchronized void addOnlineCount() { + ImWebSocketServer.onlineCount++; + } + + public static synchronized void subOnlineCount() { + ImWebSocketServer.onlineCount--; + } +} \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketConfig.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketConfig.java new file mode 100644 index 0000000..5f615fa --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/webSocket/WebSocketConfig.java @@ -0,0 +1,14 @@ +package com.ruoyi.webSocket; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/xdb/Header.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/xdb/Header.java new file mode 100644 index 0000000..c1c6839 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/xdb/Header.java @@ -0,0 +1,38 @@ +// Copyright 2022 The Ip2Region Authors. All rights reserved. +// Use of this source code is governed by a Apache2.0-style +// license that can be found in the LICENSE file. +// @Author Lion +// @Date 2022/06/23 + +package com.ruoyi.xdb; + +import org.lionsoul.ip2region.xdb.Searcher; + +public class Header { + public final int version; + public final int indexPolicy; + public final int createdAt; + public final int startIndexPtr; + public final int endIndexPtr; + public final byte[] buffer; + + public Header(byte[] buff) { + assert buff.length >= 16; + version = Searcher.getInt2(buff, 0); + indexPolicy = Searcher.getInt2(buff, 2); + createdAt = Searcher.getInt(buff, 4); + startIndexPtr = Searcher.getInt(buff, 8); + endIndexPtr = Searcher.getInt(buff, 12); + buffer = buff; + } + + @Override public String toString() { + return "{" + + "Version: " + version + ',' + + "IndexPolicy: " + indexPolicy + ',' + + "CreatedAt: " + createdAt + ',' + + "StartIndexPtr: " + startIndexPtr + ',' + + "EndIndexPtr: " + endIndexPtr + + '}'; + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/xdb/Searcher.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/xdb/Searcher.java new file mode 100644 index 0000000..6bc6512 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/xdb/Searcher.java @@ -0,0 +1,281 @@ +// Copyright 2022 The Ip2Region Authors. All rights reserved. +// Use of this source code is governed by a Apache2.0-style +// license that can be found in the LICENSE file. + +package com.ruoyi.xdb; + +// xdb searcher (Not thread safe implementation) +// @Author Lion +// @Date 2022/06/23 + + +import org.lionsoul.ip2region.xdb.Header; + +import java.io.IOException; +import java.io.RandomAccessFile; + +public class Searcher { + // constant defined copied from the xdb maker + public static final int HeaderInfoLength = 256; + public static final int VectorIndexRows = 256; + public static final int VectorIndexCols = 256; + public static final int VectorIndexSize = 8; + public static final int SegmentIndexSize = 14; + + // random access file handle for file based search + private final RandomAccessFile handle; + + private int ioCount = 0; + + // vector index. + // use the byte[] instead of VectorIndex entry array to keep + // the minimal memory allocation. + private final byte[] vectorIndex; + + // xdb content buffer, used for in-memory search + private final byte[] contentBuff; + + // --- static method to create searchers + + public static Searcher newWithFileOnly(String dbPath) throws IOException { + return new Searcher(dbPath, null, null); + } + + public static Searcher newWithVectorIndex(String dbPath, byte[] vectorIndex) throws IOException { + return new Searcher(dbPath, vectorIndex, null); + } + + public static Searcher newWithBuffer(byte[] cBuff) throws IOException { + return new Searcher(null, null, cBuff); + } + + // --- End of creator + + public Searcher(String dbFile, byte[] vectorIndex, byte[] cBuff) throws IOException { + if (cBuff != null) { + this.handle = null; + this.vectorIndex = null; + this.contentBuff = cBuff; + } else { + this.handle = new RandomAccessFile(dbFile, "r"); + this.vectorIndex = vectorIndex; + this.contentBuff = null; + } + } + + public void close() throws IOException { + if (this.handle != null) { + this.handle.close(); + } + } + + public int getIOCount() { + return ioCount; + } + + public String search(String ipStr) throws Exception { + long ip = checkIP(ipStr); + return search(ip); + } + + public String search(long ip) throws IOException { + // reset the global counter + this.ioCount = 0; + + // locate the segment index block based on the vector index + long sPtr = 0, ePtr = 0; + int il0 = (int) ((ip >> 24) & 0xFF); + int il1 = (int) ((ip >> 16) & 0xFF); + int idx = il0 * VectorIndexCols * VectorIndexSize + il1 * VectorIndexSize; + // System.out.printf("il0: %d, il1: %d, idx: %d\n", il0, il1, idx); + if (vectorIndex != null) { + sPtr = getIntLong(vectorIndex, idx); + ePtr = getIntLong(vectorIndex, idx + 4); + } else if (contentBuff != null) { + sPtr = getIntLong(contentBuff, HeaderInfoLength + idx); + ePtr = getIntLong(contentBuff, HeaderInfoLength + idx + 4); + } else { + final byte[] buff = new byte[VectorIndexSize]; + read(HeaderInfoLength + idx, buff); + sPtr = getIntLong(buff, 0); + ePtr = getIntLong(buff, 4); + } + + // System.out.printf("sPtr: %d, ePtr: %d\n", sPtr, ePtr); + + // binary search the segment index block to get the region info + final byte[] buff = new byte[SegmentIndexSize]; + int dataLen = -1; + long dataPtr = -1, l = 0, h = (ePtr - sPtr) / SegmentIndexSize; + while (l <= h) { + long m = (l + h) >> 1; + long p = sPtr + m * SegmentIndexSize; + + // read the segment index + read(p, buff); + long sip = getIntLong(buff, 0); + if (ip < sip) { + h = m - 1; + } else { + long eip = getIntLong(buff, 4); + if (ip > eip) { + l = m + 1; + } else { + dataLen = getInt2(buff, 8); + dataPtr = getIntLong(buff, 10); + break; + } + } + } + + // empty match interception + // System.out.printf("dataLen: %d, dataPtr: %d\n", dataLen, dataPtr); + if (dataPtr < 0) { + return null; + } + + // load and return the region data + final byte[] regionBuff = new byte[dataLen]; + read(dataPtr, regionBuff); + return new String(regionBuff, "utf-8"); + } + + protected void read(long offset, byte[] buffer) throws IOException { + // check the in-memory buffer first + if (contentBuff != null) { + // @TODO: reduce data copying, directly decode the data ? + // @TODO: added by Leon at 2025/06/10, when offset is negative and the content byte is not going to work. + // we need a better solution for the content buffer which is greater than (2^31 - 1 << 2) + int int_idx = (int) offset; + if (int_idx < 0) { + throw new IOException("No content buffer policy for NOW since the xdb is too large, use file or vectorIndex instead"); + } + + System.arraycopy(contentBuff, int_idx, buffer, 0, buffer.length); + return; + } + + // read from the file handle + assert handle != null; + handle.seek(offset); + + this.ioCount++; + int rLen = handle.read(buffer); + if (rLen != buffer.length) { + throw new IOException("incomplete read: read bytes should be " + buffer.length); + } + } + + // --- static cache util function + + public static org.lionsoul.ip2region.xdb.Header loadHeader(RandomAccessFile handle) throws IOException { + handle.seek(0); + final byte[] buff = new byte[HeaderInfoLength]; + handle.read(buff); + return new org.lionsoul.ip2region.xdb.Header(buff); + } + + public static org.lionsoul.ip2region.xdb.Header loadHeaderFromFile(String dbPath) throws IOException { + final RandomAccessFile handle = new RandomAccessFile(dbPath, "r"); + final Header header = loadHeader(handle); + handle.close(); + return header; + } + + public static byte[] loadVectorIndex(RandomAccessFile handle) throws IOException { + handle.seek(HeaderInfoLength); + int len = VectorIndexRows * VectorIndexCols * VectorIndexSize; + final byte[] buff = new byte[len]; + int rLen = handle.read(buff); + if (rLen != len) { + throw new IOException("incomplete read: read bytes should be " + len); + } + + return buff; + } + + public static byte[] loadVectorIndexFromFile(String dbPath) throws IOException { + final RandomAccessFile handle = new RandomAccessFile(dbPath, "r"); + final byte[] vIndex = loadVectorIndex(handle); + handle.close(); + return vIndex; + } + + public static byte[] loadContent(RandomAccessFile handle) throws IOException { + handle.seek(0); + final byte[] buff = new byte[(int) handle.length()]; + int rLen = handle.read(buff); + if (rLen != buff.length) { + throw new IOException("incomplete read: read bytes should be " + buff.length); + } + + return buff; + } + + public static byte[] loadContentFromFile(String dbPath) throws IOException { + final RandomAccessFile handle = new RandomAccessFile(dbPath, "r"); + final byte[] content = loadContent(handle); + handle.close(); + return content; + } + + // --- End cache load util function + + // --- static util method + + /* get an int from a byte array start from the specified offset */ + public static long getIntLong(byte[] b, int offset) { + return ( + ((b[offset++] & 0x000000FFL)) | + ((b[offset++] << 8) & 0x0000FF00L) | + ((b[offset++] << 16) & 0x00FF0000L) | + ((b[offset ] << 24) & 0xFF000000L) + ); + } + + public static int getInt(byte[] b, int offset) { + return ( + ((b[offset++] & 0x000000FF)) | + ((b[offset++] << 8) & 0x0000FF00) | + ((b[offset++] << 16) & 0x00FF0000) | + ((b[offset ] << 24) & 0xFF000000) + ); + } + + public static int getInt2(byte[] b, int offset) { + return ( + ((b[offset++] & 0x000000FF)) | + ((b[offset ] << 8) & 0x0000FF00) + ); + } + + /* long int to ip string */ + public static String long2ip( long ip ) + { + return String.valueOf((ip >> 24) & 0xFF) + '.' + + ((ip >> 16) & 0xFF) + '.' + ((ip >> 8) & 0xFF) + '.' + ((ip) & 0xFF); + } + + public static final byte[] shiftIndex = {24, 16, 8, 0}; + + /* check the specified ip address */ + public static long checkIP(String ip) throws Exception { + String[] ps = ip.split("\\."); + if (ps.length != 4) { + throw new Exception("invalid ip address `" + ip + "`"); + } + + long ipDst = 0; + for (int i = 0; i < ps.length; i++) { + int val = Integer.parseInt(ps[i]); + if (val > 255) { + throw new Exception("ip part `"+ps[i]+"` should be less then 256"); + } + + ipDst |= ((long) val << shiftIndex[i]); + } + + return ipDst & 0xFFFFFFFFL; + } + +} \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml b/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml index 374e538..c6a11ed 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml @@ -4,12 +4,16 @@ spring: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: - # 主库数据源 + # 主库数据源-点亮开发库 master: -# url: jdbc:mysql://124.222.105.7:3306/dl_notice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://82.156.161.160:3306/dl_site_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: site password: 123456 + #主库数据源-客户测试服务器 +# master: +# url: jdbc:mysql://127.0.0.1:3306/dl_site_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: site +# password: 123456 # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/dl_admin/ruoyi-admin/src/main/resources/application.yml b/dl_admin/ruoyi-admin/src/main/resources/application.yml index 5c411b6..348b02e 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application.yml @@ -57,9 +57,9 @@ spring: servlet: multipart: # 单个文件大小 - max-file-size: 10MB + max-file-size: 100MB # 设置总上传的文件大小 - max-request-size: 20MB + max-request-size: 100MB # 服务模块 devtools: restart: @@ -133,7 +133,7 @@ swagger: # 是否开启swagger enabled: true # 请求前缀 - pathMapping: /dev-api + pathMapping: # 防止XSS攻击 xss: @@ -143,51 +143,24 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* -# 微信小程序配置----多点通告 -wx-app: - appId: wxd96fda6510adb6d3 - appSecret: 2d3bf7172d09966bd98e1611117c2cb0 - token: tgxcxtoken - aesKey: afBZchk5wSFaldDkZB9DZ9Ib6JUV4NwMARaRThsRFqQ - msgDataFormat: XML -wxpay: - #微信公众号appid - appId: wx7d10b0fa4886a583 - #商户号 - mchId: 1712447936 - #商户密匙v2 - mchKey: ab94673dd0cca78abd0a453d0aac9f98 - # APIv3密钥 - apiV3Key: ab94673dd0cca78abd0a453d0aac9f98 - #微信支付p12证书 - keyPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/apiclient_cert.p12 - # 微信支付V3-url前缀 - baseUrl: https://api.mch.weixin.qq.com/v3 - # 支付通知回调, pjm6m9.natappfree.cc 为内网穿透地址 - notifyUrl: https://3w823u8516.vicp.fun/noticeApi/payApi/payNotify - # 转账通知回调, pjm6m9.natappfree.cc 为内网穿透地址 - zhuanNotifyUrl: https://3w823u8516.vicp.fun/noticeApi/payApi/zhuanNotify - # 退款通知回调, pjm6m9.natappfree.cc 为内网穿透地址 - refundNotifyUrl: https://www.ddtg.site/notice/notify/refundNotify - # 密钥路径,resources根目录下 - privateKeyPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/apiclient_key.pem - privateCertPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/apiclient_cert.pem - publicKeyPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/pub_key.pem - #商户证书序列号 - serialNo: 7FCDB0E72D6A928013361ACB77FA3F0DCBD370E3 - publicKeyId: PUB_KEY_ID_0117124479362025041500321584003200 - wxAppSecret: 1515e5d055e8dabf5b30faad14ccbc8d +# 阿里云OSS配置 +aliyun: + oss: + end-point: oss-cn-qingdao.aliyuncs.com + access-key-id: LTAI5tLThQFWgMLRTf3siNjb + access-key-secret: M5HjOyB8ir5tYEPFOQwImfJNgsumaG + bucket-name: dianliang123 +#google ads配置 +google: + ads: + #经理账号id + customer-id: 3052342727 + #开发者令牌 + developer-token: 7e_-FWCPRjWc16zr8uaUDg + #服务账号秘钥文件路径 + json-path: /www/wwwroot/nuxt/chengda.json + #月搜索量下限 + search-down: 500 + #App下载路径 + app-download: /www/wwwroot/nuxt/truck.apk -# 普通用户权益值 -dl-rights: -# 每月发布通告额度 - addNotice: 3 - report: 5 - #################### 腾讯COS相关配置 #################### -cos: - baseUrl: notice-1348525010.cos.ap-beijing.myqcloud.com - accessKey: AKIDDbyY3Wr9D4i9LK6f085pLfleJlz60hAP - secretKey: 82kJfnu11ulW5TghV5TecVYP3TghXAZl - regionName: ap-beijing - bucketName: notice-1348525010 - folderPrefix: /files diff --git a/dl_admin/ruoyi-admin/src/main/resources/chengda.json b/dl_admin/ruoyi-admin/src/main/resources/chengda.json new file mode 100644 index 0000000..13e37ae --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/chengda.json @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "chengda-467707", + "private_key_id": "a9a538af8b2e1e3a41f8bc6265200a432450dd00", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCaoBGTyINWYh5o\nFSmaGJ33q8wRIevL+GC6oqywzdyvk7in5MKpkGtKnx4yy8Cy0TSHp5yAsoXtblWV\n1TrrV7hia8IizB6QxkZQbcwwPz12shH7HN65m4lOdhsEjsSPZogYIwvDDtkXsAyl\nB+ALfYb+DZpX2aTST+1fvtTc+3PdrfxXBmBqmwJeTaQOVBk10BW+vDL9Y8TxuvHS\nYWbix/PJDQEpJFcQI/1shgiyeNkvBQJAxUHgb58EncukAD3F1W7wLLEJtE+5cnGU\nCH1KNHt+ymmZ/TJ1hdf/BvSjtHTgTYSM/ViEQZ7aTj1RZ1xueflSt2Pzqq84GMP3\nOJaCgcObAgMBAAECggEAC6v3h7NEDro7V1n5mPMwwWhLcCOiW/Q0wQHUjUgM14gM\nEUhYVVpcbvaR3f25XwYhs/e3/ZL8Pw7sEPJWjztA5NUDg4Lq77y3xAx1tFKhvhr0\n9oKYYWRXOf/6TB7GwZhYv5GtqpytUHdujOqKQ/PGw9idBPKd2W5FGcwa309v0JTa\ndhiaUAxi19QJNwqxDHn665EBfAHqZE76h0TR2fXiQ8XfH0T7EQuTuSI4sAD1MYaS\nU/0YnEi9eulCVJNpD5CDVFjL1C5Oa/LkMTo/SubaAd7pTY9Uo3LOrykikRBozrMc\nisObanEZDyi+y435ZMfH4ikywJq7cN4Xnlis06nBcQKBgQDTv0JaX0ze8v6fiwaZ\nrbHvEehAyRvGGaY0/mxDYM9Ioq80aIAG5/Ogh3WGDyrynz4zCu1mqjRqterzpY+H\nSP6fZzhTi7lUHGVa4QUb4QlSkDWV0BED8we4AzXnBOHmto+aMwm1bi0O3qWcbWDk\nOacLIoAOhNKOn4IAzaHWAkgH6QKBgQC68LfXb9EEGafeHIjz2o08EhqHSoMs1kAp\nvu39vh3qdMIlSXWrmGXvQS4EJyBMyq24DLufUbEMRaf2yvbCpl0NRzo3dUeXXQWh\nLBT/9erKF10IjEHd8t4PUoE4JbtuLUPUAKBCx5pbtCcAMi1wWm+kcx9uLdKw/sPC\nKBKuRJTA4wKBgA4yYpaAkTzZeezke1rOZIGs56+ATFZp3dTrwgJ6eStbjPeskfjk\nkFcQ/fYxCiYeOyNc9jHN85m7/La9QPRHFptFZmdjlNdo1/rR32/RFLjuZklXG+zx\n3HCf9ns4vpSjZNln1pzNeEPo9Z2ZT8e9fc+nToKqsRtS4np/Tvx0RrQRAoGAB/Pd\nnkifd7Evtv83xEfz4i5S+pZs5idnK193+GdyFltJNxTc8KPXEkqPjpWrhhjJMx83\njBuJkKAV+SXBQZ6aLsps65cNqJ7IcobRjeIETvyXdJmi47JFSBmWbbENPC6oyAgO\nyUh8hJIxZoy76h+uyCwtlh5U7DqqUUQrJ0a7nUkCgYBoRunRKHNRycFlMFW2rLf+\n+ayC7fIPvLiKzYg2xAHIG/ykTGmtxrqKiVQ909FyVN7k9Rbyg9ZVZdkCqG/Br7iS\nVOF7xD1SCma3pdupRP4GIQSxVZVvUo48xzXNUFWXg4bjzMEgIErG12zL286blVPi\nxMz4TKijJq2YR67kdAEzDw==\n-----END PRIVATE KEY-----\n", + "client_email": "shandongchengda@chengda-467707.iam.gserviceaccount.com", + "client_id": "107299671168418329002", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/shandongchengda%40chengda-467707.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} diff --git a/dl_admin/ruoyi-admin/src/main/resources/google-ads.properties b/dl_admin/ruoyi-admin/src/main/resources/google-ads.properties new file mode 100644 index 0000000..0259589 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/google-ads.properties @@ -0,0 +1,6 @@ +# ????????? refreshToken? +api.googleads.pathToCredentialsFile=D:/A_lighting_product/dl_site_system/dl_admin/ruoyi-admin/src/main/resources/chengda.json +# ????? Developer Token +api.googleads.developerToken=qwFA3dGfOGqEhSEHlCMorA +# ????? MCC ?? ID???? MCC) +api.googleads.loginCustomerId=3283220394 \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/ip2region.xdb b/dl_admin/ruoyi-admin/src/main/resources/ip2region.xdb new file mode 100644 index 0000000..7052c05 Binary files /dev/null and b/dl_admin/ruoyi-admin/src/main/resources/ip2region.xdb differ diff --git a/dl_admin/ruoyi-admin/src/main/resources/ip2region/ip2region.xdb b/dl_admin/ruoyi-admin/src/main/resources/ip2region/ip2region.xdb new file mode 100644 index 0000000..7052c05 Binary files /dev/null and b/dl_admin/ruoyi-admin/src/main/resources/ip2region/ip2region.xdb differ diff --git a/dl_admin/ruoyi-admin/src/main/resources/logback.xml b/dl_admin/ruoyi-admin/src/main/resources/logback.xml index a360583..69587d8 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/logback.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/logback.xml @@ -1,7 +1,7 @@ - + diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml new file mode 100644 index 0000000..560aa22 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + select id, version, content, creator, create_time, updater, update_time, del_flag from dl_base_app + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseInquiryMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseInquiryMapper.xml new file mode 100644 index 0000000..b4ffd1f --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseInquiryMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, company, company_must,email,email_must, tel, tel_must, title, title_must, name, name_must, content, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_inquiry + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseManagerMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseManagerMapper.xml new file mode 100644 index 0000000..393f049 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseManagerMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + select id, user_id, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_manager + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BasePicMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BasePicMapper.xml new file mode 100644 index 0000000..2d611b4 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BasePicMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + select id, title, sort, pic, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_pic + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BasePicsMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BasePicsMapper.xml new file mode 100644 index 0000000..978aeee --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BasePicsMapper.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, file_type, name, url, size, width, height, remark, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_pics + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSeoMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSeoMapper.xml new file mode 100644 index 0000000..f0a613e --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSeoMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + select id, data_type, sort, title, content, description, pic, cn, creator, create_time, updater, update_time, del_flag from dl_base_seo + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSiteInfoMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSiteInfoMapper.xml index 9734f6c..a7dfada 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSiteInfoMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseSiteInfoMapper.xml @@ -10,14 +10,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + @@ -27,7 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, company_name, fax_number, brand_name, tel, email, teams, copyright, address, icon, logo, qr_code, contact_us, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_site_info + select id, company_name, fax_number, brand_name, tel,whatsapp, email, teams, copyright, address, icon, logo,mobile_logo,form_logo, qr_code, contact_us,company_info,company_info_app, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_site_info - - - and del_flag='0' - and site_name like concat('%', #{entity.siteName}, '%') - and site_url = #{entity.siteUrl} - and site_content = #{entity.siteContent} - + SELECT + dbs.*, + GROUP_CONCAT( su.nick_name ) AS managerUser + FROM + dl_base_site dbs + LEFT JOIN dl_base_manager dbm ON dbs.id = dbm.tenant_id + AND dbm.del_flag = '0' + LEFT JOIN sys_user su ON dbm.user_id = su.user_id + WHERE + dbs.del_flag = '0' + and dbs.site_name like concat('%', #{entity.siteName}, '%') + and dbs.site_url = #{entity.siteUrl} + and dbs.site_content = #{entity.siteContent} + GROUP BY + dbs.id + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseTempMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseTempMapper.xml new file mode 100644 index 0000000..eba7759 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseTempMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + select id, title, file, remark, tenant_id, creator, create_time, updater, update_time, del_flag from dl_base_temp + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiCategoryMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiCategoryMapper.xml index 8e323a8..0fa0f0d 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiCategoryMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiCategoryMapper.xml @@ -6,7 +6,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - @@ -18,8 +17,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -29,27 +31,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, code, catg_name, catg_level, catg_type, parent_id, prods_junior, prods_all, title, keyword, description, sort, content, prod_up, prod_down, tenant_id, creator, create_time, updater, update_time, del_flag from dl_busi_category + select id, catg_name, catg_level, catg_type, parent_id, prods_junior, prods_all, title, keyword, description, sort, content,content_app, prod_up,prod_up_app, prod_down,prod_down_app, tenant_id, creator, create_time, updater, update_time, del_flag from dl_busi_category - - + SELECT + id + FROM + ( + SELECT + t1.id, + IF + ( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), - 1 ) AS ischild + FROM + ( SELECT id, parent_id FROM dl_busi_category t ORDER BY id, parent_id ) t1, + ( SELECT @pids := #{id} ) t2 + ) t3 + WHERE + ischild != -1 + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatItemMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatItemMapper.xml new file mode 100644 index 0000000..f14813d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatItemMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + select id, main_id, data_from, sender_id,receiver_id,content,is_read, create_time from dl_busi_chat_item + + + + + + + + update dl_busi_chat_item + set is_read = 1 + where main_id = #{sessionId} + and receiver_id = #{receiverId} + and is_read =0 + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml new file mode 100644 index 0000000..5d15daa --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiInquiryItemMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiInquiryItemMapper.xml new file mode 100644 index 0000000..b26cbf4 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiInquiryItemMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, company_name, name, tel, title, content, email, ip, national, oceania,equipment, page_url, tenant_id, creator, create_time, updater, update_time, del_flag from dl_busi_inquiry_item + + + + + + + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordItemMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordItemMapper.xml new file mode 100644 index 0000000..ee5d6b9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordItemMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + select id, title, select_date, ranking, tenant_id from dl_busi_keyword_item + + + delete from dl_busi_keyword_item where select_date = #{date} + + + + + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml new file mode 100644 index 0000000..9716e1b --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + select id, tenant_id from dl_busi_keyword + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml new file mode 100644 index 0000000..eca2010 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + select id, url, equipment, ip, national,oceania, tenant_id, create_time from dl_busi_page + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdNewMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdNewMapper.xml new file mode 100644 index 0000000..dfb626b --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdNewMapper.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, + catg_id, + title, + prod_title, + prod_keyword, + prod_description, + news_from, + public_date, + main_pic, + pics, + description, + content, + sort, + if_reco, + if_public, + tenant_id, + creator, + create_time, + updater, + update_time, + del_flag + from dl_busi_prod_new + + + + + + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdRandomMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdRandomMapper.xml new file mode 100644 index 0000000..a3a36bc --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiProdRandomMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + select id, prod_id, random_id, tenant_id, creator, create_time, updater, update_time, del_flag from dl_busi_prod_random + + + + + + + DELETE + FROM + dl_busi_prod_random + WHERE + prod_id = #{prodId} + AND random_id = #{randomId} + AND tenant_id = #{tenantId} + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiRelationMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiRelationMapper.xml new file mode 100644 index 0000000..826d4d6 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiRelationMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + select id, user_id, prod_id, tenant_id, creator, create_time, updater, update_time, del_flag from dl_busi_relation + + + DELETE + FROM + dl_busi_relation + WHERE + prod_id = #{prodId} + AND tenant_id = #{tenantId} + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiThirdItemMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiThirdItemMapper.xml new file mode 100644 index 0000000..621761d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiThirdItemMapper.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, + prod_id, + third_soft, national, third_account, view_type, page_url, equipment, ip, tenant_id, creator, create_time, updater, update_time, del_flag + from dl_busi_third_item + + + + + + + + + \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/test.json b/dl_admin/ruoyi-admin/src/main/resources/test.json new file mode 100644 index 0000000..9b6b8e9 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/test.json @@ -0,0 +1,13 @@ +{ + "type": "service_account", + "project_id": "sunny-caldron-467002-e6", + "private_key_id": "a38b797901a6c00d69abfe43374d467fd412871d", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpJv+RAS5dlqbJ\nLruF0ANGpdpobnjTmWLT99x7FvrxDunDCiO5JlqhSa8M+YsnJnluZIN85uAPOzpF\nRWMSmZLtdwz2GH2RdDai6rN88M2O3YiaNYS8AOmXfw5Q2zzchHBCnaXw1EHAENUr\nxD77eeYnlVg5U1gUyFwIeeV/o2YezKdMEA4OIdz7tLz0BdW+7wCH+sGzp7NkStkh\nvcV/sK0TRqVdU5z54cH1ndpinDPPwPyXWpV6r3L1QaeD73kgAOHcc23Rlq5BHbCs\n8CIreUnSN6i3Nix597bd9d0p7yBeEYj0F9UV7F3rkXxo2tA45WlmY+ZlgJMNofAa\n7gKfdvKfAgMBAAECggEAARgmJ3VQldFq9Kxbk0CwxyXbfl+82IU6UnHvJ56Es/gM\n2XnKNuIwL83IUejcDkxxv6wgFf8i0+huMaRT57f0tn3V0ToOhnusA/4UhIJCue8/\nRnLb41nuchcwCEbJ0DW6qT74iVj0zKu1TZqCYhbEaedBlDgYSQBLUHNDiEG60etv\nHX3Vgfjaz0ul1v6SaQVjfixRYzLAIpXFvTCzBynQhdvm1+FhL8u4ABPfTKqxYBet\nz9sGGq7Z6EKOCD+w+ppuZgJlGYgXezZuLSIWZy0I9m/adGcup6xw+mWb2EsYevtG\nthlyumpRtBQVWXIrXshymByOYPy0DNFAcl80+fVcIQKBgQDW090TiMjFhnAKinco\ne8FxwaX43ax2Dl0CZFG/qh7jO8TNrxDADoluMmlQUYgHxn/xoHOmh90XyInSH4pg\nBsOfF7FVmkjnVRQQCHmU3MqbZMcm9EZLS6w29iIpd9eyDgY/KAjksaLP6xTpFc0r\nmWhSShk6SIb8DAvbvJy5iQwt4QKBgQDJkii0gz28nN2n0Bw8VQFwgUw1a88pzWZv\nBY3RaDT9f+c82bMhmNKSsE0hDTnUlpLzo/FGVE1oG6wOS5dMx3YmVKpKGLsKOSP+\nJclzLkYEsJl2Q55gcjD6/4ETtqQ2CFmouBl199iG/aYsvqZafKCCgpmWSKC7/0Cf\nnCVuIBIwfwKBgGDJzYYaj5Jm8p3dKriDoXE2NSf9/9CkwgTs2+QFqqroZ8/fuyU8\np3CNp+M3CJmwNj7P8qsp9VPc1zNjYH3JLmPEUfJmc8g+Da73koeePm5qpkuHrRAJ\nhQqyNEwIoZaoOOpFiFQ5MEiK+r3VQ74L/PNuTRV0TdTLPKCAxv/UnjchAoGAOKnM\npYnrNfVG3iDDfzZKNE00liPbVZ32+KiwCDjqBIULBPERyRUDxNaop+zm39sALltc\nvO9/3w9AW7hmLOA5V2cfg7rWAXa0poIK0kUky7a1PSifAe+30yc2KsuB9+p7AdHW\n3nGwvanaJ+PkMbWtDWMXN8bs4ExN51BmuUFsu5MCgYEAmTq81xDw/tIK6x6QYo1S\nEobTXo7KE01cjraOR0Kjk/MtEKlwBQVcDY79LnLzc2p5H0Jfm6MWIzcg+8pRm+gA\nOROfbhB9omfHWZ0PdNBe5Gd3nzEKQGWvSYcqLhZu+4pXYTbEpJLLfhR83oSldJ26\ng54JAsrVH5nTBbbxxxBXCtA=\n-----END PRIVATE KEY-----\n", + "client_email": "mwjtest@sunny-caldron-467002-e6.iam.gserviceaccount.com", + "client_id": "101980709462554291854", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/mwjtest%40sunny-caldron-467002-e6.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/GoogleConfig.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/GoogleConfig.java new file mode 100644 index 0000000..1e414a2 --- /dev/null +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/GoogleConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @description google ads配置类 + * @author vinjor-m + */ +@ConfigurationProperties(prefix = "google.ads") +@Configuration +@Data +public class GoogleConfig { + private Long customerId; + private String developerToken; + private String jsonPath; + private Long searchDown; + /** app下载路径 */ + private String appDownload; + + +} diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java new file mode 100644 index 0000000..38706df --- /dev/null +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description OSS配置类 + * @author lixiang + */ +@ConfigurationProperties(prefix = "aliyun.oss") +@Configuration +@Data +public class OssConfig { + private String endPoint; + private String accessKeyId; + private String accessKeySecret; + private String bucketName; + + +} diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 44e80d8..6561bc2 100644 --- a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -206,6 +206,37 @@ public class RedisCache return redisTemplate.opsForHash().entries(key); } + /** + * 将元素添加到列表左边 + * @param key 键 + * @param value 元素 + * @return 列表长度 + */ + public Long leftPush(final String key, final Object value) { + // 检查键是否为空 + if (key == null || key.trim().isEmpty()) { + throw new IllegalArgumentException("Redis key cannot be null or empty"); + } + + // 直接使用key作为参数,而不是getCacheObject(key) + return redisTemplate.opsForList().leftPush(key, value); + } + /** + * 将元素添加到列表右边 + * @param key 键 + * @param value 元素 + * @return 列表长度 + */ + public Long rightPush(final String key, final Object value) { + // 检查键是否为空 + if (key == null || key.trim().isEmpty()) { + throw new IllegalArgumentException("Redis key cannot be null or empty"); + } + + // 直接使用key作为参数,而不是getCacheObject(key) + return redisTemplate.opsForList().rightPush(key, value); + } + /** * 往Hash中存入数据 * @@ -265,4 +296,54 @@ public class RedisCache { return redisTemplate.keys(pattern); } + + /** + * 递增操作 + * @param key 键 + * @param delta 增量(正数为增,负数为减) + * @return 递增后的值 + */ + public Long increment(String key, long delta) { + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递增操作(带过期时间) + * @param key 键 + * @param delta 增量 + * @param timeout 过期时间 + * @param unit 时间单位 + * @return 递增后的值 + */ + public Long increment(String key, long delta, long timeout, TimeUnit unit) { + Long value = redisTemplate.opsForValue().increment(key, delta); + // 设置过期时间 + redisTemplate.expire(key, timeout, unit); + return value; + } + + /** + * 浮点数递增操作 + * @param key 键 + * @param delta 增量 + * @return 递增后的值 + */ + public Double increment(String key, double delta) { + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 浮点数递增操作(带过期时间) + * @param key 键 + * @param delta 增量 + * @param timeout 过期时间 + * @param unit 时间单位 + * @return 递增后的值 + */ + public Double increment(String key, double delta, long timeout, TimeUnit unit) { + Double value = redisTemplate.opsForValue().increment(key, delta); + // 设置过期时间 + redisTemplate.expire(key, timeout, unit); + return value; + } } diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java new file mode 100644 index 0000000..86a7388 --- /dev/null +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java @@ -0,0 +1,51 @@ +//package com.ruoyi.common.utils; +///** +// * 图像上传工具类 +// */ +//public class AliOssUtil { +// +// +// /** +// * 上传文件到阿里云OSS +// * +// * @param file 要上传的文件 +// * @return 返回上传后的文件URL +// * @throws IOException 如果文件处理过程中发生IO异常 +// */ +// public static String upload(MultipartFile file) throws IOException { +// // 获取文件原始名称 +// String origName = file.getOriginalFilename(); +// // 获取文件扩展名 +// String ext = FilenameUtils.getExtension(origName); +// // 生成UUID作为文件名 +// String uuid = UUID.randomUUID().toString().replace("-", ""); +// String fileName = uuid + "." + ext; +// +// // 阿里云OSS配置信息 +// String endpoint = "https://xxxx.aliyuncs.com"; +// String accessKeyId = "xxxxxxxxxxxxxxxxxxxx"; +// String accessKeySecret = "xxxxxxxxxxxxxxxxxxxxxxx"; +// String bucketName = "仓库名"; +// +// // 创建OSS客户端 +// OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); +// +// try { +// // 将文件上传到OSS +// InputStream is = file.getInputStream(); +// ossClient.putObject(bucketName, fileName, is); +// } catch (Exception e) { +// // 异常处理 +// e.printStackTrace(); +// throw new IOException("上传文件到OSS失败", e); +// } finally { +// // 关闭OSS客户端 +// if (ossClient != null) { +// ossClient.shutdown(); +// } +// } +// +// // 返回上传后的文件URL +// return ALI_DOMAIN + fileName; +// } +//} diff --git a/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index b9459a8..65a646f 100644 --- a/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -111,10 +111,10 @@ public class SecurityConfig .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - requests.antMatchers("/login","/wxLogin", "/register", "/captchaImage","/sys/ueditor/exec").permitAll() + requests.antMatchers("/login","/wxLogin", "/register", "/captchaImage","/sys/ueditor/exec","/ws/asset/**").permitAll() //相关配置参数可匿名访问 - .antMatchers("/base/config/getConfigByCode").permitAll() - .antMatchers("/base/category/getByCodeInfo").permitAll() + .antMatchers("/web/**").permitAll() + .antMatchers("/chat/**").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/system/config/configKey/isOpenZf","/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() diff --git a/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 7ecbc5a..7db024a 100644 --- a/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/dl_admin/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -33,6 +33,9 @@ import com.ruoyi.framework.security.context.AuthenticationContextHolder; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; +import java.util.HashMap; +import java.util.Map; + /** * 登录校验方法 * @@ -67,8 +70,9 @@ public class SysLoginService * @param uuid 唯一标识 * @return 结果 */ - public String login(String username, String password, String code, String uuid) + public Map login(String username, String password, String code, String uuid) { + Map rtnMap = new HashMap<>(); // 验证码校验 validateCaptcha(username, code, uuid); // 登录前置校验 @@ -103,7 +107,9 @@ public class SysLoginService LoginUser loginUser = (LoginUser) authentication.getPrincipal(); recordLoginInfo(loginUser.getUserId()); // 生成token - return tokenService.createToken(loginUser); + rtnMap.put("token",tokenService.createToken(loginUser)); + rtnMap.put("userId",loginUser.getUserId().toString()); + return rtnMap; } /** diff --git a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java b/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java deleted file mode 100644 index 7570b14..0000000 --- a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.ruoyi.system.service; - -import com.tencent.cloud.CosStsClient; -import com.tencent.cloud.Response; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; - -/** - * @Description: sts - * @Author: 86187 - * @Date: 2025/03/20 16:18 - * @Version: 1.0 - */ -@Service -public class CosStsService { - // 你的腾讯云账号的 SecretId 和 SecretKey - @Value("${cos.accessKey}") - private String SECRET_ID; - @Value("${cos.secretKey}") - private String SECRET_KEY; - - // 存储桶所属的地域,例如 "ap-shanghai" - @Value("${cos.regionName}") - private String REGION; - - // 你的存储桶名,例如 "example-1250000000" - @Value("${cos.bucketName}") - private String BUCKET; - - // 临时密钥有效期(单位秒),最长不超过 2 小时(7200 秒) - private static final int DURATION_SECONDS = 1800; - - public Map getTempKeys() { - TreeMap config = new TreeMap(); - - try { - // 云 api 密钥 SecretId - config.put("secretId", SECRET_ID); - // 云 api 密钥 SecretKey - config.put("secretKey", SECRET_KEY); - // 临时密钥有效时长,单位是秒 - config.put("durationSeconds", 1800); - // 换成你的 bucket - config.put("bucket", BUCKET); - // 换成 bucket 所在地区 - config.put("region", REGION); - - // 可以通过 allowPrefixes 指定前缀数组, 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用) - config.put("allowPrefixes", new String[] { - "*" - }); - - // 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923 - String[] allowActions = new String[] { - // 简单上传 - "name/cos:PutObject", - "name/cos:PostObject", - // 分片上传 - "name/cos:InitiateMultipartUpload", - "name/cos:ListMultipartUploads", - "name/cos:ListParts", - "name/cos:UploadPart", - "name/cos:CompleteMultipartUpload" - }; - config.put("allowActions", allowActions); - - Response response = CosStsClient.getCredential(config); - Map result= new HashMap<>(); - result.put("credentials", response.credentials); - result.put("startTime", response.startTime); - result.put("expiredTime", response.expiredTime); - return result; - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalArgumentException("no valid secret !"); - } - } -} diff --git a/dl_admin/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/dl_admin/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 9433697..2e81ba0 100644 --- a/dl_admin/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/dl_admin/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -68,7 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND u.user_id = #{userId} - AND u.user_name like concat('%', #{userName}, '%') + AND (u.nick_name like concat('%', #{userName}, '%') OR u.user_name like concat('%', #{userName}, '%')) AND u.status = #{status} diff --git a/dl_vue/.env.development b/dl_vue/.env.development index 91debb8..e81affd 100644 --- a/dl_vue/.env.development +++ b/dl_vue/.env.development @@ -1,11 +1,17 @@ # 页面标题 -VUE_APP_TITLE = 成事达运营平台 +VUE_APP_TITLE = 成事达管理平台 # 开发环境配置 ENV = 'development' -# 成事达运营平台/开发环境 -VUE_APP_BASE_API = '/dev-api' +# 成事达管理平台/开发环境 +VUE_APP_BASE_API = 'http://192.168.1.13:8099' # 路由懒加载 VUE_CLI_BABEL_TRANSPILE_MODULES = true + +# websocket +VUE_APP_WEBSOCKET = 'ws://localhost:8099/ws/asset/' + +# 产品、文章预览 +VUE_APP_PREVIEW = 'http://192.168.1.13:3001/admin-preview/' diff --git a/dl_vue/.env.production b/dl_vue/.env.production index c02750e..fa7d2ed 100644 --- a/dl_vue/.env.production +++ b/dl_vue/.env.production @@ -1,8 +1,14 @@ # 页面标题 -VUE_APP_TITLE = 通告快接管理后台 +VUE_APP_TITLE = 成事达管理平台 # 生产环境配置 ENV = 'production' -# 通告快接管理后台/生产环境 -VUE_APP_BASE_API = 'https://www.ddtg.site/noticeApi' +# 成事达管理平台/生产环境 +VUE_APP_BASE_API = 'http://1.92.99.15:8099' + +# websocket +VUE_APP_WEBSOCKET = 'ws://1.92.99.15:8099/ws/asset/' + +# 产品、文章预览 +VUE_APP_PREVIEW = 'http://www.lighting-it.cn/admin-preview/' diff --git a/dl_vue/.env.staging b/dl_vue/.env.staging index ba3ccae..690111f 100644 --- a/dl_vue/.env.staging +++ b/dl_vue/.env.staging @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 成事达运营平台 +VUE_APP_TITLE = 成事达管理平台 BABEL_ENV = production @@ -8,5 +8,8 @@ NODE_ENV = production # 测试环境配置 ENV = 'staging' -# 成事达运营平台/测试环境 +# 成事达管理平台/测试环境 VUE_APP_BASE_API = '/stage-api' + +# websocket +VUE_APP_WEBSOCKET = 'ws://localhost:8099/ws/asset/' diff --git a/dl_vue/public/UEditor/ueditor.config.js b/dl_vue/public/UEditor/ueditor.config.js index 7a4c626..39d7492 100644 --- a/dl_vue/public/UEditor/ueditor.config.js +++ b/dl_vue/public/UEditor/ueditor.config.js @@ -121,9 +121,9 @@ "insertimage", // 多图上传 "emotion", // 表情 "scrawl", // 涂鸦 - "insertvideo", // 视频 - "insertaudio", // 音频 - "attachment", // 附件 + // "insertvideo", // 视频 + // "insertaudio", // 音频 + // "attachment", // 附件 "insertframe", // 插入Iframe "insertcode", // 插入代码 "pagebreak", // 分页 @@ -261,7 +261,7 @@ //,theme:'default' //,themePath:URL +"themes/" - //,zIndex : 900 //编辑器层级的基数,默认是900 + ,zIndex : 900 //编辑器层级的基数,默认是900 //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 //,charset:"utf-8" @@ -297,7 +297,7 @@ // 初始化编辑器宽度,默认 1000 // ,initialFrameWidth:1000 // 初始化编辑器高度,默认 320 - // ,initialFrameHeight:320 + ,initialFrameHeight:600 // 编辑器初始化结束后,编辑区域是否是只读的,默认是false , readonly: false @@ -507,17 +507,17 @@ , maxInputCount: 1 // 是否自动长高,默认true - , autoHeightEnabled: true + , autoHeightEnabled: false //scaleEnabled //是否可以拉伸长高,默认true(当开启时,自动长高失效) - //,scaleEnabled:false - //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 - //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 + ,scaleEnabled:true + // ,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 + ,minFrameHeight:220 //编辑器拖动时最小高度,默认220 //autoFloatEnabled //是否保持toolbar的位置不动,默认true - //,autoFloatEnabled:true + ,autoFloatEnabled:true //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 //,topOffset:30 //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) diff --git a/dl_vue/src/App.vue b/dl_vue/src/App.vue index b92ea37..aea87ef 100644 --- a/dl_vue/src/App.vue +++ b/dl_vue/src/App.vue @@ -7,10 +7,22 @@ diff --git a/dl_vue/src/api/base/app.js b/dl_vue/src/api/base/app.js new file mode 100644 index 0000000..e540f60 --- /dev/null +++ b/dl_vue/src/api/base/app.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询app版本管理列表 +export function listApp(query) { + return request({ + url: '/base/app/list', + method: 'get', + params: query + }) +} + +// 查询app版本管理详细 +export function getApp(id) { + return request({ + url: '/base/app/' + id, + method: 'get' + }) +} + +// 新增app版本管理 +export function addApp(data) { + return request({ + url: '/base/app', + method: 'post', + data: data + }) +} + +// 修改app版本管理 +export function updateApp(data) { + return request({ + url: '/base/app', + method: 'put', + data: data + }) +} + +// 删除app版本管理 +export function delApp(id) { + return request({ + url: '/base/app/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/base/info.js b/dl_vue/src/api/base/info.js index 9a6c674..458c946 100644 --- a/dl_vue/src/api/base/info.js +++ b/dl_vue/src/api/base/info.js @@ -10,10 +10,11 @@ export function listInfo(query) { } // 查询站点基础信息详细 -export function getInfo(id) { +export function getInfo(query) { return request({ - url: '/base/info/' + id, - method: 'get' + url: '/base/info/getSiteInfo', + method: 'get', + params: query }) } diff --git a/dl_vue/src/api/base/inquiry.js b/dl_vue/src/api/base/inquiry.js new file mode 100644 index 0000000..ea8837a --- /dev/null +++ b/dl_vue/src/api/base/inquiry.js @@ -0,0 +1,45 @@ +import request from '@/utils/request' + +// 查询在线询盘设置列表 +export function listInquiry(query) { + return request({ + url: '/base/inquiry/list', + method: 'get', + params: query + }) +} + +// 查询在线询盘设置详细 +export function getInquiry(query) { + return request({ + url: '/base/inquiry/getInquiry', + method: 'get', + params: query + }) +} + +// 新增在线询盘设置 +export function addInquiry(data) { + return request({ + url: '/base/inquiry', + method: 'post', + data: data + }) +} + +// 修改在线询盘设置 +export function updateInquiry(data) { + return request({ + url: '/base/inquiry', + method: 'put', + data: data + }) +} + +// 删除在线询盘设置 +export function delInquiry(id) { + return request({ + url: '/base/inquiry/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/base/manager.js b/dl_vue/src/api/base/manager.js new file mode 100644 index 0000000..e4ec671 --- /dev/null +++ b/dl_vue/src/api/base/manager.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询站点分配列表 +export function listManager(query) { + return request({ + url: '/base/manager/list', + method: 'get', + params: query + }) +} + +// 查询站点分配详细 +export function getManager(id) { + return request({ + url: '/base/manager/' + id, + method: 'get' + }) +} + +// 新增站点分配 +export function addManager(data) { + return request({ + url: '/base/manager', + method: 'post', + data: data + }) +} + +// 修改站点分配 +export function updateManager(data) { + return request({ + url: '/base/manager', + method: 'put', + data: data + }) +} + +// 删除站点分配 +export function delManager(id) { + return request({ + url: '/base/manager/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/base/pic.js b/dl_vue/src/api/base/pic.js new file mode 100644 index 0000000..660c65e --- /dev/null +++ b/dl_vue/src/api/base/pic.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询轮播图管理列表 +export function listPic(query) { + return request({ + url: '/base/pic/list', + method: 'get', + params: query + }) +} + +// 查询轮播图管理详细 +export function getPic(id) { + return request({ + url: '/base/pic/' + id, + method: 'get' + }) +} + +// 新增轮播图管理 +export function addPic(data) { + return request({ + url: '/base/pic', + method: 'post', + data: data + }) +} + +// 修改轮播图管理 +export function updatePic(data) { + return request({ + url: '/base/pic', + method: 'put', + data: data + }) +} + +// 删除轮播图管理 +export function delPic(id) { + return request({ + url: '/base/pic/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/base/pics.js b/dl_vue/src/api/base/pics.js new file mode 100644 index 0000000..bf06e51 --- /dev/null +++ b/dl_vue/src/api/base/pics.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询图片库列表 +export function listPics(query) { + return request({ + url: '/base/pics/list', + method: 'get', + params: query + }) +} + +// 查询图片库详细 +export function getPics(id) { + return request({ + url: '/base/pics/' + id, + method: 'get' + }) +} + +// 新增图片库 +export function addPics(data) { + return request({ + url: '/base/pics', + method: 'post', + data: data + }) +} + +// 修改图片库 +export function updatePics(data) { + return request({ + url: '/base/pics', + method: 'put', + data: data + }) +} + +// 删除图片库 +export function delPics(id) { + return request({ + url: '/base/pics/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/base/seo.js b/dl_vue/src/api/base/seo.js new file mode 100644 index 0000000..4d25782 --- /dev/null +++ b/dl_vue/src/api/base/seo.js @@ -0,0 +1,19 @@ +import request from '@/utils/request' + +// 查询SEO用到的国家和语言列表 +export function listSeo(query) { + return request({ + url: '/base/seo/list', + method: 'get', + params: query + }) +} + +// 查询关键词规划 +export function getKeywords(query) { + return request({ + url: '/base/seo/getKeywords', + method: 'get', + params: query + }) +} diff --git a/dl_vue/src/api/base/temp.js b/dl_vue/src/api/base/temp.js new file mode 100644 index 0000000..439e8be --- /dev/null +++ b/dl_vue/src/api/base/temp.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询模板库列表 +export function listTemp(query) { + return request({ + url: '/base/temp/list', + method: 'get', + params: query + }) +} + +// 查询模板库详细 +export function getTemp(id) { + return request({ + url: '/base/temp/' + id, + method: 'get' + }) +} + +// 新增模板库 +export function addTemp(data) { + return request({ + url: '/base/temp', + method: 'post', + data: data + }) +} + +// 修改模板库 +export function updateTemp(data) { + return request({ + url: '/base/temp', + method: 'put', + data: data + }) +} + +// 删除模板库 +export function delTemp(id) { + return request({ + url: '/base/temp/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/busi/chatItem.js b/dl_vue/src/api/busi/chatItem.js new file mode 100644 index 0000000..ec334ae --- /dev/null +++ b/dl_vue/src/api/busi/chatItem.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询在线聊天记录列表 +export function listChatItem(query) { + return request({ + url: '/busi/chatItem/list', + method: 'get', + params: query + }) +} + +// 查询在线聊天记录详细 +export function getChatItem(id) { + return request({ + url: '/busi/chatItem/' + id, + method: 'get' + }) +} + +// 新增在线聊天记录 +export function addChatItem(data) { + return request({ + url: '/busi/chatItem', + method: 'post', + data: data + }) +} + +// 修改在线聊天记录 +export function updateChatItem(data) { + return request({ + url: '/busi/chatItem', + method: 'put', + data: data + }) +} + +// 删除在线聊天记录 +export function delChatItem(id) { + return request({ + url: '/busi/chatItem/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/busi/chatMain.js b/dl_vue/src/api/busi/chatMain.js new file mode 100644 index 0000000..169b24f --- /dev/null +++ b/dl_vue/src/api/busi/chatMain.js @@ -0,0 +1,90 @@ +import request from '@/utils/request' + +// 查询在线聊天列表 +export function listChatMain(query) { + return request({ + url: '/busi/chatMain/list', + method: 'get', + params: query + }) +} + +// 查询在线聊天详细 +export function getChatMain(id) { + return request({ + url: '/busi/chatMain/' + id, + method: 'get' + }) +} + +// 新增在线聊天 +export function addChatMain(data) { + return request({ + url: '/busi/chatMain', + method: 'post', + data: data + }) +} + +export function saveMessage(data) { + return request({ + url: '/web/saveMessage', + method: 'post', + data: data + }) +} + +// 修改在线聊天 +export function updateChatMain(data) { + return request({ + url: '/busi/chatMain', + method: 'put', + data: data + }) +} + +// 删除在线聊天 +export function delChatMain(id) { + return request({ + url: '/busi/chatMain/' + id, + method: 'delete' + }) +} + +// 根据客服ID查询会话列表 +export function getByServiceId(query) { + return request({ + url: '/busi/chatMain/service', + method: 'get', + params: query + }) +} +// 根据会话ID查询消息列表 +export function getBySessionId(id) { + return request({ + url: '/chat/session/'+id, + method: 'get', + }) +} + +export function sendMessage(data) { + return request({ + url: '/chat/newMes', + method: 'post', + data: data + }) +} + +export function markAsRead(id, query) { + return request({ + url: '/chat/read/'+id, + method: 'put', + params: query + }) +} +export function closeSession(id) { + return request({ + url: '/chat/close/'+id, + method: 'put', + }) +} diff --git a/dl_vue/src/api/busi/inquiryItem.js b/dl_vue/src/api/busi/inquiryItem.js new file mode 100644 index 0000000..77c1dbe --- /dev/null +++ b/dl_vue/src/api/busi/inquiryItem.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询在线询盘记录列表 +export function listInquiryItem(query) { + return request({ + url: '/busi/inquiryItem/list', + method: 'get', + params: query + }) +} + +// 查询在线询盘记录详细 +export function getInquiryItem(id) { + return request({ + url: '/busi/inquiryItem/' + id, + method: 'get' + }) +} + +// 新增在线询盘记录 +export function addInquiryItem(data) { + return request({ + url: '/busi/inquiryItem', + method: 'post', + data: data + }) +} + +// 修改在线询盘记录 +export function updateInquiryItem(data) { + return request({ + url: '/busi/inquiryItem', + method: 'put', + data: data + }) +} + +// 删除在线询盘记录 +export function delInquiryItem(id) { + return request({ + url: '/busi/inquiryItem/' + id, + method: 'delete' + }) +} + +// 查询在线询盘记录详细 +export function getInquirySet(query) { + return request({ + url: '/web/inquirySet', + method: 'get', + params: query + }) +} diff --git a/dl_vue/src/api/busi/keywordItem.js b/dl_vue/src/api/busi/keywordItem.js new file mode 100644 index 0000000..37bcabd --- /dev/null +++ b/dl_vue/src/api/busi/keywordItem.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询关键词排名明细列表 +export function listKeywordItem(query) { + return request({ + url: '/busi/keywordItem/rankStat', + method: 'get', + params: query + }) +} +// 查询关键词排名明细列表 +export function todayRankStat(query) { + return request({ + url: '/busi/keywordItem/todayRankStat', + method: 'get', + params: query + }) +} + +// 查询关键词排名明细详细 +export function getKeywordItem(id) { + return request({ + url: '/busi/keywordItem/' + id, + method: 'get' + }) +} + +// 新增关键词排名明细 +export function addKeywordItem(data) { + return request({ + url: '/busi/keywordItem', + method: 'post', + data: data + }) +} + +// 修改关键词排名明细 +export function updateKeywordItem(data) { + return request({ + url: '/busi/keywordItem', + method: 'put', + data: data + }) +} + +// 删除关键词排名明细 +export function delKeywordItem(id) { + return request({ + url: '/busi/keywordItem/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/busi/new.js b/dl_vue/src/api/busi/new.js new file mode 100644 index 0000000..84358cf --- /dev/null +++ b/dl_vue/src/api/busi/new.js @@ -0,0 +1,90 @@ +import request from '@/utils/request' + +// 查询文章列表 +export function listProdNew(query) { + return request({ + url: '/busi/new/list', + method: 'get', + params: query + }) +} + +// 查询随机管关联产品列表 +export function listRandomProd(query) { + return request({ + url: '/busi/new/randomList', + method: 'get', + params: query + }) +} + +// 查询文章最大排序 +export function getMaxNewSort(query) { + return request({ + url: '/busi/new/getMaxSort', + method: 'get', + params: query + }) +} + +// 查询文章详细 +export function getProdNew(id) { + return request({ + url: '/busi/new/' + id, + method: 'get' + }) +} + +// 新增文章 +export function addProdNew(data) { + return request({ + url: '/busi/new', + method: 'post', + data: data + }) +} + +// 修改文章 +export function updateProdNew(data) { + return request({ + url: '/busi/new', + method: 'put', + data: data + }) +} + +// 删除文章 +export function delProdNew(id) { + return request({ + url: '/busi/new/' + id, + method: 'delete' + }) +} + +// 保存文章关联的随机产品 +export function saveRandom(data) { + return request({ + url: '/busi/new/saveRandom', + method: 'post', + data: data + }) +} + +// 删除关联产品 +export function delProdRandom(data) { + return request({ + url: '/busi/new/delProdRandom', + method: 'post', + data: data + }) +} + + +// 查相似新闻 +export function checkContent(data) { + return request({ + url: '/busi/new/checkContent', + method: 'post', + data: data + }) +} diff --git a/dl_vue/src/api/busi/page.js b/dl_vue/src/api/busi/page.js new file mode 100644 index 0000000..b9ce068 --- /dev/null +++ b/dl_vue/src/api/busi/page.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询全站网页访问次数统计列表 +export function listPage(query) { + return request({ + url: '/busi/page/list', + method: 'get', + params: query + }) +} + +// 查询全站网页访问次数统计详细 +export function getPage(id) { + return request({ + url: '/busi/page/' + id, + method: 'get' + }) +} + +// 新增全站网页访问次数统计 +export function addPage(data) { + return request({ + url: '/busi/page', + method: 'post', + data: data + }) +} + +// 修改全站网页访问次数统计 +export function updatePage(data) { + return request({ + url: '/busi/page', + method: 'put', + data: data + }) +} + +// 删除全站网页访问次数统计 +export function delPage(id) { + return request({ + url: '/busi/page/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/busi/prod.js b/dl_vue/src/api/busi/prod.js new file mode 100644 index 0000000..76af42d --- /dev/null +++ b/dl_vue/src/api/busi/prod.js @@ -0,0 +1,89 @@ +import request from '@/utils/request' + +// 查询产品、文章列表 +export function listProdNew(query) { + return request({ + url: '/busi/prod/list', + method: 'get', + params: query + }) +} + +// 查询随机管理产品列表 +export function listRandomProd(query) { + return request({ + url: '/busi/prod/randomList', + method: 'get', + params: query + }) +} + +// 查询产品、文章列表 +export function getMaxSort(query) { + return request({ + url: '/busi/prod/getMaxSort', + method: 'get', + params: query + }) +} + +// 查询产品、文章详细 +export function getProdNew(id) { + return request({ + url: '/busi/prod/' + id, + method: 'get' + }) +} + +// 新增产品、文章 +export function addProdNew(data) { + return request({ + url: '/busi/prod', + method: 'post', + data: data + }) +} + +// 修改产品、文章 +export function updateProdNew(data) { + return request({ + url: '/busi/prod', + method: 'put', + data: data + }) +} + +// 删除产品、文章 +export function delProdNew(id) { + return request({ + url: '/busi/prod/' + id, + method: 'delete' + }) +} + +// 保存产品管理的随机产品 +export function saveRandom(data) { + return request({ + url: '/busi/prod/saveRandom', + method: 'post', + data: data + }) +} + +// 删除关联产品 +export function delProdRandom(data) { + return request({ + url: '/busi/prod/delProdRandom', + method: 'post', + data: data + }) +} + +// 查相似产品 +export function checkContent(data) { + return request({ + url: '/busi/prod/checkContent', + method: 'post', + data: data + }) +} diff --git a/dl_vue/src/api/busi/relation.js b/dl_vue/src/api/busi/relation.js new file mode 100644 index 0000000..a5782e5 --- /dev/null +++ b/dl_vue/src/api/busi/relation.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询产品、新闻等与员工关系列表 +export function listRelation(query) { + return request({ + url: '/busi/relation/list', + method: 'get', + params: query + }) +} + +// 查询产品、新闻等与员工关系详细 +export function getRelation(id) { + return request({ + url: '/busi/relation/' + id, + method: 'get' + }) +} + +// 新增产品、新闻等与员工关系 +export function addRelation(data) { + return request({ + url: '/busi/relation', + method: 'post', + data: data + }) +} + +// 修改产品、新闻等与员工关系 +export function updateRelation(data) { + return request({ + url: '/busi/relation', + method: 'put', + data: data + }) +} + +// 删除产品、新闻等与员工关系 +export function delRelation(id) { + return request({ + url: '/busi/relation/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/busi/thirdItem.js b/dl_vue/src/api/busi/thirdItem.js new file mode 100644 index 0000000..fe039fd --- /dev/null +++ b/dl_vue/src/api/busi/thirdItem.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询三方程序跳转记录列表 +export function listThirdItem(query) { + return request({ + url: '/busi/thirdItem/list', + method: 'get', + params: query + }) +} + +// 查询三方程序跳转记录详细 +export function getThirdItem(id) { + return request({ + url: '/busi/thirdItem/' + id, + method: 'get' + }) +} + +// 新增三方程序跳转记录 +export function addThirdItem(data) { + return request({ + url: '/busi/thirdItem', + method: 'post', + data: data + }) +} + +// 修改三方程序跳转记录 +export function updateThirdItem(data) { + return request({ + url: '/busi/thirdItem', + method: 'put', + data: data + }) +} + +// 删除三方程序跳转记录 +export function delThirdItem(id) { + return request({ + url: '/busi/thirdItem/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/api/statistics/statistics.js b/dl_vue/src/api/statistics/statistics.js new file mode 100644 index 0000000..e4cc45a --- /dev/null +++ b/dl_vue/src/api/statistics/statistics.js @@ -0,0 +1,36 @@ +import request from '@/utils/request' + +// 首页数据统计 +export function indexData(query) { + return request({ + url: '/statistics/indexData', + method: 'get', + params: query + }) +} + +// 首页数据统计 +export function inquiryChart(query) { + return request({ + url: '/statistics/inquiryChart', + method: 'get', + params: query + }) +} +//国家分布 +export function countryChart(query) { + return request({ + url: '/statistics/countryChart', + method: 'get', + params: query + }) +} +//国家分布---分页表格 +export function inquiryCountryList(query) { + return request({ + url: '/statistics/inquiryCountryList', + method: 'get', + params: query + }) +} + diff --git a/dl_vue/src/assets/images/customer.jpg b/dl_vue/src/assets/images/customer.jpg new file mode 100644 index 0000000..d93ed40 Binary files /dev/null and b/dl_vue/src/assets/images/customer.jpg differ diff --git a/dl_vue/src/assets/images/login_logo.png b/dl_vue/src/assets/images/login_logo.png new file mode 100644 index 0000000..21ecde5 Binary files /dev/null and b/dl_vue/src/assets/images/login_logo.png differ diff --git a/dl_vue/src/assets/images/loginleft.png b/dl_vue/src/assets/images/loginleft.png index 47399bc..70ff8b1 100644 Binary files a/dl_vue/src/assets/images/loginleft.png and b/dl_vue/src/assets/images/loginleft.png differ diff --git a/dl_vue/src/assets/images/logo.png b/dl_vue/src/assets/images/logo.png new file mode 100644 index 0000000..04a6f51 Binary files /dev/null and b/dl_vue/src/assets/images/logo.png differ diff --git a/dl_vue/src/assets/images/pay.png b/dl_vue/src/assets/images/pay.png deleted file mode 100644 index bb8b967..0000000 Binary files a/dl_vue/src/assets/images/pay.png and /dev/null differ diff --git a/dl_vue/src/assets/images/profile.jpg b/dl_vue/src/assets/images/profile.jpg deleted file mode 100644 index b3a940b..0000000 Binary files a/dl_vue/src/assets/images/profile.jpg and /dev/null differ diff --git a/dl_vue/src/assets/images/x.png b/dl_vue/src/assets/images/x.png index 78b1c36..6f82ad0 100644 Binary files a/dl_vue/src/assets/images/x.png and b/dl_vue/src/assets/images/x.png differ diff --git a/dl_vue/src/assets/index/category.png b/dl_vue/src/assets/index/category.png new file mode 100644 index 0000000..d6542fe Binary files /dev/null and b/dl_vue/src/assets/index/category.png differ diff --git a/dl_vue/src/assets/index/chat-icon.png b/dl_vue/src/assets/index/chat-icon.png new file mode 100644 index 0000000..b946835 Binary files /dev/null and b/dl_vue/src/assets/index/chat-icon.png differ diff --git a/dl_vue/src/assets/index/chat-obline.png b/dl_vue/src/assets/index/chat-obline.png new file mode 100644 index 0000000..aadbdd2 Binary files /dev/null and b/dl_vue/src/assets/index/chat-obline.png differ diff --git a/dl_vue/src/assets/index/chat.png b/dl_vue/src/assets/index/chat.png new file mode 100644 index 0000000..13b2ca0 Binary files /dev/null and b/dl_vue/src/assets/index/chat.png differ diff --git a/dl_vue/src/assets/index/date.png b/dl_vue/src/assets/index/date.png new file mode 100644 index 0000000..8de11a4 Binary files /dev/null and b/dl_vue/src/assets/index/date.png differ diff --git a/dl_vue/src/assets/index/email.png b/dl_vue/src/assets/index/email.png new file mode 100644 index 0000000..e5ba57a Binary files /dev/null and b/dl_vue/src/assets/index/email.png differ diff --git a/dl_vue/src/assets/index/nav.png b/dl_vue/src/assets/index/nav.png new file mode 100644 index 0000000..5f0fb8f Binary files /dev/null and b/dl_vue/src/assets/index/nav.png differ diff --git a/dl_vue/src/assets/index/news.png b/dl_vue/src/assets/index/news.png new file mode 100644 index 0000000..d2e6fd9 Binary files /dev/null and b/dl_vue/src/assets/index/news.png differ diff --git a/dl_vue/src/assets/index/news_add.png b/dl_vue/src/assets/index/news_add.png new file mode 100644 index 0000000..cf791c3 Binary files /dev/null and b/dl_vue/src/assets/index/news_add.png differ diff --git a/dl_vue/src/assets/index/news_all.png b/dl_vue/src/assets/index/news_all.png new file mode 100644 index 0000000..ecfcd85 Binary files /dev/null and b/dl_vue/src/assets/index/news_all.png differ diff --git a/dl_vue/src/assets/index/news_edit.png b/dl_vue/src/assets/index/news_edit.png new file mode 100644 index 0000000..de96669 Binary files /dev/null and b/dl_vue/src/assets/index/news_edit.png differ diff --git a/dl_vue/src/assets/index/pic.png b/dl_vue/src/assets/index/pic.png new file mode 100644 index 0000000..eb9c753 Binary files /dev/null and b/dl_vue/src/assets/index/pic.png differ diff --git a/dl_vue/src/assets/index/prod_add.png b/dl_vue/src/assets/index/prod_add.png new file mode 100644 index 0000000..922276d Binary files /dev/null and b/dl_vue/src/assets/index/prod_add.png differ diff --git a/dl_vue/src/assets/index/prod_all.png b/dl_vue/src/assets/index/prod_all.png new file mode 100644 index 0000000..3b10679 Binary files /dev/null and b/dl_vue/src/assets/index/prod_all.png differ diff --git a/dl_vue/src/assets/index/prod_edit.png b/dl_vue/src/assets/index/prod_edit.png new file mode 100644 index 0000000..1a533d4 Binary files /dev/null and b/dl_vue/src/assets/index/prod_edit.png differ diff --git a/dl_vue/src/assets/index/productor.png b/dl_vue/src/assets/index/productor.png new file mode 100644 index 0000000..e962ccb Binary files /dev/null and b/dl_vue/src/assets/index/productor.png differ diff --git a/dl_vue/src/assets/index/site-info.png b/dl_vue/src/assets/index/site-info.png new file mode 100644 index 0000000..ca165b6 Binary files /dev/null and b/dl_vue/src/assets/index/site-info.png differ diff --git a/dl_vue/src/assets/index/teams.png b/dl_vue/src/assets/index/teams.png new file mode 100644 index 0000000..2a53e3f Binary files /dev/null and b/dl_vue/src/assets/index/teams.png differ diff --git a/dl_vue/src/assets/index/third.png b/dl_vue/src/assets/index/third.png new file mode 100644 index 0000000..2dcc198 Binary files /dev/null and b/dl_vue/src/assets/index/third.png differ diff --git a/dl_vue/src/assets/index/whatsApp.png b/dl_vue/src/assets/index/whatsApp.png new file mode 100644 index 0000000..bf39f9b Binary files /dev/null and b/dl_vue/src/assets/index/whatsApp.png differ diff --git a/dl_vue/src/assets/index/xunpan-icon.png b/dl_vue/src/assets/index/xunpan-icon.png new file mode 100644 index 0000000..ce8cb25 Binary files /dev/null and b/dl_vue/src/assets/index/xunpan-icon.png differ diff --git a/dl_vue/src/assets/index/xunpan.png b/dl_vue/src/assets/index/xunpan.png new file mode 100644 index 0000000..9c56a1f Binary files /dev/null and b/dl_vue/src/assets/index/xunpan.png differ diff --git a/dl_vue/src/assets/logo/logo-icon.png b/dl_vue/src/assets/logo/logo-icon.png new file mode 100644 index 0000000..78cea98 Binary files /dev/null and b/dl_vue/src/assets/logo/logo-icon.png differ diff --git a/dl_vue/src/assets/logo/logo.png b/dl_vue/src/assets/logo/logo.png index e263760..04a6f51 100644 Binary files a/dl_vue/src/assets/logo/logo.png and b/dl_vue/src/assets/logo/logo.png differ diff --git a/dl_vue/src/assets/styles/variables.scss b/dl_vue/src/assets/styles/variables.scss index 34484d4..2e07434 100644 --- a/dl_vue/src/assets/styles/variables.scss +++ b/dl_vue/src/assets/styles/variables.scss @@ -11,15 +11,15 @@ $panGreen: #30B08F; // 默认菜单主题风格 $base-menu-color:#bfcbd9; $base-menu-color-active:#f4f4f5; -$base-menu-background:#304156; +$base-menu-background:#022959; $base-logo-title-color: #ffffff; $base-menu-light-color:rgba(0,0,0,.70); $base-menu-light-background:#ffffff; $base-logo-light-title-color: #001529; -$base-sub-menu-background:#1f2d3d; -$base-sub-menu-hover:#001528; +$base-sub-menu-background:#0A376D; +$base-sub-menu-hover:rgba(19, 139, 255, 0.48); // 自定义暗色菜单风格 /** diff --git a/dl_vue/src/components/Editor/index.vue b/dl_vue/src/components/Editor/index.vue index 701f44d..78be4bd 100644 --- a/dl_vue/src/components/Editor/index.vue +++ b/dl_vue/src/components/Editor/index.vue @@ -5,7 +5,7 @@ :destroy="true" :config="editorConfig" :editorDependencies="['ueditor.config.js','ueditor.all.js']" - style="height:500px;width: 100%; overflow: auto "/> + /> - + + diff --git a/dl_vue/src/layout/components/Navbar.vue b/dl_vue/src/layout/components/Navbar.vue index e74dd0b..d276c80 100644 --- a/dl_vue/src/layout/components/Navbar.vue +++ b/dl_vue/src/layout/components/Navbar.vue @@ -1,34 +1,37 @@ diff --git a/dl_vue/src/router/index.js b/dl_vue/src/router/index.js index 71907b6..3712ada 100644 --- a/dl_vue/src/router/index.js +++ b/dl_vue/src/router/index.js @@ -87,6 +87,48 @@ export const constantRoutes = [ meta: { title: '个人中心', icon: 'user' } } ] + }, + { + path: '/product', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'prodForm', + component: () => import('@/views/busi/prod/prodForm'), + name: 'ProdForm', + meta: { title: '产品详情' } + } + ] + }, + { + path: '/new', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'newForm', + component: () => import('@/views/busi/new/newForm'), + name: 'NewForm', + meta: { title: '文章详情' } + } + ] + }, + { + path: '/category', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'categoryForm', + component: () => import('@/views/busi/category/form/categoryForm'), + name: 'CategoryForm', + meta: { title: '栏目信息' } + } + ] } ] diff --git a/dl_vue/src/store/index.js b/dl_vue/src/store/index.js index 97aaef8..44002a0 100644 --- a/dl_vue/src/store/index.js +++ b/dl_vue/src/store/index.js @@ -3,6 +3,7 @@ import Vuex from 'vuex' import app from './modules/app' import dict from './modules/dict' import user from './modules/user' +import websocket from './modules/websocket' import tagsView from './modules/tagsView' import permission from './modules/permission' import settings from './modules/settings' @@ -15,6 +16,7 @@ const store = new Vuex.Store({ app, dict, user, + websocket, tagsView, permission, settings diff --git a/dl_vue/src/store/modules/user.js b/dl_vue/src/store/modules/user.js index 63e6ba2..5384727 100644 --- a/dl_vue/src/store/modules/user.js +++ b/dl_vue/src/store/modules/user.js @@ -1,7 +1,6 @@ import { login, logout, getInfo } from '@/api/login' -import { getToken, setToken, removeToken } from '@/utils/auth' +import { getToken, setToken,getUserId,setUserId, removeToken } from '@/utils/auth' import { isHttp, isEmpty } from "@/utils/validate" -import defAva from '@/assets/images/profile.jpg' const user = { state: { @@ -44,6 +43,7 @@ const user = { return new Promise((resolve, reject) => { login(username, password, code, uuid).then(res => { setToken(res.token) + setUserId(res.userid) commit('SET_TOKEN', res.token) resolve() }).catch(error => { @@ -59,7 +59,7 @@ const user = { const user = res.user let avatar = user.avatar || "" if (!isHttp(avatar)) { - avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar + avatar = (isEmpty(avatar)) ? '' : process.env.VUE_APP_BASE_API + avatar } if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 commit('SET_ROLES', res.roles) diff --git a/dl_vue/src/store/modules/websocket.js b/dl_vue/src/store/modules/websocket.js new file mode 100644 index 0000000..e577995 --- /dev/null +++ b/dl_vue/src/store/modules/websocket.js @@ -0,0 +1,69 @@ +import { EventBus } from '@/utils/eventBus'; +const websocket = { + state: { + socket:null, + message:[], + count:"0", + notice:[] + }, + + mutations: { + WEBSOCKET_INIT(state,url){ + state.socket = new WebSocket(url); + state.socket.onopen=function () { + console.log("Websocket已连接") + }; + state.socket.onmessage = function (e) { + if (e.data.startsWith("C")) { + state.count = e.data; + } else if (e.data.startsWith("系统通知")){ + state.notice.push(e.data); + console.log(state.notice); + } else if (e.data.startsWith("close")){ + console.log(e.data) + }else { + console.log(e.data,'消息内容') + //这里捕获消息 + const messageData = JSON.parse(e.data) + // 触发事件通知 + EventBus.$emit('newMessage', messageData); + //存储消息 + state.message.push(messageData); + } + + }; + state.socket.onerror= function () { + console.log("WebSocket连接发生错误"); + }; + state.socket.onclose = function (e) { + console.log("connection closed (" + e.code + ")"); + }; + }, + WEBSOCKET_SEND(state,msg){ + state.socket.send(msg); + }, + WEBSOCKET_CLOSE(state){ + state.socket.close(); + }, + SET_MESSAGE(state,msg){ + state.message = msg + } + }, + + actions: { + websocket_init({commit}, url) { + commit('WEBSOCKET_INIT', url) + }, + websocket_send({commit}, msg) { + commit('WEBSOCKET_SEND', msg) + }, + websocket_close({commit}){ + commit('WEBSOCKET_CLOSE') + }, + set_message({commit},msg){ + commit('SET_MESSAGE',msg) + } + } +} + +export default websocket diff --git a/dl_vue/src/utils/auth.js b/dl_vue/src/utils/auth.js index dd35bfc..2158394 100644 --- a/dl_vue/src/utils/auth.js +++ b/dl_vue/src/utils/auth.js @@ -1,9 +1,12 @@ import Cookies from 'js-cookie' const TokenKey = 'Admin-Token' +const UserIdKey = 'userId' const TenantIdKey = 'tenantId' +const TenantNameKey = 'tenantName' + export function getToken() { return Cookies.get(TokenKey) } @@ -27,3 +30,23 @@ export function setTenantId(tenantId) { export function removeTenantId() { return Cookies.remove(TenantIdKey) } + +export function getUserId() { + return Cookies.get(UserIdKey) +} + +export function setUserId(userId) { + return Cookies.set(UserIdKey, userId) +} + +export function getTenantName() { + return Cookies.get(TenantNameKey) +} + +export function setTenantName(tenantName) { + return Cookies.set(TenantNameKey, tenantName) +} + +export function removeTenantName() { + return Cookies.remove(TenantNameKey) +} diff --git a/dl_vue/src/utils/eventBus.js b/dl_vue/src/utils/eventBus.js new file mode 100644 index 0000000..50e9f89 --- /dev/null +++ b/dl_vue/src/utils/eventBus.js @@ -0,0 +1,2 @@ +import Vue from 'vue'; +export const EventBus = new Vue(); diff --git a/dl_vue/src/utils/request.js b/dl_vue/src/utils/request.js index 323cd94..fb6c23d 100644 --- a/dl_vue/src/utils/request.js +++ b/dl_vue/src/utils/request.js @@ -40,7 +40,9 @@ service.interceptors.request.use(config => { } if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { //拼接当前管理的站点code - config.data.tenantId = getTenantId() + if(config.data){ + config.data.tenantId = getTenantId() + } const requestObj = { url: config.url, data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, diff --git a/dl_vue/src/views/base/app/index.vue b/dl_vue/src/views/base/app/index.vue new file mode 100644 index 0000000..69e26fc --- /dev/null +++ b/dl_vue/src/views/base/app/index.vue @@ -0,0 +1,230 @@ + + + diff --git a/dl_vue/src/views/base/info/index.vue b/dl_vue/src/views/base/info/index.vue index 27d2669..4021b1d 100644 --- a/dl_vue/src/views/base/info/index.vue +++ b/dl_vue/src/views/base/info/index.vue @@ -2,10 +2,10 @@
- 确 定 + 保 存 - +

公司信息

@@ -27,42 +27,68 @@

询盘联系方式

- + -
+
- +
- + - +
+ + + + +
- + + + + + +

站点信息

- + - + + + + + + + + + + + + + - + @@ -80,13 +106,26 @@ - - + + + + + + + + + + + + + + - 确 定 + + 保 存
@@ -97,6 +136,7 @@ export default { name: 'Info', data() { return { + fileTypeIcon:['ico'], // 表单参数 form: { id: null, @@ -104,14 +144,19 @@ export default { faxNumber: null, brandName: null, tel: null, + whatsapp: null, email: null, teams: null, copyright: null, address: null, icon: null, logo: null, + mobileLogo: null, + formLogo: null, qrCode: null, contactUs: null, + companyInfo: null, + companyInfoApp: null, tenantId: null, creator: null, createTime: null, @@ -122,40 +167,48 @@ export default { // 表单校验 rules: { companyName: [ - { required: true, message: '请输入公司名称', trigger: 'blur' }, + { required: true, message: '请输入公司名称', trigger: 'blur' } ], tel: [ - { required: true, message: '请输入手机号码', trigger: 'blur' }, + { required: true, message: '请输入手机号码', trigger: 'blur' } + ], + whatsapp: [ + { required: true, message: '请输入whatsapp号码', trigger: 'blur' } ], email: [ { required: true, message: '请输入Email账号', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' } ], teams: [ - { required: true, message: '请输入Teams账号', trigger: 'blur' }, + { required: true, message: '请输入Teams账号', trigger: 'blur' } ], icon: [ - { required: true, message: '请上传站点icon', trigger: 'blur' }, + { required: true, message: '请上传站点icon', trigger: 'blur' } ], logo: [ - { required: true, message: '请上传站点logo', trigger: 'blur' }, + { required: true, message: '请上传站点logo', trigger: 'blur' } + ], + mobileLogo: [ + { required: true, message: '请上传站点logo', trigger: 'blur' } + ], + formLogo: [ + { required: true, message: '请上传询盘logo', trigger: 'blur' } ], qrCode: [ - { required: true, message: '请上传站点二维码', trigger: 'blur' }, - ], + { required: true, message: '请上传站点二维码', trigger: 'blur' } + ] } } }, - created() { + mounted() { + this.getDataInfo() }, methods: { - /** 查询站点基础信息列表 */ - getList() { + /** 查询站点基础信息 */ + getDataInfo() { this.loading = true - listInfo(this.queryParams).then(response => { - this.infoList = response.data.records - this.total = response.data.total - this.loading = false + getInfo({}).then(response => { + this.form = response.data }) }, /** 提交按钮 */ @@ -177,7 +230,11 @@ export default { } } }) - }, + } } } + + diff --git a/dl_vue/src/views/base/inquiry/index.vue b/dl_vue/src/views/base/inquiry/index.vue new file mode 100644 index 0000000..6c988d5 --- /dev/null +++ b/dl_vue/src/views/base/inquiry/index.vue @@ -0,0 +1,238 @@ + + + diff --git a/dl_vue/src/views/base/manager/index.vue b/dl_vue/src/views/base/manager/index.vue new file mode 100644 index 0000000..c59f7e9 --- /dev/null +++ b/dl_vue/src/views/base/manager/index.vue @@ -0,0 +1,263 @@ + + + diff --git a/dl_vue/src/views/base/pic/index.vue b/dl_vue/src/views/base/pic/index.vue new file mode 100644 index 0000000..fdcba05 --- /dev/null +++ b/dl_vue/src/views/base/pic/index.vue @@ -0,0 +1,282 @@ + + + diff --git a/dl_vue/src/views/base/pics/index.vue b/dl_vue/src/views/base/pics/index.vue new file mode 100644 index 0000000..96ae352 --- /dev/null +++ b/dl_vue/src/views/base/pics/index.vue @@ -0,0 +1,326 @@ + + + + + diff --git a/dl_vue/src/views/base/pics/selectPic.vue b/dl_vue/src/views/base/pics/selectPic.vue new file mode 100644 index 0000000..6cc6770 --- /dev/null +++ b/dl_vue/src/views/base/pics/selectPic.vue @@ -0,0 +1,182 @@ + + + + diff --git a/dl_vue/src/views/base/site/index.vue b/dl_vue/src/views/base/site/index.vue index 90acdc4..5cf9a0d 100644 --- a/dl_vue/src/views/base/site/index.vue +++ b/dl_vue/src/views/base/site/index.vue @@ -74,6 +74,7 @@ + diff --git a/dl_vue/src/views/busi/category/form/categoryForm.vue b/dl_vue/src/views/busi/category/form/categoryForm.vue new file mode 100644 index 0000000..5314fb6 --- /dev/null +++ b/dl_vue/src/views/busi/category/form/categoryForm.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/dl_vue/src/views/busi/category/index.vue b/dl_vue/src/views/busi/category/index.vue index 8699b8c..a2e0790 100644 --- a/dl_vue/src/views/busi/category/index.vue +++ b/dl_vue/src/views/busi/category/index.vue @@ -1,14 +1,6 @@ diff --git a/dl_vue/src/views/statistics/thirdItem/index.vue b/dl_vue/src/views/statistics/thirdItem/index.vue new file mode 100644 index 0000000..d6a1ce2 --- /dev/null +++ b/dl_vue/src/views/statistics/thirdItem/index.vue @@ -0,0 +1,410 @@ + + + diff --git a/dl_vue/src/views/statistics/thirdItem/inquiryChart.vue b/dl_vue/src/views/statistics/thirdItem/inquiryChart.vue new file mode 100644 index 0000000..ff41035 --- /dev/null +++ b/dl_vue/src/views/statistics/thirdItem/inquiryChart.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/dl_vue/src/views/system/user/selectAllUser.vue b/dl_vue/src/views/system/user/selectAllUser.vue new file mode 100644 index 0000000..648269c --- /dev/null +++ b/dl_vue/src/views/system/user/selectAllUser.vue @@ -0,0 +1,199 @@ + + + diff --git a/dl_vue/vue.config.js b/dl_vue/vue.config.js index d079495..09f6619 100644 --- a/dl_vue/vue.config.js +++ b/dl_vue/vue.config.js @@ -7,7 +7,7 @@ function resolve(dir) { const CompressionPlugin = require('compression-webpack-plugin') -const name = process.env.VUE_APP_TITLE || '通告快接管理后台' // 网页标题 +const name = process.env.VUE_APP_TITLE || '成事达管理平台' // 网页标题 const port = process.env.port || process.env.npm_config_port || 80 // 端口