rdms-spring-boot-starter-biz-ip
模块定位
这是一个本地静态工具模块,用于:
- IP -> 地区编码查询
- 地区树查询与地区名称格式化
不包含远程调用,不包含自动配置,不包含智能识别能力。
它做什么
- 基于
ip2region.xdb做 IP 归属地编码查询(离线、本地内存查询) - 基于
area.csv提供地区树、地区路径、父级区域定位等工具方法
主要入口类:
com.njcn.rdms.framework.ip.core.utils.IPUtilscom.njcn.rdms.framework.ip.core.utils.AreaUtils
它不做什么
- 不访问外部 IP 服务
- 不保证行政区数据实时更新(数据随资源文件版本)
- 不负责业务策略(如风控、推荐、画像)
资源与代价
- 内置资源文件:
src/main/resources/ip2region.xdb(约 4MB)src/main/resources/area.csv- 类加载时会预加载资源到内存,换取查询速度
前端地区树返回(重点)
本模块非常适合做省市区级联选择器的后端数据源。
典型接口:
- 管理端:
GET /system/area/tree - App 端:
GET /system/area/tree
节点字段:
id:区域编码name:区域名称children:子节点列表
后端示例(获取“江苏区域树”)
1. 获取江苏节点
import com.njcn.rdms.framework.ip.core.Area;
import com.njcn.rdms.framework.ip.core.utils.AreaUtils;
Area jiangsu = AreaUtils.parseArea("中国/江苏省");
if (jiangsu == null) {
return;
}
2. 直接返回江苏及其下级区域树
Area 本身就是树节点(包含 children),拿到江苏节点后即可把它作为一棵子树返回。
import com.njcn.rdms.framework.ip.core.Area;
import com.njcn.rdms.framework.ip.core.utils.AreaUtils;
Area jiangsu = AreaUtils.parseArea("中国/江苏省");
return jiangsu; // children 中包含南京、苏州等下级节点
3. 转成前端常用结构(id/name/children)
import com.njcn.rdms.framework.ip.core.Area;
import com.njcn.rdms.framework.ip.core.utils.AreaUtils;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
record AreaNode(Integer id, String name, List<AreaNode> children) {}
private static AreaNode toNode(Area a) {
List<AreaNode> children = a.getChildren() == null
? Collections.emptyList()
: a.getChildren().stream().map(child -> toNode(child)).collect(Collectors.toList());
return new AreaNode(a.getId(), a.getName(), children);
}
Area jiangsu = AreaUtils.parseArea("中国/江苏省");
AreaNode jiangsuTree = jiangsu == null ? null : toNode(jiangsu);
返回示例:
{
"id": 320000,
"name": "江苏省",
"children": [
{ "id": 320100, "name": "南京市", "children": [] },
{ "id": 320500, "name": "苏州市", "children": [] }
]
}
适用场景
- 后端需要快速把 IP 转成地区信息
- 需要返回地区树给前端做省市区联动
不需要它的场景
- 项目没有 IP 归属地需求
- 项目不需要地区树能力