From 21a340c24815a55a07db2dc3d2e5a19e7de440cd Mon Sep 17 00:00:00 2001
From: hanbaoshan <hanbaoshan@aiotlink.com>
Date: 星期六, 29 八月 2020 19:27:57 +0800
Subject: [PATCH] 添加摄像机区域管理应用

---
 src/scripts/util.js                        |    0 
 src/api/camera.ts                          |   31 +++
 vue.config.js                              |    4 
 src/pages/library/components/upload.vue    |    2 
 src/pages/desktop/index/mock/userData.json |   22 ++
 src/pages/areaManage/index/main.ts         |   13 +
 src/pages/areaManage/index/App.vue         |  349 +++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 418 insertions(+), 3 deletions(-)

diff --git a/src/api/camera.ts b/src/api/camera.ts
index 47dafc8..f7d7cc6 100644
--- a/src/api/camera.ts
+++ b/src/api/camera.ts
@@ -140,4 +140,35 @@
     data: params
   });
 };
+//
+//鏌ユ壘鎵�鏈�(澶氳竟褰�)鍖哄煙
+export const findAllPolygons = () => {
+  return request({
+    url: "/data/api-v/polygon/findAll",
+    method: "get"
+  })
+}
+//鏌ユ壘鎵�鏈�(灞曞尯)鍖哄煙
+export const getAllAreas = () => {
+  return request({
+    url: "/data/api-v/acp/findAll",
+    method: "get"
+  })
+}
+//鍒犻櫎(灞曞尯)
+export const delArea = (data:any) => {
+  return request({
+    url: "/data/api-v/acp/delete",
+    method: "post",
+    data
+  })
+}
 
+//淇濆瓨鍖哄煙缂栬緫
+export const saveAreaInfo = (data:any) => {
+  return request({
+    url: "/data/api-v/acp/save",
+    method: "post",
+    data
+  })
+}
\ No newline at end of file
diff --git a/src/pages/areaManage/index/App.vue b/src/pages/areaManage/index/App.vue
new file mode 100644
index 0000000..c7e1025
--- /dev/null
+++ b/src/pages/areaManage/index/App.vue
@@ -0,0 +1,349 @@
+<template>
+  <div>
+    <div class="top-operation">
+      <el-button type="primary" size="small" @click="createArea">鏂板鍖哄煙</el-button>
+    </div>
+    <el-table :data="groups" border>
+      <el-table-column type="index" width="50" label="搴忓彿" align="center"></el-table-column>
+      <el-table-column prop="name" label="鍖哄煙鍚嶇О" align="center"></el-table-column>
+      <el-table-column prop="id" label="鍖哄煙ID" align="center"></el-table-column>
+      <el-table-column prop="desc" label="鎻忚堪" align="center"></el-table-column>
+      <el-table-column width="100" label="鎿嶄綔" align="center">
+        <template slot-scope="scope">
+          <div class="operation">
+            <i class="el-icon-edit primary" @click="edit(scope.row)"></i>
+            <i class="el-icon-delete red" @click="removeItem(scope.row.id)"></i>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-dialog title="鎽勫儚鏈哄尯鍩熺鐞�" :visible.sync="dialogFormVisible" style="min-width:765px">
+      <el-form :model="areaForm" class="formArea">
+        <div class>
+          <el-form-item label="鍖哄煙鍚嶇О:">
+            <el-input v-model="areaForm.name" size="small"></el-input>
+          </el-form-item>
+          <el-form-item label="鍖哄煙ID:" class="area-id">
+            <!-- <span v-if="isEdit">{{areaForm.id}}</span> -->
+            <el-input v-model="areaForm.id" size="small" :disabled="isEdit"></el-input>
+            <el-button v-if="!isEdit" size="small" type="primary" @click="getIdCode">鐢熸垚ID</el-button>
+          </el-form-item>
+          <el-form-item label="鍖哄煙鎻忚堪:">
+            <el-input type="textarea" v-model="areaForm.desc" resize="none"></el-input>
+          </el-form-item>
+        </div>
+        <div class="checklist">
+          <el-form-item>
+            <!-- <el-transfer v-model="checkedData" :props="{key:'model',label:'label'}" :titles="['鍏ㄩ儴鍖哄煙', '閫変腑鍖哄煙']" :button-texts="['宸︾Щ','鍙崇Щ']" filterable @change="handleChange" :data="areaData"></el-transfer> -->
+            <el-transfer
+              v-model="checkedData"
+              :props="{key:'symbol',label:'label',}"
+              :titles="['鍏ㄩ儴鍖哄煙', '閫変腑鍖哄煙']"
+              :button-texts="['宸︾Щ','鍙崇Щ']"
+              filterable
+              @change="handleChange"
+              :data="areaData"
+            ></el-transfer>
+          </el-form-item>
+        </div>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false" size="small">鍙栨秷</el-button>
+        <el-button type="primary" @click="save" size="small">淇濆瓨</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { guid } from '@/scripts/util.js'
+import { findAllPolygons, getAllAreas, saveAreaInfo, delArea } from '@/api/camera'
+export default {
+  data () {
+    return {
+      isEdit: false,
+      groups: [],
+      dialogFormVisible: false,
+      areaForm: {
+        name: '',
+        id: '',
+        desc: '',
+        camPolygons: [],
+
+      },
+      camPolygon: {
+        cameraId: '',
+        cameraName: '',
+        pgns: []
+      },
+      pgn: {
+        polygonId: '',
+        polygonName: ''
+      },
+      area: {
+        name: '',
+        id: ''
+      },
+
+      areaData: [{
+        cameraId: '123',
+        cameraName: '123',
+        polygonId: '234',
+        polygonName: '234'
+      }, {
+        cameraId: '133',
+        cameraName: '133',
+        polygonId: '254',
+        polygonName: '254'
+      }], //cameraId cameraName
+      checkedData: []
+    }
+  },
+  mounted () {
+    this.renderTable();
+    this.getAllPolygons();
+  },
+  methods: {
+    renderTable () {
+      getAllAreas().then(res => {
+        if (res.code == 200) {
+          debugger
+          this.groups = res.data
+        }
+      })
+    },
+    getAllPolygons () {
+      findAllPolygons().then(res => {
+        if (res.code == 200) {
+          this.areaData = res.data.map(item => {
+            return {
+              cameraId: item.camera_id,
+              cameraName: item.camera_name,
+              polygonId: item.id,
+              polygonName: item.name,
+              label: item.camera_name + ' - ' + item.name,
+              //model: JSON.stringify({cameraId:item.camera_id,cameraName: item.camera_name,polygonId: item.id,polygonName: item.name}),
+              symbol: item.camera_id + '&' + item.id
+            }
+          })
+        }
+      });
+    },
+    edit (row) {
+      this.isEdit = true;
+      this.dialogFormVisible = true;
+      this.areaForm = row;
+      debugger
+      //鍥炴樉绌挎妗�
+      let _this = this;
+      row.camPolygons.forEach(camPolygon => {
+        camPolygon.pgns.forEach(polygon => {
+          debugger
+          let symbol = camPolygon.cameraId + '&' + polygon.polygonId
+          // let checkedItem = {};
+          // checkedItem.cameraId = camPolygon.cameraId;
+          // checkedItem.cameraName = camPolygon.cameraName;
+          // checkedItem.polygonName = polygon.polygonName;
+          // checkedItem.polygonId = polygon.polygonId;
+          _this.checkedData.push(symbol);
+        })
+      });
+      console.log(this.checkedData)
+    },
+    createArea () {
+      this.isEdit = false;
+      this.dialogFormVisible = true;
+      this.areaForm.name = '';
+      this.areaForm.id = '';
+      this.areaForm.desc = '';
+      this.areaForm.camPolygons = [];
+      this.checkedData = [];
+    },
+    removeItem (id) {
+      this.$confirm('纭畾鍒犻櫎璇ラ」鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        delArea({ ids: [id] }).then(res => {
+          if (res.code == 200) {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
+            });
+            this.renderTable()
+          }
+        })
+      }).catch(() => {
+
+      });
+    },
+    getIdCode () {
+      this.areaForm.id = guid();
+    },
+    handleChange (value, direction, movedKeys) {
+      console.log(value, direction, movedKeys);
+
+    },
+    save () {
+      // this.checkedData.forEach(item=>{
+      //   let node = JSON.parse(item);
+      //   this.camPolygon.cameraId = node.cameraId;
+      //   this.camPolygon.cameraName = node.cameraName;
+      //   this.pgn.polygonId = node.polygonId;
+      //   this.pgn.polygonName = node.polygonName;
+      //   this.camPolygon.pgns.push(this.pgn);
+      //   this.areaForm.camPolygons.push(this.camPolygon);
+      //   let _this = this;
+      //   saveAreaInfo(this.areaForm).then(res=>{
+      //     if(res.code==200){
+      //       _this.$notify({
+      //         type:'success',
+      //         message:'淇濆瓨鎴愬姛!'
+      //       });
+      //       _this.dialogFormVisible = false;
+      //       _this.getAllAreas();
+      //     }
+      //   })
+      // });
+      let tempArr = [];
+      let tempIdArr = [];
+      this.areaForm.camPolygons = [];
+      debugger
+      this.checkedData.forEach(item => {
+        let tempCameraItem = { pgns: [] };
+        let cameraId = item.split('&')[0];
+        tempCameraItem.cameraId = cameraId;
+        if (tempArr.indexOf(cameraId) < 0) {
+          tempIdArr.push(cameraId)
+        }
+        let polygonId = item.split('&')[1];
+        this.areaData.forEach(area => {
+          if (area.polygonId == polygonId && area.cameraId == cameraId) {
+            this.pgn.polygonId = polygonId;
+            this.pgn.polygonName = area.polygonName;
+            if (tempArr.indexOf(cameraId) >= 0) {
+              let cpg = this.areaForm.camPolygons.find(camPolygon => camPolygon.cameraId == cameraId);
+              cpg.pgns.push(JSON.parse(JSON.stringify(this.pgn)));
+            } else {
+              //this.camPolygon.pgns.push(JSON.parse(JSON.stringify(this.pgn)));
+              tempCameraItem.pgns.push(JSON.parse(JSON.stringify(this.pgn)));
+              //this.camPolygon.cameraId = cameraId;
+              //this.camPolygon.cameraName = area.cameraName;
+              tempCameraItem.cameraName = area.cameraName;
+              this.areaForm.camPolygons.push(JSON.parse(JSON.stringify(tempCameraItem)));
+              //this.areaForm.camPolygons.push(JSON.parse(JSON.stringify(this.camPolygon)));
+            }
+
+          }
+        });
+      })
+      let _this = this;
+      console.log(this.areaForm);
+      debugger
+      saveAreaInfo(this.areaForm).then(res => {
+        if (res.code == 200) {
+          _this.$notify({
+            type: 'success',
+            message: '淇濆瓨鎴愬姛!'
+          });
+          _this.dialogFormVisible = false;
+          _this.renderTable();
+        }
+      }).catch(e => {
+        console.log(e)
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+.primary {
+  color: #3d68e1;
+}
+.red {
+  color: rgb(255, 94, 0);
+}
+.top-operation {
+  padding: 30px 30px 20px;
+  display: flex;
+  justify-content: flex-end;
+}
+.el-table {
+  width: calc(100% - 60px);
+  margin: 0 auto;
+}
+/deep/.el-table th {
+  background: #f5f5f5 !important;
+  color: #222;
+}
+.operation i {
+  font-size: 18px;
+  margin: 0 5px;
+}
+.formArea {
+  padding: 0 20px;
+}
+.flex-box {
+  display: flex;
+  justify-content: center;
+}
+.el-form-item {
+  display: flex;
+  margin-right: 40px;
+}
+.el-form-item label {
+  font-weight: bold;
+}
+.checklist .el-form-item__content {
+  margin: 10px auto;
+}
+/deep/.el-form-item__label {
+  width: 80px;
+  text-align: left;
+}
+.area-id .el-form-item__content {
+  display: flex;
+  margin-right: 0;
+  align-items: center;
+}
+.area-id .el-button {
+  margin-left: 5px;
+  margin-top: 3px;
+}
+.el-form .el-input {
+  width: 300px;
+}
+/deep/.el-transfer-panel {
+  text-align: left !important;
+}
+.el-transfer-panel__list {
+  text-align: left;
+}
+/deep/.el-button--primary.is-disabled {
+  background: #9eb4f0 !important;
+  border-color: #9eb4f0 !important;
+}
+/deep/.el-dialog {
+  min-width: 764px;
+}
+/deep/.el-textarea__inner {
+  width: 566px;
+  height: 60px;
+}
+/deep/.el-transfer-panel__item.el-checkbox .el-checkbox__label {
+  overflow: visible;
+}
+/deep/.el-transfer-panel__item.el-checkbox .el-checkbox__label {
+  overflow: visible;
+}
+/deep/.el-transfer-panel__item.el-checkbox .el-checkbox__label span{
+  font-size: 12px !important;
+  padding-right: 20px;
+}
+/deep/.el-transfer-panel
+  .el-transfer-panel__header
+  .el-checkbox
+  .el-checkbox__label {
+  font-size: 14px !important;
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/areaManage/index/main.ts b/src/pages/areaManage/index/main.ts
new file mode 100644
index 0000000..72eb673
--- /dev/null
+++ b/src/pages/areaManage/index/main.ts
@@ -0,0 +1,13 @@
+import Vue from 'vue';
+import App from './App.vue'
+
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import "@/assets/css/element-variables.scss";
+
+Vue.use(ElementUI);
+
+new Vue({
+  el: '#app',
+  render: h => h(App)
+});
diff --git a/src/pages/desktop/index/mock/userData.json b/src/pages/desktop/index/mock/userData.json
index 3b284b4..1ef5859 100644
--- a/src/pages/desktop/index/mock/userData.json
+++ b/src/pages/desktop/index/mock/userData.json
@@ -134,6 +134,28 @@
         "title": "绯荤粺缁存姢",
         "width": 760,
         "height": 534
+      },
+      {
+        "id": "19",
+        "name": "heatCamera",
+        "src": "../../images/app-mid/algorithm-manage.png",
+        "alt": "鐑姏鍥�",
+        "type": "2",
+        "url": "/view/heatCamera",
+        "title": "鐑姏鍥�",
+        "width": 760,
+        "height": 600
+      },
+      {
+        "id": "20",
+        "name": "areaManage",
+        "src": "../../images/app-mid/device.png",
+        "alt": "鎽勫儚鏈哄尯鍩熺鐞�",
+        "type": "2",
+        "url": "/view/areaManage",
+        "title": "鎽勫儚鏈哄尯鍩熺鐞�",
+        "width": 1200,
+        "height": 600
       }
     ]
   }
diff --git a/src/pages/library/components/upload.vue b/src/pages/library/components/upload.vue
index 37e34e2..58585ed 100644
--- a/src/pages/library/components/upload.vue
+++ b/src/pages/library/components/upload.vue
@@ -46,7 +46,7 @@
 </template>
 <script>
 import axios from 'axios'
-import { guid } from './util.js'
+import { guid } from '@/scripts/util.js'
 
 export default {
   name: 'upload',
diff --git a/src/pages/library/components/util.js b/src/scripts/util.js
similarity index 100%
rename from src/pages/library/components/util.js
rename to src/scripts/util.js
diff --git a/vue.config.js b/vue.config.js
index 58eb47a..a763d16 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -49,8 +49,8 @@
         changeOrigin: true,
       }, 
       "/api-v": {
-        //target: 'http://192.168.20.145:8000',
-        target: 'http://192.168.20.10:8000',
+        target: 'http://192.168.20.145:8000',
+        //target: 'http://192.168.20.10:8000',
         changeOrigin: true
       },     
       "/api-f": {

--
Gitblit v1.8.0