252 Commits 71619550aa ... 90ff07edb6

Autor SHA1 Nachricht Datum
  xiayu3 90ff07edb6 Merge branch 'master' of vor 4 Jahren
  xiayu3 09901ebc40 合并 vor 4 Jahren
  xiayu3 105befcb6b [FE]修改进出记录样式 vor 4 Jahren
  chenxr3 109dc269ce [FE] logo更换,识别记录传值问题解决 vor 4 Jahren
  luoxu5 571e3bf518 [FE]修改监控布局,视频回放,考勤报表一系列bug vor 4 Jahren
  konghl 6acd088047 修改场景关联设备 vor 4 Jahren
  konghl 895d34bec7 修改AI模型常量 vor 4 Jahren
  konghl 74cb14124e 修改视频回放 vor 4 Jahren
  chenxr3 762a15dae8 [FE] 视频监控布局问题、切换场景没有切换布局修复 识别记录下面图片跑马灯 vor 4 Jahren
  luoxu5 4f4027659a [FE]新增用户管理页面默认查询条件和设备对话框视频地址字段值 vor 4 Jahren
  liuwenxun 7e018c0902 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  liuwenxun 6b8b5abe55 [FE]AI报警角标调整 vor 4 Jahren
  liuwenxun 7ae4a35d9d [FE]处理公司名字 vor 4 Jahren
  liuwenxun 761ca52702 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  liuwenxun 232317f8d4 [FE]进出记录详情页面添加识别方框 vor 4 Jahren
  liuwenxun ac5103adfb Merge remote-tracking branch 'origin/master' vor 4 Jahren
  liuwenxun 32785134b2 Merge remote-tracking branch 'origin/dev-security' into dev-security vor 4 Jahren
  liuwenxun d911a3fea6 [FE]进出详情修改 vor 4 Jahren
  liuwenxun 286f4e7586 [FE]进出详情里截图完成 vor 4 Jahren
  liuwenxun 0ef80dba26 Merge remote-tracking branch 'origin/dev-security' into dev-security vor 4 Jahren
  liuwenxun d73f053c1c [FE]进出记录联调 vor 4 Jahren
  liuwenxun 10ffaddfc7 [FE]AI报警详情高保真解决 vor 4 Jahren
  chenxr3 a4fcb0e1ae [FE] 首页直播组件更换 vor 4 Jahren
  chenxr3 362dd05c40 [FE]视频监控分页 vor 4 Jahren
  xiayu3 264c3ba3d5 Merge branch 'dev-security' of http://10.1.235.20:3000/asiainfo/ebc into dev-security vor 4 Jahren
  xiayu3 5cb880c67a [FE]更改视频监控组件以及用户管理界面新增用户弹出框 vor 4 Jahren
  liuwenxun 9886a6c12e [FE]整合人脸审核页面到用户管理 vor 4 Jahren
  liuwenxun 6b710a982f Merge remote-tracking branch 'origin/dev-security' into dev-security vor 4 Jahren
  liuwenxun b9c49e6225 [FE]统计AI报警未处理的数据 vor 4 Jahren
  liuwenxun b700661ec4 [FE]AI报警表格调整 vor 4 Jahren
  liuwenxun c70214f3d4 [FE]AI报警徽标调整 vor 4 Jahren
  liuwenxun f85324acbe Merge remote-tracking branch 'origin/dev-security' into dev-security vor 4 Jahren
  liuwenxun 6571f93fd9 [FE]AI报警处理,AI报警角标,进出记录查询修改 vor 4 Jahren
  liuwenxun 8f4b50aca9 [FE]处理AL报警详情无法点开的问题 vor 4 Jahren
  liuwenxun 5b51d9d4bd [FE]处理videoInfo为空时,详情页面无法点击的问题 vor 4 Jahren
  xiayu3 b53ad37d3c [FE]:修改目录 vor 4 Jahren
  xiayu3 cb769b3992 Merge branch 'dev-security' of http://10.1.235.20:3000/asiainfo/ebc into dev-security vor 4 Jahren
  xiayu3 2233772536 [FE]:修改视频监控样式 vor 4 Jahren
  xiayu3 3cbe6f2c39 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  xiayu3 67f5214a9a Merge branch 'dev-security' vor 4 Jahren
  wangchao 12572cf5a1 考勤详情显示格式修改bug vor 4 Jahren
  chenxr3 d78b7bdffa 删除debugger vor 4 Jahren
  konghl 9f50c9fa97 修改问题 vor 4 Jahren
  wangdong6 0c298d1922 修改AI识别处理服务 vor 4 Jahren
  konghl 475afbbf9c 修改问题 vor 4 Jahren
  konghl e31740f33e 新增报警详情的接口 vor 4 Jahren
  wangdong6 e477401879 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangdong6 dc68bfa2ea 修改AI识别处理服务 vor 4 Jahren
  wangdong6 29063f2405 增加场景设备分页查询服务 vor 4 Jahren
  wangchao 6a9e5a5391 修改进出记录bug vor 4 Jahren
  konghl b853fa9490 修改考勤类型必填的问题 vor 4 Jahren
  konghl 902b99be6a 修改问题 vor 4 Jahren
  konghl eed12970cd 新增AI报警kafka消费 vor 4 Jahren
  wangdong6 83a580112c 修改AI处理结果 vor 4 Jahren
  wangdong6 296d4992b4 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangdong6 526e01161f 增加考勤打卡服务 vor 4 Jahren
  wangdong6 2274a0b5a3 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangdong6 366cc07942 修改AI识别功能 vor 4 Jahren
  wangdong6 f437841399 修改AI识别功能 vor 4 Jahren
  wangchao 1a8e2463b5 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 6fb2eb5da1 AI报警接口增加处理人返回值与报警类型name返回值 vor 4 Jahren
  wangchao 173425e9aa Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao cc86f342c0 进出记录返回参数查询修改 vor 4 Jahren
  wangchao 392d7269c4 进出记录、详情 查询修改 vor 4 Jahren
  wangchao 9720d09362 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 19896d67fd 进出记录、详情 查询 vor 4 Jahren
  wangchao 3c8ced1379 进出记录、详情 查询 vor 4 Jahren
  konghl 0f7ad3266b 新增批量获取文件的路径 vor 4 Jahren
  wangchao b57d80b691 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 83af37e1b4 考勤管理 vor 4 Jahren
  wangchao c1a17c529b Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 9025dc6284 修改日报bug vor 4 Jahren
  wangchao 0bf75d3a8d Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao cf7b6cdfa4 AI接口提交 vor 4 Jahren
  wangchao cf93c13cfe Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao c539efc81a 导出excel vor 4 Jahren
  chenxr3 c5de3eedce 月考勤数据查询接口修改bug vor 4 Jahren
  konghl d1691caa94 工单申请修改用户和部门 vor 4 Jahren
  wangchao 1690e0e21b 修改考勤查询日报bug vor 4 Jahren
  wangdong6 0584159bd1 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangdong6 f02a5c9889 修改考勤规则查询接口 vor 4 Jahren
  wangdong6 013e377cef 修改考勤规则查询接口 vor 4 Jahren
  konghl 2ac7393605 重构人员轨迹查询 vor 4 Jahren
  konghl 190e8a2ec0 新增工单申请及审批接口 vor 4 Jahren
  wangdong6 a0a75ce1c6 修改考勤规则保存接口 vor 4 Jahren
  wangchao 208cc9c6ed Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao eb0f593fc9 查询报表修改参数 vor 4 Jahren
  wangchao 78caba4d27 考勤详情修改 vor 4 Jahren
  wangchao 69f40fa73d Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 6ff5fe626a 考勤报告接收前台参数方式修改 vor 4 Jahren
  wangdong6 5151d2fea9 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangdong6 9a5dcf3200 封装考勤规则管理接口 vor 4 Jahren
  zhaolx5 84e32ed3ca 解决打包失败的问题 vor 4 Jahren
  zhaolx5 ac019a0444 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  zhaolx5 d80c144412 变更ipu-cache的版本号 vor 4 Jahren
  konghl 5c299da82a 问题修改 vor 4 Jahren
  chenxr3 c65072f9be 定位提交 vor 4 Jahren
  konghl 9d8fd7b88a 增加设备和围栏的判断字段 vor 4 Jahren
  wangchao 9773787bd2 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 0c3414ba5f 配置文件增加注释 vor 4 Jahren
  wangchao 62a630e635 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 59071e3124 增加空格 vor 4 Jahren
  konghl 4b9cfc964f 新增mock工程 vor 4 Jahren
  konghl 8ff2333bdb 修改配置文件,用于上传服务器 vor 4 Jahren
  konghl 35e8568374 修改项目名称,用于上传服务器 vor 4 Jahren
  konghl 296cdba193 重构后台系统,仅用于上传服务器 vor 4 Jahren
  konghl 0122efbabc 重构后台系统,仅用于上传服务器 vor 4 Jahren
  konghl 9a39799cc0 部署服务器,修改配置文件 vor 4 Jahren
  konghl ddf35fd300 暂时不启用非实体对象的判断 vor 4 Jahren
  chenxr3 7939fc8ace 首页修改提交 vor 4 Jahren
  konghl db678770b9 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc.git vor 4 Jahren
  konghl bebb2b89fe 人员定位问题修改 vor 4 Jahren
  konghl 04ada0e6f8 实时救援问题修改 vor 4 Jahren
  wangkang3 33bb67ddb7 提交 vor 4 Jahren
  chenxr3 b15b5e27ad 首页修改提交 vor 4 Jahren
  konghl 8b281e8053 修改pom,排除登录验证 vor 4 Jahren
  konghl cb0c0e8182 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc.git vor 4 Jahren
  konghl 53804e97f6 修改镜屏推送信息 vor 4 Jahren
  konghl 6809ddead2 重构实时报警和历史报警 vor 4 Jahren
  konghl 2363abc631 修改镜屏topic vor 4 Jahren
  konghl 6c328c4398 轨迹查询重构 vor 4 Jahren
  konghl b0ee3a41b4 历史轨迹回放重构,增加定时任务判断设备离线 vor 4 Jahren
  chenxr3 622b446cee 首页修改提交 vor 4 Jahren
  chenxr3 4756df9027 修改提交 vor 4 Jahren
  konghl 67e75e92ff 删除枚举等,重构人员定位 vor 4 Jahren
  chenxr3 563af28335 修改提交 vor 4 Jahren
  konghl 08a6631852 修改设备类型 vor 4 Jahren
  konghl c183618ccb Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc.git vor 4 Jahren
  konghl 2387b3f8e5 修改设备 vor 4 Jahren
  konghl 7712978aac 修改地图标记类型和设备类型 vor 4 Jahren
  konghl 97a96a8da4 中台服务的版本从2.1升级为2.1.5 vor 4 Jahren
  chenxr3 626a7699ce 修改提交 vor 4 Jahren
  konghl cbbdfa675d 修改北向接口缓存方式 vor 4 Jahren
  konghl 387e92633d Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc into master vor 4 Jahren
  konghl 9ec6ffcd72 统一设备管理返回格式 vor 4 Jahren
  konghl 46d45bf56c Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc into master vor 4 Jahren
  konghl b61fa21c4f 修改kafka配置文件 vor 4 Jahren
  konghl 24f03b82fc 统一设备管理的返回格式 vor 4 Jahren
  konghl 8c1bd0a40d Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc.git vor 4 Jahren
  konghl d6c9ee7ac9 统一用户管理返回值 vor 4 Jahren
  konghl 2667543ebe 修改人员信息返回值 vor 4 Jahren
  konghl 33f605d78d Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc into master vor 4 Jahren
  konghl 8c6e6b34db 统一地图标记和终端管理的返回格式 vor 4 Jahren
  konghl 6f5679bb9b 修改pom vor 4 Jahren
  konghl f8ec732c5e 配置kafka vor 4 Jahren
  wangchao 91cb23750d Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 7a19aa2489 加入uspa拦截器token验证 vor 4 Jahren
  wangchao 605bfe142d Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 0307a3595b 用户管理删除和新增 vor 4 Jahren
  wangchao 42c9ce12f2 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 2f12fb16fb 终端绑定 vor 4 Jahren
  wangchao a4780fea36 后台项目初始化 vor 4 Jahren
  wangchao 1d225203e0 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 7b5bd7fc8f 解绑查询关联关系 vor 4 Jahren
  wangchao 5b7ada9d09 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 3abd9ac159 测试 vor 4 Jahren
  wangchao 5c2edbe8f2 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 701921f2c7 设备管理分页查询的修改 vor 4 Jahren
  wangchao d1e6198a6c 设备管理报错修改 vor 4 Jahren
  wangchao cd2a9a0807 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 42136256e1 设备管理模块后台修改 vor 4 Jahren
  konghl e5ac90e3cc 修改git忽略文件配置 vor 4 Jahren
  konghl 173629f8c7 修改用户管理 vor 4 Jahren
  konghl 8b50ef3257 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc.git vor 4 Jahren
  konghl 15425d68aa 用户管理功能修改 vor 4 Jahren
  wangchao f4c0dc51b9 后台项目安防一体化系统初始化 vor 4 Jahren
  konghl e9eb1c63df 修改工程,无错误 vor 4 Jahren
  zhaolx5 12e2261ca9 初始化工程 vor 4 Jahren
  wangchao 21a1d106ba Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao d53bf64414 修改项目结构 vor 4 Jahren
  wangchao 10d36573b9 修改项目结构 vor 4 Jahren
  wangkang3 657320fadd 提交 vor 4 Jahren
  wangchao 993f22008d Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 1e6aae2459 修改设备添加数据库时间 vor 4 Jahren
  konghl aa3a0f690d 实际报警初始化查询 vor 4 Jahren
  konghl 3640ccd134 拆分properties配置文件 vor 4 Jahren
  konghl 9afed3d1cd 修改镜屏名称、新增查询历史报警救援等 vor 4 Jahren
  konghl 52a85f945f 修改日期工具类 vor 4 Jahren
  wanyao ee205bc24c 回退 vor 4 Jahren
  wanyao 16d1d23fee 主机启动慢的原因测试1 vor 4 Jahren
  wangkang3 d34871ad0c Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangkang3 57e2b527f0 修改镜屏uuid vor 4 Jahren
  wangkang3 a4f2b748b2 提交 vor 4 Jahren
  wangkang3 07f3e9bb23 修改提交 vor 4 Jahren
  konghl 499e7a7d94 合并海图参数 vor 4 Jahren
  konghl fe61027787 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc.git vor 4 Jahren
  konghl 70691e3608 增加海图配置参数、重构数据推送、新增轨迹回放接口 vor 4 Jahren
  konghl 510c6be0e7 修改人员定位功能数据订阅的解析 vor 4 Jahren
  chenxr3 186e9e66f4 轨迹分析页面 vor 4 Jahren
  wangchao 71ba3d6e50 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao eb6f6af53e 修改时间工具类与轨迹分析 vor 4 Jahren
  wangchao dc4c59924a Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 1c6dc5d9cd 轨迹分析信息查询 vor 4 Jahren
  chenxr3 69f534d648 地图标记绘制多边形颜色优化 vor 4 Jahren
  konghl ea8cc62767 修改配置文件 vor 4 Jahren
  wangchao ffb3b16b49 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 4f36bbe4f2 考勤方法的修改 vor 4 Jahren
  wangchao 4ea204d4e4 考勤查询功能详情信息 vor 4 Jahren
  wangchao 76ba12e88b Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 8088a9af4d 考勤查询功能 vor 4 Jahren
  konghl 0824340e9c 修改人员定位功能 vor 4 Jahren
  wangchao ceb2e684c3 测试批量插入 vor 4 Jahren
  wangchao a19b9e2346 合并代码 vor 4 Jahren
  wangchao d0cdba1219 Merge remote-tracking branch 'origin/master' vor 4 Jahren
  wangchao 14d32a62c0 删除终端时删除终端绑定关系 vor 4 Jahren
  wangchao 1d834a772a 删除终端时删除终端绑定关系 vor 4 Jahren
  chenxr3 8e19767361 设备类型标识格式更改 vor 4 Jahren
  konghl b8a06cf6e6 添加人员的枚举值 vor 4 Jahren
  konghl ec04cf2f49 删除.project文件 vor 4 Jahren
  konghl 2e3c3b67ca 修改枚举位置 vor 4 Jahren
  konghl 004b6f9498 新增定位推送,修改枚举类的位置 vor 4 Jahren
  wangkang3 76ef98bf1e 代码提交 vor 4 Jahren
  wangchao 63feb0d24b 终端管理页面加ui替换 vor 4 Jahren
  wangchao e0572c53e1 关联终端,解绑终端修改,考勤管理架子编写 vor 4 Jahren
  wangchao 9ff2237cbf 关联终端,解绑终端修改 vor 4 Jahren
  wangchao 7acc72f757 关联终端,解绑终端修改 vor 4 Jahren
  wangchao 332e05b5f4 关联终端,解绑终端修改 vor 4 Jahren
  wangchao b7fe4ca37c 后台daoimpl的修改 vor 4 Jahren
  konghl a3c4950238 修改字段 vor 4 Jahren
  konghl 48cb0bbdfa 增加返回参数 vor 4 Jahren
  konghl 429b4dbfa9 修改北向接口 vor 4 Jahren
  konghl 2e0b6dcd44 增加业务常量 vor 4 Jahren
  konghl 12d7573f2e 新增功能:地图标记增删改查 vor 4 Jahren
  wangkang3 8f7b30e3be 地图标记模块接口接入 vor 4 Jahren
  chenxr3 1013865ef3 设备管理页面 vor 4 Jahren
  wangchao 97dca84162 修改设备验证 vor 4 Jahren
  wangchao 0c9930d3e3 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangchao 8bd1ff2323 终端关联,终端解绑等接口 vor 4 Jahren
  wangchao d01adabd91 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangchao d40c613702 修改gis接口等 vor 4 Jahren
  wangchao 35550a3e47 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangchao bd86ba7a47 设备增删改查以及关联与解绑终端 vor 4 Jahren
  wangchao a8c7c1cf4d 项目配置修改以及剔除uspa vor 4 Jahren
  wangchao c251472c3d gis获取token接口 vor 4 Jahren
  wangchao fba9354c6a Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangchao 5ff38a7f9b 解决跨域问题 vor 4 Jahren
  wangchao 74f666ab34 添加注释,增加轨迹文件等 vor 4 Jahren
  wangchao 5f13388aac 修改地图管理文件 vor 4 Jahren
  wangchao 41aea6126c Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangchao 24f1743496 按评审要求修改文件 vor 4 Jahren
  wangchao 666c0f81c2 Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc vor 4 Jahren
  wangchao 779c6e3826 修改日志文件 vor 4 Jahren
  wangchao 0e5599165c 修改日志文件 vor 4 Jahren
  wangchao c217a49b3a 更新项目 vor 4 Jahren
  wangchao 408a2042a9 后台项目初始化 vor 4 Jahren
  wangkang3 7bbf8eb6a8 页面初始化提交 vor 4 Jahren
  liuchang 000ebd90c9 更新文件 vor 4 Jahren
  liuchang 46a262ab4b 删除 vor 4 Jahren
  liuchang d1d76df146 更新提交 vor 4 Jahren
  wanyao 1d2d95bc39 删除 vor 4 Jahren
  wanyao f74da4a0dd 删除 vor 4 Jahren
  wanyao b667fddfbc 初始化 vor 4 Jahren

+ 593 - 0
security-protection-platform/src/modules/access/component/tab1/index.vue

@ -0,0 +1,593 @@
1
<template>
2
  <div class="access">
3
4
    <div class="access_header">
5
6
      <div>
7
        <span class="title">开始时间 : </span>
8
        <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
9
      </div>
10
11
      <div>
12
        <span class="title">结束时间 : </span>
13
        <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:200px;height:32px"></t-date-picker>
14
      </div>
15
16
      <!-- <div>
17
        <span class="title">进出类型 : </span>
18
        <t-select v-model="searchdata.typeid" style="width:200px;height:32px">
19
          <t-option v-for="item in accesstype" :value="item.id" :key="item.id">{{ item.name }}</t-option>
20
21
        </t-select>
22
      </div> -->
23
      <div class="alarm_people">
24
        <span class="title">员工 : </span>
25
        <t-input v-model="searchdata.nameAsLike" placeholder="员工姓名" style="width: 200px"></t-input>
26
      </div>
27
28
    </div>
29
30
    <div class="access_header">
31
32
      <!-- 导出excel -->
33
      <div>
34
        <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
35
      </div>
36
37
      <div>
38
        <t-button color="primary" @click="btnsearch">查询</t-button>
39
        <t-button @click="reset">重置</t-button>
40
      </div>
41
42
    </div>
43
44
    <t-table :data="data" line @selection-change="handleSelectionChange">
45
      <t-table-column type="selection" width="34px"></t-table-column>
46
      <t-table-column label="姓名" prop="employeeName" width="60px">
47
      </t-table-column>
48
      <t-table-column label="员工编号" prop="employeeCode" width="80px">
49
      </t-table-column>
50
      <t-table-column label="公司" prop="companyname" width="94px">
51
      </t-table-column>
52
      <t-table-column label="部门" prop="organizationName" width="94px">
53
      </t-table-column>
54
      <t-table-column label="职务" prop="employeePositionZh" width="80px">
55
      </t-table-column>
56
      <t-table-column prop="simi" label="相似度" width="75px">
57
      </t-table-column>
58
      <t-table-column label="进出时间" prop="taskExecuteTime" width="160px">
59
      </t-table-column>
60
      <t-table-column label="位置" prop="terminalPosition" width="122px">
61
      </t-table-column>
62
      <t-table-column label="终端名称" prop="resourceToolName" width="97px">
63
      </t-table-column>
64
      <t-table-column label="终端编号" prop="resourceToolCode" width="90px">
65
      </t-table-column>
66
      <t-table-column label="操作" width="80px">
67
        <template slot-scope="scope">
68
          <a href="javascript:void(0)" size="sm" style="color:#0089D4" @click="handleClick(scope)">识别详情</a>
69
        </template>
70
      </t-table-column>
71
72
    </t-table>
73
74
    <!-- 分页 -->
75
    <t-pager :total="total" :current="page" :page-size="limit" show-elevator class="pager" @on-change="onChange"></t-pager>
76
77
    <!-- 模态框 -->
78
    <t-modal :visibled.sync="detail_modal" title="识别详情" width="840px" height="538px">
79
80
      <div style="text-align:center">
81
        <div class="detail_content">
82
          <div class="detail_item1">
83
            <div>抓拍图片</div>
84
            <div>
85
              <!-- <img :src="rowdata.pictureInfo.fileUrl" alt="" srcset="" style="width:100%;height:100%"> -->
86
              <!--处理图片里的方框-->
87
              <img :src="mainimage" alt="" srcset="" style="width:100%;height:100%">
88
            </div>
89
          </div>
90
          <div class="detail_item2">
91
            <div>识别结果</div>
92
            <div>
93
              <div>
94
                <!-- 修改-->
95
                <img :src="newimage" alt="" srcset="" style="width:120px;height:160px;border-radius: 5px; ">
96
97
                <!-- <div class="scaleimg">
98
                  <div :style="{backgroundImage:style.bgimg,backgroundPosition:style.bgposition,
99
                                transform:style.scale,
100
                                width:style.width,
101
                                height:style.height}" class="imgcontant"></div>
102
                </div> -->
103
                <div class="bottomimg">抓拍图片</div>
104
              </div>
105
              <div>
106
                <!-- 修改-->
107
                <img src="@/assets/images/Identify_the_successful.png" alt="" srcset="">
108
109
              </div>
110
              <div>
111
                <img :src="rowdata.alarmInfo.headerImage" alt="" srcset="" style="width:100%;height:160px; border-radius: 5px;">
112
                <div class="bottomimg">人脸底库</div>
113
              </div>
114
            </div>
115
            <div class="describe">
116
              <div>
117
                <t-icon icon="user-outline"></t-icon>
118
                {{ rowdata.alarmInfo.employeeName }}({{ rowdata.alarmInfo.employeeCode }})
119
              </div>
120
              <div>
121
                <t-icon icon="map-marker"></t-icon>
122
                {{ rowdata.alarmInfo.terminalPosition || '--' }}
123
              </div>
124
              <div>
125
                <t-icon icon="clock-outline"></t-icon>
126
                {{ rowdata.alarmInfo.taskExecuteTime }}
127
              </div>
128
              <div>
129
                <t-icon icon="team-outline"></t-icon> 相似度:
130
                {{ rowdata.alarmInfo.simi }}
131
              </div>
132
            </div>
133
          </div>
134
        </div>
135
      </div>
136
      <div slot="footer">
137
        <t-button type="danger" long @click="detail_modal = false">关闭</t-button>
138
      </div>
139
    </t-modal>
140
141
  </div>
142
</template>
143
<script>
144
import accessapi from '@/api/access'
145
146
export default {
147
148
  data () {
149
    return {
150
      // 进出类型
151
      accesstype: [],
152
      // 页码
153
      total: 0,
154
      // 选择的数据
155
      selectdata: [],
156
      // 模态框显示
157
      detail_modal: false,
158
      // 当前行数据
159
      rowdata: {
160
        alarmInfo: {},
161
        pictureInfo: {}
162
      },
163
      // 公司列表
164
      companyTypesList: [],
165
166
      // 查询的参数
167
      searchdata: {
168
169
        nameAsLike: '',
170
        beginDay: '',
171
        endDay: ''
172
      },
173
      // 一页的数据
174
      data: [
175
176
      ],
177
      // 当前页
178
      page: 1,
179
      limit: 10,
180
      // style: {
181
      //   bgimg: '',
182
      //   bgposition: '',
183
      //   scale: '',
184
      //   width: '',
185
      //   height: ''
186
187
      // }
188
      // 截取后的图片
189
      newimage: '',
190
      // 详情的主图片
191
      mainimage: ''
192
193
    }
194
  },
195
196
  mounted () {
197
    // this.gettype()
198
    this.getcompanyTypesList()
199
  },
200
  methods: {
201
    // 表格中的选择数据
202
    handleSelectionChange (val) {
203
      this.selectdata = val
204
    },
205
    // 获取公司
206
    async getcompanyTypesList () {
207
      var res = await accessapi.getcompanyTypesList()
208
      // console.log('公司信息是', res)
209
      if (res.status === 200) {
210
        this.companyTypesList = res.data.data
211
        console.log(this.companyTypesList)
212
        this.search()
213
      } else {
214
        this.$Message.danger('获取数据失败')
215
      }
216
    },
217
    // 点击详情
218
    async handleClick (scope) {
219
      // this.rowdata = scope.row
220
      // console.log(this.rowdata)
221
      // console.log('id是', scope.row.aiIdenLogId)
222
      this.newimage = ''
223
      this.mainimage = ''
224
      var res = await accessapi.getOneInAndOutRecord({ params: { aiIdenLogId: scope.row.aiIdenLogId } })
225
226
      if (res.data.success) {
227
        // this.rowdata = res.data.data
228
229
        this.rowdata.pictureInfo = res.data.data.pictureInfo
230
        console.log('数据', this.rowdata.pictureInfo)
231
        this.rowdata.alarmInfo = res.data.data.alarmInfo
232
        console.log('数据', this.rowdata.alarmInfo)
233
        console.log('相似度数据', this.rowdata.alarmInfo.simi, typeof this.rowdata.alarmInfo.simi)
234
        // this.rowdata.alarmInfo.newImg = this.rowdata.pictureInfo.fileUrl
235
236
        this.getImage()
237
        this.getmainimage()
238
        // var loadTimer
239
        // var imgObject = new Image()
240
        // imgObject.setAttribute('crossOrigin', 'anonymous')
241
        // imgObject.src = this.rowdata.pictureInfo.fileUrl
242
        // console.log(this)
243
        // imgObject.onload = this.onImgLoaded(loadTimer, imgObject, this.rowdata.alarmInfo)
244
245
        // console.log(this.rowdata.alarmInfo.newImg)
246
247
        // this.style.width = res.data.data.alarmInfo.face_box[2] - res.data.data.alarmInfo.face_box[0] + 'px'
248
        // // console.log('width是', this.style.width)
249
        // this.style.height = res.data.data.alarmInfo.face_box[3] - res.data.data.alarmInfo.face_box[1] + 'px'
250
        // // console.log('height是', this.style.height)
251
        // this.style.bgimg = 'url(' + res.data.data.pictureInfo.fileUrl + ')'
252
        // // console.log('bgimg是', this.style.bgimg)
253
        // this.style.bgposition = '' + -res.data.data.alarmInfo.face_box[0] + 'px ' + -res.data.data.alarmInfo.face_box[1] + 'px'
254
        // console.log('bgposition是', this.style.bgposition)
255
        // // transform: scale(0.33, 0.33);
256
        // var width = res.data.data.alarmInfo.face_box[2] - res.data.data.alarmInfo.face_box[0]
257
        // var height = res.data.data.alarmInfo.face_box[3] - res.data.data.alarmInfo.face_box[1]
258
        // var scalex = 120 / width
259
        // var scaley = 160 / height
260
        // // console.log(scalex)
261
        // this.style.scale = 'scale(' + scalex + ',' + scaley + ')'
262
        // // console.log('scale是', this.style.scale)
263
        // // console.log(res.data.data)
264
        // console.log('详情数据是', this.rowdata.alarmInfo)
265
266
        this.detail_modal = true
267
      } else {
268
        this.$Message.danger('获取数据失败')
269
      }
270
    },
271
    // 分页
272
    onChange (val) {
273
      this.page = val
274
      this.search()
275
    },
276
277
    // 点击查询按钮
278
    btnsearch () {
279
      if (this.page === 1) {
280
        this.search()
281
      } else {
282
        this.page = 1
283
      }
284
    },
285
    // 获取进出类型
286
    // gettype () {
287
    //   accessapi.getaccesstype().then((res) => {
288
    //     this.accesstype = res.data.data
289
    //     console.log(this.accesstype)
290
    //   })
291
    // },
292
    // 查询数据
293
    async search () {
294
      // 检验数据
295
      var flag = this.startreend(this.searchdata.beginDay, this.searchdata.endDay)
296
      if (flag) {
297
        // console.log(this.page)
298
        // console.log(this.searchdata)
299
300
        var params = this.searchdata
301
        params.pageNumber = this.page
302
        params.pageSize = this.limit
303
        // console.log(params)
304
        var res = await accessapi.getaccesslist({ params: params })
305
        // console.log(res)
306
        if (res.status === 200) {
307
          // console.log(res)
308
          this.data = res.data.data.data
309
          // console.log(this.data)
310
          // console.log(this.companyTypesList)
311
          this.data = this.data.map((item) => {
312
            // 处理进出时间
313
            // item.taskExecuteTime = formatDateTime(item.taskExecuteTime)
314
            // 处理相似度
315
            // item.simi = this.percentagedata(item.simi)
316
            // console.log('公司的数据是', this.companyTypesList)
317
            // console.log('公司id', item.companyId, typeof item.companyId)
318
            // console.log('公司名字是', this.companyTypesList.filter((item1) => { return item1.id === 10000 }))
319
            item.companyinfo = this.companyTypesList.filter((item1) => { return String(item1.id) === item.companyId })
320
            if (item.companyinfo.length > 0) {
321
              item.companyname = item.companyinfo[0].name
322
            } else {
323
              item.companyname = ''
324
            }
325
326
            return item
327
          })
328
329
          // this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
330
          // console.log(this.total)
331
          this.total = res.data.data.total
332
          // console.log('数据是', this.data)
333
        }
334
      } else {
335
        this.$Message.danger('开始时间不能在结束时间的后面')
336
      }
337
    },
338
339
    percentagedata (point) {
340
      if (point === 0) {
341
        return 0
342
      }
343
      var str = Number(point * 100).toFixed(1)
344
      str += '%'
345
      return str
346
    },
347
348
    // 重置数据
349
    reset () {
350
      for (var index in this.searchdata) {
351
        this.searchdata[index] = ''
352
      }
353
      this.page = 1
354
      this.$Message.success('数据重置成功')
355
    },
356
357
    // 字符串更改为时间类型
358
    stringtodate (date) {
359
      date = date.substring(0, 19)
360
      date = date.replace(/-/g, '/')
361
      var timestamp = new Date(date).getTime()
362
      return timestamp
363
    },
364
    // 验证开始时间·和结束时间
365
    startreend (startdate, enddate) {
366
      startdate = this.stringtodate(startdate)
367
      enddate = this.stringtodate(enddate)
368
      if (startdate > enddate) {
369
        return false
370
      } else {
371
        return true
372
      }
373
    },
374
    // 处理截图图片
375
    async getImage () {
376
      var loadTimer
377
      var imgObject = new Image()
378
      imgObject.setAttribute('crossOrigin', 'anonymous')
379
      imgObject.src = this.rowdata.pictureInfo.fileUrl
380
      var e = this.rowdata.alarmInfo
381
      var that = this
382
      imgObject.onload = onImgLoaded()
383
      // eslint-disable-next-line no-return-assign
384
      function onImgLoaded () {
385
        if (loadTimer != null) clearTimeout(loadTimer)
386
        if (!imgObject.complete) {
387
          loadTimer = setTimeout(() => {
388
            onImgLoaded()
389
          }, 3)
390
        } else {
391
          that.newimage = getImagePortion(imgObject, e.face_box[2] - e.face_box[0], e.face_box[3] - e.face_box[1], e.face_box[0], e.face_box[1])
392
        }
393
      }
394
      function getImagePortion (imgObj, newWidth, newHeight, startX, startY) {
395
        var tnCanvas = document.createElement('canvas')
396
        var tnCanvasContext = tnCanvas.getContext('2d')
397
        tnCanvas.width = newWidth; tnCanvas.height = newHeight
398
        var bufferCanvas = document.createElement('canvas')
399
        var bufferContext = bufferCanvas.getContext('2d')
400
        bufferCanvas.width = imgObj.width
401
        bufferCanvas.height = imgObj.height
402
        bufferContext.drawImage(imgObj, 0, 0)
403
        tnCanvasContext.drawImage(bufferCanvas, startX, startY, newWidth, newHeight, 0, 0, newWidth, newHeight)
404
        // console.log(tnCanvas.toDataURL())
405
        return tnCanvas.toDataURL()
406
      }
407
    },
408
409
    // 处理主图片
410
    async getmainimage () {
411
      var that = this
412
413
      var x = this.rowdata.alarmInfo.face_box[0]
414
      var y = this.rowdata.alarmInfo.face_box[1]
415
      var width = this.rowdata.alarmInfo.face_box[2] - this.rowdata.alarmInfo.face_box[0]
416
      var height = this.rowdata.alarmInfo.face_box[3] - this.rowdata.alarmInfo.face_box[1]
417
      function getBase64Image (img) {
418
        var canvas = document.createElement('canvas')
419
        canvas.width = img.width
420
        canvas.height = img.height
421
        var ctx = canvas.getContext('2d')
422
        ctx.drawImage(img, 0, 0, img.width, img.height)
423
        ctx.beginPath()
424
        ctx.moveTo(x, y)
425
        ctx.lineTo(x + width, y)
426
        ctx.lineTo(x + width, y + height)
427
        ctx.lineTo(x, y + height)
428
        ctx.lineTo(x, y) // 绘制最后一笔使图像闭合
429
        ctx.lineWidth = 5
430
        ctx.strokeStyle = 'red'
431
        ctx.stroke()
432
433
        var dataURL = canvas.toDataURL('image/png') // 可选其他值 image/jpeg
434
        return dataURL
435
      }
436
437
      function main (src, cb) {
438
        var image = new Image()
439
        image.src = src + '?v=' + Math.random() // 处理缓存
440
        image.crossOrigin = '*' // 支持跨域图片
441
        image.onload = function () {
442
          var base64 = getBase64Image(image)
443
          cb && cb(base64)
444
        }
445
      }
446
447
      main(this.rowdata.pictureInfo.fileUrl, function (base64) {
448
        // console.log(base64, '是否成功打印base64')
449
        that.mainimage = base64
450
      })
451
    }
452
    // //将分数转换为小数
453
    // toPoint (percent) {
454
    //   var str = percent.replace('%', '')
455
    //   str = str / 100
456
    //   return str
457
    // }
458
459
  }
460
}
461
</script>
462
463
<style lang='scss' scoped>
464
.access {
465
  font-size: 14px;
466
  padding: 6px 0px;
467
  height: 702px;
468
  .upload {
469
    font-size: 14px;
470
    line-height: 22px;
471
  }
472
  .table th,
473
  .table td {
474
    font-size: 14px;
475
    padding: 0 0 0 18px;
476
  }
477
  .access_header {
478
    display: flex;
479
    justify-content: space-between;
480
    margin-top: 24px;
481
    margin-bottom: 24px;
482
    .title {
483
      display: inline-block;
484
      width: 70px;
485
      height: 20px;
486
      font-size: 14px;
487
      text-align: right;
488
      color: rgba($color: #000000, $alpha: 0.65);
489
    }
490
  }
491
492
  .pager {
493
    float: right;
494
    margin-top: 26px;
495
  }
496
}
497
.detail_content {
498
  width: 100%;
499
  height: 376px;
500
  display: flex;
501
  justify-content: space-between;
502
503
  .detail_item1 {
504
    width: 45%;
505
    text-align: left;
506
    > div:nth-child(1) {
507
      margin: 0 0 20px 0;
508
      color: rgba(0, 0, 0, 0.65);
509
      font-size: 14px;
510
    }
511
    > div:nth-child(2) {
512
      width: 100%;
513
      height: 240px;
514
515
      border-radius: 5px;
516
      overflow: hidden;
517
      position: relative;
518
    }
519
  }
520
521
  .detail_item2 {
522
    width: 50%;
523
    text-align: left;
524
    > div:nth-child(1) {
525
      margin: 0 0 20px 0;
526
      color: rgba(0, 0, 0, 0.65);
527
      font-size: 14px;
528
    }
529
    > div:nth-child(2) {
530
      width: 100%;
531
      height: 190px;
532
533
      display: flex;
534
      justify-content: space-between;
535
      .bottomimg {
536
        margin-top: 12px;
537
        width: 100%;
538
        text-align: center;
539
        font-size: 12px;
540
        color: rgba(0, 0, 0, 0.65);
541
      }
542
543
      > div:nth-child(1) {
544
        width: 120px;
545
        height: 100%;
546
547
        .scaleimg {
548
          width: 120px;
549
          height: 160px;
550
551
          position: relative;
552
          .imgcontant {
553
            border-radius: 10px;
554
            background-repeat: no-repeat;
555
            background-attachment: local;
556
            position: absolute;
557
            top: -160px;
558
            left: -120px;
559
          }
560
        }
561
      }
562
      > div:nth-child(2) {
563
        width: 117.76px;
564
        height: 160px;
565
566
        line-height: 160px;
567
        img {
568
          width: 100%;
569
          height: 84.32px;
570
        }
571
      }
572
      > div:nth-child(3) {
573
        height: 100%;
574
        width: 120px;
575
      }
576
    }
577
    .describe {
578
      margin-top: 20px;
579
      width: 100%;
580
      height: 148px;
581
      display: flex;
582
      flex-wrap: wrap;
583
      align-items: center;
584
585
      > div {
586
        width: 100%;
587
        height: 22px;
588
        font-size: 14px;
589
      }
590
    }
591
  }
592
}
593
</style>

+ 593 - 0
security-protection-platform/src/modules/access/component/tab2/index.vue

@ -0,0 +1,593 @@
1
<template>
2
  <div class="access">
3
4
    <div class="access_header">
5
6
      <div>
7
        <span class="title">开始时间 : </span>
8
        <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
9
      </div>
10
11
      <div>
12
        <span class="title">结束时间 : </span>
13
        <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:200px;height:32px"></t-date-picker>
14
      </div>
15
16
      <!-- <div>
17
        <span class="title">进出类型 : </span>
18
        <t-select v-model="searchdata.typeid" style="width:200px;height:32px">
19
          <t-option v-for="item in accesstype" :value="item.id" :key="item.id">{{ item.name }}</t-option>
20
21
        </t-select>
22
      </div> -->
23
      <div class="alarm_people">
24
        <span class="title">员工 : </span>
25
        <t-input v-model="searchdata.nameAsLike" placeholder="员工姓名" style="width: 200px"></t-input>
26
      </div>
27
28
    </div>
29
30
    <div class="access_header">
31
32
      <!-- 导出excel -->
33
      <div>
34
        <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
35
      </div>
36
37
      <div>
38
        <t-button color="primary" @click="btnsearch">查询</t-button>
39
        <t-button @click="reset">重置</t-button>
40
      </div>
41
42
    </div>
43
44
    <t-table :data="data" line @selection-change="handleSelectionChange">
45
      <t-table-column type="selection" width="34px"></t-table-column>
46
      <t-table-column label="姓名" prop="employeeName" width="60px">
47
      </t-table-column>
48
      <t-table-column label="员工编号" prop="employeeCode" width="80px">
49
      </t-table-column>
50
      <t-table-column label="公司" prop="companyname" width="94px">
51
      </t-table-column>
52
      <t-table-column label="部门" prop="organizationName" width="94px">
53
      </t-table-column>
54
      <t-table-column label="职务" prop="employeePositionZh" width="80px">
55
      </t-table-column>
56
      <t-table-column prop="simi" label="相似度" width="75px">
57
      </t-table-column>
58
      <t-table-column label="进出时间" prop="taskExecuteTime" width="160px">
59
      </t-table-column>
60
      <t-table-column label="位置" prop="terminalPosition" width="122px">
61
      </t-table-column>
62
      <t-table-column label="终端名称" prop="resourceToolName" width="97px">
63
      </t-table-column>
64
      <t-table-column label="终端编号" prop="resourceToolCode" width="90px">
65
      </t-table-column>
66
      <t-table-column label="操作" width="80px">
67
        <template slot-scope="scope">
68
          <a href="javascript:void(0)" size="sm" style="color:#0089D4" @click="handleClick(scope)">识别详情</a>
69
        </template>
70
      </t-table-column>
71
72
    </t-table>
73
74
    <!-- 分页 -->
75
    <t-pager :total="total" :current="page" :page-size="limit" show-elevator class="pager" @on-change="onChange"></t-pager>
76
77
    <!-- 模态框 -->
78
    <t-modal :visibled.sync="detail_modal" title="识别详情" width="840px" height="538px">
79
80
      <div style="text-align:center">
81
        <div class="detail_content">
82
          <div class="detail_item1">
83
            <div>抓拍图片</div>
84
            <div>
85
              <!-- <img :src="rowdata.pictureInfo.fileUrl" alt="" srcset="" style="width:100%;height:100%"> -->
86
              <!--处理图片里的方框-->
87
              <img :src="mainimage" alt="" srcset="" style="width:100%;height:100%">
88
            </div>
89
          </div>
90
          <div class="detail_item2">
91
            <div>识别结果</div>
92
            <div>
93
              <div>
94
                <!-- 修改-->
95
                <img :src="newimage" alt="" srcset="" style="width:120px;height:160px;border-radius: 5px; ">
96
97
                <!-- <div class="scaleimg">
98
                  <div :style="{backgroundImage:style.bgimg,backgroundPosition:style.bgposition,
99
                                transform:style.scale,
100
                                width:style.width,
101
                                height:style.height}" class="imgcontant"></div>
102
                </div> -->
103
                <div class="bottomimg">抓拍图片</div>
104
              </div>
105
              <div>
106
                <!-- 修改-->
107
                <img src="@/assets/images/Identify_the_successful.png" alt="" srcset="">
108
109
              </div>
110
              <div>
111
                <img :src="rowdata.alarmInfo.headerImage" alt="" srcset="" style="width:100%;height:160px; border-radius: 5px;">
112
                <div class="bottomimg">人脸底库</div>
113
              </div>
114
            </div>
115
            <div class="describe">
116
              <div>
117
                <t-icon icon="user-outline"></t-icon>
118
                {{ rowdata.alarmInfo.employeeName }}({{ rowdata.alarmInfo.employeeCode }})
119
              </div>
120
              <div>
121
                <t-icon icon="map-marker"></t-icon>
122
                {{ rowdata.alarmInfo.terminalPosition || '--' }}
123
              </div>
124
              <div>
125
                <t-icon icon="clock-outline"></t-icon>
126
                {{ rowdata.alarmInfo.taskExecuteTime }}
127
              </div>
128
              <div>
129
                <t-icon icon="team-outline"></t-icon> 相似度:
130
                {{ rowdata.alarmInfo.simi }}
131
              </div>
132
            </div>
133
          </div>
134
        </div>
135
      </div>
136
      <div slot="footer">
137
        <t-button type="danger" long @click="detail_modal = false">关闭</t-button>
138
      </div>
139
    </t-modal>
140
141
  </div>
142
</template>
143
<script>
144
import accessapi from '@/api/access'
145
146
export default {
147
148
  data () {
149
    return {
150
      // 进出类型
151
      accesstype: [],
152
      // 页码
153
      total: 0,
154
      // 选择的数据
155
      selectdata: [],
156
      // 模态框显示
157
      detail_modal: false,
158
      // 当前行数据
159
      rowdata: {
160
        alarmInfo: {},
161
        pictureInfo: {}
162
      },
163
      // 公司列表
164
      companyTypesList: [],
165
166
      // 查询的参数
167
      searchdata: {
168
169
        nameAsLike: '',
170
        beginDay: '',
171
        endDay: ''
172
      },
173
      // 一页的数据
174
      data: [
175
176
      ],
177
      // 当前页
178
      page: 1,
179
      limit: 10,
180
      // style: {
181
      //   bgimg: '',
182
      //   bgposition: '',
183
      //   scale: '',
184
      //   width: '',
185
      //   height: ''
186
187
      // }
188
      // 截取后的图片
189
      newimage: '',
190
      // 详情的主图片
191
      mainimage: ''
192
193
    }
194
  },
195
196
  mounted () {
197
    // this.gettype()
198
    this.getcompanyTypesList()
199
  },
200
  methods: {
201
    // 表格中的选择数据
202
    handleSelectionChange (val) {
203
      this.selectdata = val
204
    },
205
    // 获取公司
206
    async getcompanyTypesList () {
207
      var res = await accessapi.getcompanyTypesList()
208
      // console.log('公司信息是', res)
209
      if (res.status === 200) {
210
        this.companyTypesList = res.data.data
211
        console.log(this.companyTypesList)
212
        this.search()
213
      } else {
214
        this.$Message.danger('获取数据失败')
215
      }
216
    },
217
    // 点击详情
218
    async handleClick (scope) {
219
      // this.rowdata = scope.row
220
      // console.log(this.rowdata)
221
      // console.log('id是', scope.row.aiIdenLogId)
222
      this.newimage = ''
223
      this.mainimage = ''
224
      var res = await accessapi.getOneInAndOutRecord({ params: { aiIdenLogId: scope.row.aiIdenLogId } })
225
226
      if (res.data.success) {
227
        // this.rowdata = res.data.data
228
229
        this.rowdata.pictureInfo = res.data.data.pictureInfo
230
        console.log('数据', this.rowdata.pictureInfo)
231
        this.rowdata.alarmInfo = res.data.data.alarmInfo
232
        console.log('数据', this.rowdata.alarmInfo)
233
        console.log('相似度数据', this.rowdata.alarmInfo.simi, typeof this.rowdata.alarmInfo.simi)
234
        // this.rowdata.alarmInfo.newImg = this.rowdata.pictureInfo.fileUrl
235
236
        this.getImage()
237
        this.getmainimage()
238
        // var loadTimer
239
        // var imgObject = new Image()
240
        // imgObject.setAttribute('crossOrigin', 'anonymous')
241
        // imgObject.src = this.rowdata.pictureInfo.fileUrl
242
        // console.log(this)
243
        // imgObject.onload = this.onImgLoaded(loadTimer, imgObject, this.rowdata.alarmInfo)
244
245
        // console.log(this.rowdata.alarmInfo.newImg)
246
247
        // this.style.width = res.data.data.alarmInfo.face_box[2] - res.data.data.alarmInfo.face_box[0] + 'px'
248
        // // console.log('width是', this.style.width)
249
        // this.style.height = res.data.data.alarmInfo.face_box[3] - res.data.data.alarmInfo.face_box[1] + 'px'
250
        // // console.log('height是', this.style.height)
251
        // this.style.bgimg = 'url(' + res.data.data.pictureInfo.fileUrl + ')'
252
        // // console.log('bgimg是', this.style.bgimg)
253
        // this.style.bgposition = '' + -res.data.data.alarmInfo.face_box[0] + 'px ' + -res.data.data.alarmInfo.face_box[1] + 'px'
254
        // console.log('bgposition是', this.style.bgposition)
255
        // // transform: scale(0.33, 0.33);
256
        // var width = res.data.data.alarmInfo.face_box[2] - res.data.data.alarmInfo.face_box[0]
257
        // var height = res.data.data.alarmInfo.face_box[3] - res.data.data.alarmInfo.face_box[1]
258
        // var scalex = 120 / width
259
        // var scaley = 160 / height
260
        // // console.log(scalex)
261
        // this.style.scale = 'scale(' + scalex + ',' + scaley + ')'
262
        // // console.log('scale是', this.style.scale)
263
        // // console.log(res.data.data)
264
        // console.log('详情数据是', this.rowdata.alarmInfo)
265
266
        this.detail_modal = true
267
      } else {
268
        this.$Message.danger('获取数据失败')
269
      }
270
    },
271
    // 分页
272
    onChange (val) {
273
      this.page = val
274
      this.search()
275
    },
276
277
    // 点击查询按钮
278
    btnsearch () {
279
      if (this.page === 1) {
280
        this.search()
281
      } else {
282
        this.page = 1
283
      }
284
    },
285
    // 获取进出类型
286
    // gettype () {
287
    //   accessapi.getaccesstype().then((res) => {
288
    //     this.accesstype = res.data.data
289
    //     console.log(this.accesstype)
290
    //   })
291
    // },
292
    // 查询数据
293
    async search () {
294
      // 检验数据
295
      var flag = this.startreend(this.searchdata.beginDay, this.searchdata.endDay)
296
      if (flag) {
297
        // console.log(this.page)
298
        // console.log(this.searchdata)
299
300
        var params = this.searchdata
301
        params.pageNumber = this.page
302
        params.pageSize = this.limit
303
        // console.log(params)
304
        var res = await accessapi.getaccesslist({ params: params })
305
        // console.log(res)
306
        if (res.status === 200) {
307
          // console.log(res)
308
          this.data = res.data.data.data
309
          // console.log(this.data)
310
          // console.log(this.companyTypesList)
311
          this.data = this.data.map((item) => {
312
            // 处理进出时间
313
            // item.taskExecuteTime = formatDateTime(item.taskExecuteTime)
314
            // 处理相似度
315
            // item.simi = this.percentagedata(item.simi)
316
            // console.log('公司的数据是', this.companyTypesList)
317
            // console.log('公司id', item.companyId, typeof item.companyId)
318
            // console.log('公司名字是', this.companyTypesList.filter((item1) => { return item1.id === 10000 }))
319
            item.companyinfo = this.companyTypesList.filter((item1) => { return String(item1.id) === item.companyId })
320
            if (item.companyinfo.length > 0) {
321
              item.companyname = item.companyinfo[0].name
322
            } else {
323
              item.companyname = ''
324
            }
325
326
            return item
327
          })
328
329
          // this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
330
          // console.log(this.total)
331
          this.total = res.data.data.total
332
          // console.log('数据是', this.data)
333
        }
334
      } else {
335
        this.$Message.danger('开始时间不能在结束时间的后面')
336
      }
337
    },
338
339
    percentagedata (point) {
340
      if (point === 0) {
341
        return 0
342
      }
343
      var str = Number(point * 100).toFixed(1)
344
      str += '%'
345
      return str
346
    },
347
348
    // 重置数据
349
    reset () {
350
      for (var index in this.searchdata) {
351
        this.searchdata[index] = ''
352
      }
353
      this.page = 1
354
      this.$Message.success('数据重置成功')
355
    },
356
357
    // 字符串更改为时间类型
358
    stringtodate (date) {
359
      date = date.substring(0, 19)
360
      date = date.replace(/-/g, '/')
361
      var timestamp = new Date(date).getTime()
362
      return timestamp
363
    },
364
    // 验证开始时间·和结束时间
365
    startreend (startdate, enddate) {
366
      startdate = this.stringtodate(startdate)
367
      enddate = this.stringtodate(enddate)
368
      if (startdate > enddate) {
369
        return false
370
      } else {
371
        return true
372
      }
373
    },
374
    // 处理截图图片
375
    async getImage () {
376
      var loadTimer
377
      var imgObject = new Image()
378
      imgObject.setAttribute('crossOrigin', 'anonymous')
379
      imgObject.src = this.rowdata.pictureInfo.fileUrl
380
      var e = this.rowdata.alarmInfo
381
      var that = this
382
      imgObject.onload = onImgLoaded()
383
      // eslint-disable-next-line no-return-assign
384
      function onImgLoaded () {
385
        if (loadTimer != null) clearTimeout(loadTimer)
386
        if (!imgObject.complete) {
387
          loadTimer = setTimeout(() => {
388
            onImgLoaded()
389
          }, 3)
390
        } else {
391
          that.newimage = getImagePortion(imgObject, e.face_box[2] - e.face_box[0], e.face_box[3] - e.face_box[1], e.face_box[0], e.face_box[1])
392
        }
393
      }
394
      function getImagePortion (imgObj, newWidth, newHeight, startX, startY) {
395
        var tnCanvas = document.createElement('canvas')
396
        var tnCanvasContext = tnCanvas.getContext('2d')
397
        tnCanvas.width = newWidth; tnCanvas.height = newHeight
398
        var bufferCanvas = document.createElement('canvas')
399
        var bufferContext = bufferCanvas.getContext('2d')
400
        bufferCanvas.width = imgObj.width
401
        bufferCanvas.height = imgObj.height
402
        bufferContext.drawImage(imgObj, 0, 0)
403
        tnCanvasContext.drawImage(bufferCanvas, startX, startY, newWidth, newHeight, 0, 0, newWidth, newHeight)
404
        // console.log(tnCanvas.toDataURL())
405
        return tnCanvas.toDataURL()
406
      }
407
    },
408
409
    // 处理主图片
410
    async getmainimage () {
411
      var that = this
412
413
      var x = this.rowdata.alarmInfo.face_box[0]
414
      var y = this.rowdata.alarmInfo.face_box[1]
415
      var width = this.rowdata.alarmInfo.face_box[2] - this.rowdata.alarmInfo.face_box[0]
416
      var height = this.rowdata.alarmInfo.face_box[3] - this.rowdata.alarmInfo.face_box[1]
417
      function getBase64Image (img) {
418
        var canvas = document.createElement('canvas')
419
        canvas.width = img.width
420
        canvas.height = img.height
421
        var ctx = canvas.getContext('2d')
422
        ctx.drawImage(img, 0, 0, img.width, img.height)
423
        ctx.beginPath()
424
        ctx.moveTo(x, y)
425
        ctx.lineTo(x + width, y)
426
        ctx.lineTo(x + width, y + height)
427
        ctx.lineTo(x, y + height)
428
        ctx.lineTo(x, y) // 绘制最后一笔使图像闭合
429
        ctx.lineWidth = 5
430
        ctx.strokeStyle = 'red'
431
        ctx.stroke()
432
433
        var dataURL = canvas.toDataURL('image/png') // 可选其他值 image/jpeg
434
        return dataURL
435
      }
436
437
      function main (src, cb) {
438
        var image = new Image()
439
        image.src = src + '?v=' + Math.random() // 处理缓存
440
        image.crossOrigin = '*' // 支持跨域图片
441
        image.onload = function () {
442
          var base64 = getBase64Image(image)
443
          cb && cb(base64)
444
        }
445
      }
446
447
      main(this.rowdata.pictureInfo.fileUrl, function (base64) {
448
        // console.log(base64, '是否成功打印base64')
449
        that.mainimage = base64
450
      })
451
    }
452
    // //将分数转换为小数
453
    // toPoint (percent) {
454
    //   var str = percent.replace('%', '')
455
    //   str = str / 100
456
    //   return str
457
    // }
458
459
  }
460
}
461
</script>
462
463
<style lang='scss' scoped>
464
.access {
465
  font-size: 14px;
466
  padding: 6px 0px;
467
  height: 702px;
468
  .upload {
469
    font-size: 14px;
470
    line-height: 22px;
471
  }
472
  .table th,
473
  .table td {
474
    font-size: 14px;
475
    padding: 0 0 0 18px;
476
  }
477
  .access_header {
478
    display: flex;
479
    justify-content: space-between;
480
    margin-top: 24px;
481
    margin-bottom: 24px;
482
    .title {
483
      display: inline-block;
484
      width: 70px;
485
      height: 20px;
486
      font-size: 14px;
487
      text-align: right;
488
      color: rgba($color: #000000, $alpha: 0.65);
489
    }
490
  }
491
492
  .pager {
493
    float: right;
494
    margin-top: 26px;
495
  }
496
}
497
.detail_content {
498
  width: 100%;
499
  height: 376px;
500
  display: flex;
501
  justify-content: space-between;
502
503
  .detail_item1 {
504
    width: 45%;
505
    text-align: left;
506
    > div:nth-child(1) {
507
      margin: 0 0 20px 0;
508
      color: rgba(0, 0, 0, 0.65);
509
      font-size: 14px;
510
    }
511
    > div:nth-child(2) {
512
      width: 100%;
513
      height: 240px;
514
515
      border-radius: 5px;
516
      overflow: hidden;
517
      position: relative;
518
    }
519
  }
520
521
  .detail_item2 {
522
    width: 50%;
523
    text-align: left;
524
    > div:nth-child(1) {
525
      margin: 0 0 20px 0;
526
      color: rgba(0, 0, 0, 0.65);
527
      font-size: 14px;
528
    }
529
    > div:nth-child(2) {
530
      width: 100%;
531
      height: 190px;
532
533
      display: flex;
534
      justify-content: space-between;
535
      .bottomimg {
536
        margin-top: 12px;
537
        width: 100%;
538
        text-align: center;
539
        font-size: 12px;
540
        color: rgba(0, 0, 0, 0.65);
541
      }
542
543
      > div:nth-child(1) {
544
        width: 120px;
545
        height: 100%;
546
547
        .scaleimg {
548
          width: 120px;
549
          height: 160px;
550
551
          position: relative;
552
          .imgcontant {
553
            border-radius: 10px;
554
            background-repeat: no-repeat;
555
            background-attachment: local;
556
            position: absolute;
557
            top: -160px;
558
            left: -120px;
559
          }
560
        }
561
      }
562
      > div:nth-child(2) {
563
        width: 117.76px;
564
        height: 160px;
565
566
        line-height: 160px;
567
        img {
568
          width: 100%;
569
          height: 84.32px;
570
        }
571
      }
572
      > div:nth-child(3) {
573
        height: 100%;
574
        width: 120px;
575
      }
576
    }
577
    .describe {
578
      margin-top: 20px;
579
      width: 100%;
580
      height: 148px;
581
      display: flex;
582
      flex-wrap: wrap;
583
      align-items: center;
584
585
      > div {
586
        width: 100%;
587
        height: 22px;
588
        font-size: 14px;
589
      }
590
    }
591
  }
592
}
593
</style>

+ 15 - 583
security-protection-platform/src/modules/access/index.vue

@ -1,594 +1,26 @@
1
s<template>
2
  <div class="access">
3

4
    <div class="access_header">
5

6
      <div>
7
        <span class="title">开始时间 : </span>
8
        <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
9
      </div>
10

11
      <div>
12
        <span class="title">结束时间 : </span>
13
        <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:200px;height:32px"></t-date-picker>
14
      </div>
15

16
      <!-- <div>
17
        <span class="title">进出类型 : </span>
18
        <t-select v-model="searchdata.typeid" style="width:200px;height:32px">
19
          <t-option v-for="item in accesstype" :value="item.id" :key="item.id">{{ item.name }}</t-option>
20

21
        </t-select>
22
      </div> -->
23
      <div class="alarm_people">
24
        <span class="title">员工 : </span>
25
        <t-input v-model="searchdata.nameAsLike" placeholder="员工姓名" style="width: 200px"></t-input>
26
      </div>
27

28
    </div>
29

30
    <div class="access_header">
31

32
      <!-- 导出excel -->
33
      <div>
34
        <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
35
      </div>
36

37
      <div>
38
        <t-button color="primary" @click="btnsearch">查询</t-button>
39
        <t-button @click="reset">重置</t-button>
40
      </div>
41

42
    </div>
43

44
    <t-table :data="data" line @selection-change="handleSelectionChange">
45
      <t-table-column type="selection" width="34px"></t-table-column>
46
      <t-table-column label="姓名" prop="employeeName" width="60px">
47
      </t-table-column>
48
      <t-table-column label="员工编号" prop="employeeCode" width="80px">
49
      </t-table-column>
50
      <t-table-column label="公司" prop="companyname" width="94px">
51
      </t-table-column>
52
      <t-table-column label="部门" prop="organizationName" width="94px">
53
      </t-table-column>
54
      <t-table-column label="职务" prop="employeePositionZh" width="80px">
55
      </t-table-column>
56
      <t-table-column prop="simi" label="相似度" width="75px">
57
      </t-table-column>
58
      <t-table-column label="进出时间" prop="taskExecuteTime" width="160px">
59
      </t-table-column>
60
      <t-table-column label="位置" prop="terminalPosition" width="122px">
61
      </t-table-column>
62
      <t-table-column label="终端名称" prop="resourceToolName" width="97px">
63
      </t-table-column>
64
      <t-table-column label="终端编号" prop="resourceToolCode" width="90px">
65
      </t-table-column>
66
      <t-table-column label="操作" width="80px">
67
        <template slot-scope="scope">
68
          <a href="javascript:void(0)" size="sm" style="color:#0089D4" @click="handleClick(scope)">识别详情</a>
69
        </template>
70
      </t-table-column>
71

72
    </t-table>
73

74
    <!-- 分页 -->
75
    <t-pager :total="total" :current="page" :page-size="limit" show-elevator class="pager" @on-change="onChange"></t-pager>
76

77
    <!-- 模态框 -->
78
    <t-modal :visibled.sync="detail_modal" title="识别详情" width="840px" height="538px">
79

80
      <div style="text-align:center">
81
        <div class="detail_content">
82
          <div class="detail_item1">
83
            <div>抓拍图片</div>
84
            <div>
85
              <!-- <img :src="rowdata.pictureInfo.fileUrl" alt="" srcset="" style="width:100%;height:100%"> -->
86
              <!--处理图片里的方框-->
87
              <img :src="mainimage" alt="" srcset="" style="width:100%;height:100%">
88
            </div>
89
          </div>
90
          <div class="detail_item2">
91
            <div>识别结果</div>
92
            <div>
93
              <div>
94
                <!-- 修改-->
95
                <img :src="newimage" alt="" srcset="" style="width:120px;height:160px;border-radius: 5px; ">
96

97
                <!-- <div class="scaleimg">
98
                  <div :style="{backgroundImage:style.bgimg,backgroundPosition:style.bgposition,
99
                                transform:style.scale,
100
                                width:style.width,
101
                                height:style.height}" class="imgcontant"></div>
102
                </div> -->
103
                <div class="bottomimg">抓拍图片</div>
104
              </div>
105
              <div>
106
                <!-- 修改-->
107
                <img src="@/assets/images/Identify_the_successful.png" alt="" srcset="">
108

109
              </div>
110
              <div>
111
                <img :src="rowdata.alarmInfo.headerImage" alt="" srcset="" style="width:100%;height:160px; border-radius: 5px;">
112
                <div class="bottomimg">人脸底库</div>
113
              </div>
114
            </div>
115
            <div class="describe">
116
              <div>
117
                <t-icon icon="user-outline"></t-icon>
118
                {{ rowdata.alarmInfo.employeeName }}({{ rowdata.alarmInfo.employeeCode }})
119
              </div>
120
              <div>
121
                <t-icon icon="map-marker"></t-icon>
122
                {{ rowdata.alarmInfo.terminalPosition || '--' }}
123
              </div>
124
              <div>
125
                <t-icon icon="clock-outline"></t-icon>
126
                {{ rowdata.alarmInfo.taskExecuteTime }}
127
              </div>
128
              <div>
129
                <t-icon icon="team-outline"></t-icon> 相似度:
130
                {{ rowdata.alarmInfo.simi }}
131
              </div>
132
            </div>
133
          </div>
134
        </div>
135
      </div>
136
      <div slot="footer">
137
        <t-button type="danger" long @click="detail_modal = false">关闭</t-button>
138
      </div>
139
    </t-modal>
140

141
  </div>
1
<template>
2
  <t-tabs :animated="false" style="padding:20px">
3
    <t-tab-panel label="导航页1" panel-id="tab-1">
4
      <tab-change1></tab-change1>
5
    </t-tab-panel>
6
    <t-tab-panel label="导航页2" panel-id="tab-2">
7
      <tab-change2></tab-change2>
8
    </t-tab-panel>
9
  </t-tabs>
142 10
</template>
143 11

144 12
<script>
145
import accessapi from '@/api/access'
13
import tabChange1 from './component/tab1'
14
import tabChange2 from './component/tab2'
146 15

147 16
export default {
148

17
  components: {
18
    tabChange1,
19
    tabChange2
20
  },
149 21
  data () {
150 22
    return {
151
      // 进出类型
152
      accesstype: [],
153
      // 页码
154
      total: 0,
155
      // 选择的数据
156
      selectdata: [],
157
      // 模态框显示
158
      detail_modal: false,
159
      // 当前行数据
160
      rowdata: {
161
        alarmInfo: {},
162
        pictureInfo: {}
163
      },
164
      // 公司列表
165
      companyTypesList: [],
166

167
      // 查询的参数
168
      searchdata: {
169

170
        nameAsLike: '',
171
        beginDay: '',
172
        endDay: ''
173
      },
174
      // 一页的数据
175
      data: [
176

177
      ],
178
      // 当前页
179
      page: 1,
180
      limit: 10,
181
      // style: {
182
      //   bgimg: '',
183
      //   bgposition: '',
184
      //   scale: '',
185
      //   width: '',
186
      //   height: ''
187

188
      // }
189
      // 截取后的图片
190
      newimage: '',
191
      // 详情的主图片
192
      mainimage: ''
193

194 23
    }
195
  },
196

197
  mounted () {
198
    // this.gettype()
199
    this.getcompanyTypesList()
200
  },
201
  methods: {
202
    // 表格中的选择数据
203
    handleSelectionChange (val) {
204
      this.selectdata = val
205
    },
206
    // 获取公司
207
    async getcompanyTypesList () {
208
      var res = await accessapi.getcompanyTypesList()
209
      // console.log('公司信息是', res)
210
      if (res.status === 200) {
211
        this.companyTypesList = res.data.data
212
        console.log(this.companyTypesList)
213
        this.search()
214
      } else {
215
        this.$Message.danger('获取数据失败')
216
      }
217
    },
218
    // 点击详情
219
    async handleClick (scope) {
220
      // this.rowdata = scope.row
221
      // console.log(this.rowdata)
222
      // console.log('id是', scope.row.aiIdenLogId)
223
      this.newimage = ''
224
      this.mainimage = ''
225
      var res = await accessapi.getOneInAndOutRecord({ params: { aiIdenLogId: scope.row.aiIdenLogId } })
226

227
      if (res.data.success) {
228
        // this.rowdata = res.data.data
229

230
        this.rowdata.pictureInfo = res.data.data.pictureInfo
231
        console.log('数据', this.rowdata.pictureInfo)
232
        this.rowdata.alarmInfo = res.data.data.alarmInfo
233
        console.log('数据', this.rowdata.alarmInfo)
234
        console.log('相似度数据', this.rowdata.alarmInfo.simi, typeof this.rowdata.alarmInfo.simi)
235
        // this.rowdata.alarmInfo.newImg = this.rowdata.pictureInfo.fileUrl
236

237
        this.getImage()
238
        this.getmainimage()
239
        // var loadTimer
240
        // var imgObject = new Image()
241
        // imgObject.setAttribute('crossOrigin', 'anonymous')
242
        // imgObject.src = this.rowdata.pictureInfo.fileUrl
243
        // console.log(this)
244
        // imgObject.onload = this.onImgLoaded(loadTimer, imgObject, this.rowdata.alarmInfo)
245

246
        // console.log(this.rowdata.alarmInfo.newImg)
247

248
        // this.style.width = res.data.data.alarmInfo.face_box[2] - res.data.data.alarmInfo.face_box[0] + 'px'
249
        // // console.log('width是', this.style.width)
250
        // this.style.height = res.data.data.alarmInfo.face_box[3] - res.data.data.alarmInfo.face_box[1] + 'px'
251
        // // console.log('height是', this.style.height)
252
        // this.style.bgimg = 'url(' + res.data.data.pictureInfo.fileUrl + ')'
253
        // // console.log('bgimg是', this.style.bgimg)
254
        // this.style.bgposition = '' + -res.data.data.alarmInfo.face_box[0] + 'px ' + -res.data.data.alarmInfo.face_box[1] + 'px'
255
        // console.log('bgposition是', this.style.bgposition)
256
        // // transform: scale(0.33, 0.33);
257
        // var width = res.data.data.alarmInfo.face_box[2] - res.data.data.alarmInfo.face_box[0]
258
        // var height = res.data.data.alarmInfo.face_box[3] - res.data.data.alarmInfo.face_box[1]
259
        // var scalex = 120 / width
260
        // var scaley = 160 / height
261
        // // console.log(scalex)
262
        // this.style.scale = 'scale(' + scalex + ',' + scaley + ')'
263
        // // console.log('scale是', this.style.scale)
264
        // // console.log(res.data.data)
265
        // console.log('详情数据是', this.rowdata.alarmInfo)
266

267
        this.detail_modal = true
268
      } else {
269
        this.$Message.danger('获取数据失败')
270
      }
271
    },
272
    // 分页
273
    onChange (val) {
274
      this.page = val
275
      this.search()
276
    },
277

278
    // 点击查询按钮
279
    btnsearch () {
280
      if (this.page === 1) {
281
        this.search()
282
      } else {
283
        this.page = 1
284
      }
285
    },
286
    // 获取进出类型
287
    // gettype () {
288
    //   accessapi.getaccesstype().then((res) => {
289
    //     this.accesstype = res.data.data
290
    //     console.log(this.accesstype)
291
    //   })
292
    // },
293
    // 查询数据
294
    async search () {
295
      // 检验数据
296
      var flag = this.startreend(this.searchdata.beginDay, this.searchdata.endDay)
297
      if (flag) {
298
        // console.log(this.page)
299
        // console.log(this.searchdata)
300

301
        var params = this.searchdata
302
        params.pageNumber = this.page
303
        params.pageSize = this.limit
304
        // console.log(params)
305
        var res = await accessapi.getaccesslist({ params: params })
306
        // console.log(res)
307
        if (res.status === 200) {
308
          // console.log(res)
309
          this.data = res.data.data.data
310
          // console.log(this.data)
311
          // console.log(this.companyTypesList)
312
          this.data = this.data.map((item) => {
313
            // 处理进出时间
314
            // item.taskExecuteTime = formatDateTime(item.taskExecuteTime)
315
            // 处理相似度
316
            // item.simi = this.percentagedata(item.simi)
317
            // console.log('公司的数据是', this.companyTypesList)
318
            // console.log('公司id', item.companyId, typeof item.companyId)
319
            // console.log('公司名字是', this.companyTypesList.filter((item1) => { return item1.id === 10000 }))
320
            item.companyinfo = this.companyTypesList.filter((item1) => { return String(item1.id) === item.companyId })
321
            if (item.companyinfo.length > 0) {
322
              item.companyname = item.companyinfo[0].name
323
            } else {
324
              item.companyname = ''
325
            }
326

327
            return item
328
          })
329

330
          // this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
331
          // console.log(this.total)
332
          this.total = res.data.data.total
333
          // console.log('数据是', this.data)
334
        }
335
      } else {
336
        this.$Message.danger('开始时间不能在结束时间的后面')
337
      }
338
    },
339

340
    percentagedata (point) {
341
      if (point === 0) {
342
        return 0
343
      }
344
      var str = Number(point * 100).toFixed(1)
345
      str += '%'
346
      return str
347
    },
348

349
    // 重置数据
350
    reset () {
351
      for (var index in this.searchdata) {
352
        this.searchdata[index] = ''
353
      }
354
      this.page = 1
355
      this.$Message.success('数据重置成功')
356
    },
357

358
    // 字符串更改为时间类型
359
    stringtodate (date) {
360
      date = date.substring(0, 19)
361
      date = date.replace(/-/g, '/')
362
      var timestamp = new Date(date).getTime()
363
      return timestamp
364
    },
365
    // 验证开始时间·和结束时间
366
    startreend (startdate, enddate) {
367
      startdate = this.stringtodate(startdate)
368
      enddate = this.stringtodate(enddate)
369
      if (startdate > enddate) {
370
        return false
371
      } else {
372
        return true
373
      }
374
    },
375
    // 处理截图图片
376
    async getImage () {
377
      var loadTimer
378
      var imgObject = new Image()
379
      imgObject.setAttribute('crossOrigin', 'anonymous')
380
      imgObject.src = this.rowdata.pictureInfo.fileUrl
381
      var e = this.rowdata.alarmInfo
382
      var that = this
383
      imgObject.onload = onImgLoaded()
384
      // eslint-disable-next-line no-return-assign
385
      function onImgLoaded () {
386
        if (loadTimer != null) clearTimeout(loadTimer)
387
        if (!imgObject.complete) {
388
          loadTimer = setTimeout(() => {
389
            onImgLoaded()
390
          }, 3)
391
        } else {
392
          that.newimage = getImagePortion(imgObject, e.face_box[2] - e.face_box[0], e.face_box[3] - e.face_box[1], e.face_box[0], e.face_box[1])
393
        }
394
      }
395
      function getImagePortion (imgObj, newWidth, newHeight, startX, startY) {
396
        var tnCanvas = document.createElement('canvas')
397
        var tnCanvasContext = tnCanvas.getContext('2d')
398
        tnCanvas.width = newWidth; tnCanvas.height = newHeight
399
        var bufferCanvas = document.createElement('canvas')
400
        var bufferContext = bufferCanvas.getContext('2d')
401
        bufferCanvas.width = imgObj.width
402
        bufferCanvas.height = imgObj.height
403
        bufferContext.drawImage(imgObj, 0, 0)
404
        tnCanvasContext.drawImage(bufferCanvas, startX, startY, newWidth, newHeight, 0, 0, newWidth, newHeight)
405
        // console.log(tnCanvas.toDataURL())
406
        return tnCanvas.toDataURL()
407
      }
408
    },
409

410
    // 处理主图片
411
    async getmainimage () {
412
      var that = this
413

414
      var x = this.rowdata.alarmInfo.face_box[0]
415
      var y = this.rowdata.alarmInfo.face_box[1]
416
      var width = this.rowdata.alarmInfo.face_box[2] - this.rowdata.alarmInfo.face_box[0]
417
      var height = this.rowdata.alarmInfo.face_box[3] - this.rowdata.alarmInfo.face_box[1]
418
      function getBase64Image (img) {
419
        var canvas = document.createElement('canvas')
420
        canvas.width = img.width
421
        canvas.height = img.height
422
        var ctx = canvas.getContext('2d')
423
        ctx.drawImage(img, 0, 0, img.width, img.height)
424
        ctx.beginPath()
425
        ctx.moveTo(x, y)
426
        ctx.lineTo(x + width, y)
427
        ctx.lineTo(x + width, y + height)
428
        ctx.lineTo(x, y + height)
429
        ctx.lineTo(x, y) // 绘制最后一笔使图像闭合
430
        ctx.lineWidth = 5
431
        ctx.strokeStyle = 'red'
432
        ctx.stroke()
433

434
        var dataURL = canvas.toDataURL('image/png') // 可选其他值 image/jpeg
435
        return dataURL
436
      }
437

438
      function main (src, cb) {
439
        var image = new Image()
440
        image.src = src + '?v=' + Math.random() // 处理缓存
441
        image.crossOrigin = '*' // 支持跨域图片
442
        image.onload = function () {
443
          var base64 = getBase64Image(image)
444
          cb && cb(base64)
445
        }
446
      }
447

448
      main(this.rowdata.pictureInfo.fileUrl, function (base64) {
449
        // console.log(base64, '是否成功打印base64')
450
        that.mainimage = base64
451
      })
452
    }
453
    // //将分数转换为小数
454
    // toPoint (percent) {
455
    //   var str = percent.replace('%', '')
456
    //   str = str / 100
457
    //   return str
458
    // }
459

460 24
  }
461 25
}
462 26
</script>
463

464
<style lang='scss' scoped>
465
.access {
466
  font-size: 14px;
467
  padding: 6px 24px;
468
  height: 702px;
469
  .upload {
470
    font-size: 14px;
471
    line-height: 22px;
472
  }
473
  .table th,
474
  .table td {
475
    font-size: 14px;
476
    padding: 0 0 0 18px;
477
  }
478
  .access_header {
479
    display: flex;
480
    justify-content: space-between;
481
    margin-top: 24px;
482
    margin-bottom: 24px;
483
    .title {
484
      display: inline-block;
485
      width: 70px;
486
      height: 20px;
487
      font-size: 14px;
488
      text-align: right;
489
      color: rgba($color: #000000, $alpha: 0.65);
490
    }
491
  }
492

493
  .pager {
494
    float: right;
495
    margin-top: 26px;
496
  }
497
}
498
.detail_content {
499
  width: 100%;
500
  height: 376px;
501
  display: flex;
502
  justify-content: space-between;
503

504
  .detail_item1 {
505
    width: 45%;
506
    text-align: left;
507
    > div:nth-child(1) {
508
      margin: 0 0 20px 0;
509
      color: rgba(0, 0, 0, 0.65);
510
      font-size: 14px;
511
    }
512
    > div:nth-child(2) {
513
      width: 100%;
514
      height: 240px;
515

516
      border-radius: 5px;
517
      overflow: hidden;
518
      position: relative;
519
    }
520
  }
521

522
  .detail_item2 {
523
    width: 50%;
524
    text-align: left;
525
    > div:nth-child(1) {
526
      margin: 0 0 20px 0;
527
      color: rgba(0, 0, 0, 0.65);
528
      font-size: 14px;
529
    }
530
    > div:nth-child(2) {
531
      width: 100%;
532
      height: 190px;
533

534
      display: flex;
535
      justify-content: space-between;
536
      .bottomimg {
537
        margin-top: 12px;
538
        width: 100%;
539
        text-align: center;
540
        font-size: 12px;
541
        color: rgba(0, 0, 0, 0.65);
542
      }
543

544
      > div:nth-child(1) {
545
        width: 120px;
546
        height: 100%;
547

548
        .scaleimg {
549
          width: 120px;
550
          height: 160px;
551

552
          position: relative;
553
          .imgcontant {
554
            border-radius: 10px;
555
            background-repeat: no-repeat;
556
            background-attachment: local;
557
            position: absolute;
558
            top: -160px;
559
            left: -120px;
560
          }
561
        }
562
      }
563
      > div:nth-child(2) {
564
        width: 117.76px;
565
        height: 160px;
566

567
        line-height: 160px;
568
        img {
569
          width: 100%;
570
          height: 84.32px;
571
        }
572
      }
573
      > div:nth-child(3) {
574
        height: 100%;
575
        width: 120px;
576
      }
577
    }
578
    .describe {
579
      margin-top: 20px;
580
      width: 100%;
581
      height: 148px;
582
      display: flex;
583
      flex-wrap: wrap;
584
      align-items: center;
585

586
      > div {
587
        width: 100%;
588
        height: 22px;
589
        font-size: 14px;
590
      }
591
    }
592
  }
593
}
594
</style>

+ 11 - 2
security-protection-platform/src/modules/attendance/components/DeptStaffCascader/index.vue

@ -41,7 +41,8 @@ export default {
41 41
      staffTypesList: [],
42 42
      companyTypeId: '',
43 43
      departmentTypeId: '',
44
      staffTypeId: ''
44
      staffTypeId: '',
45
      firstCreated: true
45 46
    }
46 47
  },
47 48
  computed: {
@ -79,7 +80,6 @@ export default {
79 80
  },
80 81
  methods: {
81 82
    getOrgId() {
82
      console.log(123);
83 83
      this.$emit('getOrgId', this.companyTypeId)
84 84
    },
85 85
    getDepId() {
@ -93,6 +93,8 @@ export default {
93 93
      const res = await commonApi.getCompanyTypesList()
94 94
      if (res.status === 200) {
95 95
        this.companyTypesList = res.data.data
96
        this.companyTypeId = 10086
97
        this.getOrgId()
96 98
      } else {
97 99
        this.$Message.danger('公司类型列表数据获取失败!')
98 100
      }
@ -123,6 +125,13 @@ export default {
123 125
        })
124 126
        // eslint-disable-next-line no-return-assign
125 127
        this.departmentTypesList = data.filter(item => item.data = item.id)
128
        this.$nextTick(() => {
129
          if (this.firstCreated === true) {
130
            this.departmentTypeId = '10087'
131
            this.getDepId()
132
            this.firstCreated = false
133
          }
134
        })
126 135
      } else {
127 136
        this.$Message.danger('部门类型列表数据获取失败!')
128 137
      }

+ 1 - 0
security-protection-platform/src/modules/system/monitor/HomePageSettings/ShiftCameraDialog.vue

@ -118,6 +118,7 @@ export default {
118 118
      this.form.resourceToolName = item.resourceToolName
119 119
      this.form.resourceToolId = item.resourceToolId
120 120
      this.form.pictureUrl = item.pictureUrl
121
      this.form.videoUrl = item.videoUrl
121 122
    },
122 123
    handleSubmit () {
123 124
      this.$emit('submit', this.form)

+ 0 - 1
security-protection-platform/src/modules/usermana/index.vue

@ -115,7 +115,6 @@ export default {
115 115
      companyName: '',
116 116
      // 判断页面是否是第一次渲染
117 117
      firstCreated: true
118
119 118
    }
120 119
  },
121 120
  watch: {