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 3adf05f..e265329 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 @@ -466,8 +466,9 @@ public class WebController extends BaseController { }) @PostMapping("/pageSave") public R pageSave(@ApiIgnore @RequestBody BusiPage busiPage, HttpServletRequest request) { + busiPage.setIp(CommonUtils.getIpAddr(request)); busiPage.setCreateTime(new Date()); - pageService.pageSave(busiPage,request); + pageService.pageSave(busiPage); 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 index 44f9968..30c9ef8 100644 --- 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 @@ -6,6 +6,7 @@ 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.*; @@ -40,17 +41,12 @@ public class BusiPageController extends BaseController private IBusiPageService busiPageService; /** - * 查询全站网页访问次数统计列表 + * 查询全站网页访问次数统计列表---排名前10 */ @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); + public AjaxResult list(BusiPageVO busiPage){ + return success(busiPageService.queryListNum(busiPage)); } /** 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 index 62441c7..735202e 100644 --- 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 @@ -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.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; @@ -18,4 +19,6 @@ import org.apache.ibatis.annotations.Mapper; public interface BusiPageMapper extends BaseMapper { IPage queryListPage(@Param("entity") BusiPage entity, Page page); + + List selectListCus(@Param("entity")BusiPageVO busiPageVO); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiPageService.java index ba9c846..7609302 100644 --- 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 @@ -1,10 +1,13 @@ 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; @@ -24,5 +27,14 @@ public interface IBusiPageService extends IService * @date 11:13 2025/8/7 * @param busiPage TODO **/ - void pageSave(BusiPage busiPage, HttpServletRequest request); + void pageSave(BusiPage busiPage); + + /** + * 查全站访问网页前十 + * @author vinjor-M + * @date 16:52 2025/8/7 + * @param busiPage TODO + * @return java.util.List + **/ + List queryListNum(BusiPageVO busiPage); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiPageServiceImpl.java index ea9c5f1..acb5d13 100644 --- 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 @@ -1,13 +1,19 @@ package com.ruoyi.busi.service.impl; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.busi.utils.CommonUtils; +import com.ruoyi.busi.vo.BusiPageVO; import com.ruoyi.common.utils.DateUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.constant.StrConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -44,14 +50,55 @@ public class BusiPageServiceImpl extends ServiceImpl i * @date 11:13 2025/8/7 **/ @Override - public void pageSave(BusiPage busiPage, HttpServletRequest request) { + public void pageSave(BusiPage busiPage) { // 2. 异步保存到数据库(RuoYi已内置线程池) CompletableFuture.runAsync(() -> { - Map ipMap = commonUtils.getIPAndCountry(request); - busiPage.setIp(ipMap.get("ip")); + Map ipMap = commonUtils.getCountryByIp(busiPage.getIp()); busiPage.setNational(ipMap.get("national")); busiPage.setOceania(ipMap.get("oceania")); this.save(busiPage); }); } + + /** + * 查全站访问网页前十 + * + * @param busiPage TODO + * @return java.util.List + * @author vinjor-M + * @date 16:52 2025/8/7 + **/ + @Override + public List queryListNum(BusiPageVO busiPage) { + if(StringUtils.isNotEmpty(busiPage.getStartDate())){ + busiPage.setStartDate(busiPage.getStartDate()+ StrConstants.START_DATE); + } + if(StringUtils.isNotEmpty(busiPage.getEndDate())){ + busiPage.setEndDate(busiPage.getEndDate()+StrConstants.END_DATE); + } + List rtnList = new ArrayList<>(); + List dataList = busiPageMapper.selectListCus(busiPage); + // 1. 按 url 分组并统计数量 + Map countMap = dataList.stream() + .collect(Collectors.groupingBy( + // 分组字段 + BusiPageVO::getUrl, + // 统计数量 + Collectors.counting() + )); + // 2. 按数量降序排序,并取前10 + List> top10 = countMap.entrySet().stream() + // 降序排序 + .sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue())) + // 取前10 + .limit(10) + .collect(Collectors.toList()); + top10.forEach(item->{ + BusiPageVO pageVO = new BusiPageVO(); + pageVO.setUrl(item.getKey()); + pageVO.setNum(item.getValue()); + rtnList.add(pageVO); + }); + return rtnList; + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/utils/CommonUtils.java index 0777caf..e4d75ce 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 @@ -110,7 +110,7 @@ public class CommonUtils { } /** - * 根据IP查询所属国家和洲 + * 根据请求查询IP、所属国家和洲 * @author vinjor-M * @date 15:48 2025/8/7 * @return java.util.Map @@ -128,7 +128,6 @@ public class CommonUtils { 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)) { @@ -139,4 +138,30 @@ public class CommonUtils { rtnMap.put("oceania",oceania); return rtnMap; } + + /** + * 根据IP查询所属国家和洲 + * @author vinjor-M + * @date 15:48 2025/8/7 + * @return java.util.Map + **/ + public Map getCountryByIp(String ip){ + Map rtnMap = new HashMap<>(); + String nationalStr = ""; + try { + nationalStr = CommonUtils.getAddr(ip); + } catch (Exception e) { + log.error("识别所属国家失败"); + } + nationalStr = StringUtils.isNotEmpty(nationalStr) ? nationalStr : "未知"; + String national = nationalStr.split("\\|")[0]; + String oceania = "未知"; + Map nationalMap = nationalService.getNationalMap(); + if (nationalMap.containsKey(national)) { + oceania = nationalMap.get(national); + } + rtnMap.put("national",national); + rtnMap.put("oceania",oceania); + return rtnMap; + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiPageVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiPageVO.java new file mode 100644 index 0000000..187a66d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/BusiPageVO.java @@ -0,0 +1,19 @@ +package com.ruoyi.busi.vo; + +import com.ruoyi.busi.domain.BusiPage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class BusiPageVO extends BusiPage { + + /** 时间范围-开始 */ + private String startDate; + /** 时间范围-结束 */ + private String endDate; + /** 访问次数 */ + private Long num; + /** 是否归属中国 */ + private Boolean ifChina; +} diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml index 5a128e6..eca2010 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiPageMapper.xml @@ -29,4 +29,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and tenant_id = #{entity.tenantId} + \ No newline at end of file diff --git a/dl_vue/src/views/busi/page/index.vue b/dl_vue/src/views/busi/page/index.vue index 18273a8..c2eaff9 100644 --- a/dl_vue/src/views/busi/page/index.vue +++ b/dl_vue/src/views/busi/page/index.vue @@ -1,45 +1,28 @@ @@ -163,34 +55,59 @@ export default { name: "Page", data() { return { + options: [{ + value: null, + label: '全部' + }, { + label: '是', + value: true + }, { + label: '否', + value: false + }], // 遮罩层 loading: true, - // 选中数组 - ids: [], - // 非单个禁用 - single: true, - // 非多个禁用 - multiple: true, // 显示搜索条件 showSearch: true, - // 总条数 - total: 0, // 全站网页访问次数统计表格数据 pageList: [], - // 弹出层标题 - title: "", - // 是否显示弹出层 - open: false, // 查询参数 queryParams: { pageNum: 1, pageSize: 10, - url: null, - equipment: null, - ip: null, - national: null, + dataRange: '', + startDate: '', + endDate: '', + ifChina:null, tenantId: null, }, + pickerOptions: { + shortcuts: [{ + text: '最近一周', + onClick(picker) { + const end = new Date() + const start = new Date() + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7) + picker.$emit('pick', [start, end]) + } + }, { + text: '最近一个月', + onClick(picker) { + const end = new Date() + const start = new Date() + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30) + picker.$emit('pick', [start, end]) + } + }, { + text: '最近三个月', + onClick(picker) { + const end = new Date() + const start = new Date() + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90) + picker.$emit('pick', [start, end]) + } + }] + }, // 表单参数 form: {}, // 表单校验 @@ -206,8 +123,7 @@ export default { getList() { this.loading = true; listPage(this.queryParams).then(response => { - this.pageList = response.data.records; - this.total = response.data.total; + this.pageList = response.data; this.loading = false; }); }, @@ -232,6 +148,13 @@ export default { /** 搜索按钮操作 */ handleQuery() { this.queryParams.pageNum = 1; + if (this.queryParams.dataRange && this.queryParams.dataRange.length > 1) { + this.queryParams.startDate = this.formatDate(this.queryParams.dataRange[0]) + this.queryParams.endDate = this.formatDate(this.queryParams.dataRange[1]) + }else{ + this.queryParams.startDate = null + this.queryParams.endDate = null + } this.getList(); }, /** 重置按钮操作 */ @@ -296,7 +219,18 @@ export default { this.download('busi/page/export', { ...this.queryParams }, `page_${new Date().getTime()}.xlsx`) - } + }, + /** + * 格式化时间戳 + */ + formatDate(timestamp) { + const date = new Date(timestamp) + const year = date.getFullYear() + // 月份是从0开始的,所以要加1 + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` + }, } }; diff --git a/dl_vue/src/views/statistics/inquiryItem/index.vue b/dl_vue/src/views/statistics/inquiryItem/index.vue index 7308795..353637e 100644 --- a/dl_vue/src/views/statistics/inquiryItem/index.vue +++ b/dl_vue/src/views/statistics/inquiryItem/index.vue @@ -287,7 +287,18 @@ export default { this.download('busi/inquiryItem/export', { ...this.queryParams }, `inquiryItem_${new Date().getTime()}.xlsx`) - } + }, + /** + * 格式化时间戳 + */ + formatDate(timestamp) { + const date = new Date(timestamp) + const year = date.getFullYear() + // 月份是从0开始的,所以要加1 + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` + }, } };