From d028780bd3d132909ad76279fd5ad50d15dcd1d5 Mon Sep 17 00:00:00 2001 From: Vinjor Date: Thu, 7 Aug 2025 16:18:08 +0800 Subject: [PATCH] 1 --- .../ruoyi/base/controller/WebController.java | 76 ++--- .../busi/controller/BusiPageController.java | 112 +++++++ .../java/com/ruoyi/busi/domain/BusiPage.java | 64 ++++ .../com/ruoyi/busi/mapper/BusiPageMapper.java | 21 ++ .../ruoyi/busi/service/IBusiPageService.java | 28 ++ .../service/impl/BusiPageServiceImpl.java | 57 ++++ .../com/ruoyi/busi/utils/CommonUtils.java | 37 +++ .../resources/mapper/busi/BusiPageMapper.xml | 32 ++ dl_vue/.env.development | 2 +- dl_vue/src/api/busi/page.js | 44 +++ dl_vue/src/views/busi/page/index.vue | 302 ++++++++++++++++++ 11 files changed, 731 insertions(+), 44 deletions(-) create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java create mode 100644 dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml create mode 100644 dl_vue/src/api/busi/page.js create mode 100644 dl_vue/src/views/busi/page/index.vue diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java index 631ccef..3adf05f 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java @@ -12,10 +12,7 @@ import com.ruoyi.base.service.IBaseInquiryService; import com.ruoyi.base.service.IBaseNationalService; import com.ruoyi.base.service.IBasePicService; import com.ruoyi.base.service.IBaseSiteInfoService; -import com.ruoyi.busi.domain.BusiCategory; -import com.ruoyi.busi.domain.BusiChatMain; -import com.ruoyi.busi.domain.BusiInquiryItem; -import com.ruoyi.busi.domain.BusiProdNew; +import com.ruoyi.busi.domain.*; import com.ruoyi.busi.service.*; import com.ruoyi.busi.utils.CommonUtils; import com.ruoyi.busi.vo.BusiCategoryVO; @@ -75,6 +72,10 @@ public class WebController extends BaseController { private IBusiChatMainService busiChatMainService; @Autowired private GoogleKeywordService googleKeywordService; + @Autowired + private IBusiPageService pageService; + @Autowired + private CommonUtils commonUtils; /** * 导航栏接口--所有分类 @@ -372,14 +373,7 @@ public class WebController extends BaseController { **/ @PostMapping("/chatMain") public AjaxResult saveChatMain(@RequestBody BusiChatMain busiChatMain, HttpServletRequest request) { - String ip = ""; - String nationalStr = ""; - try { - ip = CommonUtils.getIpAddr(request); - nationalStr = CommonUtils.getAddr(ip); - } catch (Exception e) { - logger.error("识别所属国家失败"); - } + String ip = CommonUtils.getIpAddr(request); ip = StringUtils.isNotEmpty(ip) ? ip : "未知"; BusiChatMain result = busiChatMainService.queryByIpAndCusCode(ip, busiChatMain.getCusCode(), busiChatMain.getProdId()); if (result != null) { @@ -389,17 +383,10 @@ public class WebController extends BaseController { } return success(result); } else { - nationalStr = StringUtils.isNotEmpty(nationalStr) ? nationalStr : "未知"; - String national = nationalStr.split("\\|")[0]; - System.out.println(ip + "-----" + nationalStr); - String oceania = "未知"; - Map nationalMap = nationalService.getNationalMap(); - if (nationalMap.containsKey(national)) { - oceania = nationalMap.get(national); - } - busiChatMain.setIp(ip); - busiChatMain.setNational(nationalStr); - busiChatMain.setOceania(oceania); + Map ipMap = commonUtils.getIPAndCountry(request); + busiChatMain.setIp(ipMap.get("ip")); + busiChatMain.setNational(ipMap.get("national")); + busiChatMain.setOceania(ipMap.get("oceania")); busiChatMain.setNums(0); busiChatMainService.save(busiChatMain); return success(busiChatMain); @@ -441,26 +428,10 @@ public class WebController extends BaseController { }) @PostMapping("/inquirySave") public R inquirySave(@ApiIgnore @RequestBody BusiInquiryItem inquiryItem, HttpServletRequest request) { - String ip = ""; - String nationalStr = ""; - try { - ip = CommonUtils.getIpAddr(request); - nationalStr = CommonUtils.getAddr(ip); - } catch (Exception e) { - logger.error("识别所属国家失败"); - } - ip = StringUtils.isNotEmpty(ip) ? ip : "未知"; - nationalStr = StringUtils.isNotEmpty(nationalStr) ? nationalStr : "未知"; - String national = nationalStr.split("\\|")[0]; - System.out.println(ip + "-----" + nationalStr); - String oceania = "未知"; - Map nationalMap = nationalService.getNationalMap(); - if (nationalMap.containsKey(national)) { - oceania = nationalMap.get(national); - } - inquiryItem.setIp(ip); - inquiryItem.setNational(national); - inquiryItem.setOceania(oceania); + Map ipMap = commonUtils.getIPAndCountry(request); + inquiryItem.setIp(ipMap.get("ip")); + inquiryItem.setNational(ipMap.get("national")); + inquiryItem.setOceania(ipMap.get("oceania")); inquiryItemService.save(inquiryItem); return R.ok(); } @@ -480,4 +451,23 @@ public class WebController extends BaseController { public R> siteMap(@RequestParam(required = true) String tenantId, @RequestParam(required = true) String catgType){ return R.ok(prodNewService.getSiteMap(tenantId,catgType)); } + + /** + * 记录网页访问次数 + * @author vinjor-M + * @date 10:04 2025/7/8 + * @return com.ruoyi.common.core.domain.AjaxResult + **/ + @ApiOperation("记录网页访问次数") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "url", value = "网页地址", required = true, paramType = "body"), + @ApiImplicitParam(name = "tenantId", value = "站点编码", required = true, paramType = "body"), + @ApiImplicitParam(name = "equipment", value = "设备类型(移动端|电脑端)", required = true, paramType = "body") + }) + @PostMapping("/pageSave") + public R pageSave(@ApiIgnore @RequestBody BusiPage busiPage, HttpServletRequest request) { + busiPage.setCreateTime(new Date()); + pageService.pageSave(busiPage,request); + return R.ok(); + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java new file mode 100644 index 0000000..44f9968 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiPageController.java @@ -0,0 +1,112 @@ +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.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; + + /** + * 查询全站网页访问次数统计列表 + */ + @PreAuthorize("@ss.hasPermi('busi:page:list')") + @GetMapping("/list") + public AjaxResult list(BusiPage busiPage, + @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) + { + Page page = new Page<>(pageNum, pageSize); + IPage list = busiPageService.queryListPage(busiPage,page); + return success(list); + } + + /** + * 导出全站网页访问次数统计列表 + */ + @PreAuthorize("@ss.hasPermi('busi:page:export')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BusiPage busiPage) + { + List list = busiPageService.list(); + ExcelUtil util = new ExcelUtil(BusiPage.class); + util.exportExcel(response, list, "全站网页访问次数统计数据"); + } + + /** + * 获取全站网页访问次数统计详细信息 + */ + @PreAuthorize("@ss.hasPermi('busi:page:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(busiPageService.getById(id)); + } + + /** + * 新增全站网页访问次数统计 + */ + @PreAuthorize("@ss.hasPermi('busi:page:add')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BusiPage busiPage) + { + return toAjax(busiPageService.save(busiPage)); + } + + /** + * 修改全站网页访问次数统计 + */ + @PreAuthorize("@ss.hasPermi('busi:page:edit')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BusiPage busiPage) + { + return toAjax(busiPageService.updateById(busiPage)); + } + + /** + * 删除全站网页访问次数统计 + */ + @PreAuthorize("@ss.hasPermi('busi:page:remove')") + @Log(title = "全站网页访问次数统计", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + List list = new ArrayList<>(Arrays.asList(ids)); + return toAjax(busiPageService.removeByIds(list)); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java new file mode 100644 index 0000000..9d26e54 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiPage.java @@ -0,0 +1,64 @@ +package com.ruoyi.busi.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import com.ruoyi.common.core.domain.DlBaseEntity; + +import java.util.Date; + +/** + * 全站网页访问次数统计对象 dl_busi_page + * + * @author vinjor-m + * @date 2025-08-07 + */ +@TableName("dl_busi_page") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "BusiPage", description = "网页访问次数实体") +public class BusiPage +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 网页地址 */ + @Excel(name = "网页地址") + @ApiModelProperty("网页地址") + private String url; + + /** 设备类型 */ + @Excel(name = "设备类型") + @ApiModelProperty("设备类型") + private String equipment; + + /** 来源IP */ + @Excel(name = "来源IP") + private String ip; + + /** 来源国家 */ + @Excel(name = "来源国家") + private String national; + /** 洲 */ + @Excel(name = "洲") + private String oceania; + + /** 站点唯一编码(租户id) */ + @Excel(name = "站点唯一编码", readConverterExp = "租=户id") + @ApiModelProperty("站点唯一编码") + private String tenantId; + /** 创建时间 */ + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java new file mode 100644 index 0000000..62441c7 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiPageMapper.java @@ -0,0 +1,21 @@ +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 org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 全站网页访问次数统计Mapper接口 + * + * @author vinjor-m + * @date 2025-08-07 + */ +@Mapper +public interface BusiPageMapper extends BaseMapper +{ + IPage queryListPage(@Param("entity") BusiPage entity, Page page); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java new file mode 100644 index 0000000..ba9c846 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java @@ -0,0 +1,28 @@ +package com.ruoyi.busi.service; + +import java.util.List; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.busi.domain.BusiPage; + +import javax.servlet.http.HttpServletRequest; + +/** + * 全站网页访问次数统计Service接口 + * + * @author vinjor-m + * @date 2025-08-07 + */ +public interface IBusiPageService extends IService +{ + IPage queryListPage(BusiPage pageReqVO, Page page); + + /** + * 保存网页访问记录 + * @author vinjor-M + * @date 11:13 2025/8/7 + * @param busiPage TODO + **/ + void pageSave(BusiPage busiPage, HttpServletRequest request); +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java new file mode 100644 index 0000000..ea9c5f1 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java @@ -0,0 +1,57 @@ +package com.ruoyi.busi.service.impl; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import com.ruoyi.busi.utils.CommonUtils; +import com.ruoyi.common.utils.DateUtils; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.busi.mapper.BusiPageMapper; +import com.ruoyi.busi.domain.BusiPage; +import com.ruoyi.busi.service.IBusiPageService; + +import javax.servlet.http.HttpServletRequest; + +/** + * 全站网页访问次数统计Service业务层处理 + * + * @author vinjor-m + * @date 2025-08-07 + */ +@Service +public class BusiPageServiceImpl extends ServiceImpl implements IBusiPageService +{ + @Autowired + private BusiPageMapper busiPageMapper; + @Autowired + private CommonUtils commonUtils; + + @Override + public IPage queryListPage(BusiPage pageReqVO, Page page) { + return busiPageMapper.queryListPage(pageReqVO, page); + } + + /** + * 保存网页访问记录 + * + * @param busiPage TODO + * @author vinjor-M + * @date 11:13 2025/8/7 + **/ + @Override + public void pageSave(BusiPage busiPage, HttpServletRequest request) { + // 2. 异步保存到数据库(RuoYi已内置线程池) + CompletableFuture.runAsync(() -> { + Map ipMap = commonUtils.getIPAndCountry(request); + busiPage.setIp(ipMap.get("ip")); + busiPage.setNational(ipMap.get("national")); + busiPage.setOceania(ipMap.get("oceania")); + this.save(busiPage); + }); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java index d15f980..0777caf 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java @@ -1,9 +1,12 @@ package com.ruoyi.busi.utils; import cn.hutool.core.util.StrUtil; +import com.ruoyi.base.service.IBaseNationalService; +import com.ruoyi.common.utils.StringUtils; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.poi.util.IOUtils; import org.lionsoul.ip2region.xdb.Searcher; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; @@ -24,6 +27,9 @@ import java.util.stream.Collectors; @Slf4j public class CommonUtils { + @Autowired + private IBaseNationalService nationalService; + private static final String UNKNOWN = "unknown"; /** @@ -102,4 +108,35 @@ public class CommonUtils { } return yearMonthList; } + + /** + * 根据IP查询所属国家和洲 + * @author vinjor-M + * @date 15:48 2025/8/7 + * @return java.util.Map + **/ + public Map getIPAndCountry(HttpServletRequest request){ + Map rtnMap = new HashMap<>(); + String ip = ""; + String nationalStr = ""; + try { + ip = CommonUtils.getIpAddr(request); + nationalStr = CommonUtils.getAddr(ip); + } catch (Exception e) { + log.error("识别所属国家失败"); + } + ip = StringUtils.isNotEmpty(ip) ? ip : "未知"; + nationalStr = StringUtils.isNotEmpty(nationalStr) ? nationalStr : "未知"; + String national = nationalStr.split("\\|")[0]; + System.out.println(ip + "-----" + nationalStr); + String oceania = "未知"; + Map nationalMap = nationalService.getNationalMap(); + if (nationalMap.containsKey(national)) { + oceania = nationalMap.get(national); + } + rtnMap.put("ip",ip); + rtnMap.put("national",national); + rtnMap.put("oceania",oceania); + return rtnMap; + } } diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml new file mode 100644 index 0000000..5a128e6 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + select id, url, equipment, ip, national,oceania, tenant_id, create_time from dl_busi_page + + + + \ No newline at end of file diff --git a/dl_vue/.env.development b/dl_vue/.env.development index a050276..5c95054 100644 --- a/dl_vue/.env.development +++ b/dl_vue/.env.development @@ -5,7 +5,7 @@ VUE_APP_TITLE = 成事达管理平台 ENV = 'development' # 成事达管理平台/开发环境 -VUE_APP_BASE_API = 'http://127.0.0.1:8099' +VUE_APP_BASE_API = 'http://192.168.1.13:8099' # 路由懒加载 VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/dl_vue/src/api/busi/page.js b/dl_vue/src/api/busi/page.js new file mode 100644 index 0000000..b9ce068 --- /dev/null +++ b/dl_vue/src/api/busi/page.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询全站网页访问次数统计列表 +export function listPage(query) { + return request({ + url: '/busi/page/list', + method: 'get', + params: query + }) +} + +// 查询全站网页访问次数统计详细 +export function getPage(id) { + return request({ + url: '/busi/page/' + id, + method: 'get' + }) +} + +// 新增全站网页访问次数统计 +export function addPage(data) { + return request({ + url: '/busi/page', + method: 'post', + data: data + }) +} + +// 修改全站网页访问次数统计 +export function updatePage(data) { + return request({ + url: '/busi/page', + method: 'put', + data: data + }) +} + +// 删除全站网页访问次数统计 +export function delPage(id) { + return request({ + url: '/busi/page/' + id, + method: 'delete' + }) +} diff --git a/dl_vue/src/views/busi/page/index.vue b/dl_vue/src/views/busi/page/index.vue new file mode 100644 index 0000000..18273a8 --- /dev/null +++ b/dl_vue/src/views/busi/page/index.vue @@ -0,0 +1,302 @@ + + +