Merge remote-tracking branch 'origin/master'

This commit is contained in:
朱春云 2025-09-05 14:24:58 +08:00
commit 471e0a96fa
288 changed files with 20934 additions and 1123 deletions

View File

@ -10,7 +10,7 @@
<name>ruoyi</name>
<url>http://www.ruoyi.vip</url>
<description>通告快接管理后台</description>
<description>成事达管理后台</description>
<properties>
<ruoyi.version>3.8.9</ruoyi.version>
@ -37,6 +37,8 @@
<spring-framework.version>5.3.39</spring-framework.version>
<hutool.version>5.8.26</hutool.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version>
<aliyun.sdk.oss.version>3.17.4</aliyun.sdk.oss.version>
<httpclient.version>4.5.13</httpclient.version>
</properties>
<!-- 依赖声明 -->
@ -229,7 +231,18 @@
<artifactId>ruoyi-common</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 阿里云OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun.sdk.oss.version}</version>
</dependency>
<!-- 简化HTTP请求处理 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -9,13 +9,25 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId>
<artifactId>nuxt-site</artifactId>
<description>
web服务入口
</description>
<dependencies>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!--微信支付SDK-->
<dependency>
@ -106,6 +118,38 @@
<artifactId>weixin-java-common</artifactId>
<version>4.6.0</version>
</dependency>
<!-- 阿里云OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<!-- 简化HTTP请求处理 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>5.3.31</version>
</dependency>
<!-- ip2region-->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
<dependency>
<groupId>com.google.api-ads</groupId>
<artifactId>google-ads</artifactId>
<version>38.0.0</version> <!-- 使用最新版本 -->
</dependency>
</dependencies>

View File

@ -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<BaseApp> page = new Page<>(pageNum, pageSize);
IPage<BaseApp> 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<BaseApp> list = baseAppService.list();
ExcelUtil<BaseApp> util = new ExcelUtil<BaseApp>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(baseAppService.removeByIds(list));
}
}

View File

@ -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));
}
}

View File

@ -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<BaseManager> page = new Page<>(pageNum, pageSize);
IPage<ManagerVO> 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<BaseManager> list = baseManagerService.list();
ExcelUtil<BaseManager> util = new ExcelUtil<BaseManager>(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<BaseManager> lambdaQueryWrapper = new LambdaQueryWrapper<BaseManager>()
.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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(baseManagerService.removeByIds(list));
}
}

View File

@ -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<BasePic> page = new Page<>(pageNum, pageSize);
IPage<BasePic> 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<BasePic> list = basePicService.list();
ExcelUtil<BasePic> util = new ExcelUtil<BasePic>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(basePicService.removeByIds(list));
}
}

View File

@ -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<BasePics> page = new Page<>(pageNum, pageSize);
IPage<BasePics> 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<BasePics> list = basePicsService.list();
ExcelUtil<BasePics> util = new ExcelUtil<BasePics>(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<BasePics> 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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(basePicsService.removeByIds(list));
}
}

View File

@ -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<BaseSeo> queryWrapper = new LambdaQueryWrapper<BaseSeo>().orderByAsc(BaseSeo::getSort);
List<BaseSeo> list = baseSeoService.list(queryWrapper);
List<BaseSeo> languageList = list.stream().filter(item -> LANGUAGE.equals(item.getDataType())).collect(Collectors.toList());
List<BaseSeo> 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<String, Object> 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<String,Object> rtnMap = new HashMap<>();
rtnMap.put("searchDown",googleConfig.getSearchDown());
rtnMap.put("dataList",googleKeywordService.getKeywords(language, country, title, url));
return success(rtnMap);
}
}

View File

@ -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<BaseSite> page = new Page<>(pageNum, pageSize);
IPage<BaseSite> list = baseSiteService.queryListPage(baseSite, page);
IPage<SiteVO> 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());
}
/**

View File

@ -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<BaseSiteInfo> page = new Page<>(pageNum, pageSize);
IPage<BaseSiteInfo> 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<BaseSiteInfo> list = baseSiteInfoService.list();
ExcelUtil<BaseSiteInfo> util = new ExcelUtil<BaseSiteInfo>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(baseSiteInfoService.removeByIds(list));
}
}

View File

@ -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<BaseTemp> page = new Page<>(pageNum, pageSize);
IPage<BaseTemp> 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<BaseTemp> list = baseTempService.list();
ExcelUtil<BaseTemp> util = new ExcelUtil<BaseTemp>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(baseTempService.removeByIds(list));
}
}

View File

@ -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<String, String> 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<BusiChatItem> 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();
}
}

View File

@ -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<List<BusiCategoryVO>> categoryList(@RequestParam(required = true) String tenantId) {
BusiCategory category = new BusiCategory();
category.setTenantId(tenantId);
List<BusiCategoryVO> 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<List<BusiCategoryVO>> prodCategoryList(@RequestParam(required = true) String tenantId, @RequestParam(required = true) String catgId) {
BusiCategory category = new BusiCategory();
category.setTenantId(tenantId);
List<BusiCategoryVO> 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<com.ruoyi.busi.domain.BusiCategory>
* @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<BusiCategory> 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<List<BasePic>> 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<Map<String, String>> indexCompanyInfo(@RequestParam(required = true) String tenantId) {
BaseSiteInfo baseSiteInfo = siteInfoService.getSiteInfo(tenantId);
Map<String, String> 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<List<BusiProdNew>> 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<List<BusiProdNew>> 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<List<BusiProdNew>> 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<BaseSiteInfo> 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<IPage<BusiProdNew>> prodPageList(String tenantId, String catgId, String text,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BusiProdNew> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<BusiProdNew> queryWrapper = new LambdaQueryWrapper<BusiProdNew>()
.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<String> 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<BusiCategoryVO> busiCategoryVOList = categoryService.treeCategory(category);
//转map
Map<String, String> catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList);
IPage<BusiProdNew> 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<IPage<BusiProdNew>> newsPageList(String tenantId, String catgId, String text,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BusiProdNew> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<BusiProdNew> queryWrapper = new LambdaQueryWrapper<BusiProdNew>()
.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<String> 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<BusiCategoryVO> busiCategoryVOList = categoryService.treeCategory(category);
//转map
Map<String, String> catgMap = categoryService.dealFirstIdRtnMap(busiCategoryVOList);
IPage<BusiProdNew> 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<WebDetailVO> 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<IPage<BusiProdNew>> searchText(String tenantId, String text,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<BusiProdNew> 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<BaseInquiry> 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<String> inquirySave(@ApiIgnore @RequestBody BusiInquiryItem inquiryItem, HttpServletRequest request) {
Map<String, String> 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<List<SiteMapVO>> 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<String> 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<String> getCatgIdApp(@RequestParam(required = true) String catgName) {
return R.ok(dictDataService.selectDictLabel(APP_MENU_KEY,catgName));
}
@ApiOperation("查询最新版本APP")
@GetMapping("/getNewApp")
public R<BaseApp> 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<String, String> 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);
}
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<BaseApp>
{
IPage<BaseApp> queryListPage(@Param("entity") BaseApp entity, Page<BaseApp> page);
}

View File

@ -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<BaseInquiry>
{
IPage<BaseInquiry> queryListPage(@Param("entity") BaseInquiry entity, Page<BaseInquiry> page);
}

View File

@ -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<BaseManager>
{
IPage<ManagerVO> queryListPage(@Param("entity") ManagerVO entity, Page<BaseManager> page);
List<SysUser> selectManagerUserByTenantId(@Param("tenantId")String tenantId);
}

View File

@ -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<BaseNational>
{
IPage<BaseNational> queryListPage(@Param("entity") BaseNational entity, Page<BaseNational> page);
}

View File

@ -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<BasePic>
{
IPage<BasePic> queryListPage(@Param("entity") BasePic entity, Page<BasePic> page);
}

View File

@ -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<BasePics>
{
IPage<BasePics> queryListPage(@Param("entity") BasePics entity, Page<BasePics> page);
}

View File

@ -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<BaseSeo>
{
IPage<BaseSeo> queryListPage(@Param("entity") BaseSeo entity, Page<BaseSeo> page);
}

View File

@ -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<BaseSite>
{
IPage<BaseSite> queryListPage(@Param("entity") BaseSite entity, Page<BaseSite> page);
IPage<SiteVO> queryListPage(@Param("entity") BaseSite entity, Page<BaseSite> page);
List<BaseSite> selectByUserId(@Param("userId")Long userId);
}

View File

@ -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<BaseTemp>
{
IPage<BaseTemp> queryListPage(@Param("entity") BaseTemp entity, Page<BaseTemp> page);
}

View File

@ -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<BaseApp>
{
IPage<BaseApp> queryListPage(BaseApp pageReqVO, Page<BaseApp> page);
BaseApp selectNewApp();
}

View File

@ -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<BaseInquiry>
{
IPage<BaseInquiry> queryListPage(BaseInquiry pageReqVO, Page<BaseInquiry> page);
/**
* 查询站点询盘设置
* @author vinjor-M
* @date 11:01 2025/6/24
* @param tenantId 租户id
* @return com.ruoyi.base.domain.BaseInquiry
**/
BaseInquiry getInquiry(String tenantId);
}

View File

@ -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<BaseManager> {
IPage<ManagerVO> queryListPage(ManagerVO pageReqVO, Page<BaseManager> page);
/**
* 根据站点编码查负责的用户
* @author vinjor-M
* @date 15:33 2025/8/11
* @param tenantId TODO
* @return java.util.List<com.ruoyi.common.core.domain.entity.SysUser>
**/
List<SysUser> getManagerUserByTenantId(String tenantId);
}

View File

@ -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<BaseNational>
{
IPage<BaseNational> queryListPage(BaseNational pageReqVO, Page<BaseNational> page);
/**
* 返回所有国家列表map
* @author vinjor-M
* @date 11:36 2025/7/11
* @return java.util.Map<java.lang.String,java.lang.String>
**/
Map<String,String> getNationalMap();
}

View File

@ -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<BasePic>
{
IPage<BasePic> queryListPage(BasePic pageReqVO, Page<BasePic> page);
/**
* 查询轮播图列表不分页
* @author vinjor-M
* @date 10:33 2025/7/8
* @param tenantId 租户id
* @return java.util.List<com.ruoyi.base.domain.BasePic>
**/
List<BasePic> list(String tenantId);
}

View File

@ -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<BasePics>
{
IPage<BasePics> queryListPage(BasePics pageReqVO, Page<BasePics> page);
}

View File

@ -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<BaseSeo>
{
IPage<BaseSeo> queryListPage(BaseSeo pageReqVO, Page<BaseSeo> page);
}

View File

@ -15,4 +15,13 @@ import com.ruoyi.base.domain.BaseSiteInfo;
public interface IBaseSiteInfoService extends IService<BaseSiteInfo>
{
IPage<BaseSiteInfo> queryListPage(BaseSiteInfo pageReqVO, Page<BaseSiteInfo> page);
/**
* 查询站点详情
* @author vinjor-M
* @date 11:47 2025/6/23
* @param tenantId TODO
* @return com.ruoyi.base.domain.BaseSiteInfo
**/
BaseSiteInfo getSiteInfo(String tenantId);
}

View File

@ -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<BaseSite>
{
IPage<BaseSite> queryListPage(BaseSite pageReqVO, Page<BaseSite> page);
IPage<SiteVO> queryListPage(BaseSite pageReqVO, Page<BaseSite> page);
/**
* 查询本人可以管理的站点
* @author vinjor-M
* @date 16:17 2025/8/11
* @return java.util.List<com.ruoyi.base.domain.BaseSite>
**/
List<BaseSite> getMySiteList();
}

View File

@ -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<BaseTemp>
{
IPage<BaseTemp> queryListPage(BaseTemp pageReqVO, Page<BaseTemp> page);
}

View File

@ -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<BaseAppMapper,BaseApp> implements IBaseAppService
{
@Autowired
private BaseAppMapper baseAppMapper;
@Override
public IPage<BaseApp> queryListPage(BaseApp pageReqVO, Page<BaseApp> page) {
return baseAppMapper.queryListPage(pageReqVO, page);
}
@Override
public BaseApp selectNewApp() {
LambdaQueryWrapper<BaseApp> queryWrapper = new LambdaQueryWrapper<BaseApp>().orderByDesc(BaseApp::getVersion).orderByDesc(DlBaseEntity::getCreateTime);
List<BaseApp> list = this.list(queryWrapper);
return list.isEmpty()?null:list.get(0);
}
}

View File

@ -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<BaseInquiryMapper,BaseInquiry> implements IBaseInquiryService
{
@Autowired
private BaseInquiryMapper baseInquiryMapper;
@Override
public IPage<BaseInquiry> queryListPage(BaseInquiry pageReqVO, Page<BaseInquiry> 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<BaseInquiry> queryWrapper = new LambdaQueryWrapper<BaseInquiry>()
.eq(BaseInquiry::getTenantId,tenantId);
List<BaseInquiry> list = this.list(queryWrapper);
return list.isEmpty()?null:list.get(0);
}
}

View File

@ -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<BaseManagerMapper,BaseManager> implements IBaseManagerService
{
@Autowired
private BaseManagerMapper baseManagerMapper;
@Override
public IPage<ManagerVO> queryListPage(ManagerVO pageReqVO, Page<BaseManager> page) {
return baseManagerMapper.queryListPage(pageReqVO, page);
}
/**
* 根据站点编码查负责的用户
*
* @param tenantId TODO
* @return java.util.List<com.ruoyi.common.core.domain.entity.SysUser>
* @author vinjor-M
* @date 15:33 2025/8/11
**/
@Override
public List<SysUser> getManagerUserByTenantId(String tenantId) {
return baseManagerMapper.selectManagerUserByTenantId(tenantId);
}
}

View File

@ -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<BaseNationalMapper,BaseNational> implements IBaseNationalService
{
@Autowired
private BaseNationalMapper baseNationalMapper;
@Override
public IPage<BaseNational> queryListPage(BaseNational pageReqVO, Page<BaseNational> page) {
return baseNationalMapper.queryListPage(pageReqVO, page);
}
/**
* 返回所有国家列表map
*
* @return java.util.Map<java.lang.String, java.lang.String>
* @author vinjor-M
* @date 11:36 2025/7/11
**/
@Override
@Cacheable("national_map")
public Map<String, String> getNationalMap() {
return this.list().stream().collect(Collectors.toMap(BaseNational::getNational,BaseNational::getOceania));
}
}

View File

@ -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<BasePicMapper,BasePic> implements IBasePicService
{
@Autowired
private BasePicMapper basePicMapper;
@Override
public IPage<BasePic> queryListPage(BasePic pageReqVO, Page<BasePic> page) {
return basePicMapper.queryListPage(pageReqVO, page);
}
/**
* 查询轮播图列表不分页
*
* @param tenantId 租户id
* @return java.util.List<com.ruoyi.base.domain.BasePic>
* @author vinjor-M
* @date 10:33 2025/7/8
**/
@Override
public List<BasePic> list(String tenantId) {
LambdaQueryWrapper<BasePic> queryWrapper = new LambdaQueryWrapper<BasePic>()
.eq(BasePic::getTenantId,tenantId)
.orderByDesc(BasePic::getSort);
return this.list(queryWrapper);
}
}

View File

@ -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<BasePicsMapper,BasePics> implements IBasePicsService
{
@Autowired
private BasePicsMapper basePicsMapper;
@Override
public IPage<BasePics> queryListPage(BasePics pageReqVO, Page<BasePics> page) {
return basePicsMapper.queryListPage(pageReqVO, page);
}
}

View File

@ -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<BaseSeoMapper,BaseSeo> implements IBaseSeoService
{
@Autowired
private BaseSeoMapper baseSeoMapper;
@Override
public IPage<BaseSeo> queryListPage(BaseSeo pageReqVO, Page<BaseSeo> page) {
return baseSeoMapper.queryListPage(pageReqVO, page);
}
}

View File

@ -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<BaseSiteInfoMapper,Base
public IPage<BaseSiteInfo> queryListPage(BaseSiteInfo pageReqVO, Page<BaseSiteInfo> 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<BaseSiteInfo> queryWrapper = new LambdaQueryWrapper<BaseSiteInfo>()
.eq(BaseSiteInfo::getTenantId,tenantId);
List<BaseSiteInfo> list = this.list(queryWrapper);
return list.isEmpty()?null:list.get(0);
}
}

View File

@ -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<BaseSiteMapper,BaseSite> i
private BaseSiteMapper baseSiteMapper;
@Override
public IPage<BaseSite> queryListPage(BaseSite pageReqVO, Page<BaseSite> page) {
public IPage<SiteVO> queryListPage(BaseSite pageReqVO, Page<BaseSite> page) {
return baseSiteMapper.queryListPage(pageReqVO, page);
}
/**
* 查询本人可以管理的站点
*
* @return java.util.List<com.ruoyi.base.domain.BaseSite>
* @author vinjor-M
* @date 16:17 2025/8/11
**/
@Override
public List<BaseSite> getMySiteList() {
Long userId = SecurityUtils.getUserId();
if(1==userId){
//超级管理员查所有站点
return this.list();
}
return baseSiteMapper.selectByUserId(userId);
}
}

View File

@ -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<BaseTempMapper,BaseTemp> implements IBaseTempService
{
@Autowired
private BaseTempMapper baseTempMapper;
@Override
public IPage<BaseTemp> queryListPage(BaseTemp pageReqVO, Page<BaseTemp> page) {
return baseTempMapper.queryListPage(pageReqVO, page);
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<BasePics> fileList;
}

View File

@ -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;
}

View File

@ -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<BusiCategory> page = new Page<>(pageNum, pageSize);
IPage<BusiCategory> 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<BusiCategory> list = busiCategoryService.list();
ExcelUtil<BusiCategory> util = new ExcelUtil<BusiCategory>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiCategoryService.removeByIds(list));
}

View File

@ -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<BusiChatItem> list = busiChatItemService.list();
ExcelUtil<BusiChatItem> util = new ExcelUtil<BusiChatItem>(BusiChatItem.class);
util.exportExcel(response, list, "在线聊天记录数据");
}
}

View File

@ -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<BusiChatMain> page = new Page<>(pageNum, pageSize);
IPage<ChatMainVO> 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<BusiChatMain> list = busiChatMainService.list();
ExcelUtil<BusiChatMain> util = new ExcelUtil<BusiChatMain>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiChatMainService.removeByIds(list));
}
/**
* 根据客服ID查询会话列表---只有服务端使用所以挪过来
*/
@GetMapping("/service")
public AjaxResult getByServiceId() {
LoginUser loginUser = SecurityUtils.getLoginUser();
List<BusiChatMain> sessions = busiChatMainService.selectByServiceId(loginUser.getUserId());
return AjaxResult.success(sessions);
}
}

View File

@ -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<BusiInquiryItem> page = new Page<>(pageNum, pageSize);
IPage<BusiInquiryItem> 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<BusiInquiryItem> list = busiInquiryItemService.list();
ExcelUtil<BusiInquiryItem> util = new ExcelUtil<BusiInquiryItem>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiInquiryItemService.removeByIds(list));
}
}

View File

@ -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<BusiKeywordRankStatVO> page = new Page<>(pageNum, pageSize);
IPage<BusiKeywordRankStatVO> 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<String, Integer> 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<BusiKeywordItem> list = busiKeywordItemService.list();
ExcelUtil<BusiKeywordItem> util = new ExcelUtil<BusiKeywordItem>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiKeywordItemService.removeByIds(list));
}
}

View File

@ -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<BusiProdNew> page = new Page<>(pageNum, pageSize);
//只查新闻
busiProdNew.setDataType(DATA_TYPE_NEWS);
IPage<ProdNewVO> 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<BusiProdNew> list = busiProdNewService.list();
ExcelUtil<BusiProdNew> util = new ExcelUtil<BusiProdNew>(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<String> 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<BusiProdRandom> 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));
}
}

View File

@ -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<BusiPage> list = busiPageService.list();
ExcelUtil<BusiPage> util = new ExcelUtil<BusiPage>(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<Long> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiPageService.removeByIds(list));
}
}

View File

@ -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<BusiProdNew> page = new Page<>(pageNum, pageSize);
//只查产品
busiProdNew.setDataType(DATA_TYPE_PRODUCT);
IPage<ProdNewVO> 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<BusiProdNew> list = busiProdNewService.list();
ExcelUtil<BusiProdNew> util = new ExcelUtil<BusiProdNew>(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<String> 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<BusiProdRandom> 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));
}
}

View File

@ -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<BusiRelation> page = new Page<>(pageNum, pageSize);
IPage<BusiRelation> 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<BusiRelation> list = busiRelationService.list();
ExcelUtil<BusiRelation> util = new ExcelUtil<BusiRelation>(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<String> userIdList = Arrays.asList(busiRelation.getLeaderId().split(","));
List<BusiRelation> 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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiRelationService.removeByIds(list));
}
}

View File

@ -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<BusiThirdItem> page = new Page<>(pageNum, pageSize);
IPage<ThirdVO> 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<BusiThirdItem> list = busiThirdItemService.list();
ExcelUtil<BusiThirdItem> util = new ExcelUtil<BusiThirdItem>(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<String> list = new ArrayList<>(Arrays.asList(ids));
return toAjax(busiThirdItemService.removeByIds(list));
}
}

View File

@ -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<String, Object> 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<ChartDataVO> list = busiThirdItemService.nationalData(tenantId,startDate,endDate,null);
int startIndex = (pageNum-1)*pageSize;
int endIndex = Math.min(startIndex+pageSize,list.size());
Map<String,Object> rtnMap = new HashMap<>();
rtnMap.put("records",list.subList(startIndex,endIndex));
rtnMap.put("current",pageNum);
rtnMap.put("total",list.size());
return success(rtnMap);
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<BusiCategory>
{
IPage<BusiCategory> queryListPage(@Param("entity") BusiCategory entity, Page<BusiCategory> page);
public interface BusiCategoryMapper extends BaseMapper<BusiCategory> {
List<String> selectAllChildren(@Param("id")String id);
}

View File

@ -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<BusiChatItem>
{
IPage<BusiChatItem> queryListPage(@Param("entity") BusiChatItem entity, Page<BusiChatItem> page);
List<ChatItemVO> selectListData(@Param("entity")BusiChatItem entity);
/**
* 根据会话ID查询消息列表
* @param sessionId 会话ID
* @return 消息列表
*/
List<BusiChatItem> 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);
}

View File

@ -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<BusiChatMain>
{
IPage<ChatMainVO> queryListPage(@Param("entity") ChatMainVO entity, Page<BusiChatMain> 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<ChartDataVO> 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<com.ruoyi.busi.vo.ChartDataVO>
**/
List<ChartDataVO> selectEquipmentSortList(@Param("tenantId")String tenantId);
List<ThirdSoftVO> selectChatVO(@Param("tenantId")String tenantId);
List<BusiChatMain> selectLineChart(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate);
/**
* 根据客服ID查询会话列表
* @param serviceId 客服ID
* @return 会话列表
*/
List<BusiChatMain> 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);
}

View File

@ -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<BusiInquiryItem>
{
IPage<BusiInquiryItem> queryListPage(@Param("entity") InquiryItemVO entity, Page<BusiInquiryItem> 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<ChartDataVO> 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<com.ruoyi.busi.vo.ChartDataVO>
**/
List<ChartDataVO> selectEquipmentSortList(@Param("tenantId")String tenantId);
/**
* 查询在线询盘-近30天
* @author vinjor-M
* @date 16:19 2025/7/16
* @param tenantId 站点编码
* @return java.util.List<com.ruoyi.busi.vo.ThirdSoftVO>
**/
List<ThirdSoftVO> selectinquiryItemVO(@Param("tenantId")String tenantId);
List<BusiInquiryItem> selectLineChart(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate);
}

View File

@ -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<BusiKeywordItem>
{
IPage<BusiKeywordItem> queryListPage(@Param("entity") BusiKeywordItem entity, Page<BusiKeywordItem> page);
int deleteBySelectDateInt(@Param("date") String date);
/**
* 分页查询关键词基础信息
*/
IPage<BusiKeywordRankStatVO> selectKeywordPage(
IPage<BusiKeywordRankStatVO> page,
@Param("title") String title,
@Param("tenantId") String tenantId
);
/**
* 查询关键词在时间范围内的排名数据
*/
List<KeywordRankData> selectRankDataByKeywordIds(
@Param("keywordIds") List<String> 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<Map<String, Object>> selectTodayRankStat(
@Param("selectDate") Date selectDate,
@Param("tenantId") String tenantId
);
}

View File

@ -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<BusiKeyword>
{
IPage<BusiKeyword> queryListPage(@Param("entity") BusiKeyword entity, Page<BusiKeyword> page);
/**
* 最新一次添加关键词的 时间
* @author vinjor-M
* @date 14:32 2025/8/21
**/
Date selectNewDate();
}

View File

@ -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<BusiPage>
{
IPage<BusiPage> queryListPage(@Param("entity") BusiPage entity, Page<BusiPage> page);
List<BusiPageVO> selectListCus(@Param("entity")BusiPageVO busiPageVO);
}

View File

@ -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<BusiProdNew>
{
IPage<ProdNewVO> queryListPage(@Param("entity") ProdNewVO entity, Page<BusiProdNew> page);
List<ProdNewVO> 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<com.ruoyi.busi.vo.ProdNewVO>
**/
List<ProdNewVO> 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<com.ruoyi.busi.domain.BusiProdNew>
**/
List<BusiProdNew> selectDataByUpdateTime(@Param("updateTime")String updateTime);
}

View File

@ -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<BusiProdRandom>
{
IPage<BusiProdRandom> queryListPage(@Param("entity") BusiProdRandom entity, Page<BusiProdRandom> page);
/**
* 查某产品管理的随机产品
* @author vinjor-M
* @date 16:36 2025/6/27
* @return java.util.List<com.ruoyi.busi.vo.ProdNewVO>
**/
List<ProdNewVO> 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);
}

View File

@ -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<BusiRelation>
{
IPage<BusiRelation> queryListPage(@Param("entity") BusiRelation entity, Page<BusiRelation> page);
Integer deleteByProdId(@Param("prodId")String prodId,@Param("tenantId")String tenantId);
}

View File

@ -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<BusiThirdItem>
{
IPage<ThirdVO> queryListPage(@Param("entity") ThirdVO entity, Page<BusiThirdItem> 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<com.ruoyi.busi.vo.ChartDataVO>
**/
List<ChartDataVO> 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<com.ruoyi.busi.vo.ChartDataVO>
**/
List<ChartDataVO> selectEquipmentSortList(@Param("tenantId")String tenantId);
List<ThirdSoftVO> selectThirdSoft(@Param("tenantId")String tenantId);
List<BusiThirdItem> selectLineChart(@Param("tenantId")String tenantId,@Param("startDate")String startDate,@Param("endDate")String endDate);
}

View File

@ -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<com.ruoyi.base.vo.KeywordVO>
* @author vinjor-M
* @date 17:55 2025/8/4
**/
public List<KeywordVO> getKeywords(String language, String country, String title, String url) {
List<KeywordVO> 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<String> seedKeywords = Arrays.asList(title.split(StrUtil.COMMA));
// 语言
language = "languageConstants/"+language;
// 国家/地区
List<String> geoTargetList = new ArrayList<>();
for (String item:country.split(StrUtil.COMMA)){
geoTargetList.add("geoTargetConstants/"+item);
}
// 3. 获取关键词提示
List<GenerateKeywordIdeaResult> 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<GenerateKeywordIdeaResult> generateKeywordIdeas(
GoogleAdsClient googleAdsClient,
long customerId,
List<String> seedKeywords,
String language,
List<String> geoTargets,String url) throws IOException {
List<GenerateKeywordIdeaResult> 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;
}
}

View File

@ -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<BusiCategory>
{
IPage<BusiCategory> queryListPage(BusiCategory pageReqVO, Page<BusiCategory> page);
public interface IBusiCategoryService extends IService<BusiCategory> {
/**
* 树形结构查询网站栏目
*
* @param category {@link BusiCategory}
* @return java.util.List<com.ruoyi.busi.vo.BusiCategoryVO>
* @author PQZ
* @date 14:06 2025/6/23
**/
List<BusiCategoryVO> treeCategory(BusiCategory category);
/**
* 设置直接产品数递归产品数
* @author PQZ
* @date 14:12 2025/6/30
**/
void setCategoryAmount(List<ProdNewVO> list,String tenantId);
/**
*
* @author vinjor-M
* @date 15:30 2025/7/8
* @param id 查询的栏目ID
* @return java.util.List<java.lang.String>
**/
List<String> getAllChildrenId(String id);
/**
* 给所有子级设置最父级ID
* @author vinjor-M
* @date 11:23 2025/7/19
* @param busiCategoryVOList TODO
* @return java.util.List<com.ruoyi.busi.vo.BusiCategoryVO>
**/
List<BusiCategoryVO> dealFirstId(List<BusiCategoryVO> busiCategoryVOList);
/**
* 给所有子级设置最父级ID并且反回map格式
* @author vinjor-M
* @date 11:23 2025/7/19
* @param busiCategoryVOList 栏目树
* @return java.util.List<com.ruoyi.busi.vo.BusiCategoryVO>
**/
Map<String,String> dealFirstIdRtnMap(List<BusiCategoryVO> busiCategoryVOList);
}

View File

@ -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<BusiChatItem>
{
List<ChatItemVO> queryList(BusiChatItem pageReqVO);
/**
* 发送消息
* @param message 消息内容
* @return 消息ID
*/
BusiChatItem sendMessage(BusiChatItem message);
/**
* 根据会话ID查询消息列表
* @param sessionId 会话ID
* @return 消息列表
*/
List<BusiChatItem> 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);
}

View File

@ -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<BusiChatMain> {
IPage<ChatMainVO> queryListPage(ChatMainVO pageReqVO, Page<BusiChatMain> 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<BusiChatMain> 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);
}

View File

@ -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<BusiInquiryItem>
{
IPage<BusiInquiryItem> queryListPage(InquiryItemVO pageReqVO, Page<BusiInquiryItem> page);
}

View File

@ -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<BusiKeywordItem>
{
IPage<BusiKeywordItem> queryListPage(BusiKeywordItem pageReqVO, Page<BusiKeywordItem> page);
/**
* 获取所有关键词的google排名
* @author vinjor-M
* @date 15:10 2025/8/21
**/
void getKeywordRanking();
/**
* 分页查询关键词排名统计
* @param page 分页参数
* @param queryVO 查询参数
* @return 分页结果
*/
IPage<BusiKeywordRankStatVO> selectKeywordRankStatPage(IPage<BusiKeywordRankStatVO> page, BusiKeywordItemQueryVO queryVO);
/**
* 统计当天1-10名和11-20名的关键词数量
* @param selectDate 选择日期
* @param tenantId 租户ID
* @return Map形式的统计结果 {key1: 1-10名数量, key2: 11-20名数量}
*/
Map<String, Integer> selectTodayRankStat( String tenantId);
}

View File

@ -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<BusiKeyword> {
IPage<BusiKeyword> queryListPage(BusiKeyword pageReqVO, Page<BusiKeyword> page);
/**
* 检索全站使用的关键词
* @author vinjor-M
* @date 14:26 2025/8/21
**/
void getAllKeyword();
}

View File

@ -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<BusiPage>
{
IPage<BusiPage> queryListPage(BusiPage pageReqVO, Page<BusiPage> 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<com.ruoyi.busi.vo.BusiPageVO>
**/
List<BusiPageVO> queryListNum(BusiPageVO busiPage);
}

View File

@ -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<BusiProdNew>
{
IPage<ProdNewVO> queryListPage(ProdNewVO pageReqVO, Page<BusiProdNew> 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<java.lang.String,java.lang.Object>
**/
Map<String,Object> getIndexData(String tenantId);
/**
* 首页查询热门产品
* @author vinjor-M
* @date 11:33 2025/7/8
* @param tenantId 租户id
* @return java.util.List<com.ruoyi.busi.domain.BusiProdNew>
**/
List<BusiProdNew> 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<com.ruoyi.busi.vo.ProdNewVO>
**/
IPage<BusiProdNew> searchTextAll(String tenantId, String text,Page<BusiProdNew> page);
/**
* 相似度检测
* @author vinjor-M
* @date 10:24 2025/7/18
* @param prodNewVO
* @return java.util.List<com.ruoyi.busi.vo.ProdNewVO>
**/
List<ProdNewVO> checkContent(ProdNewVO prodNewVO);
/**
* 获取站点分类地图
* @author vinjor-M
* @date 14:12 2025/8/4
* @param tenantId 站点编码
* @param catgType 栏目类型
* @return java.util.List<com.ruoyi.busi.vo.SiteMapVO>
**/
List<SiteMapVO> getSiteMap(String tenantId, String catgType);
}

View File

@ -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<BusiProdRandom>
{
IPage<BusiProdRandom> queryListPage(BusiProdRandom pageReqVO, Page<BusiProdRandom> page);
/**
* 查某产品的随机关联产品
* @author vinjor-M
* @date 16:35 2025/6/27
* @return java.util.List<com.ruoyi.busi.vo.ProdNewVO>
**/
List<ProdNewVO> 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);
}

View File

@ -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<BusiRelation>
{
IPage<BusiRelation> queryListPage(BusiRelation pageReqVO, Page<BusiRelation> 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);
}

View File

@ -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<BusiThirdItem>
{
IPage<ThirdVO> queryListPage(ThirdVO pageReqVO, Page<BusiThirdItem> page);
/**
* 首页询盘总流量
* @author vinjor-M
* @date 16:25 2025/7/11
* @param tenantId TODO
* @return java.util.Map<java.lang.String,java.lang.Object>
**/
Map<String,Object> inquiryMap(String tenantId);
/**
* 查询询盘来源前十国家
* @author vinjor-M
* @date 10:47 2025/7/16
* @param tenantId 站点编码
* @return java.util.List<com.ruoyi.busi.vo.ChartDataVO>
**/
List<ChartDataVO> nationalData(String tenantId,String startDate,String endDate,Integer num);
/**
* 查询盘设备
* @author vinjor-M
* @date 15:15 2025/7/16
* @param tenantId 站点编码
* @return java.util.List<com.ruoyi.busi.vo.ChartDataVO>
**/
List<ChartDataVO> equipmentData(String tenantId);
/**
* 首页查询近30天询盘数
* @author vinjor-M
* @date 15:26 2025/7/16
* @param tenantId 站点编码
* @return java.util.List<com.ruoyi.busi.vo.IndexInquiryVO>
**/
List<IndexInquiryVO> dataList(String tenantId);
/**
* 询盘走势
* @author vinjor-M
* @date 17:12 2025/7/16
* @param tenantId 站点编码
* @param startDate 开始日期
* @param endDate 结束日期
* @return java.util.Map<java.lang.String,java.lang.Object>
**/
Map<String, Object> 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<java.lang.String,java.lang.Object>
**/
Map<String, Object> countryChart(String tenantId, String startDate, String endDate);
}

Some files were not shown because too many files have changed in this diff Show More