开发一个前后端分离的webgis城市共享单车投放管理系统(4)
文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。
同时,您也可以关注我的微信公众号:****松果猿的代码工坊****,获取最新文章推送和编程技巧。
前言
通过前三期我们已经实现了这个共享单车管理系统的一部分功能,下面我们这一期实现单车投放区域查询
后端接口开发
毕竟我们这只是一个简单的系统,就不写这些复杂的业务逻辑了,后端的逻辑代码都是简化的,我们也不是写什么企业级的代码,就一切从简了。
我们需要安装PostGIS扩展来管理我们的地理数据,我们通过如下的SQL建表:
1 | -- 启用PostGIS扩展 |
现在我们已经创建了region
单车投放区域表以及单车位置bikes
表
我们需要一个统一的响应体类,我直接把苍穹外卖的弄过来(CV大法):
Result.java
1 | package com.beson.result; |
PageResult.java
1 | package com.beson.result; |
再来新建一个接收前端参数的DTO类以及Region的一个模型数据类:
RegionPageQueryDTO.java
1 | package com.beson.DTO; |
Region.java
1 | package com.beson.model; |
我们使用PageHelper这个工具,简化一下分页逻辑代码:
引入依赖
1 | <dependency> |
下面就是MVC三层架构了,懂得都懂:
RegionController.java
(省略了包声明和导入语句,不然太赘述)
1 |
|
RegionService.java
(省略了包声明和导入语句)
1 |
|
RegionMapper.java
(省略了包声明和导入语句)
1 |
|
我们加一些测试数据:
1 | INSERT INTO regions (name, rno, capacity, exist, geometry) VALUES |
使用Postman进行测试一下接口是否可用:



可以看到接口正常,下面就可以进行我们前端的开发了
前端开发
查询区域列表功能
根目录下新建.env.developments
1 | VITE_API_URL=http://localhost:8080 |
新建@/components/RegionTable.vue
,查询表格组件
1 | <template> |
新建@/stores/contentStore.ts
,用于管理弹窗渲染条件
1 | import { defineStore } from 'pinia' |
RegionTable.vue
挂载在Home.vue
:

在Header.vue
创建点击事件

下面我们来看一下效果:
可以看到是列表成功渲染出来了,下面来实现地理数据加载功能
加载区域地理数据
新建@/hooks/useRegionGeom.js
,将后端传来的WKB数据转为geometry矢量图层添加进map对象中
1 | import { ref } from 'vue'; |
我们测试数据的地理数据成功渲染在地图上了:
.gif)不过这个弹窗有点遮挡视野,我们把它改为可以拖动位置的
RegionTable.vue

添加拖动逻辑代码:
1 | // 拖动逻辑 |
查看效果:
.gif)区域定位功能
首先根据编号获取到该区域的geojson数据:
在RegionTable.vue
中添加:
1 | // 根据rno获取区域数据 |
然后就是获取几何中心点以及高亮显示
在RegionTable.vue
中添加获取数据事件以及定位事件:
1 | // 根据rno获取区域数据 |
在将定位高亮逻辑封装进@/hooks/useRegionGeom.js
(openlayers获取中心点的接口逻辑有点奇怪…)
1 | async function locateRegion(geometry) { |
再在RegionTable.vue
调用:

查看效果:
如果有疑问或者文章有错误的,请在评论区提出,我看到一定会解答