简介
本项目是人流密度检测系统的服务端,采用SpringBoot与MyBatis框架搭建,数据库采用MySQL数据库。
本项目通过对数据分析端提供RESTFULL接口来接收数据储存到数据库中,然后微信小程序端每分钟向服务端请求一次数据,从而达到实时获取人流密度的效果。
项目架构
本项目通过三层架构进行解耦,分别是Controller层,Server层,Mapper层
Controller层
Controller层主要是与用户交互,接受用户发来的信息并传给Server层进行处理。
对外提供三个接口,分别是/setDataList,/getDataList与/getData。
/setDataList
该接口对外提供给数据分析端用来提交全部摄像头信息。
接口逻辑:数据分析端发来一个数据包,服务端首先会解开数据包提取出其中的json数据,然后将json数据转化成对应的实体类列表,然后遍历实体类列表,用if判断该实体类是否为新摄像头,如果是,则进行插入操作,如果不是则进行更新操作。如果全部成功则返回200状态码,存在失败操作就返回400状态码。
@RequestMapping("/setDataList")
public Result setDataList(@RequestBody List<Data> dataList){
for(Data data:dataList){
Data data1 = dataService.getData(data);
if(data1!=null){
dataService.updateData(data);
}else dataService.insertData(data);
}
result.setSuccess("数据更新成功",null);
return result;
}
/getDataList
该接口对外提供给微信小程序端用来查询全部摄像头信息。
接口逻辑:微信小程序端发来POST请求,服务端查询数据库中所有数据并封装在实体类列表中,然后打成JSON格式数据包发送给微信小程序。
@RequestMapping("/getDataList")
public Result getDataList(){
List<Data> dataList = dataService.getDataList();
if(dataList.size()>0){
result.setSuccess("查询成功",dataList);
}else result.setInfo("信息缺失",null);
return result;
}
/getData
该接口对外提供给微信小程序端用来根据经纬度查询摄像头信息。
接口逻辑:微信小程序端携带经纬度发来POST请求,服务端根据经纬度查询数据库中所有数据并封装在实体类中,状态码设为200,然后打成JSON格式数据包发送给微信小程序,如果数据库中不存在该经纬度下的摄像头,则返回400状态码。
@RequestMapping("/getData")
public Result getData(@RequestBody Data data){
Data data1 = dataService.getData(data);
if(data1!=null){
result.setSuccess("查询成功",data1);
}else result.setInfo("信息缺失",null);
return result;
}
Server层
Server层主要是接受Controller层的数据并处理数据,将数据转化成查询数据库需要用到的数据,然后传给Mapper层进行下一步操作。并且可以开启事务防止数据出错丢失。
由于本项目中数据逻辑较为简单,故不再展示。
Mapper层
Mapper层接收到Server层的数据后,通过MyBatis框架,执行相应的SQL语句查询数据库,然后将数据返回给Server层。
Mapper层有4个方法分别是:getData(Data data)、getDataList()、updateData(Data data)、insertData(Data data);
getData(Data data)
根据经纬度查询摄像头数据
sql语句:
select * from `data` where latitude = #{latitude} and longitude = #{longitude}
getDataList()
查询所有摄像头数据
sql语句:
select * from `data`
updateData(Data data)
更新对应摄像头数据
sql语句:
update `data` set num = #{num} where latitude = #{latitude} and longitude = #{longitude}
insertData(Data data)
插入新的摄像头数据
sql语句:
insert into `data`(camera_id,latitude,longitude,num) values (#{cameraId},#{latitude},#{longitude},#{num})
数据库设计
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for data
-- ----------------------------
DROP TABLE IF EXISTS `data`;
CREATE TABLE `data` (
`camera_id` varchar(50) NOT NULL,
`latitude` double(12,6) NOT NULL,
`longitude` double(12,6) NOT NULL,
`num` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`camera_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;