diff --git a/src/main/java/com/cm/population/controller/api/camera/CameraController.java b/src/main/java/com/cm/population/controller/api/camera/CameraController.java new file mode 100644 index 0000000..a221ef5 --- /dev/null +++ b/src/main/java/com/cm/population/controller/api/camera/CameraController.java @@ -0,0 +1,109 @@ +package com.cm.population.controller.api.camera; + +import com.cm.common.annotation.CheckRequestBodyAnnotation; +import com.cm.common.base.AbstractController; +import com.cm.common.constants.ISystemConstant; +import com.cm.common.exception.SearchException; +import com.cm.common.pojo.ListPage; +import com.cm.common.result.ErrorResult; +import com.cm.common.result.SuccessResult; +import com.cm.common.result.SuccessResultList; +import com.cm.population.pojo.dtos.camera.CameraDTO; +import com.cm.population.pojo.vos.camera.CameraVO; +import com.cm.population.service.camera.ICameraService; +import io.swagger.annotations.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 摄像头管理 + * @author : LY + * @date :2023-11-14 17:53 + * @description : + * @modyified By: + */ +@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "摄像头接口") +@RestController +@RequestMapping(ISystemConstant.API_PREFIX + "/camera") +public class CameraController extends AbstractController { + + @Autowired + private ICameraService cameraService; + + + @ApiOperation(value = "新增摄像头信息", notes = "新增摄像头信息接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PostMapping("save") + @CheckRequestBodyAnnotation + public SuccessResult save(@RequestBody CameraVO cameraVO) throws Exception { + return cameraService.save(cameraVO); + } + + @ApiOperation(value = "修改摄像头信息", notes = "修改摄像头信息接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "cityCameraId", value = "摄像头ID", paramType = "path"), + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update/{cityCameraId}") + @CheckRequestBodyAnnotation + public SuccessResult update(@PathVariable("cityCameraId") String cityCameraId, @RequestBody CameraVO cameraVO) throws Exception { + return cameraService.update(cityCameraId, cameraVO); + } + + + @ApiOperation(value = "摄像头详情(通过ID)", notes = "摄像头详情(通过ID)接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "cityCameraId", value = "摄像头ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get/{cityCameraId}") + public CameraDTO getCensusMsgById(@PathVariable("cityCameraId") String cityCameraId) throws SearchException { + return cameraService.get(cityCameraId); + } + + + @ApiOperation(value = "攝像头信息列表", notes = "攝像头信息列表接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("list") + public List list() throws SearchException { + Map params = requestParams(); + return cameraService.list(params); + } + + @ApiOperation(value = "攝像头信息分页列表", notes = "攝像头信息分页列表接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"), + @ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"), + @ApiImplicitParam(name = "keywords", value = "关键字", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "String") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("listpage") + public SuccessResultList> listPage(ListPage page) throws SearchException { + Map params = requestParams(); + page.setParams(params); + return cameraService.listPage(page); + } + + + @ApiOperation(value = "删除摄像头", notes = "删除摄像头接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "ids", value = "ID列表,用下划线分隔", paramType = "path", example = "1_2_3") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @DeleteMapping("remove/{ids}") + public SuccessResult remove(@PathVariable("ids") String ids) { + cameraService.remove(null, Arrays.asList(ids.split("\\_"))); + return new SuccessResult(); + } + + + + + +} diff --git a/src/main/java/com/cm/population/controller/route/camera/CameraRouteController.java b/src/main/java/com/cm/population/controller/route/camera/CameraRouteController.java new file mode 100644 index 0000000..99c1042 --- /dev/null +++ b/src/main/java/com/cm/population/controller/route/camera/CameraRouteController.java @@ -0,0 +1,55 @@ +package com.cm.population.controller.route.camera; + +/** + * @author : LY + * @date :2023-11-16 14:36 + * @description : + * @modyified By: + */ + +import com.cm.common.base.AbstractController; +import com.cm.common.constants.ISystemConstant; +import com.cm.population.pojo.dtos.populationinfo.PopulationInfoDTO; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +/** + * @ClassName: SecurityController + * @Description: 摄像头路由 + * @Author: CodeFactory + * @Date: 2023-10-25 15:53:09 + * @Version: 3.0 + **/ +@Api(tags = ISystemConstant.ROUTE_TAGS_PREFIX + "摄像头路由") +@RestController +@RequestMapping(ISystemConstant.ROUTE_PREFIX + "/camera") +public class CameraRouteController extends AbstractController { + + + @GetMapping("save") + public ModelAndView save() { + return new ModelAndView("camera/save"); + } + + @GetMapping("update") + public ModelAndView update() { + return new ModelAndView("camera/update"); + } + + @GetMapping("list") + public ModelAndView list() { + return new ModelAndView("camera/list"); + } + + + @GetMapping("view-console") + public ModelAndView viewConsole() { + return new ModelAndView("camera/view-console"); + } + + + +} diff --git a/src/main/java/com/cm/population/dao/camera/ICameraDao.java b/src/main/java/com/cm/population/dao/camera/ICameraDao.java new file mode 100644 index 0000000..931cc33 --- /dev/null +++ b/src/main/java/com/cm/population/dao/camera/ICameraDao.java @@ -0,0 +1,86 @@ +package com.cm.population.dao.camera; + +import com.cm.common.exception.RemoveException; +import com.cm.common.exception.SaveException; +import com.cm.common.exception.SearchException; +import com.cm.common.exception.UpdateException; +import com.cm.population.pojo.dtos.camera.CameraDTO; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: ICameraDao + * @Description: 摄像头管理 + * @Author: WenG + * @Date: 2020-11-16 11:20 + * @Version: 1.0 + **/ + + +@Repository +public interface ICameraDao { + + + /** + * 新增攝像头 + * + * @param params + * @throws SaveException + */ + void save(Map params) throws SaveException; + + /** + * 删除攝像头 + * + * @param params + * @throws RemoveException + */ + void remove(Map params) throws RemoveException; + + /** + * 删除攝像头(物理) + * + * @param params + * @throws RemoveException + */ + void delete(Map params) throws RemoveException; + + /** + * 修改攝像头 + * + * @param params + * @throws UpdateException + */ + void update(Map params) throws UpdateException; + + /** + * 攝像头详情 + * + * @param params + * @return + * @throws SearchException + */ + CameraDTO get(Map params) throws SearchException; + + /** + * 攝像头列表 + * + * @param params + * @return + * @throws SearchException + */ + List list(Map params) throws SearchException; + + /** + * 攝像头统计 + * + * @param params + * @return + * @throws SearchException + */ + Integer count(Map params) throws SearchException; + + +} diff --git a/src/main/java/com/cm/population/pojo/dtos/camera/CameraDTO.java b/src/main/java/com/cm/population/pojo/dtos/camera/CameraDTO.java new file mode 100644 index 0000000..7bff30d --- /dev/null +++ b/src/main/java/com/cm/population/pojo/dtos/camera/CameraDTO.java @@ -0,0 +1,134 @@ +package com.cm.population.pojo.dtos.camera; + +import io.swagger.annotations.ApiModel; + +/** + * 摄像头管理 + * @author : LY + * @date :2023-11-14 18:01 + * @description : + * @modyified By: + */ + +@ApiModel +public class CameraDTO { + + private String cityCameraId; + private String cameraName; + private String cameraStreetId; + private String cameraStreetName; + private String cameraCommunityId; + private String cameraCommunityName; + private String cameraDistrictId; + private String cameraDistrictName; + private String cameraLongitude; + private String cameraLatitude; + private String cameraAddress; + private String cameraRtspLink; + private String remark; + + + public String getCityCameraId() { + return cityCameraId; + } + + public void setCityCameraId(String cityCameraId) { + this.cityCameraId = cityCameraId; + } + + public String getCameraName() { + return cameraName; + } + + public void setCameraName(String cameraName) { + this.cameraName = cameraName; + } + + public String getCameraStreetId() { + return cameraStreetId; + } + + public void setCameraStreetId(String cameraStreetId) { + this.cameraStreetId = cameraStreetId; + } + + public String getCameraStreetName() { + return cameraStreetName; + } + + public void setCameraStreetName(String cameraStreetName) { + this.cameraStreetName = cameraStreetName; + } + + public String getCameraCommunityId() { + return cameraCommunityId; + } + + public void setCameraCommunityId(String cameraCommunityId) { + this.cameraCommunityId = cameraCommunityId; + } + + public String getCameraCommunityName() { + return cameraCommunityName; + } + + public void setCameraCommunityName(String cameraCommunityName) { + this.cameraCommunityName = cameraCommunityName; + } + + public String getCameraDistrictId() { + return cameraDistrictId; + } + + public void setCameraDistrictId(String cameraDistrictId) { + this.cameraDistrictId = cameraDistrictId; + } + + public String getCameraDistrictName() { + return cameraDistrictName; + } + + public void setCameraDistrictName(String cameraDistrictName) { + this.cameraDistrictName = cameraDistrictName; + } + + public String getCameraLongitude() { + return cameraLongitude; + } + + public void setCameraLongitude(String cameraLongitude) { + this.cameraLongitude = cameraLongitude; + } + + public String getCameraLatitude() { + return cameraLatitude; + } + + public void setCameraLatitude(String cameraLatitude) { + this.cameraLatitude = cameraLatitude; + } + + public String getCameraAddress() { + return cameraAddress; + } + + public void setCameraAddress(String cameraAddress) { + this.cameraAddress = cameraAddress; + } + + public String getCameraRtspLink() { + return cameraRtspLink; + } + + public void setCameraRtspLink(String cameraRtspLink) { + this.cameraRtspLink = cameraRtspLink; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/src/main/java/com/cm/population/pojo/vos/camera/CameraVO.java b/src/main/java/com/cm/population/pojo/vos/camera/CameraVO.java new file mode 100644 index 0000000..9863361 --- /dev/null +++ b/src/main/java/com/cm/population/pojo/vos/camera/CameraVO.java @@ -0,0 +1,129 @@ +package com.cm.population.pojo.vos.camera; + +/** + * @author : LY + * @date :2023-11-16 9:22 + * @description : + * @modyified By: + */ +public class CameraVO { + + private String cityCameraId; + private String cameraName; + private String cameraStreetId; + private String cameraStreetName; + private String cameraCommunityId; + private String cameraCommunityName; + private String cameraDistrictId; + private String cameraDistrictName; + private String cameraLongitude; + private String cameraLatitude; + private String cameraAddress; + private String cameraRtspLink; + private String remark; + + + public String getCityCameraId() { + return cityCameraId; + } + + public void setCityCameraId(String cityCameraId) { + this.cityCameraId = cityCameraId; + } + + public String getCameraName() { + return cameraName; + } + + public void setCameraName(String cameraName) { + this.cameraName = cameraName; + } + + public String getCameraStreetId() { + return cameraStreetId; + } + + public void setCameraStreetId(String cameraStreetId) { + this.cameraStreetId = cameraStreetId; + } + + public String getCameraStreetName() { + return cameraStreetName; + } + + public void setCameraStreetName(String cameraStreetName) { + this.cameraStreetName = cameraStreetName; + } + + public String getCameraCommunityId() { + return cameraCommunityId; + } + + public void setCameraCommunityId(String cameraCommunityId) { + this.cameraCommunityId = cameraCommunityId; + } + + public String getCameraCommunityName() { + return cameraCommunityName; + } + + public void setCameraCommunityName(String cameraCommunityName) { + this.cameraCommunityName = cameraCommunityName; + } + + public String getCameraDistrictId() { + return cameraDistrictId; + } + + public void setCameraDistrictId(String cameraDistrictId) { + this.cameraDistrictId = cameraDistrictId; + } + + public String getCameraDistrictName() { + return cameraDistrictName; + } + + public void setCameraDistrictName(String cameraDistrictName) { + this.cameraDistrictName = cameraDistrictName; + } + + public String getCameraLongitude() { + return cameraLongitude; + } + + public void setCameraLongitude(String cameraLongitude) { + this.cameraLongitude = cameraLongitude; + } + + public String getCameraLatitude() { + return cameraLatitude; + } + + public void setCameraLatitude(String cameraLatitude) { + this.cameraLatitude = cameraLatitude; + } + + public String getCameraAddress() { + return cameraAddress; + } + + public void setCameraAddress(String cameraAddress) { + this.cameraAddress = cameraAddress; + } + + public String getCameraRtspLink() { + return cameraRtspLink; + } + + public void setCameraRtspLink(String cameraRtspLink) { + this.cameraRtspLink = cameraRtspLink; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/src/main/java/com/cm/population/service/camera/ICameraService.java b/src/main/java/com/cm/population/service/camera/ICameraService.java new file mode 100644 index 0000000..c5303eb --- /dev/null +++ b/src/main/java/com/cm/population/service/camera/ICameraService.java @@ -0,0 +1,83 @@ +package com.cm.population.service.camera; + + +import com.cm.common.exception.RemoveException; +import com.cm.common.exception.SearchException; +import com.cm.common.pojo.ListPage; +import com.cm.common.result.SuccessResult; +import com.cm.common.result.SuccessResultList; +import com.cm.population.pojo.dtos.camera.CameraDTO; +import com.cm.population.pojo.vos.camera.CameraVO; + +import java.util.List; +import java.util.Map; + +/** + * 摄像头管理 + * @author : LY + * @date :2023-11-16 9:25 + * @description : + * @modyified By: + */ + +public interface ICameraService { + + + /** + * 保存摄像头 + * @param cameraVO + * @throws Exception + */ + SuccessResult save(CameraVO cameraVO) throws Exception; + + + /** + * 修改摄像头 + * @param cityCameraId + * @param cameraVO + */ + SuccessResult update(String cityCameraId, CameraVO cameraVO) throws Exception; + + + /** + * 获取摄像头详情 + * @param cityCameraId + * @return + * @throws SearchException + */ + CameraDTO get(String cityCameraId) throws SearchException; + + + /** + * 获取摄像头列表 + * @param params + * @return + */ + List list(Map params); + + + /** + * 摄像头分页列表 + * @param page + * @return + */ + SuccessResultList> listPage(ListPage page) throws SearchException; + + + + /** + * 删除摄像头 + * + * @param ids id列表 + * @return + */ + void remove(String token, List ids); + + + /** + * 删除摄像头(物理删除) + * + * @param ids id列表 + */ + void delete(List ids) throws RemoveException; +} diff --git a/src/main/java/com/cm/population/service/camera/impl/CameraServiceImpl.java b/src/main/java/com/cm/population/service/camera/impl/CameraServiceImpl.java new file mode 100644 index 0000000..5aa4fa4 --- /dev/null +++ b/src/main/java/com/cm/population/service/camera/impl/CameraServiceImpl.java @@ -0,0 +1,120 @@ +package com.cm.population.service.camera.impl; + +import com.cm.common.base.AbstractService; +import com.cm.common.exception.RemoveException; +import com.cm.common.exception.SearchException; +import com.cm.common.pojo.ListPage; +import com.cm.common.result.SuccessResult; +import com.cm.common.result.SuccessResultList; +import com.cm.common.utils.HashMapUtil; +import com.cm.common.utils.UUIDUtil; +import com.cm.population.dao.camera.ICameraDao; +import com.cm.population.pojo.dtos.camera.CameraDTO; +import com.cm.population.pojo.vos.camera.CameraVO; +import com.cm.population.service.camera.ICameraService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 摄像头管理 + * @author : LY + * @date :2023-11-16 9:25 + * @description : + * @modyified By: + */ + +@Service +public class CameraServiceImpl extends AbstractService implements ICameraService { + + @Autowired + private ICameraDao cameraDao; + + + @Override + public SuccessResult save(CameraVO cameraVO) throws Exception { + this.saveReturnId(null, cameraVO); + return new SuccessResult(); + } + + + + @Override + public SuccessResult update(String cityCameraId, CameraVO cameraVO) throws Exception{ + this.updateInfo(null, cityCameraId, cameraVO); + return new SuccessResult(); + } + + @Override + public CameraDTO get(String cityCameraId) throws SearchException { + Map params = super.getHashMap(1); + params.put("cityCameraId", cityCameraId); + return cameraDao.get(params); + } + + @Override + public List list(Map params) { + return cameraDao.list(params); + } + + @Override + public SuccessResultList> listPage(ListPage page) throws SearchException{ + PageHelper.startPage(page.getPage(), page.getRows()); + List list = cameraDao.list(page.getParams()); + PageInfo pageInfo = new PageInfo<>(list); + return new SuccessResultList<>(list, pageInfo.getPageNum(), pageInfo.getTotal()); + } + + @Override + public void remove(String token, List ids) { + Map params = getHashMap(3); + params.put("cityCameraIds", ids); + if (token != null) { + setUpdateInfo(token, params); + } else { + setUpdateInfo(params); + } + cameraDao.remove(params); + } + + @Override + public void delete(List ids) throws RemoveException { + Map params = getHashMap(3); + params.put("cityCameraIds", ids); + cameraDao.delete(params); + } + + + + + public String saveReturnId(String token, CameraVO cameraVO) throws Exception{ + String cityCameraId = UUIDUtil.getUUID(); + Map params = HashMapUtil.beanToMap(cameraVO); + params.put("cityCameraId", cityCameraId); + if (token != null) { + setSaveInfo(token, params); + } else { + setSaveInfo(params); + } + cameraDao.save(params); + return cityCameraId; + } + + + public void updateInfo(String token, String cityCameraId, CameraVO cameraVO) throws Exception{ + Map params = HashMapUtil.beanToMap(cameraVO); + params.put("cityCameraId", cityCameraId); + if (token != null) { + setUpdateInfo(token, params); + } else { + setUpdateInfo(params); + } + cameraDao.update(params); + } +} diff --git a/src/main/resources/mybatis/mapper/camera/camera-mapper.xml b/src/main/resources/mybatis/mapper/camera/camera-mapper.xml new file mode 100644 index 0000000..6c2eadb --- /dev/null +++ b/src/main/resources/mybatis/mapper/camera/camera-mapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO city_camera ( + city_camera_id, + camera_name, + camera_street_id, + camera_street_name, + camera_community_id, + camera_community_name, + camera_district_id, + camera_district_name, + camera_longitude, + camera_latitude, + camera_address, + camera_rtsp_link, + remark, + creator, + gmt_create, + modifier, + gmt_modified, + is_delete + ) values ( + #{cityCameraId}, + #{cameraName}, + #{cameraStreetId}, + #{cameraStreetName}, + #{cameraCommunityId}, + #{cameraCommunityName}, + #{cameraDistrictId}, + #{cameraDistrictName}, + #{cameraLongitude}, + #{cameraLatitude}, + #{cameraAddress}, + #{cameraRtspLink}, + #{remark}, + #{creator}, + #{gmtCreate}, + #{modifier}, + #{gmtModified}, + #{isDelete} + ) + + + + + UPDATE + city_camera + SET + gmt_modified = #{gmtModified}, + modifier = #{modifier}, + is_delete = 1 + WHERE + city_camera_id IN + + #{cityCameraIds[${index}]} + + + + + + DELETE FROM + city_camera + WHERE + city_camera_id = #{cityCameraId} + + + + + UPDATE + city_camera + SET + + camera_name = #{cameraName}, + + + camera_street_id = #{cameraStreetId}, + + + camera_street_name = #{cameraStreetName}, + + + camera_community_id = #{cameraCommunityId}, + + + camera_community_name = #{cameraCommunityName}, + + + camera_district_id = #{cameraDistrictId}, + + + camera_district_name = #{cameraDistrictName}, + + + camera_longitude = #{cameraLongitude}, + + + camera_latitude = #{cameraLatitude}, + + + camera_address = #{cameraAddress}, + + + camera_rtsp_link = #{cameraRtspLink}, + + remark = #{remark}, + gmt_modified = #{gmtModified}, + modifier = #{modifier} + WHERE + city_camera_id = #{cityCameraId} + + + + + + + + + + + + diff --git a/src/main/resources/static/assets/images/camera-img.png b/src/main/resources/static/assets/images/camera-img.png new file mode 100644 index 0000000..812f685 Binary files /dev/null and b/src/main/resources/static/assets/images/camera-img.png differ diff --git a/src/main/resources/templates/camera/list.html b/src/main/resources/templates/camera/list.html new file mode 100644 index 0000000..ecb2de9 --- /dev/null +++ b/src/main/resources/templates/camera/list.html @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+ + +
+
+
+
+
+ + + + + + + + + + + + diff --git a/src/main/resources/templates/camera/save.html b/src/main/resources/templates/camera/save.html new file mode 100644 index 0000000..e691131 --- /dev/null +++ b/src/main/resources/templates/camera/save.html @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + + +
+
+ +
+
+
+
+
+ + +
+ +
+ +
+
+ + + +
+
+ +
+
+
+
+
+
+ + + + + + + + + + diff --git a/src/main/resources/templates/camera/update.html b/src/main/resources/templates/camera/update.html new file mode 100644 index 0000000..de96a96 --- /dev/null +++ b/src/main/resources/templates/camera/update.html @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + + +
+
+ +
+
+
+
+
+ + +
+ +
+ +
+
+ + + +
+
+ +
+
+
+
+
+
+ + + + + + + + + + diff --git a/src/main/resources/templates/camera/view-console.html b/src/main/resources/templates/camera/view-console.html new file mode 100644 index 0000000..211f7df --- /dev/null +++ b/src/main/resources/templates/camera/view-console.html @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ 摄像头一 +
+
+ +
+
+
+
+
+
+ 摄像头一 +
+
+ +
+
+
+
+
+
+
+
+ 摄像头一 +
+
+ +
+
+
+
+
+
+ 摄像头一 +
+
+ +
+
+
+
+
+
+ + +
+ + + + + + + + + + + + +