From 7e281f26b6ef5674fab67e0543e693185b3f2e34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BB=99=E9=A3=8E=E9=81=93=E9=AA=A8=E5=B0=8F=E5=8D=8A?=
=?UTF-8?q?=E4=BB=99=E5=84=BF?= <414571696@qq.com>
Date: Tue, 8 Apr 2025 22:36:12 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=B0=E5=9B=BEAPP?=
=?UTF-8?q?=EF=BC=8C=E4=BC=9A=E5=91=98=E8=AF=B7=E6=B1=82=E9=AB=98=E5=BE=B7?=
=?UTF-8?q?=E5=9C=B0=E5=9B=BE=E6=95=B0=E6=8D=AE=E5=8A=9F=E8=83=BD=20pom?=
=?UTF-8?q?=E5=BC=95=E5=85=A5=E5=88=86=E8=AF=8D=E6=A8=A1=E5=9D=97com.hankc?=
=?UTF-8?q?s.hanlp=20pom=E5=BC=95=E5=85=A5=E8=AF=B7=E6=B1=82=E9=99=90?=
=?UTF-8?q?=E5=88=B6=EF=BC=9A=20=20@RateLimiter(count=20=3D=2010,keyResolv?=
=?UTF-8?q?er=3D=20ClientIpRateLimiterKeyResolver.class,=20timeUnit=20=3D?=
=?UTF-8?q?=20TimeUnit.MINUTES)=E9=92=88=E5=AF=B9IP=E7=BA=A7=E5=88=AB?=
=?UTF-8?q?=EF=BC=8C=E6=AF=8F=E5=88=86=E9=92=9F=E8=AF=B7=E6=B1=8210?=
=?UTF-8?q?=E6=AC=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
yudao-module-map/yudao-module-map-biz/pom.xml | 9 +++
.../controller/app/lbs/AppLbsController.java | 78 +++++++++++++++++++
.../controller/app/lbs/vo/AppMapLbsReqVO.java | 19 +++++
.../app/lbs/vo/AppMapLbsRespVO.java | 68 ++++++++++++++++
.../module/map/enums/LogRecordConstants.java | 8 ++
.../module/map/service/pois/PoisService.java | 11 +++
6 files changed, 193 insertions(+)
create mode 100644 yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/AppLbsController.java
create mode 100644 yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsReqVO.java
create mode 100644 yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsRespVO.java
create mode 100644 yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/enums/LogRecordConstants.java
diff --git a/yudao-module-map/yudao-module-map-biz/pom.xml b/yudao-module-map/yudao-module-map-biz/pom.xml
index 13832615e4..3bdf477cb5 100644
--- a/yudao-module-map/yudao-module-map-biz/pom.xml
+++ b/yudao-module-map/yudao-module-map-biz/pom.xml
@@ -50,6 +50,15 @@
cn.iocoder.boot
yudao-spring-boot-starter-excel
+
+ com.hankcs
+ hanlp
+ portable-1.2.7
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-protection
+
diff --git a/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/AppLbsController.java b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/AppLbsController.java
new file mode 100644
index 0000000000..3c89bd605c
--- /dev/null
+++ b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/AppLbsController.java
@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.map.controller.app.lbs;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.ratelimiter.core.annotation.RateLimiter;
+import cn.iocoder.yudao.framework.ratelimiter.core.keyresolver.impl.ClientIpRateLimiterKeyResolver;
+import cn.iocoder.yudao.module.map.controller.app.lbs.vo.AppMapLbsReqVO;
+import cn.iocoder.yudao.module.map.controller.admin.keywordsearch.vo.KeywordSearchRespVO;
+import cn.iocoder.yudao.module.map.dal.dataobject.keywordsearch.KeywordSearchDO;
+import cn.iocoder.yudao.module.map.dal.dataobject.pois.PoisDO;
+import cn.iocoder.yudao.module.map.dal.dataobject.pois.PoisIndoorDO;
+import cn.iocoder.yudao.module.map.service.keywordsearch.KeywordSearchService;
+import cn.iocoder.yudao.module.map.service.pois.PoisService;
+import com.hankcs.hanlp.HanLP;
+import com.hankcs.hanlp.seg.common.Term;
+import com.hankcs.hanlp.tokenizer.NLPTokenizer;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "地图 App - 地图服务")
+@RestController
+@RequestMapping("/map/lbs")
+@Validated
+public class AppLbsController {
+
+ @Resource
+ private KeywordSearchService kwService;
+
+ @Resource
+ private PoisService poisService;
+
+ @GetMapping("/get-poi-types")
+ @Operation(summary = "获取高德POI类型")
+ public CommonResult getGdPoiTypes() {
+ return success("");
+ }
+
+ @GetMapping("/get-search-list")
+ @Operation(summary = "获取查询数据列表")
+ public CommonResult getSearchList() {
+ return success("");
+ }
+
+ /**
+ * 请求高德POI2.0接口获得地图数据,限制每个IP每分钟10次请求
+ *
+ * @param pageReqVO 分页查询
+ * @return 搜索记录分页
+ */
+ @GetMapping("/get-map-data")
+ @RateLimiter(count = 10,keyResolver= ClientIpRateLimiterKeyResolver.class, timeUnit = TimeUnit.MINUTES)
+ @Operation(summary = "请求高德POI2.0接口获得地图数据")
+ public CommonResult getMapData(@Valid AppMapLbsReqVO pageReqVO) {
+ return poisService.getPoiData(pageReqVO);
+ }
+
+ @GetMapping("/test-hanlp")
+ @Operation(summary = "测试hanlp分词")
+ public void test() {
+ List termList = NLPTokenizer.segment("中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程");
+ for (Term term : termList) {
+ System.out.println(term.word + " " + term.nature);
+ }
+ }
+
+}
diff --git a/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsReqVO.java b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsReqVO.java
new file mode 100644
index 0000000000..7bf2bcf511
--- /dev/null
+++ b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsReqVO.java
@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.map.controller.app.lbs.vo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import lombok.Data;
+
+@Data
+public class AppMapLbsReqVO extends PageParam {
+
+ @Schema(description = "关键字", example = "机械")
+ private String keywords;
+
+ @Schema(description = "搜索区划", example = "北京市")
+ private String region;
+
+ @Schema(description = "是否精准模式(1精准,0分词模糊)", example = "0")
+ private int isFocus;
+}
diff --git a/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsRespVO.java b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsRespVO.java
new file mode 100644
index 0000000000..2baba452f3
--- /dev/null
+++ b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/controller/app/lbs/vo/AppMapLbsRespVO.java
@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.module.map.controller.app.lbs.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import cn.iocoder.yudao.module.map.dal.dataobject.pois.PoisBusinessDO;
+import cn.iocoder.yudao.module.map.dal.dataobject.pois.PoisNaviDO;
+import cn.iocoder.yudao.module.map.dal.dataobject.pois.PoisPhotosDO;
+
+@Schema(description = "APP - 高德POI数据相应 Response VO")
+@Data
+@ToString(callSuper = true)
+public class AppMapLbsRespVO {
+ @Schema(description = "POI名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+ @NotEmpty(message = "POI名称不能为空")
+ private String name;
+
+ @Schema(description = "经纬度", requiredMode = Schema.RequiredMode.REQUIRED, example = "116.413232,39.899947")
+ @NotEmpty(message = "经纬度不能为空")
+ private String location;
+
+ @Schema(description = "所属类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "汽车服务;汽车养护/装饰;汽车养护|汽车服务;洗车场;洗车场|汽车维修;汽车维修;汽车维修")
+ @NotEmpty(message = "所属类型不能为空")
+ private String type;
+
+ @Schema(description = "分类编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "010400|010500|030000")
+ @NotEmpty(message = "分类编码不能为空")
+ private String typecode;
+
+ @Schema(description = "省份", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京市")
+ @NotEmpty(message = "省份不能为空")
+ private String pname;
+
+ @Schema(description = "城市", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京市")
+ @NotEmpty(message = "城市不能为空")
+ private String cityName;
+
+ @Schema(description = "区县", requiredMode = Schema.RequiredMode.REQUIRED, example = "东城区")
+ @NotEmpty(message = "区县不能为空")
+ private String adname;
+
+ @Schema(description = "详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "宝鼎中心C座B2层(崇文门地铁站D西南口步行480米)")
+ @NotEmpty(message = "详细地址不能为空")
+ private String address;
+
+ @Schema(description = "省份编码", example = "110000")
+ private String pcode;
+
+ @Schema(description = "区域编码", example = "110101")
+ private String adcode;
+
+ @Schema(description = "城市编码", example = "010")
+ private String citycode;
+
+ @Schema(description = "poi唯一标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "B0GUKCE3AI")
+ @NotEmpty(message = "poi唯一标识不能为空")
+ private String poiId;
+
+ @Schema(description = "高德POI商业信息")
+ private PoisBusinessDO poisBusiness;
+
+ @Schema(description = "高德POI导航信息")
+ private PoisNaviDO poisNavi;
+
+ @Schema(description = "高德POI图片信息")
+ private PoisPhotosDO poisPhotos;
+}
diff --git a/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/enums/LogRecordConstants.java b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/enums/LogRecordConstants.java
new file mode 100644
index 0000000000..d2406237ad
--- /dev/null
+++ b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/enums/LogRecordConstants.java
@@ -0,0 +1,8 @@
+package cn.iocoder.yudao.module.map.enums;
+
+public interface LogRecordConstants {
+ String POI_DATA = "POI数据";
+ String POI_DATA_REQUEST = "POI数据请求";
+ String POI_DATA_REQUEST_SUCCESS = "POI数据请求成功";
+ String POI_DATA_REQUEST_ERROR = "POI数据请求失败";
+}
diff --git a/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/service/pois/PoisService.java b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/service/pois/PoisService.java
index f50ec23eaa..2d9b83ae40 100644
--- a/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/service/pois/PoisService.java
+++ b/yudao-module-map/yudao-module-map-biz/src/main/java/cn/iocoder/yudao/module/map/service/pois/PoisService.java
@@ -1,6 +1,9 @@
package cn.iocoder.yudao.module.map.service.pois;
import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.map.controller.app.lbs.vo.AppMapLbsReqVO;
import jakarta.validation.*;
import cn.iocoder.yudao.module.map.controller.admin.pois.vo.*;
import cn.iocoder.yudao.module.map.dal.dataobject.pois.PoisDO;
@@ -96,4 +99,12 @@ public interface PoisService {
*/
PoisPhotosDO getPoisPhotosByPoisId(Long poisId);
+
+ /**
+ * 请求高德POI2.0接口获得地图数据
+ *
+ * @param pageReqVO 分页查询
+ * @return 搜索记录分页
+ */
+ CommonResult getPoiData(AppMapLbsReqVO pageReqVO);
}
\ No newline at end of file