Commit 95e7f474 authored by beilang's avatar beilang

init

parents
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.5.RELEASE</version>
<relativePath />
</parent>
<groupId>com.ces</groupId>
<artifactId>monitor</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.18</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- JSP依赖 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!--<scope>provided</scope>-->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.ces;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* @author Tao
*/
@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(WebApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebApplication.class);
}
}
package com.ces.common.core.domain;
import com.ces.common.core.enums.ResultEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author Tao
*/
@Data
@AllArgsConstructor
public class Result {
private Boolean success;
private String code;
private String message;
private Object data;
public static Result success() {
return new Result(true, ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), null);
}
public static Result success(String msg) {
return new Result(true, ResultEnum.SUCCESS.getCode(), msg, null);
}
public static Result success(Object data) {
return new Result(true, ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data);
}
public static Result error() {
return new Result(false, ResultEnum.ERROR.getCode(), ResultEnum.ERROR.getMessage(), null);
}
public static Result error(String msg) {
return new Result(false, ResultEnum.ERROR.getCode(), msg, null);
}
public Result message(String msg) {
this.message = msg;
return this;
}
public Result data(Object data) {
this.data = data;
return this;
}
}
package com.ces.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Tao
*/
@Getter
@AllArgsConstructor
public enum ResultEnum {
/**
* 成功响应
*/
SUCCESS("200", "success"),
/**
* 错误响应
*/
ERROR("500", "error");
private final String code;
private final String message;
}
package com.ces.common.device.dto;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* @author Tao
*/
@Data
public class DeviceDTO {
private String id;
private String gbid;
private String groupId;
private String applyType;
private String deviceName;
private String updaterIp;
private String createDeptCode;
private String source;
private String sharePermission;
private String devPrivateId;
private String gpsStatus;
private String model;
private String validGPSPointSatisfy;
private String updaterCode;
private String viidId;
private String longitude;
private String deviceType;
private String manufactorCode;
private String deleteFlg;
private String operateType;
private String dataStatus;
private List<String> devicePermission;
private Map<String, Object> otherGroupNames;
private String civilCode;
private String jobId;
private String groupName;
private Map<String, Object> otherNames;
private String updaterName;
private String name;
private String originStatus;
private String longitudeStr;
private List<String> preDevicePermission;
private String nodeId;
private String applyStatus;
private String status;
private String lifeStatus;
private String parentGbId;
private String latitude;
private String creatorName;
private String apeStatus;
private Map<String, Object> otherGroupIds;
private Map<String, Object> otherPermissions;
private String accessProtocol;
private String gbFlg;
private String preSharePermission;
private String pkMd5;
private String operateFlag;
private String approvalStatus;
private Map<String, Object> deviceAttr;
private String createDeptName;
private String address;
private String updateTime;
private String parentId;
private String typeCode;
private String dataMd5;
private String latitudeStr;
private String recordStatus;
private String gbStratege;
private String createTime;
private String originStatusTime;
}
package com.ces.common.device.dto;
import lombok.Data;
import java.util.List;
/**
* @author Tao
*/
@Data
public class DeviceGroupDTO {
/**
* 分组ID
*/
private String id;
/**
* 分组唯一编码
*/
private String groupCode;
/**
* 分组名称
*/
private String name;
/**
* 分组类型
* 0-视频分组,1-卡口分组,2-人卡分组,默认0
*/
private String type;
/**
* 分组子类型
* 0-视频分组,1-卡口分组,2-人卡分组,默认0
*/
private String groupCatalog;
/**
* 分组顺序
*/
private Integer sortIndex;
/**
* 父分组ID
*/
private String parentId;
/**
* 下级平台编码
* 如果是手动录入的默认为10000
*/
private String domainId;
/**
* 分组的id(外部可不参考)
*/
private String pid;
private List<DeviceGroupDTO> children;
}
package com.ces.common.device.dto;
import lombok.Data;
/**
* @author Tao
*/
@Data
public class ResultDTO<T> {
private String code;
private Integer status;
private Long timestamp;
private T result;
}
package com.ces.common.device.service;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;
import com.ces.common.device.dto.DeviceDTO;
import com.ces.common.device.dto.DeviceGroupDTO;
import com.ces.common.device.support.QueryWrapper;
import com.ces.common.utils.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 设备查询服务
*
* @author Tao
*/
@Service
public class DeviceQueryService {
@Value("${monitor.query-service.api}")
private String baseApi;
private final String SUCCESS_CODE = "0";
private static final Logger logger = LoggerFactory.getLogger(DeviceQueryService.class);
/**
* 获取设备分组tree
*
* @return
*/
public List<DeviceGroupDTO> getDeviceGroupTree() {
return getDeviceGroupTree(null);
}
/**
* 获取设备分组tree
*
* @param name 分组名称
* @return
*/
public List<DeviceGroupDTO> getDeviceGroupTree(String name) {
try {
Map<String, Object> params = new HashMap<>(1);
if (ObjectUtils.isNotBlank(name)) {
params.put("name", name);
}
String result = HttpUtil.get(baseApi + "/group/tree", params);
JSONObject resultObj = JSONObject.parseObject(result);
String code = resultObj.getString("code");
Object dataList = resultObj.get("result");
if (!SUCCESS_CODE.equals(code)) {
logger.error("调用 获取设备分组列表 接口失败!");
return null;
}
if (dataList == null) {
logger.error("未获取到设备分组列表!");
return null;
}
return com.alibaba.fastjson.JSONObject.parseArray(JSONObject.toJSONString(dataList), DeviceGroupDTO.class);
} catch (Exception e) {
logger.error("调用 获取设备分组列表 接口失败!");
return null;
}
}
/**
* 根据分组ID获取设备列表
*
* @param groupId 分组id
* @return
*/
public String getDevicesByGroupId(String groupId) {
try {
Map<String, String> params = new HashMap<>(1);
if (ObjectUtils.isBlank(groupId)) {
logger.error("分组ID不能为空...");
return null;
}
params.put("groupId", groupId);
return HttpUtil.post(baseApi + "/group/device-list", JSONObject.toJSONString(params));
} catch (Exception e) {
logger.error("调用 获取分组下设备列表 接口失败!");
return null;
}
}
public List<DeviceDTO> getDeviceByExt(QueryWrapper queryWrapper) {
try {
Map<String, Object> paramMap = queryWrapper.getParamMap();
String result = HttpUtil.get(baseApi + "/ext", paramMap);
JSONObject resultObj = JSONObject.parseObject(result);
String code = resultObj.getString("code");
JSONObject dataObj = resultObj.getJSONObject("result");
if (!SUCCESS_CODE.equals(code)) {
logger.error("调用 设备查询 接口失败!");
return null;
}
if (dataObj == null) {
logger.error("未获取到设备列表!");
return null;
}
Object dataList = dataObj.get("data");
if (dataList == null) {
logger.error("未获取到设备列表!");
return null;
}
return com.alibaba.fastjson.JSONObject.parseArray(JSONObject.toJSONString(dataList), DeviceDTO.class);
} catch (Exception e) {
logger.error("接口调用失败...", e);
return null;
}
}
public DeviceDTO getDeviceById(String deviceId) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("id", deviceId);
List<DeviceDTO> dtoList = this.getDeviceByExt(queryWrapper);
if (dtoList == null || dtoList.isEmpty()) {
return null;
}
return dtoList.get(0);
}
}
package com.ces.common.device.support;
import com.ces.common.utils.ObjectUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author Tao
*/
public class QueryWrapper {
public static final class OPTION_KEY {
public static final String EQ = "eq";
public static final String NOT_EQ = "not";
public static final String LIKE = "like";
public static final String NOT_LIKE = "nlike";
public static final String CONTAINS = "contains";
}
private final Map<String, Map<String, String>> params;
public QueryWrapper() {
params = new HashMap<>(16);
}
public synchronized void eq(String key, String val){
this.addParams(OPTION_KEY.EQ, key, val);
}
public synchronized void notEq(String key, String val) {
this.addParams(OPTION_KEY.NOT_EQ, key, val);
}
public synchronized void like(String key, String val) {
this.addParams(OPTION_KEY.LIKE, key, val);
}
public synchronized void notLike(String key, String val) {
this.addParams(OPTION_KEY.NOT_LIKE, key, val);
}
public synchronized void contains(String key, String val) {
this.addParams(OPTION_KEY.CONTAINS, key, val);
}
public void addParams(String op, String key, String val) {
if (ObjectUtils.isBlank(key) || ObjectUtils.isBlank(val)) {
return;
}
Map<String, String> eqParams = params.get(op);
if (ObjectUtils.isEmpty(eqParams)) {
eqParams = new HashMap<>(16);
params.put(op, eqParams);
}
eqParams.put(key, val);
}
public Map<String, Object> getParamMap() {
Map<String, Object> paramMap = new HashMap<>(16);
for (String opKey : this.params.keySet()) {
Map<String, String> kvMap = this.params.get(opKey);
if (ObjectUtils.isEmpty(kvMap)) {
continue;
}
for (String key : kvMap.keySet()) {
paramMap.put("f_" + opKey + "_" + key, kvMap.get(key));
}
}
if (ObjectUtils.isEmpty(paramMap)) {
return null;
}
return paramMap;
}
}
package com.ces.common.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* 对象的一些判断操作的工具类。
*
*/
public class ObjectUtils{
/**
* List非空判断。 包含了null与empty的判断。
*
* @param list
* @return
*/
public static boolean isNotEmpty(List<?> list) {
return list != null && !list.isEmpty();
}
/**
* List为空判断。 包含了null与empty的判断。
*
* @param list
* @return
*/
public static boolean isEmpty(List<?> list) {
return list == null || list.isEmpty();
}
/**
* Map非空判断。 包含了null与empty的判断。
*
* @param map
* @return
*/
public static boolean isNotEmpty(Map<?, ?> map) {
return map != null && !map.isEmpty();
}
/**
* Map为空判断。 包含了null与empty的判断。
*
* @param map
* @return
*/
public static boolean isEmpty(Map<?, ?> map) {
return map == null || map.isEmpty();
}
/**
* Object[]非空判断。 包含了null与length的判断。
*
* @param objs
* @return
*/
public static boolean isNotEmpty(Object[] objs) {
return objs != null && objs.length != 0;
}
/**
* Object[]为空判断。 包含了null与length的判断。
*
* @param objs
* @return
*/
public static boolean isEmpty(Object[] objs) {
return objs == null || objs.length == 0;
}
/**
* 字符串非空判断。 包含了null和去除字符串首尾空格后的判断。
*
* @param str
* @return
*/
public static boolean isNotBlank(String str) {
return str != null && !"".equals(str.trim());
}
/**
* 字符串非空判断。 包含了null、去除字符串首尾空格后的空串和"null"的判断。
*
* @param str
* @return
*/
public static boolean isNotBlankAndStrNull(String str) {
if (str != null) {
str = str.trim();
return !"".equals(str) && !"null".equals(str);
}
return false;
}
/**
* 字符串空判断。 包含了null、去除字符串首尾空格后的空串和"null"的判断。
*
* @param str
* @return
*/
public static boolean isBlankAndStrNull(String str) {
if (str == null) {
return true;
} else {
str = str.trim();
return "".equals(str) || "null".equals(str);
}
}
/**
* 字符串为空判断。 包含了null和去除字符串首尾空格后的空串判断。
*
* @param str
* @return
*/
public static boolean isBlank(String str) {
return str == null || "".equals(str.trim());
}
/**
* 判断参数为0或0.0,包含参数为null的情况,返回也为true。
*
* @param num
* @return
*/
public static boolean isNullOrZero(Number num) {
return num == null || (num.longValue() == 0 && num.doubleValue() == 0);
}
/**
* 判断参数不为0、0.0和null。
*
* @param num
* @return
*/
public static boolean isNotNullOrZero(Number num) {
return num != null && (num.longValue() != 0 || num.doubleValue() != 0);
}
/**
* 判断obj是否为null,如果为null 返回空串,否则传入对象toString方法后的结果。
*
* @param obj
* @return
*/
public static String toString(Object obj) {
return obj == null ? "" : obj.toString();
}
/**
* 判断是否为正整数,且不等于0
*
* @param str
* @return
*/
public static boolean isPositiveNum(String str) {
if (ObjectUtils.isNotBlank(str) && !"0".equals(str)) {
Pattern pattern = Pattern.compile("[\\d]*$");
return pattern.matcher(str).matches();
}
return false;
}
/**
* 计算map初始化容量,用于优化map的速度和节约空间
*
* @param elemNum
* 需要存储的元素个数
* @return
*/
public static int calcMapInitCapacity(int elemNum) {
int n = elemNum - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return ((n < 0) ? 1 : n + 1);
}
/**
* 关闭流。
*
* @param closeable
*/
public static void closeQuietly(AutoCloseable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 对象转换为byte数组。
*
* @param obj
* @return
*/
public static byte[] toByteArray(Object obj) {
byte[] bytes = null;
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos)) {
oos.writeObject(obj);
bytes = bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return bytes;
}
/**
* byte数组转换为对象。
*
* @param bytes
* @param clazz
* @param <T>
* @return
*/
public static <T> T toObject(byte[] bytes, Class<T> clazz) {
T obj = null;
try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis)) {
obj = clazz.cast(ois.readObject());
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
/**
* 深拷贝对象。
*
* @param obj
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T cloneObject(T obj) {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos)) {
oos.writeObject(obj);
try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis)) {
return (T)ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 合并多个list
*
* @param <T>
* @param lists
* @return
*/
@SafeVarargs
public static <T> List<T> mergeList(List<? extends T>... lists) {
List<T> list = new ArrayList<>();
for (List<? extends T> item : lists) {
if (item != null) {
list.addAll(item);
}
}
return list;
}
/**
* from hutool
*
* 合并多个数组
*
* @param <T>
* @param arrays
* @return
*/
@SuppressWarnings("unchecked")
@SafeVarargs
public static <T> T[] mergeArray(T[]... arrays) {
if (arrays.length == 1) {
return arrays[0];
}
int length = 0;
for (T[] array : arrays) {
if (null != array) {
length += array.length;
}
}
T[] result = (T[])Array.newInstance(arrays.getClass().getComponentType().getComponentType(), length);
length = 0;
for (T[] array : arrays) {
if (null != array) {
System.arraycopy(array, 0, result, length, array.length);
length += array.length;
}
}
return result;
}
/**
* 判断段文字在文本中出现的次数
*
* @param words
* 文字
* @param text
* 文本内容
* @return
*/
public static int keywordCount(String words, String text) {
if (ObjectUtils.isNotBlank(words) && ObjectUtils.isNotBlank(text)) {
int oriLength = text.length();
text = text.replace(words, "");
int newLength = text.length();
return (oriLength - newLength) / words.length();
}
return 0;
}
}
package com.ces.framework.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
/**
* 配置相关信息
* @author Tao
*/
@Configuration
@MapperScan("com.ces.**.mapper")
public class ApplicationConfig {
}
package com.ces.web.device.controller;
import com.ces.common.core.domain.Result;
import com.ces.web.device.service.IDeviceService;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
* @author Tao
*/
@RestController
@RequestMapping("/device")
public class DeviceController {
@Autowired
private IDeviceService deviceService;
@GetMapping("/demo")
public ModelAndView demoView() {
return new ModelAndView("demo");
}
/**
* 获取所有监狱信息
*/
@GetMapping("/getAllPrison")
public Result getAllPrison() {
return Result.success(deviceService.getPrisonList());
}
/**
* 根据监狱名称获取所有大楼信息
* @param prisonName 监狱名称
*/
@GetMapping("/getBuildInfoByPrison")
public Result getBuildInfoByPrison(String prisonName) {
return Result.success(deviceService.getBuildList(prisonName));
}
/**
* 获取所有楼层信息
* @param prisonName 监狱名称
* @param buildName 大楼名称
*/
@GetMapping("/getFloorInfoByBuildName")
public Result getFloorInfoByBuildName(String prisonName, String buildName) {
return Result.success(deviceService.getFloorList(prisonName, buildName));
}
}
package com.ces.web.device.entity;
/**
* @author Tao
*/
public class Device {
private Long id;
/**
* 设备id
*/
private String uuid;
/**
* 国际id(devId)
*/
private String gbid;
/**
* 分组ID
*/
private String groupId;
private String applyType;
/**
* 设备状态 0在线、1离线
*/
private String status;
private String name;
}
package com.ces.web.device.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 监控设备信息
*
* @author Tao
*/
@Data
@TableName("DEVICE_INFO")
public class DeviceInfo {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 接口的设备ID
*/
@TableField("BUSS_ID")
private String bussId;
/**
* 国际ID
*/
@TableField("GB_ID")
private String gbId;
/**
* 设备名称
*/
@TableField("NAME")
private String name;
/**
* 状态
*/
@TableField("STATUS")
private String status;
/**
* 监狱名称
*/
@TableField("PRISON_NAME")
private String prisonName;
/**
* 大楼名称
*/
@TableField("BUILD_NAME")
private String buildName;
/**
* 监区
*/
@TableField("AREA_NAME")
private String areaName;
/**
* 楼层
*/
@TableField("FLOOR")
private String floor;
/**
* 地点
*/
@TableField("PLACE")
private String place;
/**
* 设备编号
*/
@TableField("DEVICE_NO")
private String deviceNo;
}
package com.ces.web.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ces.web.device.entity.DeviceInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author Tao
*/
public interface DeviceMapper extends BaseMapper<DeviceInfo> {
List<String> getPrisonNameList();
List<Map<String, Object>> getBuildNameList(String prisonName);
List<String> getFloorNameList(@Param("prisonName") String prisonName, @Param("buildName") String buildName);
}
package com.ces.web.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ces.web.device.entity.DeviceInfo;
import java.util.List;
import java.util.Map;
/**
* @author Tao
*/
public interface IDeviceService extends IService<DeviceInfo> {
List<String> getPrisonList();
List<Map<String, Object>> getBuildList(String prisonName);
List<String> getFloorList(String prisonName, String buildName);
}
package com.ces.web.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ces.web.device.entity.DeviceInfo;
import com.ces.web.device.mapper.DeviceMapper;
import com.ces.web.device.service.IDeviceService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @author Tao
*/
@Service
public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, DeviceInfo> implements IDeviceService {
/**
* 获取所有监狱名称
*/
@Override
public List<String> getPrisonList() {
return getBaseMapper().getPrisonNameList();
}
/**
* 根据监狱名称获取所有大楼信息
* @param prisonName 监狱名称
*/
@Override
public List<Map<String, Object>> getBuildList(String prisonName) {
return getBaseMapper().getBuildNameList(prisonName);
}
/**
* 获取楼层信息
* @param prisonName 监狱名称
* @param buildName 大楼名称
*/
@Override
public List<String> getFloorList(String prisonName, String buildName) {
return getBaseMapper().getFloorNameList(prisonName, buildName);
}
}
package com.ces.web.hw.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @author Tao
*/
@Controller
@RequestMapping("/hw")
public class HWController {
@GetMapping
public ModelAndView hwIndex() {
return new ModelAndView("hw/areaPlan");
}
@GetMapping("/lt")
public ModelAndView ltIndex() {
return new ModelAndView("hw/hw_hall");
}
@GetMapping("/wss")
public ModelAndView wssIndex() {
return new ModelAndView("hw/hw_wss");
}
@GetMapping("/xkl")
public ModelAndView xklIndex() {
return new ModelAndView("hw/hw_xkl");
}
@GetMapping("/jyl")
public ModelAndView jylIndex() {
return new ModelAndView("hw/hw_jyl");
}
@GetMapping("/jcqy/{model}")
public ModelAndView jcqyIndex(@PathVariable String model) {
ModelAndView mv = new ModelAndView("hw/hw_jcqy");
mv.addObject("model", model);
return mv;
}
}
package com.ces.web.index.ctrl;
import com.ces.common.device.service.DeviceQueryService;
import com.ces.common.utils.ObjectUtils;
import com.ces.web.device.service.IDeviceService;
import org.springframework.beans.factory.annotation.Autowired;
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;
import java.util.List;
import java.util.Map;
/**
* @author Tao
*/
@RestController
@RequestMapping("/")
public class IndexController {
@Autowired
public DeviceQueryService deviceQueryService;
@Autowired
public IDeviceService deviceService;
@GetMapping
public ModelAndView indexView() {
return new ModelAndView("index");
}
@GetMapping("/areaPlan")
public ModelAndView prisonBuild(String name) {
ModelAndView mv = new ModelAndView("hw/areaPlan ");
if (ObjectUtils.isBlank(name)) {
return mv;
}
List<Map<String, Object>> buildList = deviceService.getBuildList(name);
mv.addObject("prisonName", name);
mv.addObject("buildList", buildList);
return mv;
}
}
server:
port: 8080
servlet:
context-path: /jcy
spring:
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://127.0.0.1:5236/JCY_MONITOR
username: JCY_MONITOR
password: 1234567890
type: com.alibaba.druid.pool.DruidDataSource
druid:
validation-query: select 1
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
monitor:
websocket-url: ws://172.100.100.21:32101
query-service:
api: http://172.100.100.21/cdevice-manage/device
mybatis-plus:
type-aliases-package: com.ces.web.**.entity
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ces.web.device.mapper.DeviceMapper">
<select id="getPrisonNameList" resultType="String">
SELECT PRISON_NAME FROM DEVICE_INFO GROUP BY PRISON_NAME HAVING PRISON_NAME IS NOT NULL
</select>
<select id="getBuildNameList" resultType="Map">
select * from
(
SELECT BUILD_NAME as "buildName",COUNT(1) as "count" FROM DEVICE_INFO WHERE PRISON_NAME = #{prisonName} AND BASE_AREA = '0' GROUP BY BUILD_NAME
)
union all
SELECT '基础区域' as "buildName",COUNT(1) as "count" FROM DEVICE_INFO WHERE PRISON_NAME = #{prisonName} AND BASE_AREA = '1'
</select>
<select id="getFloorNameList" resultType="String">
SELECT FLOOR FROM DEVICE_INFO WHERE PRISON_NAME = #{prisonName} AND BUILD_NAME = #{buildName} GROUP BY FLOOR ORDER BY FLOOR
</select>
</mapper>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setAttribute("ctx", request.getContextPath());
%>
\ No newline at end of file
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setAttribute("ctx", request.getContextPath());
%>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试</title>
<script src="${ctx}/static/js/kmedia-uni.js"></script>
<style>
*{
margin: 0;
padding: 0;
}
html,body{
width: 100%;
}
#app{
height: 100%;
}
#video,#video1,#video2,#video3{
margin: 15px;
width: 800px;
height: 350px;
}
.model{
margin: auto;
width: 75%;
height: 300px;
border: 1px solid lightgray;
}
</style>
</head>
<body>
<div id="app">
<div class="tools">
<input type="text" id="gbid">
<button onclick="loadVideo()">实时播放</button>
</div>
<div id="video">
</div>
<%-- <div class="tools">
<input type="text" id="gbid1">
<button onclick="loadVideo1()">实时播放</button>
</div>
<div id="video1">
</div>--%>
<%--<div class="tools">
<input type="text" id="gbid2">
<button onclick="loadVideo2()">实时播放</button>
</div>
<div id="video2">
</div>
<div class="tools">
<input type="text" id="gbid3">
<button onclick="loadVideo3()">实时播放</button>
</div>
<div id="video3">
</div>--%>
<div class="model">
</div>
</div>
<script>
let gbid = '';
let wsUrl = 'ws://172.100.100.21:32101';
console.log(Object.values(KMediaUni.TOOLS));
// 初始化播放器
let player = new KMediaUni({
selector: '#video',
loading: true,
showMessage: true,
request: {
silentConnection: true,
},
control: {
hideControlsBar: false,
tools: Object.values(KMediaUni.TOOLS)
// tools: ['play']
}
});
function loadVideo() {
let gbid = document.getElementById("gbid").value;
if (!gbid) {
return;
}
player.loadVideo({
src: {
websocketUrl: wsUrl,
devId: gbid
},
transport: KMediaUni.MODE.WEBRTC,
autoplay: true
});
}
// 初始化播放器
let player1 = new KMediaUni({
selector: '#video1',
loading: true,
showMessage: true,
request: {
silentConnection: true,
},
control: {
hideControlsBar: false,
tools: Object.values(KMediaUni.TOOLS)
// tools: ['play']
}
});
function loadVideo1() {
let gbid = document.getElementById("gbid1").value;
if (!gbid) {
return;
}
player1.loadVideo({
src: {
websocketUrl: wsUrl,
devId: gbid
},
transport: KMediaUni.MODE.WEBRTC,
autoplay: true
});
}
// 初始化播放器
let player2 = new KMediaUni({
selector: '#video2',
loading: true,
showMessage: true,
request: {
silentConnection: true,
},
control: {
hideControlsBar: false,
tools: Object.values(KMediaUni.TOOLS)
// tools: ['play']
}
});
function loadVideo2() {
let gbid = document.getElementById("gbid2").value;
if (!gbid) {
return;
}
player2.loadVideo({
src: {
websocketUrl: wsUrl,
devId: gbid
},
transport: KMediaUni.MODE.WEBRTC,
autoplay: true
});
}
// 初始化播放器
let player3 = new KMediaUni({
selector: '#video3',
loading: true,
showMessage: true,
request: {
silentConnection: true,
},
control: {
hideControlsBar: false,
tools: Object.values(KMediaUni.TOOLS)
// tools: ['play']
}
});
function loadVideo3() {
let gbid = document.getElementById("gbid3").value;
if (!gbid) {
return;
}
player3.loadVideo({
src: {
websocketUrl: wsUrl,
devId: gbid
},
transport: KMediaUni.MODE.WEBRTC,
autoplay: true
});
}
</script>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setAttribute("ctx", request.getContextPath());
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="${ctx}/static/js/kmedia-uni.js"></script>
<style>
#app {
width: 600px;
height: 400px;
}
</style>
</head>
<body>
<div id="handler-container"></div>
<button onclick="loadVideo(true)">加载实时流</button>
<button onclick="loadVideo(false)">加载录像回放</button>
<button onclick="exec('loadVideo')">销毁</button>
<button onclick="get10Thumbnail()">获取10s缩略图</button>
<br><br>
<div id="app"></div>
<p>========== 接口测试 ==========</p>
<span>实时操作</span>
<button onclick="exec('ptz', 'left')">云台左转</button>
<button onclick="exec('ptz', 'stop')">关闭云台左转</button>
<button onclick="exec('startVoiceCall')">开启反向语音</button>
<button onclick="exec('stopVoiceCall')">关闭反向语音</button>
<button onclick="exec('startRecord')">开始录制</button>
<button onclick="exec('stopRecord')">结束录制</button>
<button onclick="exec('cancelRecord')">取消录制</button>
<br><br>
<span>回放操作</span>
<button onclick="exec('play')">恢复播放</button>
<button onclick="exec('pause')">暂停</button>
<button onclick="exec('currentTime', 10)">seek到10s</button>
<button onclick="exec('frameForward')">帧进</button>
<button onclick="exec('frameReverse')">帧退</button>
<button onclick="exec('reversePlay')">倒播</button>
<button onclick="exec('exitReversePlay')">退出倒播</button>
<button onclick="exec('changeResolution', 'D1')">切换D1分辨率</button>
<button onclick="startLoopVideo()">开始轮询</button>
<button onclick="stopLoopVideo()">停止轮询</button>
<p>========== 缩略图展示 ==========</p>
<img src=" " id="imgID" width="750" height="480">
<script>
const defaultValue = {
websocketUrl: 'ws://172.100.100.21:32101',
devId: '31011800001320000625',
nmediaId: '',
startTime: '2022-10-26T10:00:00',
endTime: '2022-10-27T00:00:00'
};
const box = document.getElementById('handler-container');
['devId', 'websocketUrl', 'nmediaId', 'startTime', 'endTime'].forEach(key => {
const p = document.createElement('p');
p.innerText = key + ': ';
p.style.margin = '2px 0';
const input = document.createElement('input');
input.onchange = e => {
localStorage.setItem(key, e.target.value);
defaultValue[key] = e.target.value;
}
p.appendChild(input);
if (localStorage.getItem(key) !== null) {
defaultValue[key] = localStorage.getItem(key);
}
input.value = defaultValue[key];
box.appendChild(p);
});
const MODE = KMediaUni.MODE;
let timer = null;
let player = new KMediaUni({
selector: '#app',
loading: true,
showMessage: true,
request: {
silentConnection: true,
},
control: {
hideControlsBar: false,
tools: Object.values(KMediaUni.TOOLS)
}
});
;
function loadVideo(isLive) {
console.log("default value ", defaultValue);
document.getElementById("imgID").src = " ";
player.loadVideo({
src: {
...defaultValue,
...(
isLive
? {
startTime: undefined,
endTime: undefined
}
: {}
)
},
transport: MODE.WEBRTC,
autoplay: true
});
}
function startLoopVideo() {
timer = setInterval(() => {
loadVideo(true)
}, 200);
}
function stopLoopVideo() {
timer && clearInterval(timer)
}
function exec(cmd, ...args) {
if (player && player[cmd]) {
player[cmd](...args);
} else {
console.error('not find', cmd);
}
}
function get10Thumbnail() {
player.getThumbnail(10).then(res => {
console.log(res); // 'data:image/png;base64...'
document.getElementById("imgID").src = res;
}); // 获取10s位置的缩略图
}
</script>
</body>
</html>
\ No newline at end of file
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="../base.jsp"/>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>沪-未 平面图</title>
<script src="${ctx}/static/js/flexible.js"></script>
<link rel="stylesheet" href="${ctx}/static/css/common.css">
<style>
.area-right{
background: url(${ctx}/static/images/plan_floor.png) no-repeat;
height: 23rem;
float: right;
background-size: cover;
width: 78%;
background-size: 100% 100%;
}
.area-box img{
max-width: 70%;
}
</style>
</head>
<body>
<div class="container">
<div class="main-area">
<div class="header-area">
<img src="${ctx}/static/images/logo_mc.png"/>
</div>
<div class="area-content">
<div class="area-left">
<div class="title">沪-未 平面图</div>
<div class="left-menu">
<ul>
<li>
<div class="menu-mc">
<span>教育楼</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #ff6363;">81</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>北车间</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style=" background-color: #ffba00;">50</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>南车间</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #43e04e;">100</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>北监</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style=" background-color: #2f8fff;">107</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>南监</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #ff6363;">86</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>老会见楼</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #ff8a00;">19</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>心康中心</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #ffba00;">46</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>礼堂</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #43e04e;">9</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>卫生所</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #43e04e;">14</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>基础区域</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span style="background-color: #43e04e;">88</span>
</div>
</li>
</ul>
</div>
</div>
<div class="area-right">
<div class="area-box">
<ul>
<li class="xzqy_floor">
<a href="#"> <img src="${ctx}/static/images/xzqy.png"/></a>
</li>
<li class="jyl_floor">
<a href="${ctx}/hw/jyl"> <img src="${ctx}/static/images/jyl.png"/></a>
</li>
<li class="cuican_floor">
<a href="${ctx}/hw/jcqy/炊场"> <img src="${ctx}/static/images/cuican.png"/></a>
</li>
<li class="litan_floor">
<a href="${ctx}/hw/lt"> <img src="${ctx}/static/images/lidan.png"/></a>
</li>
<li class="wss_floor">
<a href="${ctx}/hw/wss"> <img src="${ctx}/static/images/wss.png"/></a>
</li>
<li class="nanjian_floor">
<a href="#"> <img src="${ctx}/static/images/lanjian.png"/></a>
</li>
<li class="beijianyu_floor">
<a href="#"> <img src="${ctx}/static/images/beijianyu.png"/></a>
</li>
<li class="beijian_floor">
<a href="#"> <img src="${ctx}/static/images/beiche.png"/></a>
</li>
<li class="nanchejian_floor">
<a href="#"> <img src="${ctx}/static/images/lanche.png"/></a>
</li>
<li class="lhjl_floor">
<a href="5"> <img src="${ctx}/static/images/lhjl.png"/></a>
</li>
<li class="xkzx_floor">
<a href="5"> <img src="${ctx}/static/images/xkzx.png"/></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="../base.jsp"/>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>沪-未 平面图</title>
<script src="${ctx}/static/js/flexible.js"></script>
<script src="${ctx}/static/js/jquery-1.8.1.min.js" type=text/javascript></script>
<link rel="stylesheet" href="${ctx}/static/css/common.css">
<script>
$(document).ready(function () {
$("ul li").mouseenter(function () {
$(this).find("img").css("transform", "scale(1.03)"); /* 鼠标进入时将图片放大为1.2倍 */
}).mouseleave(function () {
$(this).find("img").css("transform", "scale(1)"); /* 鼠标离开时恢复图片原始大小 */
});
});
</script>
</head>
<body>
<div class="container">
<div class="main-area">
<div class="header-area">
<img src="${ctx}/static/images/logo_mc.png"/>
</div>
<div class="area-content">
<div class="area-left">
<div class="title">沪-未 平面图</div>
<div class="left-menu">
<ul>
<li>
<div class="menu-mc">
<span>教育楼</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">81</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>北车间</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">50</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>南车间</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">100</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>北监</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">107</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>南监</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">86</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>老会见楼</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">19</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>心康中心</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">46</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>礼堂</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">9</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>卫生所</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">14</span>
</div>
</li>
<li>
<div class="menu-mc">
<span>基础区域</span>
</div>
<div class="menu-num">
<span>监控点</span>
<span class="menu-num-text">88</span>
</div>
</li>
</ul>
</div>
</div>
<div class="area-right">
<div class="area-box">
<ul>
<li class="a_floor">
<a href="${ctx}/hw/jyl"> <img src="${ctx}/static/images/A_floor.png"/></a>
<span>教育楼</span>
</li>
<li class="bg1_floor">
<a href="#"> <img src="${ctx}/static/images/bgq_floor.png"/></a>
<span>北车间</span>
</li>
<li class="b_floor">
<a href="#"> <img src="${ctx}/static/images/B_floor.png"/></a>
<span>北监</span>
</li>
<li class="g_floor">
<a href="#"> <img src="${ctx}/static/images/G_floor.png"/></a>
<span>老会见楼</span>
</li>
<li class="c_floor">
<a href="${ctx}/hw/jcqy"> <img src="${ctx}/static/images/C_floor.png"/></a>
<span>基础区域</span>
</li>
<li class="e_floor">
<a href="${ctx}/hw/wss"> <img src="${ctx}/static/images/E_floor.png"/></a>
<span>卫生所</span>
</li>
<li class="d_floor_index">
<a href="${ctx}/hw/xkl"> <img src="${ctx}/static/images/D_floor_1.png"/></a>
<span>心康楼</span>
</li>
<li class="f_floor">
<a href="${ctx}/hw/lt"> <img src="${ctx}/static/images/F_floor.png"/></a>
<span>礼堂</span>
</li>
<!-- <li class="h_floor">
<a href="#"> <img src="../static/images/F_floor.png"/></a>
</li> -->
</ul>
</div>
</div>
</div>
</div>
</div>
<script>
let prisonName = '${prisonName}';
$(function () {
setBgColor();
})
function setBgColor() {
let colors = ["#ff6363", "#ffba00", "#43e04e", "#2f8fff"];
let i = 0;
$(".menu-num-text").each(function () {
if (i===4) {
i = 0;
}
$(this).css('background-color', colors[i]);
i++;
});
}
</script>
</body>
</html>
\ No newline at end of file
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="../base.jsp"/>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/common.css"/>
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/workshop.css"/>
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/commonArea.css"/>
<script src="${ctx}/static/js/jquery-1.8.1.min.js" type=text/javascript></script>
<script src="${ctx}/static/js/rem.js"></script>
<title>礼堂</title>
</head>
<style type="text/css">
.content {
background: url('${ctx}/static/images/bg.jpg') center center no-repeat;
width: 100%;
height: 100%;
/* background-position-x: center; */
background-size: cover;
}
</style>
<body>
<div class="content">
<div class="content_top"></div>
<div class=" padding_box2 clearfix">
<div class="menu_box">
<div class="menu_title_box">礼堂</div>
<div class="tab_list">
<ul>
<li class="current">
<a class="flex-box" href="#">
<p class="tabName">一楼</p>
<p class="monitor monitor2">监控点<span>9</span></p>
</a>
</li>
</ul>
</div>
</div>
<div class="content_box">
<div class="room_box">
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript">
var arr = [
{
top: '0.2rem',
left: '3.2rem',
gbid: '31011700001320001326'
}, {
top: '0.33rem',
left: '10.4rem',
gbid: '31011700001320001327'
}, {
top: '0.78rem',
left: '0.3rem',
gbid: '31011700001320001330'
}, {
top: '4.39rem',
left: '0.3rem',
gbid: '31011700001320001331'
}, {
top: '5.35rem',
left: '0.3rem',
gbid: '31011700001320001333'
}, {
top: '6.68rem',
left: '3.15rem',
gbid: '31011700001320001328'
}, {
top: '6.68rem',
left: '10.4rem',
gbid: '31011700001320001329'
}, {
top: '4.37rem',
left: '11.15rem',
gbid: '31011700001320001334'
}, {
top: '7.25rem',
left: '6.5rem',
gbid: '31011700001320001334'
}
]
$(function () {
// 1、点击上面的li,当前点击的li添加current类,其余兄弟移除类
$(".tab_list li").click(function () {
// 链式编程 当前li添加类,其余兄弟移除类
$(this).addClass('current').siblings().removeClass('current');
// 2、拿到当前点击的索引号
var index = $(this).index();
// 3、下面index对应的模块显示,其余的item隐藏
$(".tab_con .item").eq(index).show().siblings().hide();
})
//循环数组 打摄像头位置
var divElement = document.querySelector('.room_box');
console.log(divElement)
let htmlTxt = '<img class="bg_img" src="../static/images/hall.jpg" alt="">'
for (let i = 0; i < arr.length; i++) {
console.log(divElement)
htmlTxt = htmlTxt + '<img class="camera" src="../static/images/camera.png" ' + ' style=top:' + arr[i].top + ";left:" + arr[i].left + ' onclick="handleClick(' + i + ')"></img>'
// 使用 innerHTML 添加元素
}
divElement.innerHTML = htmlTxt;
});
function handleClick(areaNumber) {
alert("gbid " + arr[areaNumber].gbid);
}
</script>
</html>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="../base.jsp"/>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/common.css"/>
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/workshop.css"/>
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/commonArea.css"/>
<script src="${ctx}/static/js/jquery-1.8.1.min.js" type=text/javascript></script>
<script src="${ctx}/static/js/rem.js"></script>
<title>卫生所</title>
</head>
<style type="text/css">
.content {
background: url('${ctx}/static/images/bg.jpg') center center no-repeat;
width: 100%;
height: 100%;
/* background-position-x: center; */
background-size: cover;
}
</style>
<body>
<div class="content">
<div class="content_top"></div>
<div class=" padding_box2 clearfix">
<div class="menu_box">
<div class="menu_title_box">卫生所</div>
<div class="tab_list">
<ul>
<li class="current">
<a class="flex-box" href="#">
<p class="tabName">一楼</p>
<p class="monitor monitor2">监控点<span>9</span></p>
</a>
</li>
<li>
<a class="flex-box" href="#">
<p class="tabName">二楼</p>
<p class="monitor monitor2">监控点<span>5</span></p>
</a>
</li>
</ul>
</div>
</div>
<div class="content_box">
<div class="room_box">
</div>
</div>
</div>
</div>
<script type="text/javascript">
let dataList = {
'arr1': [
{
top: '0.38rem',
left: '0.38rem',
gbid: '31011700001320001354'
}, {
top: '0.43rem',
left: '5.52rem',
gbid: '31011700001320001366'
}, {
top: '0.38rem',
left: '9.84rem',
gbid: '31011700001320001355'
}, {
top: '4.2rem',
left: '5.26rem',
gbid: '31011700001320001361'
}, {
top: '4.5rem',
left: '9.85rem',
gbid: '31011700001320001356'
}, {
top: '4.21rem',
left: '11.3rem',
gbid: '31011700001320001365'
}, {
top: '7.45rem',
left: '1.51rem',
gbid: '31011700001320001367'
}, {
top: '7.45rem',
left: '4.34rem',
gbid: '31011700001320001363'
}, {
top: '7.45rem',
left: '8.17rem',
gbid: '31011700001320001364'
}
],
'arr2': [
{
top: '0.43rem',
left: '5.52rem',
gbid: '31011700001320001362'
}, {
top: '2.4rem',
left: '10.95rem',
gbid: '31011700001320001357'
}, {
top: '4.15rem',
left: '6.32rem',
gbid: '31011700001320001358'
}, {
top: '7.45rem',
left: '2.92rem',
gbid: '31011700001320001359'
}, {
top: '7.45rem',
left: '8.68rem',
gbid: '31011700001320001360'
}
]
}
let thisIndex = 1;
$(function () {
// 1、点击上面的li,当前点击的li添加current类,其余兄弟移除类
$(".tab_list li").click(function () {
// 链式编程 当前li添加类,其余兄弟移除类
$(this).addClass('current').siblings().removeClass('current');
// 2、拿到当前点击的索引号
var index = $(this).index();
// 3、下面index对应的模块显示,其余的item隐藏
$(".tab_con .item").eq(index).show().siblings().hide();
updateData(index + 1);
})
updateData(1);
});
function updateData(index) {
thisIndex = index;
var divElement = document.querySelector('.room_box');
let htmlTxt = '<img class="bg_img" src="../static/images/wss_0' + index + '.jpg" alt="">'
for (let i = 0; i < dataList[`arr${"${index}"}`].length; i++) {
htmlTxt = htmlTxt + '<img class="camera" src="../static/images/camera.png" ' + ' style=top:' + dataList[`arr${"${index}"}`][i].top + ";left:" + dataList[`arr${"${index}"}`][i].left + ' onclick="handleClick(' + i + ')"></img>'
// 使用 innerHTML 添加元素
}
divElement.innerHTML = htmlTxt;
}
function handleClick(areaNumber) {
alert("gbid " + dataList['arr' + thisIndex][areaNumber].gbid);
}
</script>
</body>
</html>
\ No newline at end of file
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="../base.jsp"/>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/common.css"/>
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/workshop.css"/>
<link rel="stylesheet" type="text/css" href="${ctx}/static/css/commonArea.css"/>
<script src="${ctx}/static/js/jquery-1.8.1.min.js" type=text/javascript></script>
<script src="${ctx}/static/js/rem.js"></script>
<title>心康楼</title>
</head>
<style type="text/css">
.content {
background: url('${ctx}/static/images/bg.jpg') center center no-repeat;
width: 100%;
height: 100%;
/* background-position-x: center; */
background-size: cover;
}
</style>
<body>
<div class="content">
<div class="content_top"></div>
<div class=" padding_box2 clearfix">
<div class="menu_box">
<div class="menu_title_box">心康楼</div>
<div class="tab_list">
<ul>
<li class="current">
<a class="flex-box" href="#">
<p class="tabName">一楼</p>
<p class="monitor monitor2">监控点<span>11</span></p>
</a>
</li>
<li>
<a class="flex-box" href="#">
<p class="tabName">二楼</p>
<p class="monitor monitor2">监控点<span>21</span></p>
</a>
</li>
<li>
<a class="flex-box" href="#">
<p class="tabName">三楼</p>
<p class="monitor monitor2">监控点<span>14</span></p>
</a>
</li>
</ul>
</div>
</div>
<div class="content_box">
<div class="room_box">
</div>
</div>
</div>
</div>
<script type="text/javascript">
let dataList = {
'arr1': [
{
top: '4.1rem',
left: '0.4rem',
gbid: '31011700001320000976'
}, {
top: '5.4rem',
left: '7.95rem',
gbid: '31011700001320000977'
}, {
top: '5rem',
left: '2.45rem',
gbid: '31011700001320000979'
}, {
top: '5.95rem',
left: '0.4rem',
gbid: '31011700001320000982'
}, {
top: '5.95rem',
left: '3.89rem',
gbid: '31011700001320000983'
}, {
top: '5.95rem',
left: '7.95rem',
gbid: '31011700001320000975'
}, {
top: '0.74rem',
left: '8.4rem',
gbid: '31011700001320000978'
}, {
top: '1.65rem',
left: '8.4rem',
gbid: '31011700001320000980'
}, {
top: '7.4rem',
left: '8.4rem',
gbid: '31011700001320000981'
}, {
top: '0.34rem',
left: '11.12rem',
gbid: '31011700001320000973'
}, {
top: '7.4rem',
left: '11.12rem',
gbid: '31011700001320000974'
}
],
'arr2': [
{
top: '0.36rem',
left: '0.49rem',
gbid: '31011700001320000998'
}, {
top: '2.52rem',
left: '0.49rem',
gbid: '31011700001320000999'
}, {
top: '5.27rem',
left: '0.49rem',
gbid: '31011700001320001000'
}, {
top: '7.4rem',
left: '0.49rem',
gbid: '31011700001320001001'
}, {
top: '3.3rem',
left: '3.15rem',
gbid: '31011700001320001002'
}, {
top: '4.2rem',
left: '3.15rem',
gbid: '31011700001320000997'
}, {
top: '0.36rem',
left: '7.95rem',
gbid: '31011700001320000990'
}, {
top: '4.6rem',
left: '3.62rem',
gbid: '31011700001320000991'
}, {
top: '0.73rem',
left: '8.5rem',
gbid: '31011700001320000992'
}, {
top: '1.57rem',
left: '10.5rem',
gbid: '31011700001320000984'
}, {
top: '2.95rem',
left: '8.4rem',
gbid: '31011700001320000985'
}, {
top: '3.4rem',
left: '8.4rem',
gbid: '31011700001320000988'
}, {
top: '4.6rem',
left: '10.5rem',
gbid: '31011700001320000989'
}, {
top: '5.27rem',
left: '3.16rem',
gbid: '31011700001320001003'
}, {
top: '5.27rem',
left: '8.24rem',
gbid: '31011700001320001004'
}, {
top: '5.9rem',
left: '1.11rem',
gbid: '31011700001320000993'
}, {
top: '7.4rem',
left: '4.44rem',
gbid: '31011700001320000994'
}, {
top: '7.4rem',
left: '4.89rem',
gbid: '31011700001320000995'
}, {
top: '7.4rem',
left: '8.38rem',
gbid: '31011700001320000996'
}, {
top: '0.36rem',
left: '11.13rem',
gbid: '31011700001320000986'
}, {
top: '7.4rem',
left: '11.13rem',
gbid: '31011700001320000987'
}
],
'arr3': [
{
top: '0.36rem',
left: '0.49rem',
gbid: '31011700001320001014'
}, {
top: '2.52rem',
left: '0.49rem',
gbid: '31011700001320001015'
}, {
top: '5.27rem',
left: '0.49rem',
gbid: '31011700001320001016'
}, {
top: '7.4rem',
left: '0.49rem',
gbid: '31011700001320001017'
}, {
top: '3.3rem',
left: '1.15rem',
gbid: '31011700001320001011'
}, {
top: '4.65rem',
left: '8rem',
gbid: '31011700001320001012'
}, {
top: '0.73rem',
left: '8.5rem',
gbid: '31011700001320001009'
}, {
top: '1.57rem',
left: '10.5rem',
gbid: '31011700001320001005'
}, {
top: '4.65rem',
left: '8.38rem',
gbid: '31011700001320001006'
}, {
top: '7.4rem',
left: '5.79rem',
gbid: '31011700001320001018'
}, {
top: '7.4rem',
left: '6.27rem',
gbid: '31011700001320001010'
},
{
top: '4.2rem',
left: '3.15rem',
gbid: '31011700001320001013'
}, {
top: '0.36rem',
left: '11.13rem',
gbid: '31011700001320001007'
}, {
top: '7.4rem',
left: '11.13rem',
gbid: '31011700001320001008'
}
]
}
let thisIndex = 1;
$(function () {
// 1、点击上面的li,当前点击的li添加current类,其余兄弟移除类
$(".tab_list li").click(function () {
// 链式编程 当前li添加类,其余兄弟移除类
$(this).addClass('current').siblings().removeClass('current');
// 2、拿到当前点击的索引号
var index = $(this).index();
// 3、下面index对应的模块显示,其余的item隐藏
$(".tab_con .item").eq(index).show().siblings().hide();
updateData(index + 1);
})
updateData(1);
});
function updateData(index) {
thisIndex = index;
var divElement = document.querySelector('.room_box');
let htmlTxt = '<img class="bg_img" src="../static/images/xkl_0' + index + '.jpg" alt="">'
for (let i = 0; i < dataList[`arr${"${index}"}`].length; i++) {
htmlTxt = htmlTxt + '<img class="camera" src="../static/images/camera.png" ' + ' style=top:' + dataList[`arr${"${index}"}`][i].top + ";left:" + dataList[`arr${"${index}"}`][i].left + ' onclick="handleClick(' + i + ')"></img>'
// 使用 innerHTML 添加元素
}
divElement.innerHTML = htmlTxt;
}
function handleClick(areaNumber) {
alert("gbid " + dataList['arr' + thisIndex][areaNumber].gbid);
}
</script>
</body>
</html>
\ No newline at end of file
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="base.jsp" />
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>监区平面图</title>
<script src="${ctx}/static/js/flexible.js"></script>
<link rel="stylesheet" href="${ctx}/static/css/common.css">
</head>
<body>
<div class="container">
<div class="main-area">
<div class="header-area">
<img src="${ctx}/static/images/logo_mc.png"/>
</div>
<div class="area-content">
<div class="loupan_map_box">
<ul>
<li class="index">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_01">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_02">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_03">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_04">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_05">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_06">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_07">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_08">
<a href="${ctx}/hw" title="沪-未"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_09">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_10">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_11">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_12">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_13">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_14">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
<li class="index_15">
<a href="#"> <img src="${ctx}/static/images/model_mc.png"/></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>jcy</display-name>
</web-app>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
body,ul,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,div{margin:0;padding:0;border:0;font-size: 16px;color: #fff;}
ul,ol{list-style:none;}
select,input,img,select{vertical-align:middle;}
a{text-decoration:none;}
a:link{color:#009;}
a:visited{color:#800080;}
a:hover,a:active,a:focus{color:#c00;text-decoration:underline;}
.container .main-area{
background: url(../images/home_bj.png) no-repeat;
height: 100vh;
background-size: cover;
}
/**首页**/
.container{
height: 100vh;
overflow: hidden;
}
.area-content .loupan_map_box {
text-align: center;
}
.loupan_map_box ul{
position: relative;
}
.loupan_map_box ul li img{
width: 2rem;
height: 2rem;
}
.loupan_map_box ul li{
position: absolute;
}
.loupan_map_box ul .index{
left: 11rem;
top: 0.8rem;
}
.loupan_map_box ul .index_01{
right: 6rem;
top: 4rem;
}
.loupan_map_box ul .index_02{
right: 6rem;
top: 4rem;
}
.loupan_map_box ul .index_03{
left: 9rem;
top: 6rem;
}
.loupan_map_box ul .index_04{
left: 14rem;
top: 6rem;
}
.loupan_map_box ul .index_05{
right:14.8rem;
top: 7rem;
}
.loupan_map_box ul .index_06{
left: 7rem;
top: 8.5rem;
}
.loupan_map_box ul .index_07{
left: 10rem;
top: 11rem;
}
.loupan_map_box ul .index_08{
left: 10rem;
top: 11rem;
}
.loupan_map_box ul .index_09{
left: 12rem;
top: 14rem;
}
.loupan_map_box ul .index_10{
right: 7rem;
top: 12rem;
}
.loupan_map_box ul .index_11{
right: 11.5rem;
top: 9rem;
}
.loupan_map_box ul .index_12{
right: 14.5rem;
top: 13rem;
}
.loupan_map_box ul .index_13{
left:16rem;
top: 10.5rem;
}
.loupan_map_box ul .index_14{
left:15rem;
top: 9rem;
}
.loupan_map_box ul .index_15{
left:14rem;
top: 8rem;
}
.area-content .loupan_map_box{
background: url(../images/home_floor.png) no-repeat;
width: 34rem;
height: 19rem;
margin: 0 auto;
margin-top: 2rem;
background-size: 100% 100%;
}
.header-area{
margin: auto;
text-align: center;
}
.header-area img{
width: 10rem;
height: auto;
padding-top: 1.4rem;
}
/**监控业务数据**/
.area-content{
margin:1rem 3rem 0 3rem;
overflow: hidden;
}
.area-left{
width: 20%;
float: left;
}
.area-content .area-left .title{
font-size: 0.6rem;
text-align: center;
letter-spacing: 2px;
font-family: 'AlibabaPuHuiTi_2_85_Bold';
}
.left-menu {
margin-top: 20px;
}
.left-menu ul li{
background-color: #0d2a5b;
border-radius: 7px;
margin-top: 0.6rem;
display: flex;
justify-content: space-between;
font-size: 18px;
height: 1.5rem;
line-height: 1.5rem;
padding: 0 20px;
}
.left-menu ul li span{
font-size: 0.5rem;
}
.left-menu .menu-num span:nth-child(2){
vertical-align: middle;
padding:3px 20px;
border-radius: 13px;
margin-left: 10px
}
.area-right ul{
position: relative;
}
.area-right ul li{
position: absolute;
}
.area-right ul li span{
position: fixed;
font-size: 0.6rem;
}
.area-right ul .a_floor img{
width: 12.6rem;
}
.area-right ul .a_floor{
left: 3.9rem;
top: 3rem;
}
.area-right ul .a_floor span{
left: 26rem;
top: 7rem;
}
.area-right ul .bg1_floor img{
width: 16rem;
}
.area-right ul .bg1_floor{
left: 4rem;
top: 4.6rem;
}
.area-right ul .bg1_floor span{
left: 30.7rem;
top:8.4rem;
}
.area-right ul .b_floor img{
width: 5rem;
}
.area-right ul .b_floor{
left: 4rem;
top: 7.8rem;
}
.area-right ul .b_floor span{
left: 20rem;
top: 13.6rem;
}
.area-right ul .b_floor{
left: 4rem;
top: 7.8rem;
}
.area-right ul .g_floor img{
width: 7rem;
}
.area-right ul .g_floor{
left: 4rem;
top: 12.2rem;
}
.area-right ul .g_floor span{
margin-top: 2.5rem;
margin-left: -2.4rem;
}
.area-right ul .c_floor img{
width: 7.3rem;
}
.area-right ul .c_floor{
left: 13.6rem;
top: 4.2rem;
}
.area-right ul .c_floor span{
left: 31rem;
top: 11.8rem;
}
.area-right ul .e_floor img{
width: 5.8rem;
}
.area-right ul .e_floor{
z-index: 2;
left: 15.6rem;
top: 13.4rem;
}
.area-right ul .e_floor span{
margin-top: 1.3rem;
margin-left: -1.8rem;
}
.area-right ul .d_floor img{
width: 3rem;
}
.area-right ul .d_floor{
right: 12rem;
top: 6rem;
}
.area-right ul .d_floor_index span{
margin-top: 5rem;
margin-left: -1.8rem;
}
.area-right ul .f_floor img{
width: 5.8rem;
}
.area-right ul .f_floor{
right: 1.7rem;
top: 11.7rem;
}
.area-right ul .f_floor span{
margin-top: 0.6rem;
margin-left: -1.8rem;
}
.area-right ul .d_floor_index img{
width: 5rem;
}
.area-right ul .d_floor_index{
right: 11rem;
z-index: 1;
top: 6.6rem;
}
/**业务层**/
.area-content .business{
background: url(../images/yewuceng.png) no-repeat;
margin: 0 auto;
margin-top: 2rem;
background-size: 100% 100%;
}
.bue-yewu .map img {
transition: transform 0.3s ease-in-out; /* 添加过渡效果,过渡时间为0.3秒 */
}
.bue-yewu .map img:hover {
transform: scale(1.05); /* 鼠标悬停时图标放大为原来的1.2倍 */
}
/**监控业务数据**/
.area-right ul .xzqy_floor{
right: 5.2rem;
top: 11rem;
}
/**监控业务数据**/
.area-right ul .jyl_floor{
right: 12rem;
top: 7rem;
}
.area-right ul .cuican_floor{
right: 4.8rem;
top: 8.3rem;
}
.area-right ul .litan_floor{
right: 5rem;
top: 6.8rem;
}
.area-right ul .wss_floor{
right: 6.8rem;
top: 5.6rem;
}
.area-right ul .nanjian_floor{
right: 9rem;
top: 4.3rem;
}
.area-right ul .beijian_floor{
right: 13rem;
top: 3.6rem;
}
.area-right ul .nanchejian_floor{
right: 15rem;
top: 2.6rem;
z-index: 1;
}
.area-right ul .beijianyu_floor{
left: 16rem;
top: 6rem;
}
.area-right ul .lhjl_floor{
right: 19rem;
top: 12rem;
}
.xkzx_floor{
left: 15rem;
top: 5rem;
}
\ No newline at end of file
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-size: 0.14rem;
}
/* 清格式 */
.clearfix:after {
content: "";
height: 0;
line-height: 0;
display: block;
visibility: hidden;
clear: both;
}
@font-face {
font-family: "led";
src: url(@/assets/fonts/FX-LED.TTF);
}
.clearfix {
zoom: 1;
}
.clear {
clear: both;
}
.content_top {
font-size: 0.16rem;
height: 1.4rem;
background: url("../images/topBg.png") center center no-repeat;
background-size: contain;
}
.padding_box2 {
margin: 0 auto;
width: 15.85rem;
height: 8.7rem;
}
.menu_box {
float: left;
width: 2.65rem;
}
.content_box {
float: right;
width: 13rem;
height: 8.54rem;
background: rgba(0, 0, 0, 0.6);
padding: 0.25rem 0.52rem;
border-radius: 0.1rem;
}
.room_box {
position: relative;
height: 100%;
/* width: 11.82rem;
height: 8.18rem; */
width: 100%;
height: 100%;
}
.bg_img {
position: absolute;
top: 0;
left: 0;
/* height: 100%; */
/* width: 11.82rem;
height: 8.18rem; */
width: 100%;
height: 100%;
}
.camera {
position: absolute;
width: 0.25rem;
height: 0.25rem;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-size: 0.14rem;
}
body {
background-color: #001a4c;
}
/* 清格式 */
.clearfix:after {
content: "";
height: 0;
line-height: 0;
display: block;
visibility: hidden;
clear: both;
}
@font-face {
font-family: "led";
src: url(@/assets/fonts/FX-LED.TTF);
}
.clearfix {
zoom: 1;
}
.clear {
clear: both;
}
.content_top {
font-size: 0.16rem;
height: 1.4rem;
background: url("../images/topBg.png") center center no-repeat;
background-size: contain;
}
.padding_box2 {
margin: 0 auto;
/* width: 15.85rem; */
width: 17.5rem;
height: 8.54rem;
}
.menu_box {
float: left;
width: 4rem;
}
.tab_list ul li {
border-radius: 0.1rem;
}
.tab_list ul li a {
font-size: 0.24rem;
justify-content: space-around;
}
.tab_list ul li a:hover {
text-decoration: none;
}
.tabName {
font-size: 0.19rem;
}
.monitor2 {
font-size: 0.15rem;
}
.content_box {
float: right;
width: 13rem;
height: 8.54rem;
background: rgba(0, 11, 52, 0.6);
padding: 0.25rem 0.52rem;
border-radius: 0.1rem;
}
.room_box {
position: relative;
height: 100%;
/* width: 11.82rem;
height: 8.18rem; */
width: 100%;
height: 100%;
}
.bg_img {
position: absolute;
top: 0;
left: 0;
/* height: 100%; */
/* width: 11.82rem;
height: 8.18rem; */
width: 100%;
height: 100%;
}
.camera {
position: absolute;
width: 0.25rem;
height: 0.25rem;
}
.content_top {
height: 1.4rem;
background: url("../images/topBg.png") center center no-repeat;
}
.content_box {
width: 13rem;
height: 8.8rem;
margin: 0.2rem;
background: rgba(0, 0, 0, 0.6);
padding: 0.25rem 0.52rem;
border-radius: 0.1rem;
}
.padding_box {
padding: 0.12rem 0.7rem;
}
.room_box {
position: relative;
height: 100%;
}
.bg_img {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.camera {
position: absolute;
}
\ No newline at end of file
/* 修改模态框样式 */
.modal-dialog {
/* 防止重复平铺 */
width: 75%;
/* 设置模态框宽度为屏幕的一半 */
height: 68vh;
/* 设置模态框高度为屏幕高度的一半 */
max-width: 1200px;
/* 设置最大宽度 */
max-height: 700px;
/* 设置最大高度 */
}
/* 修改模态框样式 */
.modal-content {
background-image: url("../images/tc_bj.png");
/* 替换为你的背景图片路径和名称 */
background-size: cover;
/* 自动适应尺寸并覆盖整个模态框 */
background-repeat: no-repeat;
/* background-color: #00254d00; */
border: none;
background-color: transparent;
}
.modal-title {
font-family: 'PingFang-SC-Bold';
font-size: 26px;
font-weight: normal;
font-stretch: normal;
letter-spacing: 1px;
color: #ffffff;
}
.modal-body {
display: flex;
padding: 30px;
}
#cameraText {
width: 50%;
/* 修改左侧文字占比 */
padding: 20px;
/* 修改文字内边距 */
}
#cameraText p {
margin-bottom: 10px;
/* 修改段落之间的间距 */
}
#cameraVideo {
width: 50%;
/* 修改右侧视频占比 */
padding: 0 10px;
/* 修改视频内边距 */
}
#cameraVideo video {
width: 100%;
/* 修改视频宽度 */
outline: none;
/* 去掉视频播放器的外边框 */
}
.modal-content .title {
text-align: center;
line-height: 40px;
margin-top: 20px;
font-size: 0.25rem;
}
.modal-body ul {
margin-left: 20px;
margin-top: 10px;
}
.modal-body ul li {
height: 40px;
font-size: 16px;
cursor: pointer;
}
.modal-body ul li span {
margin-left: 10px;
font-size: 0.2rem;
color: #eee;
}
\ No newline at end of file
.padding_box {
padding: 3.5rem 2rem 0;
}
.flex-box {
display: flex;
align-content: center;
justify-content: center;
align-items: center;
}
.menu_box {
width: 10rem;
}
.menu_title_box {
width: 100%;
text-align: center;
font-size: 32px;
color: #fff;
}
.tab_list ul {
display: block;
width: 100%;
}
.tab_list ul li {
color: #fff;
font-weight: normal;
font-size: 16px;
background: rgb(0 35 105 / 70%);
margin: 0.4rem 0;
border-radius: 0.2rem;
line-height: 2rem;
}
.tab_list ul li div {
font-size: 0.6rem;
justify-content: space-around;
}
.monitor {
font-size: 0.5rem;
}
.monitor span {
background: #006aec;
padding: 0.1rem 0.4rem;
border-radius: 2rem;
margin-left: 0.1rem;
}
.tab_list ul li a {
color: #a84c47;
}
.tab_list ul li.current {
line-height: 2rem;
border: none;
background: #006aec;
font-weight: normal;
}
.tab_list ul li.current .monitor span {
background: #0055bd;
}
.content_box {
flex: 1;
}
.padding_box {
padding: 1.4rem 1rem 0;
}
.flex-box {
display: flex;
align-content: center;
justify-content: center;
}
.menu_box {
width: 4rem;
}
.menu_title_box {
width: 100%;
text-align: center;
font-size: 0.32rem;
color: #fff;
}
.tab_list ul {
display: block;
width: 100%;
}
.tab_list ul li {
color: #fff;
font-weight: normal;
font-size: 0.24rem;
background: rgb(0 35 105 / 70%);
margin: 0.2rem 0;
border-radius: 0.2rem;
line-height: 0.6rem;
}
.tab_list ul li div {
font-size: 0.24rem;
justify-content: space-around;
}
.monitor {
font-size: 0.2rem;
}
.monitor span {
background: #006aec;
padding: 0.04rem 0.2rem;
border-radius: 0.2rem;
margin-left: 0.1rem;
}
.tab_list ul li a {
color: #a84c47;
}
.tab_list ul li.current {
line-height: 0.6rem;
border: none;
background: #006aec;
font-weight: normal;
}
.tab_list ul li.current .monitor span {
background: #0055bd;
}
.content_box {
flex: 1;
}
\ No newline at end of file
.padding_box {
padding: 1.4rem 1rem 0;
}
.flex-box {
display: flex;
align-content: center;
justify-content: center;
}
.menu_box {
width: 4rem;
}
.menu_title_box {
width: 100%;
text-align: center;
font-size: 0.32rem;
color: #fff;
}
.tab_list ul {
display: block;
width: 100%;
}
.tab_list ul li {
color: #fff;
font-weight: normal;
font-size: 0.24rem;
background: rgb(0 35 105 / 70%);
margin: 0.2rem 0;
border-radius: 0.2rem;
line-height: 0.6rem;
}
.tab_list ul li div {
font-size: 0.24rem;
justify-content: space-around;
}
.monitor {
font-size: 0.2rem;
}
.monitor span {
background: #006aec;
padding: 0.04rem 0.2rem;
border-radius: 0.2rem;
margin-left: 0.1rem;
}
.tab_list ul li a {
color: #a84c47;
}
.tab_list ul li.current {
line-height: 0.6rem;
border: none;
background: #006aec;
font-weight: normal;
}
.tab_list ul li.current .monitor span {
background: #0055bd;
}
.content_box {
flex: 1;
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This image diff could not be displayed because it is too large. You can view the blob instead.
This image diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment