文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。
同时,您也可以关注我的微信公众号:松果猿的代码工坊,获取最新文章推送和编程技巧。
前言
通过前三期我们已经实现了这个共享单车管理系统的一部分功能,下面我们这一期实现单车投放区域查询
后端接口开发
毕竟我们这只是一个简单的系统,就不写这些复杂的业务逻辑了,后端的逻辑代码都是简化的,我们也不是写什么企业级的代码,就一切从简了。
我们需要安装PostGIS扩展来管理我们的地理数据,我们通过如下的SQL建表:
-- 启用PostGIS扩展
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 区域表
CREATE TABLE regions (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL, -- 区域名称
rno VARCHAR(50) UNIQUE NOT NULL, -- 区域编号
capacity INTEGER NOT NULL, -- 区域单车容量
exist INTEGER DEFAULT 0, -- 当前存量
geometry GEOMETRY(Polygon, 4326) NOT NULL -- 地理边界
);
-- 单车表
CREATE TABLE bikes (
id BIGSERIAL PRIMARY KEY,
bno VARCHAR(50) UNIQUE NOT NULL, -- 单车编号
regionid BIGINT, -- 区域ID(逻辑外键)
location GEOMETRY(Point, 4326) NOT NULL -- 当前位置
);
-- 区域空间索引
CREATE INDEX idx_regions_geometry ON regions USING GIST(geometry);
-- 单车位置索引
CREATE INDEX idx_bikes_location ON bikes USING GIST(location);
-- 单车区域索引
CREATE INDEX idx_bikes_regionid ON bikes(regionid);
现在我们已经创建了region
单车投放区域表以及单车位置bikes
表
我们需要一个统一的响应体类,我直接把苍穹外卖的弄过来(CV大法):
Result.java
package com.beson.result;
import lombok.Data;
import java.io.Serializable;
/**
* 后端统一返回结果
* @param <T>
*/
@Data
public class Result<T> implements Serializable {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
public static <T> Result<T> success() {
Result<T> result = new Result<T>();
result.code = 1;
return result;
}
public static <T> Result<T> success(T object) {
Result<T> result = new Result<T>();
result.data = object;
result.code = 1;
return result;
}
public static <T> Result<T> error(String msg) {
Result result = new Result();
result.msg = msg;
result.code = 0;
return result;
}
}
PageResult.java
package com.beson.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 封装分页查询结果
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {
private long total; //总记录数
private List records; //当前页数据集合
}
再来新建一个接收前端参数的DTO类以及Region的一个模型数据类:
RegionPageQueryDTO.java
package com.beson.DTO;
import lombok.Data;
@Data
public class RegionPageQueryDTO {
//页码
private int page;
//每页显示记录数
private int pageSize;
}
Region.java
package com.beson.model;
import lombok.Data;
@Data
public class Region {
private Long id;
private String name;
private String rno;
private Integer capacity;
private Integer exist;
private String geometry; // WKT格式
}
我们使用PageHelper这个工具,简化一下分页逻辑代码:
引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
下面就是MVC三层架构了,懂得都懂:
RegionController.java
(省略了包声明和导入语句,不然太赘述)