>
      position: absolute;
116
      left: 0;
117
      top: 0;
118
      width: 100%;
119
      height: 100%;
120
      opacity: 0;
121
      display: flex;
122
      justify-content: center;
123
      align-items: center;
124
      .move{
125
        color: rgb(255, 255, 255);
126
        position: absolute;
127
        top: 12px;
128
        text-align: center;
129
      }
130
      &::before {
131
        content: "";
132
        display: block;
133
        position: absolute;
134
        left: 0;
135
        top: 0;
136
        width: 100%;
137
        height: 100%;
138
        background-color: #00000038;
139
        border-radius: 4px;
140
        opacity: 0.8;
141
      }
142
      &::after {
143
        content: "";
144
        display: none;
145
        position: absolute;
146
        left: 0;
147
        top: 0;
148
        width: 100%;
149
        height: 100%;
150
        background-color: black;
151
        border-radius: 4px;
152
        opacity: 0;
153
      }
154
155
      &>.btn {
156
        color: rgba(255, 255, 255, 0.65);
157
        border-color: rgba(0, 0, 0, 0);
158
        background-color: rgba(0, 0, 0, 0);
159
160
        &:hover {
161
          color: white;
162
          background-color: $brand-primary;
163
        }
164
      }
165
166
      &:hover {
167
        opacity: 1;
168
      }
169
    }
170
171
    &.active &__opt {
172
      opacity: 1;
173
    }
174
175
    &.lock &__opt::after {
176
      display: block;
177
    }
178
179
    .popover {
180
      width: 213px;
181
      background-color: white;
182
      color: rgba(0, 0, 0, 0.65);
183
      position: absolute;
184
      bottom: 12px;
185
      left: 12px;
186
      padding: 16px 20px;
187
      border-radius: 4px;
188
    }
189
190
    .btn-block {
191
      display: flex;
192
      flex-direction: row-reverse;
193
      margin-top: 14px;
194
    }
195
  }
196
197
  .div-footer {
198
    height: 32px;
199
    margin-top: 6px;
200
  }
201
</style>

+ 3 - 3
security-protection-platform/src/modules/system/monitor/index.vue

@ -1,9 +1,9 @@
1 1
<template>
2
<div class="app-monitor">
2
  <div class="app-monitor">
3 3
    <t-tabs :animated="false" class="sys-monitor__tabs">
4 4
      <t-tab-panel label="首页" panel-id="tab-1">
5 5
        <home-page-settings class="sys-attendance__page" />
6
        
6
7 7
      </t-tab-panel>
8 8
      <t-tab-panel label="视频监控" panel-id="tab-2">
9 9
        <video-monitor class="sys-attendance__page" />
@ -55,4 +55,4 @@ export default {
55 55
.sys-attendance__page {
56 56
  padding: 24px 0;
57 57
}
58
</style>
58
</style>

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

@ -0,0 +1,279 @@
1
<template>
2
  <div class="usermana-page">
3
    <t-card class="page-card">
4
      <div class="select-confidtion-box row">
5
        <div class="col-3">公司:
6
          <t-select v-model="companyTypeId" width="200px">
7
            <t-option v-for="item in companyTypesList" :key="item.id" :value="item.id">{{ item.name }}</t-option>
8
          </t-select>
9
        </div>
10
        <div class="col-3">部门:
11
          <t-select v-model="departmentTypeId" width="200px">
12
            <t-option v-for="item in departmentTypesList" :key="item.id" :value="item.id">{{ item.name }}</t-option>
13
          </t-select>
14
        </div>
15
        <div class="col-3">姓名:
16
          <t-select v-model="staffTypeId" width="200px">
17
            <t-option v-for="item in staffTypesList" :key="item.id" :value="item.id">{{ item.name }}</t-option>
18
          </t-select>
19
        </div>
20
        <div class="col-2 offset-1 select-button-box" align="end">
21
          <t-button color="primary" @click="selectHandle">查询</t-button>
22
          <t-button @click="resetData">重置</t-button>
23
        </div>
24
      </div>
25
      <div class="function-button-box">
26
        <t-button color="primary" @click="showAddDeviceModal">
27
          <t-icon icon="plus-circle-outline" size="16"></t-icon>新增
28
        </t-button>
29
        <t-button @click="multDeleteDeviceData">
30
          <t-icon icon="trash" size="16"></t-icon>删除
31
        </t-button>
32
      </div>
33
      <div class="table-box">
34
        <t-table :data="userDataList" line @selection-change="selectChange">
35
          <t-table-column type="selection" width="70"></t-table-column>
36
          <t-table-column prop="name" label="姓名" width="100"></t-table-column>
37
          <t-table-column prop="userId" label="员工编号" width="120"></t-table-column>
38
          <t-table-column prop="companyName" label="公司" width="150"></t-table-column>
39
          <t-table-column prop="departmentName" label="部门" width="150"></t-table-column>
40
          <t-table-column prop="post" label="职务" width="100"></t-table-column>
41
          <t-table-column prop="age" label="年龄" width="80"></t-table-column>
42
          <t-table-column prop="telephone" label="手机" width="120"></t-table-column>
43
          <t-table-column prop="status" label="人脸状态" width="120">
44
            <template v-slot="{row}">
45
              <t-tag v-if="row.status=== 'xxx'" state="primary">待审核</t-tag>
46
              <t-tag v-else state="success">已生效</t-tag>
47
            </template>
48
          </t-table-column>
49
          <t-table-column label="操作">
50
            <template v-slot="{row}">
51
              <a href="javascript:;" style="color:#0089D4;" @click="editDeviceData(row.resourceToolId)">编辑</a>
52
              <a href="javascript:;" style="color:#0089D4;" @click="deleteDeviceData(row)">删除</a>
53
              <a href="javascript:;" style="color:#0089D4;" @click="deleteDeviceData(row)">人脸审核</a>
54
            </template>
55
          </t-table-column>
56
        </t-table>
57
      </div>
58
      <div class="table-pager">
59
        <t-pager :current.sync="page" :total="total" :page-size="limit" :sizer-range="[10,20,50,100]" show-elevator show-sizer @on-size-change="onSizeChange" @on-change="onChange">>
60
        </t-pager>
61
      </div>
62
    </t-card>
63
  </div>
64
</template>
65
66
<script>
67
import sysapi from '@/api/system'
68
export default {
69
70
  data () {
71
    return {
72
      // 公司类型id
73
      companyTypeId: '',
74
      // 公司类型列表
75
      companyTypesList: [],
76
      // 部门类型id
77
      departmentTypeId: '',
78
      // 部门类型列表
79
      departmentTypesList: [],
80
      // 员工类型id
81
      staffTypeId: '',
82
      // 员工类型列表
83
      staffTypesList: [],
84
      // 用户数据列表
85
      userDataList: [],
86
      // 当前页
87
      page: 1,
88
      // 当前页的数据个数
89
      limit: 10,
90
      // 数据总数
91
      total: 100,
92
      // 批量删除的设备id
93
      deleteResourceToolId: [],
94
      // 当前设备数据
95
      currentDeviceData: {},
96
      // 显示/隐藏新增设备对话框
97
      addDeviceModal: false,
98
      currentEditDevice: {}
99
    }
100
  },
101
  created () {
102
    this.getDeviceData()
103
    this.getDeviceTypes()
104
  },
105
  methods: {
106
    // 获取设备列表数据
107
    async getDeviceData () {
108
109
    },
110
    // 向服务器发送请求获取设备类型列表数据
111
    async getDeviceTypes () {
112
      const res = await sysapi.getDeviceTypes()
113
      if (res.status === 200) {
114
        this.companyTypesList = res.data.data
115
      } else {
116
        this.$Message.danger('设备类型列表数据获取失败!')
117
      }
118
    },
119
    // 查询数据
120
    selectHandle () {
121
      this.page = 1
122
      this.getDeviceData()
123
    },
124
    // 重置查询数据
125
    resetData () {
126
      this.page = 1
127
      this.companyTypeId = ''
128
      this.staffTypeId = ''
129
      this.departmentTypeId = ''
130
      this.getDeviceData()
131
    },
132
    // 当前页改变 触发事件
133
    onChange (page) {
134
      this.page = page
135
      this.getDeviceData()
136
    },
137
    // 当前页数据总数改变 触发事件
138
    onSizeChange (pageSize) {
139
      this.limit = pageSize
140
      this.getDeviceData()
141
    },
142
    // 删除数据
143
    deleteDeviceData (row) {
144
      this.$Confirm.confirm({
145
        title: '正在准备删除...',
146
        content: '<p>确定要删除?</p><p>删除后将无法还原!</p>',
147
        ok: async () => {
148
          const res = await sysapi.deleteDeviceData({ resourceToolId: row.resourceToolId })
149
          if (res.status === 200) {
150
            this.getDeviceData()
151
            this.$Message.success('删除成功!')
152
          } else {
153
            this.$Message.danger('删除失败!')
154
          }
155
        },
156
        cancel: () => {
157
          this.$Message.info('已取消删除!')
158
        }
159
      })
160
    },
161
    // 当复选框发生改变时 触发事件
162
    selectChange (data) {
163
      const arr = []
164
      data.forEach(item => arr.push(item.resourceToolId))
165
      this.deleteResourceToolId = arr
166
    },
167
    // 批量删除数据
168
    multDeleteDeviceData () {
169
      if (this.deleteResourceToolId.length === 0) {
170
        return this.$Message.warning('请选择要删除的数据!')
171
      }
172
      this.$Confirm.confirm({
173
        title: '正在准备删除...',
174
        content: '<p>确定要删除?</p><p>删除后将无法还原!</p>',
175
        ok: async () => {
176
          const res = await sysapi.deleteDeviceData({ resourceToolId: this.deleteResourceToolId })
177
          if (res.status === 200) {
178
            this.getDeviceData()
179
            this.$Message.success('删除成功!')
180
          } else {
181
            this.$Message.danger('删除失败!')
182
          }
183
        },
184
        cancel: () => {
185
          this.$Message.info('已取消删除!')
186
        }
187
      })
188
    },
189
    // 获取设备详情数据
190
    async getDeviceInfo (id) {
191
      const res = await sysapi.getDeviceInfo(id)
192
      if (res.status === 200) {
193
        this.currentDeviceData = res.data
194
      } else {
195
        this.$Message.danger('设备详情数据获取失败!')
196
      }
197
    },
198
    // 显示新增设备对话框
199
    showAddDeviceModal () {
200
      this.addDeviceModal = true
201
    },
202
    async editDeviceData (id) {
203
      const res = await sysapi.getDeviceInfo(id)
204
      if (res.status === 200) {
205
        this.currentEditDevice = res.data
206
      } else {
207
        this.$Message.danger('设备数据获取失败!')
208
      }
209
      this.addDeviceModal = true
210
    }
211
  }
212
}
213
</script>
214
215
<style lang="scss">
216
.usermana-page {
217
  .card-block {
218
    padding: 0px 24px !important;
219
  }
220
  .tabs {
221
    overflow: inherit;
222
  }
223
  .tabs-list {
224
    .tabs-list__content {
225
      display: flex;
226
      justify-content: flex-end;
227
      margin-top: -10px;
228
      .tabs-list__nav {
229
        height: 32px;
230
        line-height: 16px;
231
      }
232
    }
233
    .tabs-tab {
234
      margin: 0;
235
      padding: 0 25px;
236
      font-size: 14px;
237
    }
238
    .tabs-tab.checked {
239
      border-bottom: 3px solid #2d98ff;
240
    }
241
  }
242
  .select-button-box {
243
    padding: 0;
244
    button {
245
      margin-left: 5px;
246
    }
247
  }
248
  .select-confidtion-box {
249
    margin: 24px 0;
250
    .col-3 {
251
      padding: 0;
252
    }
253
  }
254
  .function-button-box {
255
    line-height: 32px;
256
    button {
257
      margin-right: 12px;
258
      i {
259
        line-height: 32px;
260
        margin-right: 8px;
261
      }
262
    }
263
    a {
264
      color: #0089d4;
265
      i {
266
        line-height: 32px !important;
267
        margin-left: 4px;
268
      }
269
    }
270
  }
271
  .table-box {
272
    margin: 20px 0;
273
  }
274
  .table-pager {
275
    display: flex;
276
    justify-content: flex-end;
277
  }
278
}
279
</style>

+ 218 - 0
security-protection-platform/src/modules/videoSurveillance/components/ReplayDialog/index.vue

@ -0,0 +1,218 @@
1
<template>
2
  <t-modal :visibled.sync="visible" :header-visibled="false" :footer-visibled="false" :no-padding="true" width="50%">
3
    <div class="replayer">
4
      <div class="replayer-list">
5
        <div class="date-select-box row-12">
6
          <div class="col-12">
7
            <t-date-picker v-model="beginDay" type="dateTime" style="width:200px" placeholder="请选择开始时间"></t-date-picker>
8
          </div>
9
          <div class="col-12">
10
            <t-date-picker v-model="endDay" type="dateTime" style="width:200px" placeholder="请选择结束时间"></t-date-picker>
11
          </div>
12
          <div class="col-12 button-box" align="end">
13
            <t-button color="primary" @click="getData">查询</t-button>
14
            <t-button @click="resetData">重置</t-button>
15
          </div>
16
        </div>
17
        <t-tabs v-if="isShow" v-model="currentTab" mode="scrollY" orientation="vertical" width="100%" @change="handleTabChange">
18
          <t-tab-panel v-for="item in list" :key="item.fileId" :label="item.fileName" :panel-id="item.fileId" />
19
        </t-tabs>
20
      </div>
21
22
      <div class="replayer-video">
23
        <t-loading v-model="loadVideo">
24
          <span class="text-md text-info">获取视频资源...</span>
25
        </t-loading>
26
        <video-player :sources="videoList" :autoadvance="0" :style="{'width':'100%',opacity: loadVideo ? 0: 1}" @player-inited="handlePlayerInited" @playlistitem="handlePlayerCurrentChange" />
27
      </div>
28
    </div>
29
  </t-modal>
30
</template>
31
32
<script>
33
import VideoPlayer from '@/components/VideoPlayer'
34
import formatDateTime from '@/utils/formatDateTime.js'
35
import sysapi from '@/api/videoSurveillance'
36
37
export default {
38
  filters: {
39
    formatDateTime
40
  },
41
  components: { VideoPlayer },
42
  props: {
43
    // 视频列表
44
    list: {
45
      type: Array,
46
      default: () => []
47
    },
48
    // 是否显示对话框
49
    visibled: {
50
      type: Boolean,
51
      default: false
52
    }
53
  },
54
  data () {
55
    return {
56
      // 当前的tab标签
57
      currentTab: null,
58
      loadVideo: false,
59
      // 视频列表
60
      videoList: [],
61
      // 视频播放器对象
62
      $player: null,
63
      // 开始时间
64
      beginDay: '2020-12-19 20:14:00',
65
      // 结束时间
66
      endDay: '2020-12-19 20:14:59',
67
      isShow: true
68
    }
69
  },
70
  computed: {
71
    visible: {
72
      get () { return this.visibled },
73
      set (val) {
74
        if (!val) this.$player.pause()
75
        this.$emit('update:visibled', val)
76
      }
77
    }
78
  },
79
  watch: {
80
    list: {
81
      handler (val) {
82
        this.list = val
83
        // 利用v-if刷新tab组件
84
        this.reload()
85
        console.warn(`list Change`)
86
        this.resetVideoList()
87
        if (val.length > 0) {
88
          this.currentTab = val[0].fileId
89
          // 手动触发第一个tab点击事件
90
          this.handleTabChange(null, 0)
91
        }
92
      },
93
      immediate: true
94
    }
95
  },
96
  methods: {
97
    // 初始化视频
98
    handlePlayerInited (player) {
99
      this.$player = player
100
      window.player = this
101
    },
102
    async handleTabChange (name, index) {
103
      this.$player.pause()
104
      await this.preloadOriVideoUrl(index)
105
      this.play(index)
106
    },
107
    handlePlayerCurrentChange (e, item) {
108
      const { index, fileId } = item
109
      this.currentTab = fileId
110
      this.preloadOriVideoUrl(index)
111
    },
112
    resetVideoList () {
113
      const videoList = this.list.map((item, index) => {
114
        const { fileId } = item
115
        const fileType = 'video/' + item.fileType
116
        return {
117
          index,
118
          fileId,
119
          fileType,
120
          loaded: false
121
        }
122
      })
123
124
      this.videoList = videoList
125
    },
126
    play (index) {
127
      console.log(`播放:index=${index}`)
128
      // 调用额外的currentItem方法以避免currentItem在首次不生效
129
      // https://github.com/brightcove/videojs-playlist/blob/master/docs/api.md
130
      this.$player.playlist.currentItem()
131
      this.$player.playlist.currentItem(index)
132
      this.$player.play()
133
    },
134
    /**
135
   *  从index开始预载videoList的视频地址
136
   *  此方法将在获取index对应的地址后就立即返回
137
   */
138
    preloadOriVideoUrl (index = 0, maxLength = 5) {
139
      return new Promise((resolve, reject) => {
140
        for (let i = index; i in this.videoList && i - index < maxLength; i++) {
141
          console.log(`预载地址:index=${i}`)
142
          const item = this.videoList[i]
143
          const task = item.loaded
144
            ? Promise.resolve()
145
            : this.getOriVideoUrl(item.fileId).then(resp => {
146
              console.log(`预载完成,更新播放源:index=${i}`)
147
              item.loaded = true
148
              item.sources = [{
149
                src: resp.url,
150
                type: item.fileType
151
              }]
152
            })
153
          if (i === index) {
154
            this.loadVideo = !item.loaded
155
            task.then(() => {
156
              resolve()
157
            }).finally(() => {
158
              this.loadVideo = false
159
            })
160
          }
161
        }
162
      })
163
    },
164
    /*
165
   * 获取真实视频地址
166
   */
167
    async getOriVideoUrl (fileId) {
168
      const res = await sysapi.getFileUrl(fileId)
169
      // fake
170
      return new Promise((resolve, reject) => {
171
        setTimeout(() => {
172
          const url = res.data.data.fileUrl
173
          resolve({
174
            url
175
          })
176
        }, 1000)
177
      })
178
    },
179
    getData () {
180
      this.$emit('get-list', { beginDay: this.beginDay, endDay: this.endDay })
181
    },
182
    resetData () {
183
      this.beginDay = formatDateTime(new Date(+new Date() - 10 * 60 * 1000), 'yyyy-MM-dd hh:mm:ss')
184
      this.endDay = formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss')
185
      // this.getData()
186
    },
187
    // 刷新组件
188
    reload () {
189
      this.isShow = false
190
      this.$nextTick(() => {
191
        this.isShow = true
192
      })
193
    }
194
  }
195
}
196
</script>
197
198
<style lang="scss">
199
.replayer {
200
  display: flex;
201
202
  &-list {
203
    margin-right: 20px;
204
    // width: 200px;
205
    .date-select-box {
206
      margin-top: 15px;
207
      > div {
208
        margin-bottom: 15px;
209
      }
210
    }
211
  }
212
213
  &-video {
214
    position: relative;
215
    flex: auto;
216
  }
217
}
218
</style>

+ 162 - 0
security-protection-platform/src/modules/videoSurveillance/components/rtmpVideoPlay/index.vue

@ -0,0 +1,162 @@
1
<template>
2
  <div class="replayer">
3
    <div class="replayer-video">
4
      <t-loading v-model="loadVideo">
5
        <span class="text-md text-info">获取视频资源...</span>
6
      </t-loading>
7
      <video-player :sources="videoList" :autoadvance="0" :style="{opacity: loadVideo ? 0: 1}" @player-inited="handlePlayerInited" @playlistitem="handlePlayerCurrentChange" />
8
    </div>
9
  </div>
10
</template>
11
12
<script>
13
import VideoPlayer from '@/components/VideoPlayer'
14
15
export default {
16
  components: { VideoPlayer },
17
  props: {
18
    list: {
19
      type: Array,
20
      default: () => []
21
    },
22
    visibled: {
23
      type: Boolean,
24
      default: false
25
    }
26
  },
27
  data () {
28
    return {
29
      currentTab: null,
30
      loadVideo: false,
31
      videoList: [],
32
      $player: null
33
    }
34
  },
35
  computed: {
36
    visible: {
37
      get () { return this.visibled },
38
      set (val) {
39
        if (!val) this.$player.pause()
40
        this.$emit('update:visibled', val)
41
      }
42
    }
43
  },
44
  watch: {
45
    list: {
46
      handler (val) {
47
        console.warn(`list Change`)
48
        this.resetVideoList()
49
        if (val.length > 0) {
50
          this.currentTab = val[0].fileId
51
          // 手动触发第一个tab点击事件
52
          this.handleTabChange(null, 0)
53
        }
54
      },
55
      immediate: true
56
    }
57
  },
58
  methods: {
59
    // 初始化
60
    handlePlayerInited (player) {
61
      this.$player = player
62
      window.player = this
63
      var myButton = player.controlBar.addChild('button')
64
      myButton.addClass('vjs-play-control')
65
      myButton.on('click', () => {
66
        this.$emit('videoReplay', this.list[0].id)
67
      })
68
    },
69
    async handleTabChange (name, index) {
70
      this.$player.pause()
71
      await this.preloadOriVideoUrl(index)
72
      this.play(index)
73
    },
74
    handlePlayerCurrentChange (e, item) {
75
      const { index, fileId } = item
76
      this.currentTab = fileId
77
      this.preloadOriVideoUrl(index)
78
    },
79
    resetVideoList () {
80
      const videoList = this.list.map((item, index) => {
81
        const { fileId, fileType } = item
82
        return {
83
          index,
84
          fileId,
85
          fileType,
86
          loaded: false
87
        }
88
      })
89
90
      this.videoList = videoList
91
    },
92
    play (index) {
93
      console.log(`播放:index=${index}`)
94
      // 调用额外的currentItem方法以避免currentItem在首次不生效
95
      // https://github.com/brightcove/videojs-playlist/blob/master/docs/api.md
96
      this.$player.playlist.currentItem()
97
      this.$player.playlist.currentItem(index)
98
      this.$player.play()
99
    },
100
    /**
101
     *  从index开始预载videoList的视频地址
102
     *  此方法将在获取index对应的地址后就立即返回
103
     */
104
    preloadOriVideoUrl (index = 0, maxLength = 5) {
105
      return new Promise((resolve, reject) => {
106
        for (let i = index; i in this.videoList && i - index < maxLength; i++) {
107
          console.log(`预载地址:index=${i}`)
108
          const item = this.videoList[i]
109
          const task = item.loaded
110
            ? Promise.resolve()
111
            : this.getOriVideoUrl(item.fileId).then(resp => {
112
              console.log(`预载完成,更新播放源:index=${i}`)
113
              item.loaded = true
114
              item.sources = [{
115
                src: resp.url,
116
                type: item.fileType
117
              }]
118
            })
119
          if (i === index) {
120
            this.loadVideo = !item.loaded
121
            task.then(() => {
122
              resolve()
123
            }).finally(() => {
124
              this.loadVideo = false
125
            })
126
          }
127
        }
128
      })
129
    },
130
    /*
131
     * 获取真实视频地址
132
     */
133
    getOriVideoUrl (fileId) {
134
      console.log(`请求地址:${fileId}`)
135
      // fake
136
      return new Promise((resolve, reject) => {
137
        setTimeout(() => {
138
          const url = fileId || 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1'
139
          resolve({
140
            url
141
          })
142
        }, 1000)
143
      })
144
    }
145
  }
146
}
147
</script>
148
149
<style lang="scss">
150
.replayer {
151
  display: flex;
152
  &-list {
153
    margin-right: 20px;
154
    // width: 200px;
155
  }
156
157
  &-video {
158
    position: relative;
159
    flex: auto;
160
  }
161
}
162
</style>

+ 172 - 173
security-protection-platform/src/modules/videoSurveillance/index.vue

@ -1,55 +1,46 @@
1 1
<template>
2 2
  <div class="page-main">
3 3
    <t-button-group class="top-btn">
4
      <t-button :color="tabType === 'gate' ? 'primary' : 'secondary'" @click="tabClick('gate')">风场大门</t-button>
5
      <t-button :color="tabType === 'room' ? 'primary' : 'secondary'" @click="tabClick('room')">集控室</t-button>
4
      <t-button v-for="(item,index) in sceneList" :key="index"
5
                :value="item.monitorSceneId"
6
                :color="item.monitorSceneId === selectedMonitorScene ? 'primary' : 'secondary'"
7
                @click="tabClick(item.monitorSceneId)">
8
        {{ item.monitorSceneName }}
9
      </t-button>
6 10
    </t-button-group>
7 11
    <div class="page-top">
8 12
      <span>风场:</span>
9
      <t-select v-model="gateFieldData" @change="getWindFieldData">
10
        <t-option v-for="(item,index) in organizationList" :key="index" :value="item.id">{{ item.org }}</t-option>
13
      <t-select v-model="gateFieldData" clearable @change="getSceneList()">
14
        <t-option v-for="(item,index) in organizationList" :key="index" :value="item.id">{{ item.name }}</t-option>
11 15
      </t-select>
12 16
    </div>
13
    <div v-if="tabType==='gate'" >
14
      <div class="page-bottom">
15
        <t-card v-for="(item,index) in gateList" :key="index" :class="index%3===0?'card-video-first':'card-video'">
16
          <img :src="item.url" class="card-image">
17
          <div slot="foot" class="bottom">
18
            <span v-tooltip="item.videoDetail">{{ item.videoDetail.content | handleText }}</span>
19
            <div style="margin-left:auto">
20
              <t-button v-tooltip="item.options1" class="bottom-btn" @click="goDistinguishRecord(item.videoId)"><t-icon size="16" icon="image-outline"></t-icon></t-button>
21
              <t-button v-tooltip="item.options2" class="bottom-btn"><t-icon size="16" icon="piechart-outline"></t-icon></t-button>
22
              <t-button v-tooltip="item.options3" class="bottom-btn"><t-icon size="16" icon="arrow-expand-all-outline"></t-icon></t-button>
23
            </div>
24
          </div>
25
        </t-card>
17
    <div class="page-bottom">
18
      <div v-for="(item,index) in videoList" :key="index" :value="item.id" style="width:400px;margin:24px 0px 0 24px;">
19
        <rtmp-video :list="getVideoPlayList(item)" @videoReplay="handleReview"></rtmp-video>
26 20
      </div>
27
      <t-pager :page-size="gatePageSize" :current="gateCurrent" :total="gateTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
28
    </div>
29
    <div v-if="tabType==='room'" >
30
      <div class="page-bottom">
31
        <t-card v-for="(item,index) in roomList" :key="index" :class="index%3===0?'card-video-first':'card-video'">
32
          <img :src="item.url" class="card-image">
33
          <div slot="foot" class="bottom">
34
            <span v-tooltip="item.videoDetail">{{ item.videoDetail.content | handleText }}</span>
35
            <div style="margin-left:auto">
36
              <t-button v-tooltip="item.options1" class="bottom-btn" @click="goDistinguishRecord(item.videoId)"><t-icon size="16" icon="image-outline"></t-icon></t-button>
37
              <t-button v-tooltip="item.options2" class="bottom-btn"><t-icon size="16" icon="piechart-outline"></t-icon></t-button>
38
              <t-button v-tooltip="item.options3" class="bottom-btn"><t-icon size="16" icon="arrow-expand-all-outline"></t-icon></t-button>
39
            </div>
40
          </div>
41
        </t-card>
42
      </div>
43
      <t-pager :page-size="roomPageSize" :current="roomCurrent" :total="roomTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeRoom"></t-pager>
44 21
    </div>
22
    <t-pager :page-size="videoPageSize" :current="videoCurrent" :total="videoTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
23
    <replay-dialog :list="replayList" :visibled.sync="showReplayDialog" @get-list="queryMonitorVideoLog" />
45 24
  </div>
46 25
</template>
47 26
<script>
48 27
import sysapi from '@/api/videoSurveillance'
49
import commonapi from '@/api/common'
28
import RtmpVideo from './components/rtmpVideoPlay'
29
import ReplayDialog from './components/ReplayDialog'
30
import VideoPlayer from '@/components/VideoPlayer'
31
import formatDateTime from '@/utils/formatDateTime.js'
32
import videojs from 'video.js'
33
window.videojs = videojs
34
35
require('videojs-flash')
36
require('videojs-playlist')
37
require('video.js/dist/lang/zh-CN.js')
38
require('video.js/dist/video-js.min.css')
39
50 40
export default {
41
  components: { ReplayDialog, VideoPlayer, RtmpVideo },
51 42
  filters: {
52
    handleText(value) {
43
    handleText (value) {
53 44
      if (!value) return ''
54 45
      if (value.length > 13) {
55 46
        return value.slice(0, 13) + '...'
@ -57,179 +48,187 @@ export default {
57 48
      return value
58 49
    }
59 50
  },
60
  data() {
51
  data () {
61 52
    return {
62
      gateCurrent: 1, // 大门分页数据
63
      gatePageSize: 10, // 大门分页数据
64
      gateTotal: 100, // 大门分页总数
65
      roomCurrent: 1, // 集控室分页数据
66
      roomPageSize: 10, // 集控室分页数据
67
      roomTotal: 100, // 集控室分页总数
68
      tabType: 'gate',
53
      videoCurrent: 1, // 大门分页数据
54
      videoPageSize: 10, // 大门分页数据
55
      videoTotal: 100, // 大门分页总数
56
      tabId: 1,
57
      paramsObj: { // 接口请求数据
58
        page: 0,
59
        limit: 10
60
      },
69 61
      organizationList: [], // 风场数据
70
      gateFieldData: 101101,
71
      gateList: [],
72
      roomList: []
62
      gateFieldData: '',
63
      videoList: [], // 场景数据列表
64
      sceneList: [], // 场景列表
65
      selectedMonitorScene: '', // 当前选择场景
66
      videoPlayList: [],
67
      showReplayDialog: false,
68
      replayList: [],
69
      beginDay: formatDateTime(new Date(+new Date() - 10 * 60 * 1000), 'yyyy-MM-dd hh:mm:ss'),
70
      endDay: formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss')
71
      // beginDay: '2020-12-19 20:14:00',
72
      // endDay: '2020-12-19 20:14:00'
73 73
    }
74 74
  },
75
  mounted() {
75
  mounted () {
76 76
    this.getWindFiledList() // 获取风场列表
77
    this.getWindFieldData()
78
    this.getCenterRoomData()
79 77
  },
80 78
  methods: {
81
    tabClick(name) {
82
      this.gateFieldData = ''
83
      this.gateCurrent = 1
84
      this.roomCurrent = 1
85
      if (name === 'gate') {
86
        this.tabType = 'gate'
79
    getVideoPlayList (item) {
80
      return [{
81
        fileId: item.videoUrl,
82
        fileType: 'rtmp/flv',
83
        id: item.resourceToolId
84
      }]
85
    },
86
    // 获取场景列表
87
    getSceneList () {
88
      this.sceneList = []
89
      this.videoList = []
90
      console.log(this.organizationList)
91
      this.organizationList.forEach((element, index) => {
92
        if (element.id === this.gateFieldData) {
93
          sysapi.getMonitorScene(this.organizationList[index].id).then((resp) => {
94
            this.sceneList = resp.data.data || []
95
            this.tabClick(this.sceneList[0].monitorSceneId)
96
          })
97
        }
98
      })
99
    },
100
    // 向服务器发送请求获取视频回放数据
101
    async queryMonitorVideoLog (data) {
102
      let res = []
103
      // console.log(this.beginDay, this.endDay)
104
      if (data) {
105
        res = await sysapi.queryMonitorVideoLog({ params: { id: this.replayId, ...data } })
106
      } else {
107
        res = await sysapi.queryMonitorVideoLog({ params: { id: this.replayId, beginDay: this.beginDay, endDay: this.endDay } })
108
      }
109
      if (res.status === 200) {
110
        this.replayList = res.data.data
87 111
      } else {
88
        this.tabType = 'room'
112
        this.$Message.danger('视频列表数据获取失败!')
89 113
      }
90 114
    },
91
    getWindFiledList() {
92
      commonapi.getDepartments().then(resp => {
93
        this.organizationList = []
94
        console.log(resp)
95
        this.organizationList = resp.data.map(item => {
96
          return {
97
            org: item.name,
98
            id: item.id
99
          }
100
        })
115
    // 显示视频回放对话框
116
    handleReview (id) {
117
      this.replayId = id
118
      this.queryMonitorVideoLog()
119
      this.showReplayDialog = true
120
    },
121
    // 切换场景
122
    async tabClick (id) {
123
      this.selectedMonitorScene = id
124
      this.paramsObj.page = 0
125
      this.videoList = []
126
      this.tabId = id
127
      this.videoCurrent = 1
128
      this.getVideoSurveillanceData(id)
129
    },
130
    // 获取风场下拉框列表
131
    async getWindFiledList () {
132
      sysapi.getDepartments().then(resp => {
133
        this.organizationList = resp.data.data
134
        this.gateFieldData = this.organizationList[0].id
135
        this.getSceneList()
101 136
      }, err => {
102 137
        this.$Message.danger('获取风场列表失败!')
103 138
        console.log(err)
104 139
      })
105 140
    },
106 141
    // 获得风场大门数据
107
    getWindFieldData() {
108
      let obj = {
109
        page: this.gateCurrent,
110
        limit: this.gatePageSize
111
      }
112
      sysapi.getGateFieldData({params: obj}).then(res => {
113
        this.gateList = res.data.data
114
        this.gateTotal = res.data.total
115
        this.gateList.forEach(element => {
116
          const txt = element.videoDetail
117
          element.videoDetail = {}
118
          element.videoDetail.content = txt
119
          element.videoDetail.placement = 'top'
120
        })
142
    getVideoSurveillanceData (id) {
143
      this.paramsObj.page = this.videoCurrent
144
      sysapi.getVideoSurveillanceData({ params: { monitorSceneId: id } }).then(res => {
145
        this.videoList = res.data.data
121 146
      })
122 147
    },
123
    // 获得集控室数据
124
    getCenterRoomData() {
125
      let obj = {
126
        page: this.roomCurrent,
127
        limit: this.roomPageSize
128
      }
129
      sysapi.getCenterRoomData({params: obj}).then(res => {
130
        this.roomList = res.data.data
131
        this.roomTotal = res.data.total
132
        this.roomList.forEach(element => {
133
          const txt = element.videoDetail
134
          element.videoDetail = {}
135
          element.videoDetail.content = txt
136
          element.videoDetail.placement = 'top'
137
        })
138
      })
139
    },
140
    // 集控室分页
141
    onChangeRoom (val) {
142
      this.roomCurrent = val
143
      this.getCenterRoomData()
144
    },
145 148
    // 进入识别记录界面
146
    goDistinguishRecord(id) {
147
      this.$router.push({path: '/videoSurveillance/distinguishRecord', query: {videoId: id}})
149
    goDistinguishRecord (id) {
150
      this.$router.push({ path: '/videoSurveillance/distinguishRecord', query: { videoId: id } })
148 151
    },
149 152
    // 风场大门分页
150
    onChangeGate(val) {
151
      this.gateCurrent = val
152
      this.getWindFieldData()
153
    onChangeGate (val) {
154
      this.videoList = []
155
      this.videoCurrent = val
153 156
    }
154 157
  }
155 158
}
156 159
</script>
157 160
<style lang="scss" scoped>
158
.page-main{
159
    padding:30px 24px 24px 24px;
160
    .top-btn{
161
        float: right;
162
    }
163
    .page-bottom{
164
        display: flex;
161
.page-main {
162
  padding: 30px 24px 24px 24px;
163
  .top-btn {
164
    float: right;
165
  }
166
  .page-bottom {
167
    display: flex;
168
    width: 100%;
169
    flex-wrap: wrap;
170
    margin-left: -24px;
171
    .card-video-first,
172
    .card-video {
173
      width: 354px;
174
      height: 240px;
175
      margin-top: 20px;
176
      .card-image {
165 177
        width: 100%;
166
        flex-wrap: wrap;
167
        .card-video-first, .card-video{
168
          width:397px;
169
          margin-top: 20px;
170
          height:245px;
171
            .card-image{
172
                width: 100%;
173
                height: 100%;
174
            }
175
            .bottom{
176
                padding: 0 12px;
177
                display: flex;
178
                align-items: center;
179
                background-color: rgba(0, 0, 0, 0.5);
180
                height: 40px;
181
                color: #fff;
182
                font-size: 14px;
183
                .bottom-btn{
184
                    color: #fff;
185
                    border: none;
186
                    padding:0 !important;
187
                    &:hover{
188
                        color: #0089d4;
189
                    }
190
                }
191
            }
192
        }
193
        .card-video-first{
194
          .card-footer{
195
             padding: 0px !important;
196
             background: none;
197
             width: 100%;
198
             position: absolute;
199
             border-top: none;
200
             bottom: 0px;
201
             }
202
            .card-block{
203
              padding:0 !important;
204
            }
205
        }
206
        .card-video{
207
          .card-footer{
208
             padding: 0px 0 0 24px !important;
209
             background: none;
210
             width: 100%;
211
             position: absolute;
212
             border-top: none;
213
             bottom: 0px;
214
             }
215
            .card-block, .card-video-block{
216
              margin-left: 24px;
217
              padding:0 !important;
218
            }
178
        height: 100%;
179
      }
180
      .bottom {
181
        padding: 0 12px;
182
        display: flex;
183
        align-items: center;
184
        background-color: rgba(0, 0, 0, 0.5);
185
        height: 40px;
186
        color: #fff;
187
        font-size: 14px;
188
        .bottom-btn {
189
          color: #fff;
190
          border: none;
191
          padding: 0 !important;
192
          &:hover {
193
            color: #0089d4;
194
          }
219 195
        }
196
      }
220 197
    }
221
    .pager{
198
    .card-video {
199
      .card-footer {
200
        padding: 0px 0 0 24px !important;
201
        background: none;
202
        width: 100%;
203
        position: absolute;
204
        border-top: none;
205
        bottom: 0px;
206
      }
207
      .card-block,
208
      .card-video-block {
209
        margin-left: 24px;
210
        padding: 0 !important;
211
      }
212
    }
213
  }
214
  .pager {
222 215
    margin-right: auto;
223 216
    margin: 21px 0px 24px 0;
224 217
    float: right;
225 218
  }
226
.btn-primary, .radio-group-button .form-radio:checked, .radio-group-button .form-radio[checked]{
219
  .btn-primary,
220
  .radio-group-button .form-radio:checked,
221
  .radio-group-button .form-radio[checked] {
227 222
    color: #0089d4;
228 223
    background-color: #fff;
229 224
    border: 1px solid #0089d4;
230
}
231
.btn-secondary, .radio-group-button .form-radio, .checkbox-group--button .form-checkbox .form-checkbox__inner, .btn-dashed-secondary, .btn-outline-secondary{
225
  }
226
  .btn-secondary,
227
  .radio-group-button .form-radio,
228
  .checkbox-group--button .form-checkbox .form-checkbox__inner,
229
  .btn-dashed-secondary,
230
  .btn-outline-secondary {
232 231
    background: none;
233
}
232
  }
234 233
}
235 234
</style>

+ 4 - 4
security-protection-platform/src/modules/workorder/components/modal/approvalmodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="approval-modal-title">工单审批</div>
5 5
    </template>
@ -20,8 +20,8 @@
20 20
    <t-form ref="approvalModalForm" :model="approvalModalForm" :rules="approvalModalFormRules" :label-span="2" label-position="right">
21 21
      <t-form-item label="审批结果:" prop="result">
22 22
        <t-radio-group v-model="approvalModalForm.result">
23
          <t-radio label="0">同意</t-radio>
24
          <t-radio label="1">拒绝</t-radio>
23
          <t-radio label="1">同意</t-radio>
24
          <t-radio label="0">拒绝</t-radio>
25 25
        </t-radio-group>
26 26
      </t-form-item>
27 27
      <t-form-item label="审批意见:" prop="comments">
@ -98,7 +98,6 @@ export default {
98 98
      this.$refs['approvalModalForm'].validate((valid) => {
99 99
        if (valid) {
100 100
          this.addApprovalData()
101
          this.$emit('refresh-all-data')
102 101
        } else {
103 102
          this.loadingSubmit = false
104 103
          console.log('error--------->请输入完整的表单信息!')
@ -111,6 +110,7 @@ export default {
111 110
      const res = await workOrderApi.addApprovalData(this.approvalModalForm)
112 111
      if (res.status === 200) {
113 112
        this.resetModalData()
113
        this.$emit('refresh-all-data')
114 114
        this.$Message.success('操作成功!')
115 115
      } else {
116 116
        this.$Message.danger('操作失败!')

+ 2 - 2
security-protection-platform/src/modules/workorder/components/modal/cardreplacementmodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="cardReplacementModal" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="cardReplacementModal" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="card-modal-title">新增补卡</div>
5 5
    </template>
@ -92,7 +92,6 @@ export default {
92 92
      this.$refs['cardReplacementModalForm'].validate((valid) => {
93 93
        if (valid) {
94 94
          this.addCardReplacementData()
95
          this.$emit('refresh-data')
96 95
        } else {
97 96
          console.log('error--------->请输入完整的表单信息!')
98 97
          this.loadingSubmit = false
@ -112,6 +111,7 @@ export default {
112 111
        if (res.data.fail) {
113 112
          this.$Message.warning(res.data.fail)
114 113
        } else {
114
          this.$emit('refresh-data')
115 115
          this.$Message.success('提交成功!')
116 116
        }
117 117
      } else {

+ 4 - 3
security-protection-platform/src/modules/workorder/components/modal/fieldservicemodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="fieldServiceModal" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="fieldServiceModal" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="field-modal-title">新增外勤</div>
5 5
    </template>
@ -115,7 +115,6 @@ export default {
115 115
      this.$refs['fieldServiceModalForm'].validate((valid) => {
116 116
        if (valid) {
117 117
          this.addFieldServiceData()
118
          this.$emit('refresh-data')
119 118
        } else {
120 119
          console.log('error--------->请输入完整的表单信息!')
121 120
          this.loadingSubmit = false
@ -143,6 +142,7 @@ export default {
143 142
        if (res.data.fail) {
144 143
          this.$Message.warning(res.data.fail)
145 144
        } else {
145
          this.$emit('refresh-data')
146 146
          this.$Message.success('提交成功!')
147 147
        }
148 148
      } else {
@ -155,7 +155,7 @@ export default {
155 155
      if (startDate && endDate) {
156 156
        const start = +new Date(startDate)
157 157
        const end = +new Date(endDate)
158
        return (end - start) / (24 * 60 * 60 * 1000)
158
        return (end - start) / (24 * 60 * 60 * 1000) + 1
159 159
      } else {
160 160
        return 0
161 161
      }
@ -163,6 +163,7 @@ export default {
163 163
    // 计算结束时间
164 164
    calEndTime (startDate, duration) {
165 165
      if (startDate && duration) {
166
        duration = duration - 1
166 167
        const endDate = formatDateTime(new Date(+new Date(startDate) + (duration * 24 * 60 * 60 * 1000)))
167 168
        return endDate
168 169
      } else {

+ 1 - 1
security-protection-platform/src/modules/workorder/components/modal/importworkordermodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="leave-modal-title">导入工单</div>
5 5
    </template>

+ 4 - 3
security-protection-platform/src/modules/workorder/components/modal/leavemodal.vue

@ -1,6 +1,6 @@
1 1
<template>
2 2
  <!-- 请假对话框 -->
3
  <t-modal :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
3
  <t-modal :visibled.sync="visibled" :mask-closable="false" :closable="false" width="600px" height="500px">
4 4
    <template slot="header">
5 5
      <div class="leave-modal-title">新增请假</div>
6 6
    </template>
@ -113,7 +113,6 @@ export default {
113 113
      this.$refs['leaveModalForm'].validate((valid) => {
114 114
        if (valid) {
115 115
          this.addLeaveData()
116
          this.$emit('refresh-data')
117 116
        } else {
118 117
          console.log('error--------->请输入完整的表单信息!')
119 118
          this.loadingSubmit = false
@ -141,6 +140,7 @@ export default {
141 140
        if (res.data.fail) {
142 141
          this.$Message.warning(res.data.fail)
143 142
        } else {
143
          this.$emit('refresh-data')
144 144
          this.$Message.success('提交成功!')
145 145
        }
146 146
      } else {
@ -153,7 +153,7 @@ export default {
153 153
      if (startDate && endDate) {
154 154
        const start = +new Date(startDate)
155 155
        const end = +new Date(endDate)
156
        return (end - start) / (24 * 60 * 60 * 1000)
156
        return (end - start) / (24 * 60 * 60 * 1000) + 1
157 157
      } else {
158 158
        return 0
159 159
      }
@ -161,6 +161,7 @@ export default {
161 161
    // 计算结束时间
162 162
    calEndTime (startDate, duration) {
163 163
      if (startDate && duration) {
164
        duration = duration - 1
164 165
        const endDate = formatDateTime(new Date(+new Date(startDate) + (duration * 24 * 60 * 60 * 1000)))
165 166
        return endDate
166 167
      } else {

+ 4 - 3
security-protection-platform/src/modules/workorder/components/modal/overtimemodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="overtimeModal" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="overtimeModal" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="work-modal-title">新增加班</div>
5 5
    </template>
@ -102,7 +102,6 @@ export default {
102 102
      this.$refs['overtimeModalForm'].validate((valid) => {
103 103
        if (valid) {
104 104
          this.addWorkOverTimeData()
105
          this.$emit('refresh-data')
106 105
        } else {
107 106
          console.log('error--------->请输入完整的表单信息!')
108 107
          this.loadingSubmit = false
@ -130,6 +129,7 @@ export default {
130 129
        if (res.data.fail) {
131 130
          this.$Message.warning(res.data.fail)
132 131
        } else {
132
          this.$emit('refresh-data')
133 133
          this.$Message.success('提交成功!')
134 134
        }
135 135
      } else {
@ -142,7 +142,7 @@ export default {
142 142
      if (startDate && endDate) {
143 143
        const start = +new Date(startDate)
144 144
        const end = +new Date(endDate)
145
        return (end - start) / (24 * 60 * 60 * 1000)
145
        return (end - start) / (24 * 60 * 60 * 1000) + 1
146 146
      } else {
147 147
        return 0
148 148
      }
@ -150,6 +150,7 @@ export default {
150 150
    // 计算结束时间
151 151
    calEndTime (startDate, duration) {
152 152
      if (startDate && duration) {
153
        duration = duration - 1
153 154
        const endDate = formatDateTime(new Date(+new Date(startDate) + (duration * 24 * 60 * 60 * 1000)))
154 155
        return endDate
155 156
      } else {

+ 1 - 1
security-protection-platform/src/modules/workorder/components/modal/workorderinfomodal.vue

@ -15,7 +15,7 @@
15 15
    </div>
16 16
    <div v-if="status" class="approval-info row">
17 17
      <div class="col-6">审批人:<span>{{ data.approver }}</span></div>
18
      <div class="col-6">审批结果:<span>{{ data.result===0?'同意':'驳回' }}</span></div>
18
      <div class="col-6">审批结果:<span>{{ data.result==='0'?'失败':'成功' }}</span></div>
19 19
      <div class="col-12">审批时间:<span>{{ data.approveTime }}</span></div>
20 20
      <div class="col-12">审批意见:<span>{{ data.comments }}</span></div>
21 21
    </div>

+ 68 - 14
security-protection-platform/src/routes.js

@ -18,21 +18,41 @@ export const constantRoutes = [
18 18
    hidden: true
19 19
  },
20 20
  {
21
    name: 'dashboard',
22
    path: '/dashboard',
23
    component: () => import(/* webpackChunkName: "dashboard" */ './modules/dashboard'),
24
    meta: { title: '首页', icon: 'home' },
25
    children: [
26
      {
27
        name: 'dashboardch',
28
        path: '',
29
        meta: { title: '首页', icon: 'home' }
30
      }
31
    ]
32
  },
33
  {
21 34
    path: '/videoSurveillance',
22 35
    component: Layout,
23
    meta: { icon: 'home' },
36
    meta: { icon: 'video' },
24 37
    children: [
25 38
      {
26 39
        name: 'videoSurveillance',
27 40
        path: '',
28 41
        component: () => import(/* webpackChunkName: "videoSurveillance" */ './modules/videoSurveillance'),
29
        meta: { title: '视频监控', icon: 'home' }
30
      },
42
        meta: { title: '视频监控', icon: 'video' }
43
      }
44
    ]
45
  },
46
  {
47
    path: '/access',
48
    component: Layout,
49
    meta: { icon: 'file-solution-outline' },
50
    children: [
31 51
      {
32
        name: 'videoSurveillance/distinguishRecord',
33
        path: '/videoSurveillance/distinguishRecord',
34
        component: () => import(/* webpackChunkName: "distinguishRecord" */ './modules/videoSurveillance/distinguishRecord'),
35
        hidden: true
52
        name: 'access',
53
        path: '',
54
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/access/index.vue'),
55
        meta: { title: '进出记录', icon: 'file-solution-outline' }
36 56
      }
37 57
    ]
38 58
  },
@ -57,13 +77,26 @@ export const constantRoutes = [
57 77
  }, {
58 78
    path: '/workorder',
59 79
    component: Layout,
60
    meta: { icon: 'home' },
80
    meta: { icon: 'calendar-outline' },
61 81
    children: [
62 82
      {
63 83
        name: 'workorder',
64 84
        path: '',
65 85
        component: () => import(/* webpackChunkName: "workorder" */ './modules/workorder'),
66
        meta: { title: '假勤管理', icon: 'home' }
86
        meta: { title: '假勤管理', icon: 'calendar-outline' }
87
      }
88
    ]
89
  },
90
  {
91
    path: '/alarm',
92
    component: Layout,
93
    meta: { icon: 'bell' },
94
    children: [
95
      {
96
        name: 'ai_alarm',
97
        path: '',
98
        component: () => import(/* webpackChunkName: "alarm" */ './modules/aialarm/index.vue'),
99
        meta: { title: 'AI报警', icon: 'bell' }
67 100
      }
68 101
    ]
69 102
  }, {
@ -80,19 +113,40 @@ export const constantRoutes = [
80 113
        meta: { title: '设备管理' }
81 114
      },
82 115
      {
83
        name: 'sys_attendance',
84
        path: 'attendance',
85
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/system/attendance'),
86
        meta: { title: '考勤配置' }
116
        name: 'sys_task',
117
        path: 'assignment',
118
        component: () => import(/* webpackChunkName: "sys__task" */ './modules/system/assignment'),
119
        meta: { title: 'AI任务' }
87 120
      },
88 121
      {
89 122
        name: 'sys_monitor',
90 123
        path: 'monitor',
91 124
        component: () => import(/* webpackChunkName: "sys_monitor" */ './modules/system/monitor'),
92 125
        meta: { title: '监控布局' }
126
      },
127
      {
128
        name: 'sys_attendance',
129
        path: 'attendance',
130
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/system/attendance'),
131
        meta: { title: '考勤配置' }
93 132
      }
94 133
    ]
95
  }, {
134
  },
135
  {
136
    path: '/usermana',
137
    component: Layout,
138
    meta: { icon: 'lock' },
139
    children: [
140
      {
141
        name: 'usermana',
142
        path: '',
143
        component: () => import(/* webpackChunkName: "user_rights" */ './modules/usermana'),
144
        meta: { title: '用户管理', icon: 'lock' }
145
      }
146
147
    ]
148
  },
149
  {
96 150
    path: '*',
97 151
    hidden: true,
98 152
    component: {

+ 1 - 0
security-protection-platform/src/styles/index.scss

@ -25,6 +25,7 @@ html {
25 25
*,
26 26
*:before,
27 27
*:after {
28
  font-family: inherit;
28 29
  box-sizing: inherit;
29 30
}
30 31

BIN
security-protection-platform/static/video-js.swf


提交 · 9b893df7e3 - Nuosi Git Service
wangkang3 4 years ago
parent
commit
9b893df7e3

+ 5 - 1
ebc-middle-platform/src/conf/services.js

@ -68,7 +68,11 @@ export default {
68 68
    GETBYNAMESEARCHORG: '/org/queryOrg/', // 根据NAME查组织
69 69
    STAFF: '/staff', // 根据组织id新建post, 修改put,删除delete员工信息
70 70
    SEARCHSTAFF: '/staff/staffId/', // 根据组织id新建post, 修改put,删除delete员工信息
71
    QUERYSTAFF: '/staff/queryStaff' // 根据组织id查找员工列表
71
    QUERYSTAFF: '/staff/queryStaff', // 根据组织id查找员工列表
72
    MAP_LOCATION_VIEW: '/locationManagement/loadMapLocationView', // 初始化人员定位页面的数据
73
    BIND_DEVICE: '/workEmployee/queryEmployeeBindDeviceList', // 查询绑定的人员列表
74
    FENCE_BY_DEPARTMENT: '/mapTag/queryAllMapTagByOrg', // 按部门查询查询围栏
75
    EQUIPMENT_NOT_BIND: '/equipment/queryAllEquipmentNotBind' // 查询所有未绑定的设备
72 76
  },
73 77
  position: {
74 78
    POSITION: '/position/', // 新增post,修改put,删除delete岗位信息

+ 3 - 1
ebc-middle-platform/src/modules/orientation/orientation.scss

@ -11,9 +11,10 @@
11 11
      .person-info{
12 12
        display: flex;
13 13
        font-size: 16px;
14
        div{
14
        >div{
15 15
          margin-right: 10px;
16 16
          display: flex;
17
          min-width: 85px;
17 18
          .number{
18 19
            color: #2373D2;
19 20
            font-size: 24px;
@ -49,6 +50,7 @@
49 50
        .time{
50 51
          font-size: 16px;
51 52
          margin-left: 50px;
53
          min-width: 230px;
52 54
        }
53 55
      }
54 56
      .right-content{

+ 111 - 30
ebc-middle-platform/src/modules/orientation/orientation.vue

@ -36,7 +36,7 @@
36 36
          "
37 37
        >轨迹</t-button
38 38
        >
39
        <div>悬浮窗<t-switch rounded></t-switch></div>
39
        <div style="min-width:100px">悬浮窗<t-switch rounded></t-switch></div>
40 40
      </div>
41 41
    </div>
42 42
    <div id="div1" style="height: 100%"></div>
@ -102,7 +102,7 @@
102 102
            style="width: 200px"
103 103
          ></t-input>
104 104
          <div>
105
            <div v-for="(item,index) in personList" :class="trackPerson==item.deviceId?'active':''" :key="index" @click="personTrack(item)">{{ item.userName }}</div>
105
            <div v-for="(item,index) in personList" :class="trackPerson==item.code?'active':''" :key="index" @click="personTrack(item)">{{ item.name }}</div>
106 106
          </div>
107 107
        </div>
108 108
        <div class="track-modal-right">
@ -127,15 +127,7 @@
127 127
              placeholder="请选择时间"
128 128
              @date-change="onChangeDate">
129 129
            </t-date-picker>
130
            <!-- <t-date-picker
131
              :class="trackQueryCondition.currentIndex === 3?'':'hidden'"
132
              v-model="rangeDate"
133
              style="width: 250px"
134
              type="dateRange"
135
              placeholder="请选择时间"
136
              @date-change="onChangeDate"
137
            ></t-date-picker> -->
138
            <div style="display: flex;line-height:32.5px">
130
            <div style="display: flex;line-height:32.5px;width: 120px;">
139 131
              <div>速度</div>
140 132
              <t-select>
141 133
                <t-option>1x</t-option>
@ -177,7 +169,7 @@
177 169
import './orientation.scss'
178 170
import services from '../../conf/services'
179 171
import EventBus from '../../bus'
180
import { GIS_SEA_LAYER_URL, GIS_SEA_URL } from '@/constants'
172
import { GIS_SEA_LAYER_URL, GIS_SEA_URL } from '../../constants'
181 173
export default {
182 174
  filters: {
183 175
    dateFormat(value) {
@ -337,7 +329,8 @@ export default {
337 329
      personList: [],
338 330
      rescuer: [],
339 331
      appointAlarmId: '',
340
      trackPerson: ''
332
      trackPerson: '',
333
      orgId: ''
341 334
    }
342 335
  },
343 336
  mounted() {
@ -378,29 +371,64 @@ export default {
378 371
        center: this.$store.getters.getMapParam.center,
379 372
        zoom: this.$store.getters.getMapParam.zoom
380 373
      })
381
      var maplayer
382
      maplayer = Ai.TileLayer(GIS_SEA_LAYER_URL)
374
      var maplayer = Ai.TileLayer(GIS_SEA_LAYER_URL)
375
      this.map.addLayer(maplayer)
383 376
      var la = Ai.WMTSLayer(
384 377
        GIS_SEA_URL,
385 378
        { opacity: 0.5 }
386 379
      )
387
      this.map.addLayer(maplayer)
388 380
      this.map.addLayer(la)
389 381
390 382
      Ai.Scale({ position: 'bottomright' }).addTo(this.map)
391 383
      Ai.Zoom({ type: 'small' }).addTo(this.map)
392 384
      this.loadMapArea()
385
      this.loadMapView()
393 386
    },
394 387
    loadMapView() {
395
      // this.$test
396
      //   .post(services.mapTag.GET_MAP_PARAM, {})
397
      //   .then((res) => {
398
      //     if (res.data.success) {
399
      //     }
400
      //   })
401
      //   .catch((res) => {
402
      //     // 请求失败处理...
403
      //   })
388
      this.$test
389
        .post(services.organization.MAP_LOCATION_VIEW, {})
390
        .then((res) => {
391
          console.log(res)
392
          this.loadUnaggregated(res.data.unaggregatedEntityPositionList)
393
        })
394
        .catch((res) => {
395
          // 请求失败处理...
396
        })
397
    },
398
    loadUnaggregated(dataList) { // 加载不聚合的人
399
      var points = []
400
      dataList.forEach(element => {
401
        var point = Ai.Point([element.latitude, element.longitude], {
402
          icon: Ai.DivIcon({
403
            html: '<div class="sos">1人</div>',
404
            className: 'person-count',
405
            // 设置图标大小
406
            // iconSize: [20, 20],
407
            // 设置点对象和图标的相对偏移量
408
            iconAnchor: [15, 15]
409
          })
410
        })
411
        this.map.addLayer(point)
412
        var popup = Ai.Popup({
413
          minWidth: 100,
414
          offset: [0, -10],
415
          autoClose: false,
416
          closeButton: false
417
        })
418
        var content =
419
                  '<div class="tips-item"><div class="container">' +
420
                  '<div class="sos">' + element.name + '</div>' +
421
                 '</div></div>'
422
        // 设置弹出框弹出位置
423
        popup.setLatLng(point.getLatLng())
424
        // 设置弹出框弹出内容
425
        popup.setContent(content)
426
        popup.openOn(this.map)
427
        points.push(point)
428
      })
429
      this.map.setViewPort([points])
430
    },
431
    loadAggregated(dataList) {
404 432
    },
405 433
    loadMapArea() {
406 434
      // data.forEach(element => {
@ -422,7 +450,7 @@ export default {
422 450
          // 设置图标大小
423 451
          iconSize: [20, 20],
424 452
          // 设置点对象和图标的相对偏移量
425
          iconAnchor: [0, 0]
453
          iconAnchor: [100, 100]
426 454
        })
427 455
      })
428 456
      var layer = new Ai.FeatureGroup()
@ -432,7 +460,7 @@ export default {
432 460
      var popup = Ai.Popup({
433 461
        minWidth: 300,
434 462
        offset: [0, -40],
435
        autoClose: true,
463
        autoClose: false,
436 464
        closeButton: false
437 465
      })
438 466
      var content =
@ -469,14 +497,49 @@ export default {
469 497
        ak: this.$store.getters.getGisToken,
470 498
        center: [39.915599, 122.406568]
471 499
      })
472
      var maplayer = null
473
      maplayer = Ai.TileLayer(GIS_SEA_LAYER_URL)
500
      var maplayer = Ai.TileLayer(GIS_SEA_LAYER_URL)
474 501
      var la = Ai.WMTSLayer(GIS_SEA_URL, {opacity: 0.5})
475 502
      this.trackMap.addLayer(maplayer)
476 503
      this.trackMap.addLayer(la)
477 504
478 505
      Ai.Scale({position: 'bottomright'}).addTo(this.trackMap)
479 506
      Ai.Zoom({type: 'small'}).addTo(this.trackMap)
507
      this.loadBindDevicePerson()
508
      this.loadNotBindEquipment()
509
    },
510
    loadBindDevicePerson() {
511
      this.$test
512
        .post(services.organization.BIND_DEVICE, {})
513
        .then((res) => {
514
          console.log(res)
515
          this.personList = res.data
516
        })
517
        .catch((res) => {
518
          // 请求失败处理...
519
        })
520
    },
521
    loadNotBindEquipment() {
522
      this.$test
523
        .post(services.organization.EQUIPMENT_NOT_BIND, {})
524
        .then((res) => {
525
          console.log(res)
526
          res.data.forEach(e => {
527
            var point = Ai.Point([e.latitude, e.longitude], {
528
              icon: Ai.Icon({
529
                // 设置图标URL路径
530
                iconUrl: '/static/images/风机.png',
531
                // 设置图标大小
532
                iconSize: [20, 20],
533
                // 设置点对象和图标的相对偏移量
534
                iconAnchor: [0, 0]
535
              })
536
            })
537
            this.trackMap.addLayer(point)
538
          })
539
        })
540
        .catch((res) => {
541
          // 请求失败处理...
542
        })
480 543
    },
481 544
    onChangeDate() { // 轨迹时间选择
482 545
    },
@ -560,7 +623,25 @@ export default {
560 623
    },
561 624
    personTrack(item) {
562 625
      console.log(item)
563
      this.trackPerson = item.deviceId
626
      this.trackPerson = item.code
627
      if (this.orgId !== item.orgId) {
628
        this.$test
629
          .post(services.organization.FENCE_BY_DEPARTMENT, {entityId: item.orgId})
630
          .then((res) => {
631
            this.orgId = item.orgId
632
            console.log(res)
633
            var la = new Ai.FeatureGroup()
634
            res.data.forEach(e => {
635
              var wktstr = e.mapAreaContent
636
              var polygon = Ai.Polygon(wktstr, {color: 'red'})
637
              la.addLayer(polygon)
638
            })
639
            this.trackMap.addLayer(la)
640
          })
641
          .catch((res) => {
642
          // 请求失败处理...
643
          })
644
      }
564 645
    },
565 646
    playback() {
566 647
      var coords = [[40.026037, 116.323928, '1'], [40.017886, 116.328048], [40.00763, 116.336631], [39.99132, 116.338348], [39.97527, 116.341094], [39.96685, 116.346244], [39.96633, 116.354827], [39.96580, 116.37233], [39.96659, 116.38538], [39.96685, 116.40048], [39.96685, 116.41834], [39.96028, 116.419029], [39.95501, 116.41937], [39.92501, 116.41937], [39.91501, 116.41937], [39.90501, 116.41937], [39.87501, 116.41937]]

+ 0 - 1
ebc-middle-platform/src/modules/system-management/equipment-management.scss

@ -44,7 +44,6 @@
44 44
  }
45 45
}
46 46
.loading--fix{
47
  position: absolute;
48 47
  color: #000;
49 48
  background-color: rgba(255, 255, 255, 0.8);
50 49
}

+ 0 - 1
ebc-middle-platform/src/modules/system-management/map-mark.scss

@ -47,7 +47,6 @@
47 47
  }
48 48
}
49 49
.loading--fix{
50
  position: absolute;
51 50
  color: #000;
52 51
  background-color: rgba(255, 255, 255, 0.8);
53 52
}

+ 0 - 1
ebc-middle-platform/src/modules/system-management/terminal-management.scss

@ -92,7 +92,6 @@
92 92
  color: #ffffff;
93 93
}
94 94
.loading--fix{
95
  position: absolute;
96 95
  color: #000;
97 96
  background-color: rgba(255, 255, 255, 0.8);
98 97
}

修改部分sonar扫描严重 · 24b25ecb85 - Nuosi Git Service
Преглед на файлове

修改部分sonar扫描严重

wuyong3 преди 6 години
родител
ревизия
24b25ecb85

+ 3 - 1
display-client/src/com/ai/ipu/display/MainActivity.java

@ -26,6 +26,7 @@ import android.annotation.SuppressLint;
26 26
import android.graphics.Rect;
27 27
import android.os.Bundle;
28 28
import android.util.DisplayMetrics;
29
import android.util.Log;
29 30
import android.view.View;
30 31
31 32
public class MainActivity extends TemplateMainActivity {
@ -168,6 +169,7 @@ public class MainActivity extends TemplateMainActivity {
168 169
		switch (id) {
169 170
		case 0://插件:基础界面
170 171
			mobileUI.openPage("Basic", null);
172
			break;
171 173
		case 1://插件:相机
172 174
			mobileUI.openPage("Basic", null);
173 175
			break;
@ -224,7 +226,7 @@ public class MainActivity extends TemplateMainActivity {
224 226
		try {
225 227
			AssetsUtil.copyAssetsDir("share",AppInfoUtil.getSdcardPath()+"/share");
226 228
		} catch (Exception e) {
227
			e.printStackTrace();
229
			Log.e(getClass().getSimpleName(), e.getMessage());
228 230
		}
229 231
	}
230 232
	

+ 7 - 7
ipu-count-test/src/com/ai/ipu/count/test/TestActivity.java

@ -49,7 +49,7 @@ public class TestActivity extends Activity {
49 49
					bean.sayBye();
50 50
				} catch (Exception e) {
51 51
					// TODO Auto-generated catch block
52
					e.printStackTrace();
52
					Log.e(TAG, e.getMessage(), e);
53 53
				}
54 54
			}
55 55
		});
@ -71,7 +71,7 @@ public class TestActivity extends Activity {
71 71
					Log.d(TAG, "返回结果:" + result);
72 72
				} catch (Exception e) {
73 73
					// TODO Auto-generated catch block
74
					e.printStackTrace();
74
					Log.e(TAG, e.getMessage(), e);
75 75
				}
76 76
			}
77 77
		});
@ -92,7 +92,7 @@ public class TestActivity extends Activity {
92 92
					Log.d(TAG, "返回结果:" + bean.sayHello(""));
93 93
				} catch (Exception e) {
94 94
					// TODO Auto-generated catch block
95
					e.printStackTrace();
95
					Log.e(TAG, e.getMessage(), e);
96 96
				}
97 97
			}
98 98
		});
@ -112,7 +112,7 @@ public class TestActivity extends Activity {
112 112
					bean.sayBye();
113 113
				} catch (Exception e) {
114 114
					// TODO Auto-generated catch block
115
					Log.e(TAG, e.getMessage());
115
					Log.e(TAG, e.getMessage(), e);
116 116
				}
117 117
			}
118 118
		});
@ -162,7 +162,7 @@ public class TestActivity extends Activity {
162 162
                try {
163 163
                    IpuCount.send("Hello UDP");
164 164
                } catch (PackageManager.NameNotFoundException e) {
165
                    e.printStackTrace();
165
                    Log.e(TAG, e.getMessage(), e);
166 166
                }
167 167
            }
168 168
		});
@ -191,7 +191,7 @@ public class TestActivity extends Activity {
191 191
                try {
192 192
                    IpuCount.sendDevice("设备日志");
193 193
                } catch (PackageManager.NameNotFoundException e) {
194
                    e.printStackTrace();
194
                    Log.e(TAG, e.getMessage());
195 195
                }
196 196
            }
197 197
        });
@ -205,7 +205,7 @@ public class TestActivity extends Activity {
205 205
                try {
206 206
                    IpuCount.sendPlugin(SystemClock.currentThreadTimeMillis(),"Plugin Action");
207 207
                } catch (PackageManager.NameNotFoundException e) {
208
                    e.printStackTrace();
208
                    Log.e(TAG, e.getMessage());
209 209
                }
210 210
            }
211 211
        });

+ 2 - 2
ipu-count-test/src/com/ai/ipu/count/test/TestUDPServer.java

@ -45,11 +45,11 @@ public class TestUDPServer implements Runnable {
45 45
					dSocket.receive(dPacket);
46 46
					Log.i("msg sever received", new String(dPacket.getData()));
47 47
				} catch (IOException e) {
48
					e.printStackTrace();
48
					Log.e(getClass().getSimpleName(), e.getMessage(), e);
49 49
				}
50 50
			}
51 51
		} catch (SocketException e) {
52
			e.printStackTrace();
52
			Log.e(getClass().getSimpleName(), e.getMessage(), e);
53 53
		}finally {
54 54
			if(dSocket != null){
55 55
				dSocket.close();

+ 2 - 0
ipu-open-platform/.gitignore

@ -3,3 +3,5 @@
3 3
/proguard-project.txt
4 4
/project.properties
5 5
/gen/
6
/.settings/
7
/bin/

+ 2 - 2
ipu-open-platform/src/com/ai/ipu/open_platform/HttpURLConnectionHelper.java

@ -103,12 +103,12 @@ public class HttpURLConnectionHelper {
103 103
				sb.append(line + "/n");
104 104
			}
105 105
		} catch (IOException e) {
106
			e.printStackTrace();
106
			Log.e(getClass().getSimpleName(), e.getMessage(), e);
107 107
		} finally {
108 108
			try {
109 109
				is.close();
110 110
			} catch (IOException e) {
111
				e.printStackTrace();
111
				Log.e(getClass().getSimpleName(), e.getMessage(), e);
112 112
			}
113 113
		}
114 114
		return sb.toString();

+ 0 - 2
ipu-share/.settings/org.eclipse.core.resources.prefs

@ -1,2 +0,0 @@
1
eclipse.preferences.version=1
2
encoding/<project>=UTF-8

+ 0 - 11
ipu-share/.settings/org.eclipse.jdt.core.prefs

@ -1,11 +0,0 @@
1
eclipse.preferences.version=1
2
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
3
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
4
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
5
org.eclipse.jdt.core.compiler.compliance=1.6
6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
7
org.eclipse.jdt.core.compiler.debug.localVariable=generate
8
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
9
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
10
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
11
org.eclipse.jdt.core.compiler.source=1.6

+ 0 - 34
ipu-share/bin/AndroidManifest.xml

@ -1,34 +0,0 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
    package="com.ai.ipu.share"
4
    android:versionCode="1"
5
    android:versionName="1.0" >
6
7
    <uses-sdk
8
        android:minSdkVersion="8"
9
        android:targetSdkVersion="15" />
10
    
11
   <uses-permission android:name="android.permission.INTERNET"/>
12
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
13
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
14
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
15
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
16
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
17
    
18
    <application 
19
        android:allowBackup="true"
20
        android:icon="@drawable/ic_launcher"
21
        android:label="@string/app_name"
22
        android:theme="@style/AppTheme">
23
        <activity 
24
            android:name=".MainActivity">
25
            <intent-filter>
26
                <action android:name="android.intent.action.MAIN" />
27
                <category android:name="android.intent.category.LAUNCHER" />
28
            </intent-filter>
29
        </activity>
30
        
31
    </application>
32
    
33
  
34
</manifest>

+ 0 - 80
ipu-share/bin/R.txt

@ -1,80 +0,0 @@
1
int anim hyperspace_in 0x7f040000
2
int anim hyperspace_out 0x7f040001
3
int anim push_left_in 0x7f040002
4
int anim push_left_out 0x7f040003
5
int anim push_right_in 0x7f040004
6
int anim push_right_out 0x7f040005
7
int anim scale_action 0x7f040006
8
int anim shut_open_in 0x7f040007
9
int anim shut_open_out 0x7f040008
10
int dimen activity_horizontal_margin 0x7f080000
11
int dimen activity_vertical_margin 0x7f080001
12
int drawable audio_activity_dialog 0x7f020000
13
int drawable ic_launcher 0x7f020001
14
int drawable keyboard_key 0x7f020002
15
int drawable keyboard_normal_bg 0x7f020003
16
int drawable keyboard_normal_hl_bg 0x7f020004
17
int drawable keyboard_qwerty 0x7f020005
18
int drawable keyboard_sym_delete 0x7f020006
19
int drawable keyboard_sym_shift 0x7f020007
20
int drawable keyboard_sym_space 0x7f020008
21
int drawable keyboard_symbols 0x7f020009
22
int drawable nfc_bg 0x7f02000a
23
int drawable record_mic_normal 0x7f02000b
24
int drawable record_mic_press 0x7f02000c
25
int drawable screenlock_arrow 0x7f02000d
26
int drawable screenlock_line 0x7f02000e
27
int drawable screenlock_line_error 0x7f02000f
28
int drawable screenlock_line_semicircle 0x7f020010
29
int drawable screenlock_line_semicircle_error 0x7f020011
30
int drawable screenlock_round_click 0x7f020012
31
int drawable screenlock_round_click_error 0x7f020013
32
int drawable screenlock_round_original 0x7f020014
33
int drawable screenlock_welcome_bg 0x7f020015
34
int drawable share_apk_activity_dialog 0x7f020016
35
int id btn_qq_file 0x7f090002
36
int id btn_qq_text 0x7f090000
37
int id btn_wechat_file 0x7f090003
38
int id btn_wechat_text 0x7f090001
39
int id deviceListView 0x7f09000c
40
int id deviceNameTV 0x7f09000f
41
int id exit 0x7f09000d
42
int id forget_btn 0x7f090009
43
int id keyboard_view 0x7f090006
44
int id lock_view 0x7f090007
45
int id macAddressTV 0x7f090010
46
int id micButton 0x7f090005
47
int id notify 0x7f090008
48
int id recordLabel 0x7f090004
49
int id reset_btn 0x7f09000a
50
int id search 0x7f09000e
51
int id share 0x7f09000b
52
int layout activity_share 0x7f030000
53
int layout audio_recorder 0x7f030001
54
int layout keyboard 0x7f030002
55
int layout nfcard 0x7f030003
56
int layout screenlock_login_layout2 0x7f030004
57
int layout screenlock_reset_lock_layout 0x7f030005
58
int layout share_apk_activity 0x7f030006
59
int layout share_apk_device_list_item 0x7f030007
60
int raw beep 0x7f050000
61
int string action_settings 0x7f06000d
62
int string app_name 0x7f060000
63
int string hello_world 0x7f06000c
64
int string imgContentDesc 0x7f060003
65
int string pressTip 0x7f060002
66
int string recording 0x7f060001
67
int string sa_confirm_share 0x7f06000a
68
int string sa_exit 0x7f060009
69
int string sa_mac_address 0x7f060006
70
int string sa_search 0x7f060007
71
int string sa_searching 0x7f060008
72
int string sa_share 0x7f060005
73
int string sa_tip 0x7f06000b
74
int string tips 0x7f060004
75
int style AppBaseTheme 0x7f070004
76
int style AppTheme 0x7f070005
77
int style AudioDialogTheme 0x7f070000
78
int style CustomDialogTheme 0x7f070001
79
int style ShareApkDialogTheme 0x7f070002
80
int style SlidingMenuTheme 0x7f070003

BIN
ipu-share/bin/ipu-share.jar


+ 0 - 3
ipu-share/bin/jarlist.cache

@ -1,3 +0,0 @@
1
# cache for current jar dependency. DO NOT EDIT.
2
# format is <lastModified> <length> <SHA-1> <path>
3
# Encoding is UTF-8

BIN
ipu-share/bin/res/crunch/drawable-mdpi/ic_launcher.png


+ 0 - 6
ipu-share/gen/com/ai/ipu/share/BuildConfig.java

@ -1,6 +0,0 @@
1
/** Automatically generated file. DO NOT MODIFY */
2
package com.ai.ipu.share;
3
4
public final class BuildConfig {
5
    public final static boolean DEBUG = true;
6
}

+ 0 - 162
ipu-share/gen/com/ai/ipu/share/R.java

@ -1,162 +0,0 @@
1
/* AUTO-GENERATED FILE.  DO NOT MODIFY.
2
 *
3
 * This class was automatically generated by the
4
 * aapt tool from the resource data it found.  It
5
 * should not be modified by hand.
6
 */
7
8
package com.ai.ipu.share;
9
10
public final class R {
11
    public static final class anim {
12
        public static int hyperspace_in=0x7f040000;
13
        public static int hyperspace_out=0x7f040001;
14
        public static int push_left_in=0x7f040002;
15
        public static int push_left_out=0x7f040003;
16
        public static int push_right_in=0x7f040004;
17
        public static int push_right_out=0x7f040005;
18
        public static int scale_action=0x7f040006;
19
        public static int shut_open_in=0x7f040007;
20
        public static int shut_open_out=0x7f040008;
21
    }
22
    public static final class attr {
23
    }
24
    public static final class dimen {
25
        /**  Default screen margins, per the Android Design guidelines. 
26
27
         Example customization of dimensions originally defined in res/values/dimens.xml
28
         (such as screen margins) for screens with more than 820dp of available width. This
29
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively).
30
    
31
         */
32
        public static int activity_horizontal_margin=0x7f080000;
33
        public static int activity_vertical_margin=0x7f080001;
34
    }
35
    public static final class drawable {
36
        public static int audio_activity_dialog=0x7f020000;
37
        public static int ic_launcher=0x7f020001;
38
        public static int keyboard_key=0x7f020002;
39
        public static int keyboard_normal_bg=0x7f020003;
40
        public static int keyboard_normal_hl_bg=0x7f020004;
41
        public static int keyboard_qwerty=0x7f020005;
42
        public static int keyboard_sym_delete=0x7f020006;
43
        public static int keyboard_sym_shift=0x7f020007;
44
        public static int keyboard_sym_space=0x7f020008;
45
        public static int keyboard_symbols=0x7f020009;
46
        public static int nfc_bg=0x7f02000a;
47
        public static int record_mic_normal=0x7f02000b;
48
        public static int record_mic_press=0x7f02000c;
49
        public static int screenlock_arrow=0x7f02000d;
50
        public static int screenlock_line=0x7f02000e;
51
        public static int screenlock_line_error=0x7f02000f;
52
        public static int screenlock_line_semicircle=0x7f020010;
53
        public static int screenlock_line_semicircle_error=0x7f020011;
54
        public static int screenlock_round_click=0x7f020012;
55
        public static int screenlock_round_click_error=0x7f020013;
56
        public static int screenlock_round_original=0x7f020014;
57
        public static int screenlock_welcome_bg=0x7f020015;
58
        public static int share_apk_activity_dialog=0x7f020016;
59
    }
60
    public static final class id {
61
        public static int btn_qq_file=0x7f090002;
62
        public static int btn_qq_text=0x7f090000;
63
        public static int btn_wechat_file=0x7f090003;
64
        public static int btn_wechat_text=0x7f090001;
65
        public static int deviceListView=0x7f09000c;
66
        public static int deviceNameTV=0x7f09000f;
67
        public static int exit=0x7f09000d;
68
        public static int forget_btn=0x7f090009;
69
        public static int keyboard_view=0x7f090006;
70
        public static int lock_view=0x7f090007;
71
        public static int macAddressTV=0x7f090010;
72
        public static int micButton=0x7f090005;
73
        public static int notify=0x7f090008;
74
        public static int recordLabel=0x7f090004;
75
        public static int reset_btn=0x7f09000a;
76
        public static int search=0x7f09000e;
77
        public static int share=0x7f09000b;
78
    }
79
    public static final class layout {
80
        public static int activity_share=0x7f030000;
81
        public static int audio_recorder=0x7f030001;
82
        public static int keyboard=0x7f030002;
83
        public static int nfcard=0x7f030003;
84
        public static int screenlock_login_layout2=0x7f030004;
85
        public static int screenlock_reset_lock_layout=0x7f030005;
86
        public static int share_apk_activity=0x7f030006;
87
        public static int share_apk_device_list_item=0x7f030007;
88
    }
89
    public static final class raw {
90
        public static int beep=0x7f050000;
91
    }
92
    public static final class string {
93
        public static int action_settings=0x7f06000d;
94
        public static int app_name=0x7f060000;
95
        public static int hello_world=0x7f06000c;
96
        public static int imgContentDesc=0x7f060003;
97
        public static int pressTip=0x7f060002;
98
        public static int recording=0x7f060001;
99
        public static int sa_confirm_share=0x7f06000a;
100
        public static int sa_exit=0x7f060009;
101
        public static int sa_mac_address=0x7f060006;
102
        public static int sa_search=0x7f060007;
103
        public static int sa_searching=0x7f060008;
104
        public static int sa_share=0x7f060005;
105
        public static int sa_tip=0x7f06000b;
106
        public static int tips=0x7f060004;
107
    }
108
    public static final class style {
109
        /** 
110
        Base application theme, dependent on API level. This theme is replaced
111
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
112
    
113
114
            Theme customizations available in newer API levels can go in
115
            res/values-vXX/styles.xml, while customizations related to
116
            backward-compatibility can go here.
117
        
118
119
        Base application theme for API 11+. This theme completely replaces
120
        AppBaseTheme from res/values/styles.xml on API 11+ devices.
121
    
122
 API 11 theme customizations can go here. 
123
124
        Base application theme for API 14+. This theme completely replaces
125
        AppBaseTheme from BOTH res/values/styles.xml and
126
        res/values-v11/styles.xml on API 14+ devices.
127
    
128
 API 14 theme customizations can go here. 
129
130
        Base application theme, dependent on API level. This theme is replaced
131
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
132
    
133
134
            Theme customizations available in newer API levels can go in
135
            res/values-vXX/styles.xml, while customizations related to
136
            backward-compatibility can go here.
137
        
138
139
        Base application theme for API 11+. This theme completely replaces
140
        AppBaseTheme from res/values/styles.xml on API 11+ devices.
141
    
142
 API 11 theme customizations can go here. 
143
144
        Base application theme for API 14+. This theme completely replaces
145
        AppBaseTheme from BOTH res/values/styles.xml and
146
        res/values-v11/styles.xml on API 14+ devices.
147
    
148
 API 14 theme customizations can go here. 
149
         */
150
        public static int AppBaseTheme=0x7f070004;
151
        /**  Application theme. 
152
 All customizations that are NOT specific to a particular API-level can go here. 
153
 Application theme. 
154
 All customizations that are NOT specific to a particular API-level can go here. 
155
         */
156
        public static int AppTheme=0x7f070005;
157
        public static int AudioDialogTheme=0x7f070000;
158
        public static int CustomDialogTheme=0x7f070001;
159
        public static int ShareApkDialogTheme=0x7f070002;
160
        public static int SlidingMenuTheme=0x7f070003;
161
    }
162
}