td> 290
}
291
.detail_content {
292
  width: 100%;
293
  height: 376px;
294
  display: flex;
295
  justify-content: space-between;
296

297
  .detail_item1 {
298
    width: 45%;
299
    text-align: left;
300
    > div:nth-child(1) {
301
      margin: 0 0 20px 0;
302
      color: rgba(0, 0, 0, 0.65);
303
      font-size: 14px;
304
    }
305
    > div:nth-child(2) {
306
      width: 100%;
307
      height: 240px;
308

309
      border-radius: 5px;
310
      overflow: hidden;
311
    }
312
  }
313

314
  .detail_item2 {
315
    width: 50%;
316
    text-align: left;
317
    > div:nth-child(1) {
318
      margin: 0 0 20px 0;
319
      color: rgba(0, 0, 0, 0.65);
320
      font-size: 14px;
321
    }
322
    > div:nth-child(2) {
323
      width: 100%;
324
      height: 190px;
325

326
      display: flex;
327
      justify-content: space-between;
328
      .bottomimg {
329
        margin-top: 12px;
330
        width: 100%;
331
        text-align: center;
332
        font-size: 12px;
333
        color: rgba(0, 0, 0, 0.65);
334
      }
335

336
      > div:nth-child(1) {
337
        width: 120px;
338
        height: 100%;
339
      }
340
      > div:nth-child(2) {
341
        width: 117.76px;
342
        height: 160px;
343

344
        line-height: 160px;
345
        img {
346
          width: 100%;
347
          height: 84.32px;
348
        }
349
      }
350
      > div:nth-child(3) {
351
        height: 100%;
352
        width: 120px;
353
      }
354
    }
355
    .describe {
356
      margin-top: 20px;
357
      width: 100%;
358
      height: 148px;
359
      display: flex;
360
      flex-wrap: wrap;
361
      align-items: center;
362

363
      > div {
364
        width: 100%;
365
        height: 22px;
366
        font-size: 14px;
367
      }
368
    }
369
  }
370
}
371
</style>

+ 481 - 0
security-protection-platform/src/modules/aialarm/index.vue

@ -0,0 +1,481 @@
1
<template>
2
  <div class="ai_alarm">
3
    <!-- 顶部的查询组件 -->
4

5
    <div class="alarm_header">
6
      <div>
7
        <span class="title">报警类型 : </span>
8
        <t-select v-model="searchdata.typeid" style="width:200px;height:32px">
9
          <t-option v-for="(item,index) in alarmtypelist" :key="index" :value="item.id">{{ item.name }}</t-option>
10
        </t-select>
11
      </div>
12

13
      <div>
14
        <span class="title">开始时间 : </span>
15
        <t-date-picker :confirm="false" v-model="searchdata.starttime" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
16
      </div>
17

18
      <div>
19
        <span class="title">结束时间 : </span>
20
        <t-date-picker :confirm="false" v-model="searchdata.endtime" placeholder="请选择结束时间" style="width:200px;height:32px"></t-date-picker>
21
      </div>
22

23
    </div>
24

25
    <div class="alarm_header">
26
      <div class="alarm_people">
27
        <span class="title">报警人 : </span>
28
        <t-select v-model="searchdata.Police" style="width:200px;height:32px">
29
          <t-option value="你好">选项1</t-option>
30
          <t-option value="世界">选项2</t-option>
31
        </t-select>
32
      </div>
33

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

40
    <!-- 导出excel组件 -->
41
    <div>
42
      <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
43
    </div>
44

45
    <!-- 表格 -->
46
    <t-table :data="data" line @selection-change="handleSelectionChange">
47
      <t-table-column type="selection" width="50"></t-table-column>
48
      <t-table-column label="状态" width="110">
49
        <template slot-scope="scope">
50

51
          <t-tag v-if="scope.row.state=== '处理中'" state="info">{{ scope.row.state }}</t-tag>
52
          <t-tag v-if="scope.row.state=== '未确认'" state="warning">{{ scope.row.state }}</t-tag>
53
          <t-tag v-if="scope.row.state=== '已处理'" state="success">{{ scope.row.state }}</t-tag>
54
        </template>
55
      </t-table-column>
56
      <t-table-column label="报警类型" prop="type">
57
      </t-table-column>
58
      <t-table-column label="报警描述" prop="describe" width="110">
59
      </t-table-column>
60
      <t-table-column label="设备名称" prop="equipment_name" width="110">
61
      </t-table-column>
62
      <t-table-column label="设备编号" prop="equipment_number" width="90">
63
      </t-table-column>
64
      <t-table-column label="设备位置" prop="equipment_location" width="120">
65
      </t-table-column>
66
      <t-table-column label="报警时间" prop="alarm_time" width="148px">
67
      </t-table-column>
68
      <t-table-column label="处理人" prop="Handler" width="70">
69
      </t-table-column>
70
      <t-table-column label="处理时间" prop="processing_time" width="148px">
71
      </t-table-column>
72
      <t-table-column label="操作">
73
        <template slot-scope="scope">
74

75
          <a href="javascript:void(0)" size="sm" style="color:#0089D4" @click="handleClick(scope,0)">详情</a>
76
          <a v-if="scope.row.state=='处理中'" style="color:#0089D4" @click="handleClick(scope,1)">关闭</a>
77
          <a v-if="scope.row.state=='未确认'" style="color:#0089D4" @click="handleClick(scope,1)">处理</a>
78
        </template>
79
      </t-table-column>
80
    </t-table>
81

82
    <!-- 分页 -->
83
    <t-pager :total="total" :current="page" show-elevator class="pager" @on-change="onChange"></t-pager>
84

85
    <!-- 模态框-->
86
    <t-modal :visibled.sync="details_modal" :title="clickdetail==0?'报警详情':'报警处理'" width="732px">
87

88
      <div style="text-align:center">
89
        <div class="details_item1">
90
          <div class="detail">
91
            <label class="detail_title">状态:</label>
92
            <div class="detail_content">
93
              <t-tag v-if="currentdata.data.state==='未确认'" state="warning">{{ currentdata.data.state }}</t-tag>
94
              <t-tag v-if="currentdata.data.state==='已处理'" state="success">{{ currentdata.data.state }}</t-tag>
95
              <t-tag v-if="currentdata.data.state==='处理中'" state="info">{{ currentdata.data.state }}</t-tag>
96
            </div>
97

98
          </div>
99
          <div class="detail">
100
            <label class="detail_title">报警类型:</label>
101
            <div class="detail_content">{{ currentdata.data.type }}</div>
102
          </div>
103
          <div class="detail">
104
            <label class="detail_title">报警描述:</label>
105
            <div class="detail_content">{{ currentdata.data.describe }}</div>
106
          </div>
107
          <div class="detail">
108
            <label class="detail_title">报警时间:</label>
109
            <div class="detail_content">{{ currentdata.data.alarm_time }}</div>
110
          </div>
111

112
          <div class="detail">
113
            <label class="detail_title">设备编号:</label>
114
            <div class="detail_content">{{ currentdata.data.equipment_name }}</div>
115
          </div>
116
          <div class="detail">
117
            <label class="detail_title">设备位置:</label>
118
            <div class="detail_content">{{ currentdata.data.equipment_location }}</div>
119
          </div>
120

121
          <div class="detail">
122
            <label class="detail_title">处理人:</label>
123
            <div class="detail_content">{{ currentdata.data.Handler }}</div>
124
          </div>
125

126
          <div class="detail">
127
            <label class="detail_title">处理时间:</label>
128
            <div>{{ currentdata.data.processing_time }}</div>
129
          </div>
130
        </div>
131

132
        <div class="details_item2">
133
          <div>
134
            <div>识别图片</div>
135
            <div><img :src="currentdata.data.picture_url" alt="" srcset="" style="width:100%;height:100%"></div>
136
          </div>
137
          <div>
138
            <div>识别视频</div>
139
            <div>
140
              <video :src="currentdata.data.video_url" class="video" controls></video>
141
            </div>
142
          </div>
143
        </div>
144
        <div v-if="clickdetail==1">
145
          <div v-if="currentdata.data.state!='已处理'" class="radio">
146
            <div>报警处理 : </div>
147
            <div v-if="currentdata.data.state=='未确认'">
148
              <t-radio-group v-model="msg">
149
                <t-radio label="确认">
150

151
                  <span>确认</span>
152
                </t-radio>
153
                <t-radio label="误判">
154

155
                  <span>误判</span>
156
                </t-radio>
157

158
              </t-radio-group>
159
            </div>
160

161
            <div v-if="currentdata.data.state=='处理中'">
162
              <t-radio-group v-model="msg">
163
                <t-radio label="关闭">关闭</t-radio>
164
              </t-radio-group>
165

166
            </div>
167
          </div>
168
        </div>
169
      </div>
170
      <div slot="footer">
171
        <div v-if="clickdetail==1">
172

173
          <div>
174
            <t-button @click="details_modal=false">取消</t-button>
175
            <t-button color="primary" @click="confimclick">确认</t-button>
176

177
          </div>
178
        </div>
179
        <div v-else>
180
          <t-button type="danger" long @click="details_modal=false">关闭</t-button>
181
        </div>
182
      </div>
183
    </t-modal>
184

185
  </div>
186
</template>
187

188
<script>
189

190
import aialarmapi from '@/api/aialarm'
191
export default {
192

193
  data () {
194
    return {
195
      searchdata: {
196
        typeid: '', // 报警类型
197
        Police: '', // 报警人
198
        starttime: '', // 开始时间
199
        endtime: '' // 结束时间
200
      },
201
      // 报警类型
202
      alarmtypelist: [],
203
      // 报警人
204
      // 模态框中的单选按钮
205
      msg: '',
206
      // 模态框
207
      details_modal: false,
208
      // 当前行的数据
209
      currentdata: {
210
        index: '',
211
        data: {}
212
      },
213
      // 选择的数据
214
      selectdata: [],
215
      // 判断是详情还是处理
216
      clickdetail: 0,
217
      // 一页的数据
218
      data: [
219
        // {
220
        //   state: '处理中',
221
        //   type: '身份异常',
222
        //   describe: '未授权车辆',
223
        //   equipment_name: '1#人脸终端',
224
        //   equipment_number: 's00001',
225
        //   equipment_location: '1#风场SVG室',
226
        //   alarm_time: '2020-09-21 16:07:09',
227
        //   Handler: '张三',
228
        //   processing_time: '2020-09-21 16:07:09',
229

230
        // },
231

232
      ],
233
      // 页数
234
      page: 1,
235
      limit: 10,
236

237
      total: 0
238

239
    }
240
  },
241
  mounted () {
242
    this.gettype()
243
    this.search()
244
  },
245
  methods: {
246
    // 选择行
247
    handleSelectionChange (val) {
248
      // console.log(val)
249
      this.selectdata = val
250
    },
251

252
    // 点击详情
253
    handleClick (scope, val) {
254
      this.clickdetail = val
255
      // 去除模态框中的单选项
256

257
      this.msg = ''
258

259
      this.details_modal = true // 打开模态框
260
      this.currentdata.data = scope.row // 获取当前行的数据
261
      this.currentdata.index = scope.$index // 获取当前行的索引
262
      console.log(this.currentdata.data)
263
    },
264

265
    // 未确认状态的模态框的确认按钮 || 处理中状态的模态框的确认按钮
266
    confimclick () {
267
      // 获取单选框中的值
268
      // console.log(this.msg)
269
      // 判断是否选择了单选框
270
      if (this.msg) {
271
        // 向后端发送数据
272
        this.alarmdispose(this.currentdata.data.id, this.msg)
273
        // 关闭模态框
274
        this.details_modal = false
275
      } else {
276
        this.$Message.warning('请选择按钮')
277
      }
278
    },
279

280
    async alarmdispose (id, msg) {
281
      var res = await aialarmapi.dispose({ 'id': id, 'msg': msg })
282
      console.log(res)
283
      if (res.status === 200) {
284
        // console.log(res.data.data)
285
        this.judgeradio(msg)
286
      } else {
287
        this.$Message.danger('处理失败')
288
      }
289
    },
290

291
    // 判断选择了哪个单选按钮
292
    judgeradio (msg) {
293
      // 未确认的模态框选择了确认
294
      if (msg === '确认') {
295
        this.data[this.currentdata.index].state = '处理中'
296
      }
297
      // 未确认的模态框选择了误判
298
      if (msg === '误判') {
299
        this.$Message.info('未确认的模态框选择了误判')
300
      }
301
      // 处理中的模态框选择了关闭按钮
302
      if (msg === '关闭') {
303
        this.data[this.currentdata.index].state = '已处理'
304
      }
305
    },
306
    onChange (val) {
307
      // console.log(val)
308
      this.page = val
309
      this.search()
310
    },
311

312
    // 点击查询按钮
313
    btnsearch () {
314
      if (this.page === 1) {
315
        this.search()
316
      } else {
317
        this.page = 1
318
      }
319
    },
320

321
    // 获取报警类型 以及报警人
322
    async gettype () {
323
      var res = await aialarmapi.getaialarmtype()
324
      // console.log(res)
325
      if (res.status === 200) {
326
        this.alarmtypelist = res.data.data
327
        console.log(this.alarmtypelist)
328
      }
329
    },
330

331
    // 查询数据时
332
    async search () {
333
      var flag = this.startreend(this.searchdata.starttime, this.searchdata.endtime)
334
      console.log(flag)
335
      if (flag) {
336
        // 查询
337
        var params = this.searchdata
338
        params.page = this.page
339
        params.limit = this.limit
340

341
        var res = await aialarmapi.getaialarmlist({
342
          params: params
343
        })
344

345
        // console.log(res)
346
        if (res.status === 200) {
347
          this.data = res.data.data
348
          this.total = Math.ceil(res.data.total / this.limit) * 5
349
        } else {
350
          this.$Message.danger('数据获取失败')
351
        }
352
      } else {
353
        this.$Message.danger('开始时间不能在结束时间的后面')
354
      }
355
    },
356

357
    // 重置
358
    reset () {
359
      for (var index in this.searchdata) {
360
        this.searchdata[index] = ''
361
      }
362
      // console.log(this.searchdata)
363
      this.page = 1
364
      this.$Message.success('数据重置成功')
365
    },
366
    // 字符串更改为时间类型
367
    stringtodate (date) {
368
      date = date.substring(0, 19)
369
      date = date.replace(/-/g, '/')
370
      var timestamp = new Date(date).getTime()
371
      return timestamp
372
    },
373
    // 验证开始时间·和结束时间
374
    startreend (startdate, enddate) {
375
      startdate = this.stringtodate(startdate)
376
      enddate = this.stringtodate(enddate)
377
      if (startdate > enddate) {
378
        return false
379
      } else {
380
        return true
381
      }
382
    }
383

384
  }
385
}
386

387
</script>
388

389
<style lang='scss' >
390
.ai_alarm {
391
  font-size: 14px;
392
  padding: 6px 24px;
393
  .upload {
394
    font-size: 14px;
395
    line-height: 22px;
396
    margin: 29px 0 25px 0;
397
  }
398
  .table th,
399
  .table td {
400
    padding: 0 0 0 21px;
401
  }
402
  .alarm_header {
403
    display: flex;
404
    justify-content: space-between;
405
    margin-top: 24px;
406
    .title {
407
      display: inline-block;
408
      width: 70px;
409
      height: 20px;
410
      font-size: 14px;
411
      text-align: right;
412
      color: rgba($color: #000000, $alpha: 0.65);
413
    }
414
  }
415
}
416
.pager {
417
  float: right;
418
  margin-top: 26px;
419
}
420
.details_item1 {
421
  display: flex;
422
  justify-content: space-between;
423
  flex-wrap: wrap;
424
  height: 192px;
425
  align-items: center;
426
  border-radius: 4px;
427
  background-color: rgba(245, 245, 245, 1);
428
  padding: 0 16px;
429
  color: rgba(0, 0, 0, 0.45);
430
  font-size: 14px;
431
  .detail {
432
    width: 49%;
433
    display: flex;
434
    .detail_title {
435
      display: block;
436
      width: 70px;
437
      height: 22px;
438
      text-align: right;
439
    }
440
    .detail_content {
441
      flex: 1;
442
      text-align: left;
443
    }
444
  }
445
}
446

447
.details_item2 {
448
  display: flex;
449
  justify-content: space-between;
450
  margin-top: 24px;
451
  > div {
452
    width: 49%;
453
    > div:nth-child(1) {
454
      text-align: left;
455
      font-size: 14px;
456
      color: rgba(0, 0, 0, 0.65);
457
      margin-bottom: 8px;
458
    }
459
    > div:nth-child(2) {
460
      height: 250px;
461
      // border: 1px solid black;
462
      border-radius: 5px;
463
      overflow: hidden;
464
    }
465
  }
466
}
467
.radio {
468
  margin-top: 19px;
469
  float: left;
470
  display: flex;
471
  align-items: center;
472
  > div:nth-child(1) {
473
    margin-right: 5px;
474
  }
475
}
476
.video {
477
  width: 100%;
478
  height: 100%;
479
  object-fit: fill;
480
}
481
</style>

+ 26 - 0
security-protection-platform/src/routes.js

@ -66,6 +66,19 @@ export const constantRoutes = [
66 66
        meta: { title: '假勤管理', icon: 'home' }
67 67
      }
68 68
    ]
69
  },
70
  {
71
    path: '/alarm',
72
    component: Layout,
73
    meta: { icon: 'bell' },
74
    children: [
75
      {
76
        name: 'ai_alarm',
77
        path: '',
78
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/aialarm/index.vue'),
79
        meta: { title: 'AI报警', icon: 'bell' }
80
      }
81
    ]
69 82
  }, {
70 83
    path: '/system',
71 84
    component: Layout,
@ -92,6 +105,19 @@ export const constantRoutes = [
92 105
        meta: { title: '监控布局' }
93 106
      }
94 107
    ]
108
  },
109
  {
110
    path: '/access',
111
    component: Layout,
112
    meta: { icon: 'home' },
113
    children: [
114
      {
115
        name: 'access',
116
        path: '',
117
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/access/index.vue'),
118
        meta: { title: '进出记录', icon: 'home' }
119
      }
120
    ]
95 121
  }, {
96 122
    path: '*',
97 123
    hidden: true,

ipu/android-share - Nuosi Git Service

1432 Commits (758a2c20c7f7f478599f1b71520eb78f74061bf6)

Autor SHA1 Nachricht Datum
  zhanglong7 758a2c20c7 添加closeUrl插件 vor 6 Jahren
  lilb3 762e81454f 测试修改 vor 6 Jahren
  zhanglong7 2767f72d59 修复getOfflineCache没传encrypt参数报错的问题 vor 6 Jahren
  zhanglong7 9f684aec09 新增openUrlWithPlug插件 vor 6 Jahren
  zhanglong7 8cc1720910 修改运行时报错,无法访问变量 vor 6 Jahren
  wangyj18 ac8b57f99a sonar 严重修复 vor 6 Jahren
  wangyj18 f68f721250 sonar严重修复 vor 6 Jahren
  wangyj18 604ddbc6c0 sonar嚴重級別 vor 6 Jahren
  wangyj18 b73f32dcec sonar严重修复 vor 6 Jahren
  wangyj18 f58418bd38 sonar严重修复 vor 6 Jahren
  wangyj18 b291ea8304 sonar严重修复 vor 6 Jahren
  wangyj18 2631bf352c sonar 严重修复 vor 6 Jahren
  zhanglong7 978910dbf5 sonar报错修改,限制数组成员的访问权限 vor 6 Jahren
  wangyj18 c5c5b725f8 sonar修复严重 vor 6 Jahren
  wangyj18 ad865fc8c1 sonnar严重级别修复 vor 6 Jahren
  wangyj18 27d0472267 sonar修复严重 vor 6 Jahren
  wuyong3 9287e751ca 修正部分sonar严重 vor 6 Jahren
  wuyong3 9d1e1b5da0 修正ipu-share中的两个严重 vor 6 Jahren
  wuyong3 3c16469891 修改GITignore vor 6 Jahren
  wuyong3 24b25ecb85 修改部分sonar扫描严重 vor 6 Jahren
  zhanglong7 2e0227c87b 代码评审修改 vor 6 Jahren
  leijie e49f8b7a31 修正sonar阻断-客户端网络请求删除同步锁字符串dataAction vor 6 Jahren
  leijie cb113a81bd 修正阻断问题-循环调用流文件未关闭 vor 6 Jahren
  weihf a0da43b40f 引入ipu-cache替换wade-cache,使用ipu-cache的ICache替换ipu-server-web的ICache vor 6 Jahren
  weihf 2a12ef9852 增加display的使用说明 vor 6 Jahren
  zhanglong7 cd630b11e8 去掉插件定义中调用callback的isEscape参数 vor 6 Jahren
  leijie 7dc0cfe899 dataRequest连接异常更新 vor 6 Jahren
  leijie 06850e474a jsAPI 新增headers头字段参数 vor 6 Jahren
  leijie 78adb48532 dataRequest与dataRequestWithHost 新增头字段参数 vor 6 Jahren
  zhanglong7 68da1da24e dataRequest插件增加错误逻辑,捕获异常后,result返回js定义的的X_RESULTCODE vor 6 Jahren
  huangbo 869abe80a6 增加reqUrl的记录 vor 6 Jahren
  huangbo 9753ad45b9 重置工程配置文件 vor 6 Jahren
  huangbo 95a6402476 增加<config name="res_host" value="http://10.0.2.2:8080/res"/> vor 6 Jahren
  zhanglong7 3002ff51ac OpenUrl插件,当只有一个更多项时,用对应的图标代码3个点图标;标题、样式、按钮支持缺省参数 vor 7 Jahren
  zhanglong7 45fc251518 修改openUrl接口 vor 7 Jahren
  zhanglong7 4cd4284ef2 从2.9分支移植OpenRemoteUrl插件,与现有OpenUrl合并 vor 7 Jahren
  leijie 645e337b60 更新MobileCamera,与IOS同步 vor 7 Jahren
  leijie 058f4f86fb 更新获取状态栏高度插件 px转dp vor 7 Jahren
  leijie cccb4541e4 新增状态栏透明及获取高度 vor 7 Jahren
  Administrator 1bcee7111d Merge branch 'master' of http://10.1.235.20:3000/ipu/android-share.git vor 7 Jahren
  Administrator b8d8da15c5 display-server tfs的demo代码提交 vor 7 Jahren
  leijie 75e96a435b 更新ipu-show 插件管理url为测试服务 vor 7 Jahren
  Administrator 1626513dbc checkstyle插件集成,指定自定义ipu_checkstyle.xml路径 vor 7 Jahren
  huangbo dcf79b739f Merge branch 'master' of http://10.1.235.20:3000/ipu/android-share.git vor 7 Jahren
  huangbo 34a58b5204 依赖ipu-mobile-xxx而非wade-mobile-xxx vor 7 Jahren
  leijie d3a710c5fe Merge branch 'master' of http://10.1.235.20:3000/ipu/android-share vor 7 Jahren
  leijie e0ecf68501 更新wade-mobile.js:新增openBrower和openIpuBrower插件 vor 7 Jahren
  miaozy 8d968f85b0 配置测试环境 vor 7 Jahren
  zhanglong7 e957f1aa5e 1、修改其他应用打开IPU时的参数名字 vor 7 Jahren
  chengwb3 ead212c496 ipu-web-libs的pom.xml调整,分生产,测试,开发环境打包 vor 7 Jahren