From d8e493052309db7180c3ee5d3ec9e01b78e12bdc Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 20 十二月 2023 09:33:17 +0800
Subject: [PATCH] Mr.Shi

---
 admin/src/components/business/OperaDeviceRoleFWindow.vue     |   49 
 admin/src/components/business/OperaVisitsDesWindow.vue       |  217 +++
 admin/src/views/business/laborSource.vue                     |   66 
 admin/src/views/business/empower.vue                         |  116 +
 admin/src/views/business/visits.vue                          |  132 +
 admin/src/views/business/retention.vue                       |  101 +
 admin/package-lock.json                                      |   31 
 admin/vue.config.js                                          |    6 
 admin/src/api/business/category.js                           |   32 
 admin/src/components/business/OperaDeviceRoleWindow.vue      |   64 
 admin/src/api/business/deviceRole.js                         |   32 
 admin/src/api/business/block.js                              |   23 
 admin/src/api/business/member.js                             |   48 
 admin/src/views/business/blackmailPersonnel.vue              |  116 +
 admin/src/views/business/freezePersonnel.vue                 |  112 +
 admin/src/components/common/Tree.vue                         |  158 ++
 admin/src/api/business/visits.js                             |   45 
 admin/src/api/business/empower.js                            |   40 
 admin/package.json                                           |    1 
 admin/src/components/business/OperaDeviceWindow.vue          |   45 
 admin/src/views/business/category.vue                        |   93 +
 admin/src/views/business/visitorManagement.vue               |  112 +
 admin/src/views/index.vue                                    |  367 ++++
 admin/src/views/business/problemLog.vue                      |   80 +
 admin/src/views/business/visitorSources.vue                  |   66 
 admin/src/views/business/internalCompany.vue                 |   93 +
 admin/src/api/business/visitEvent.js                         |    8 
 admin/src/api/business/company.js                            |   42 
 admin/src/components/common/Menu.vue                         |    3 
 admin/src/layouts/TableLayout1.vue                           |  167 ++
 admin/src/views/business/strandedPersonnel.vue               |  115 +
 admin/src/views/business/deviceRole_f.vue                    |   85 +
 admin/src/api/business/cars.js                               |   32 
 admin/src/views/business/parks.vue                           |   75 +
 admin/src/api/business/problems.js                           |   23 
 admin/src/api/business/problemLog.js                         |   16 
 admin/src/api/business/deviceEvent.js                        |   16 
 admin/src/components/business/OperaCompanyWindow.vue         |   64 
 admin/src/views/business/company.vue                         |  114 +
 admin/src/views/business/visitEvent.vue                      |  114 +
 admin/src/components/business/OperaProblemsWindow.vue        |  107 +
 admin/src/layouts/AppLayout.vue                              |    2 
 admin/src/views/business/carEvent.vue                        |  118 +
 admin/src/views/business/problems.vue                        |   97 +
 admin/src/api/business/parks.js                              |    8 
 admin/src/components/business/OperaInternalCompanyWindow.vue |   42 
 admin/src/views/business/deviceRole.vue                      |   91 +
 admin/src/components/business/OperaCategoryWindow.vue        |   59 
 admin/src/views/business/cars.vue                            |  100 +
 admin/src/views/business/device.vue                          |   95 +
 admin/src/api/business/retention.js                          |   40 
 admin/src/api/business/carEvent.js                           |    8 
 admin/src/api/business/device.js                             |   13 
 admin/src/views/business/internalMember.vue                  |  167 ++
 admin/src/components/business/OperaCarsWindow.vue            |   75 +
 admin/src/views/business/deviceEvent.vue                     |  111 +
 56 files changed, 4,180 insertions(+), 72 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index 26079ad..0a07be0 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -4859,6 +4859,22 @@
         "safer-buffer": "^2.1.0"
       }
     },
+    "echarts": {
+      "version": "5.4.3",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz",
+      "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==",
+      "requires": {
+        "tslib": "2.3.0",
+        "zrender": "5.4.4"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+        }
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
@@ -14275,6 +14291,21 @@
           "dev": true
         }
       }
+    },
+    "zrender": {
+      "version": "5.4.4",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz",
+      "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==",
+      "requires": {
+        "tslib": "2.3.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+        }
+      }
     }
   }
 }
diff --git a/admin/package.json b/admin/package.json
index 04c08ba..44d0bfe 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -13,6 +13,7 @@
     "@riophae/vue-treeselect": "^0.4.0",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
+    "echarts": "^5.4.3",
     "element-ui": "^2.3.6",
     "js-cookie": "^2.2.1",
     "js-file-download": "^0.4.12",
diff --git a/admin/src/api/business/block.js b/admin/src/api/business/block.js
new file mode 100644
index 0000000..dd3c45d
--- /dev/null
+++ b/admin/src/api/business/block.js
@@ -0,0 +1,23 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/member/findUnusualPage', data, {
+    trim: true
+  })
+}
+
+// 浜哄憳绉婚櫎-瑙e喕
+export function updateRemoveStatusById (data) {
+  return request.post('/business/member/updateRemoveStatusById', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/member/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
diff --git a/admin/src/api/business/carEvent.js b/admin/src/api/business/carEvent.js
new file mode 100644
index 0000000..51c51db
--- /dev/null
+++ b/admin/src/api/business/carEvent.js
@@ -0,0 +1,8 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/carEvent/page', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/api/business/cars.js b/admin/src/api/business/cars.js
new file mode 100644
index 0000000..6aba135
--- /dev/null
+++ b/admin/src/api/business/cars.js
@@ -0,0 +1,32 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/cars/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/cars/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/cars/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/cars/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/cars/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/category.js b/admin/src/api/business/category.js
new file mode 100644
index 0000000..d44f859
--- /dev/null
+++ b/admin/src/api/business/category.js
@@ -0,0 +1,32 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/category/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/category/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/category/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/category/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/category/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/company.js b/admin/src/api/business/company.js
new file mode 100644
index 0000000..edaec75
--- /dev/null
+++ b/admin/src/api/business/company.js
@@ -0,0 +1,42 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/company/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/company/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/company/updateById', data)
+}
+
+// 閮ㄩ棬淇℃伅鍚屾
+export function companySync (data) {
+  return request.post('/business/company/sync', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/company/delete/${id}`)
+}
+
+// 鏍规嵁绫诲瀷鏌ヨ缁勭粐淇℃伅
+export function findCompanyTreePage (type) {
+  return request.get(`/business/company/findCompanyTreePage?type=${type}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/company/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/device.js b/admin/src/api/business/device.js
new file mode 100644
index 0000000..4f85769
--- /dev/null
+++ b/admin/src/api/business/device.js
@@ -0,0 +1,13 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/device/page', data, {
+    trim: true
+  })
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/device/updateById', data)
+}
diff --git a/admin/src/api/business/deviceEvent.js b/admin/src/api/business/deviceEvent.js
new file mode 100644
index 0000000..06bcc8b
--- /dev/null
+++ b/admin/src/api/business/deviceEvent.js
@@ -0,0 +1,16 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/deviceEvent/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/deviceEvent/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
diff --git a/admin/src/api/business/deviceRole.js b/admin/src/api/business/deviceRole.js
new file mode 100644
index 0000000..420d6bc
--- /dev/null
+++ b/admin/src/api/business/deviceRole.js
@@ -0,0 +1,32 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/deviceRole/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/deviceRole/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/deviceRole/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/deviceRole/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/deviceRole/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/empower.js b/admin/src/api/business/empower.js
new file mode 100644
index 0000000..0b24879
--- /dev/null
+++ b/admin/src/api/business/empower.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/empower/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/empower/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/empower/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/empower/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/empower/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/empower/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/member.js b/admin/src/api/business/member.js
new file mode 100644
index 0000000..0d97137
--- /dev/null
+++ b/admin/src/api/business/member.js
@@ -0,0 +1,48 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  // return request.post('/business/member/page', data, {
+  //   trim: true
+  // })
+  return request.post('/business/member/findMemberInfoPage', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/member/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/member/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/member/updateById', data)
+}
+
+// 鎵归噺鎷夐粦
+export function batchBlock (ids) {
+  return request.get(`/business/member/batchBlock?ids=${ids}`)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/member/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/member/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/parks.js b/admin/src/api/business/parks.js
new file mode 100644
index 0000000..d104bc2
--- /dev/null
+++ b/admin/src/api/business/parks.js
@@ -0,0 +1,8 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/parks/page', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/api/business/problemLog.js b/admin/src/api/business/problemLog.js
new file mode 100644
index 0000000..fffc379
--- /dev/null
+++ b/admin/src/api/business/problemLog.js
@@ -0,0 +1,16 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/problemLog/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/problemLog/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
diff --git a/admin/src/api/business/problems.js b/admin/src/api/business/problems.js
new file mode 100644
index 0000000..c37c60d
--- /dev/null
+++ b/admin/src/api/business/problems.js
@@ -0,0 +1,23 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/problems/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/problems/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/problems/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/problems/delete/${id}`)
+}
diff --git a/admin/src/api/business/retention.js b/admin/src/api/business/retention.js
new file mode 100644
index 0000000..043ed5d
--- /dev/null
+++ b/admin/src/api/business/retention.js
@@ -0,0 +1,40 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/retention/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/retention/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/retention/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/retention/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/retention/delete/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/retention/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/visitEvent.js b/admin/src/api/business/visitEvent.js
new file mode 100644
index 0000000..2d5ab68
--- /dev/null
+++ b/admin/src/api/business/visitEvent.js
@@ -0,0 +1,8 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/visitEvent/page', data, {
+    trim: true
+  })
+}
diff --git a/admin/src/api/business/visits.js b/admin/src/api/business/visits.js
new file mode 100644
index 0000000..4fb1516
--- /dev/null
+++ b/admin/src/api/business/visits.js
@@ -0,0 +1,45 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/visits/page', data, {
+    trim: true
+  })
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/visits/exportExcel', data, {
+    trim: true,
+    download: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/visits/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/visits/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/visits/delete/${id}`)
+}
+
+// 鏍规嵁ID鏌ヨ
+export function queryById (id) {
+  return request.get(`/business/visits/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/visits/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/components/business/OperaCarsWindow.vue b/admin/src/components/business/OperaCarsWindow.vue
new file mode 100644
index 0000000..1f7b996
--- /dev/null
+++ b/admin/src/components/business/OperaCarsWindow.vue
@@ -0,0 +1,75 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        width="500px"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="杞︾墝鍙�" prop="code">
+                <el-input v-model="form.code" placeholder="璇疯緭鍏ヨ溅鐗屽彿" v-trim/>
+            </el-form-item>
+            <el-form-item label="鐢ㄦ埛绫诲瀷" prop="code">
+                <el-radio-group v-model="form.code">
+                    <el-radio label="鍐呴儴鍛樺伐"></el-radio>
+                    <el-radio label="鍔冲姟浜哄憳"></el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="閫夋嫨鐢ㄦ埛" prop="code">
+                <el-select v-model="form.code" filterable placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鎺堟潈鏈夋晥鏈�" prop="code">
+                <el-date-picker
+                    v-model="form.code"
+                    type="daterange"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫棩鏈�"
+                    end-placeholder="缁撴潫鏃ユ湡">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="鎺堟潈鍋滆溅鍦�" prop="code">
+                <el-radio-group v-model="form.code">
+                    <el-radio label="鍏ㄩ儴鍋滆溅鍦�"></el-radio>
+                    <el-radio label="閮ㄥ垎鍋滆溅鍦�"></el-radio>
+                </el-radio-group>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCarsWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        code: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/cars',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaCategoryWindow.vue b/admin/src/components/business/OperaCategoryWindow.vue
new file mode 100644
index 0000000..e074136
--- /dev/null
+++ b/admin/src/components/business/OperaCategoryWindow.vue
@@ -0,0 +1,59 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="鍏徃绫诲瀷" prop="name">
+                <el-input v-model="form.name" placeholder="璇疯緭鍏ュ叕鍙哥被鍨�" v-trim/>
+            </el-form-item>
+            <el-form-item label="鐘舵��" prop="status">
+                <el-select v-model="form.status" placeholder="璇烽�夋嫨">
+                    <el-option label="鍚敤" value="0"></el-option>
+                    <el-option label="绂佺敤" value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="澶囨敞" prop="remark">
+                <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCategoryWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        remark: '',
+        status: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ叕鍙哥被鍨�', trigger: 'blur' }
+        ],
+        status: [
+          { required: true, message: '璇烽�夋嫨鏄惁鍚敤', trigger: 'change' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/category',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaCompanyWindow.vue b/admin/src/components/business/OperaCompanyWindow.vue
new file mode 100644
index 0000000..698a395
--- /dev/null
+++ b/admin/src/components/business/OperaCompanyWindow.vue
@@ -0,0 +1,64 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="鍚嶇О" prop="name">
+                <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+            </el-form-item>
+            <el-form-item label="鍏徃缂栫爜" prop="code">
+                <el-input v-model="form.code" placeholder="璇疯緭鍏ュ叕鍙哥紪鐮�" v-trim/>
+            </el-form-item>
+            <el-form-item label="鍏徃绫诲瀷" prop="type">
+                <el-select v-model="form.type" placeholder="璇烽�夋嫨">
+                    <el-option label="鍔冲姟鍏徃" :value="0"></el-option>
+                    <el-option label="鍐呴儴缁勭粐" :value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鑱旂郴浜�" prop="linkName">
+                <el-input v-model="form.linkName" placeholder="璇疯緭鍏ヨ仈绯讳汉" v-trim/>
+            </el-form-item>
+            <el-form-item label="鎵嬫満鍙�" prop="linkPhone">
+                <el-input type="number" v-model="form.linkPhone" maxlength="11" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim/>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaCompanyWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        type: '',
+        code: '',
+        linkName: '',
+        linkPhone: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ叕鍙稿悕绉�', trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/company',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaDeviceRoleFWindow.vue b/admin/src/components/business/OperaDeviceRoleFWindow.vue
new file mode 100644
index 0000000..9b5e912
--- /dev/null
+++ b/admin/src/components/business/OperaDeviceRoleFWindow.vue
@@ -0,0 +1,49 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
+                <el-input v-model="form.name" placeholder="璇疯緭鍏ラ棬绂佺粍鍚嶇О" v-trim/>
+            </el-form-item>
+            <el-form-item label="鎺堟潈闂ㄧ" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">璁垮</el-radio>
+                    <el-radio :label="6">鍔冲姟浜哄憳</el-radio>
+                </el-radio-group>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaDeviceRoleWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        doorIds: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/deviceRole',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaDeviceRoleWindow.vue b/admin/src/components/business/OperaDeviceRoleWindow.vue
new file mode 100644
index 0000000..76ddcfb
--- /dev/null
+++ b/admin/src/components/business/OperaDeviceRoleWindow.vue
@@ -0,0 +1,64 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="鍚嶇О" prop="name">
+                <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+            </el-form-item>
+            <el-form-item label="鏄惁榛樿" prop="isDefault">
+                <el-switch
+                    v-model="form.isDefault"
+                    active-color="#13ce66"
+                    inactive-color="#ff4949"
+                    :active-value="1"
+                    :inactive-value="0">
+                </el-switch>
+            </el-form-item>
+            <el-form-item label="鎺堟潈闂ㄧ" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">鍏ㄩ儴闂ㄧ</el-radio>
+                    <el-radio :label="6">閮ㄥ垎闂ㄧ</el-radio>
+                </el-radio-group>
+                <el-checkbox-group v-model="form.doorIds">
+                    <el-checkbox label="闂ㄧA"></el-checkbox>
+                    <el-checkbox label="闂ㄧB"></el-checkbox>
+                    <el-checkbox label="闂ㄧC"></el-checkbox>
+                </el-checkbox-group>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaDeviceRoleWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: '',
+        isDefault: '',
+        doorIds: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/deviceRole',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaDeviceWindow.vue b/admin/src/components/business/OperaDeviceWindow.vue
new file mode 100644
index 0000000..28967d6
--- /dev/null
+++ b/admin/src/components/business/OperaDeviceWindow.vue
@@ -0,0 +1,45 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="闂ㄧ鍚嶇О" prop="title">
+                <el-input v-model="form.title" placeholder="璇疯緭鍏ラ棬绂佸悕绉�" v-trim/>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaDeviceWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        title: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        title: [
+          { required: true, message: '璇疯緭鍏ラ棬绂佸悕绉�' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/device',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaInternalCompanyWindow.vue b/admin/src/components/business/OperaInternalCompanyWindow.vue
new file mode 100644
index 0000000..5d0b5fd
--- /dev/null
+++ b/admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -0,0 +1,42 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="鍚嶇О" prop="name">
+                <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaInternalCompanyWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        name: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/company',
+      'field.id': 'id'
+    })
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaProblemsWindow.vue b/admin/src/components/business/OperaProblemsWindow.vue
new file mode 100644
index 0000000..5fb5b7c
--- /dev/null
+++ b/admin/src/components/business/OperaProblemsWindow.vue
@@ -0,0 +1,107 @@
+<template>
+    <GlobalWindow
+            :title="title"
+            :visible.sync="visible"
+            :confirm-working="isWorking"
+            @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="棰樼洰" prop="title">
+                <el-input v-model="form.title" placeholder="璇疯緭鍏ラ鐩�" v-trim/>
+            </el-form-item>
+            <el-form-item label="棰樼洰绫诲瀷" prop="type">
+                <el-select v-model="form.type" placeholder="璇烽�夋嫨">
+                    <el-option label="鍒ゆ柇" value="0"></el-option>
+                    <el-option label="鍗曢��" value="1"></el-option>
+                    <el-option label="澶氶��" value="2"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="閫傜敤鐢ㄦ埛" prop="useType">
+                <el-radio-group v-model="form.useType">
+                    <el-radio :label="0">鍔冲姟浜哄憳</el-radio>
+                    <el-radio :label="1">鏅�氳瀹�</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="棰樼洰椤哄簭(鍗囧簭)" prop="sortnu">
+                <el-input v-model="form.sortnu" placeholder="璇疯緭鍏�" v-trim/>
+            </el-form-item>
+            <el-form-item label="閫夐」闆嗗悎" prop="options" v-if="form.type === '1' || form.type === '2'">
+                <el-button type="primary" style="width: 120px; margin-bottom: 15px;" @click="add" icon="el-icon-plus">娣诲姞閫夐」</el-button>
+                <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
+                    <el-tab-pane
+                        v-for="item in problems"
+                        :key="item.name"
+                        :label="item.name"
+                        :name="item.id"
+                    >
+                        <el-input v-model="item.val" placeholder="璇疯緭鍏�" v-trim/>
+                    </el-tab-pane>
+                </el-tabs>
+            </el-form-item>
+            <el-form-item label="姝g‘绛旀" prop="answer">
+                <el-select v-model="form.answer" multiple placeholder="璇烽�夋嫨姝g‘绛旀">
+                    <el-option
+                        v-for="item in problems"
+                        :key="item.id"
+                        :label="item.name"
+                        :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaProblemsWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        id: null,
+        title: '',
+        options: '',
+        answer: '',
+        sortnu: '',
+        type: '',
+        useType: ''
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      },
+      editableTabsValue: '0',
+      problems: [
+        { name: '閫夋嫨A', val: '', id: '0' }
+      ],
+      arr: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/problems',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    removeTab (e) {
+      this.problems.splice(e, 1)
+      if (e === this.editableTabsValue) {
+        this.editableTabsValue = '0'
+      }
+      this.problems.forEach((item, index) => {
+        item.name = '閫夐」' + this.arr[index]
+        item.id = index.toString()
+      })
+    },
+    add () {
+      const name = '閫夐」' + this.arr[this.problems.length]
+      this.problems.push({ name, val: '', id: this.problems.length.toString() })
+    }
+  }
+}
+</script>
diff --git a/admin/src/components/business/OperaVisitsDesWindow.vue b/admin/src/components/business/OperaVisitsDesWindow.vue
new file mode 100644
index 0000000..9cf9b28
--- /dev/null
+++ b/admin/src/components/business/OperaVisitsDesWindow.vue
@@ -0,0 +1,217 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        width="60%"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <div class="list">
+            <div class="list_item">
+                <div class="list_item_label">鎷滆淇℃伅</div>
+                <div class="list_item_val" v-if="info">
+                    <div class="list_item_val_item">鎷滆瀵规柟锛歿{info.receptMemberName}} - {{info.receptMemberDepartment}}</div>
+                    <div class="list_item_val_item">鎷滆鏃堕棿锛歿{info.starttime}} 鑷� {{info.endtime}}</div>
+                    <div class="list_item_val_item">鎷滆浜嬬敱锛歿{info.reason}}</div>
+                    <div class="list_item_val_item">鐢宠浜哄憳锛歿{info.name}} {{info.companyName}}</div>
+                    <div class="list_item_val_item">鐢宠闂ㄧ锛歿{info.deviceList ? info.deviceList.map(item => item.name).join(',') : ''}}</div>
+                    <div class="list_item_val_item">鍒涘缓鏃堕棿锛歿{info.createDate}}</div>
+                </div>
+            </div>
+            <div class="list_item">
+                <div class="list_item_label">璁垮淇℃伅</div>
+                <div class="list_item_info" v-if="info">闅忚杞﹁締锛歿{info.carNos}}</div>
+                <div class="list_item_table" v-if="info">
+                    <el-table
+                        :data="info.lwWithUserList ? info.lwWithUserList : []"
+                        border
+                        :header-cell-style="{background: '#dcdde2', color: 'rgb(51, 51, 51)'}"
+                        style="width: 100%">
+                        <el-table-column
+                            prop="name"
+                            label="濮撳悕">
+                        </el-table-column>
+                        <el-table-column
+                            label="鎬у埆">
+                            <template slot-scope="{row}">
+                                <span v-if="row.sex === 1">鐢�</span>
+                                <span v-if="row.sex === 2">濂�</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column
+                            prop="birthday"
+                            label="骞撮緞">
+                        </el-table-column>
+                        <el-table-column
+                            prop="phone"
+                            label="鎵嬫満鍙�">
+                        </el-table-column>
+                        <el-table-column
+                            label="璇佷欢绫诲瀷">
+                            <template slot-scope="{row}">
+                                <span v-if="row.idcardType === 0">韬唤璇�</span>
+                                <span v-if="row.idcardType === 1">娓境璇佷欢</span>
+                                <span v-if="row.idcardType === 2">鎶ょ収</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column
+                            prop="idcardNo"
+                            label="韬唤璇佸彿鐮�">
+                        </el-table-column>
+                        <el-table-column
+                            prop="companyName"
+                            label="鍏徃">
+                        </el-table-column>
+                        <el-table-column
+                            prop="faceImg"
+                            label="浜鸿劯鐓х墖">
+                        </el-table-column>
+                        <el-table-column
+                            prop="imgurl"
+                            label="鍋ュ悍璇�">
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+<!--            <div class="list_item">-->
+<!--                <div class="list_item_label">瀹℃壒娴佺▼</div>-->
+<!--                <div class="list_item_status">-->
+<!--                    <div class="list_item_status_item" v-for="(item, index) in 3" :key="index">-->
+<!--                        <div class="dian"></div>-->
+<!--                        <div class="xian"></div>-->
+<!--                        <div class="status_info">-->
+<!--                            <span class="status_info_a">寮犱笁鎻愪氦鐨勫姵鍔″叆鍘傜敵璇�</span>-->
+<!--                            <span class="status_info_b">鐜嬬粡鐞嗭紙宸插悓鎰忥級</span>-->
+<!--                            <div class="status_info_c">鏉ヨ鍙傝宸ュ巶锛屾湜棰嗗鎵瑰噯</div>-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </div>-->
+<!--            </div>-->
+        </div>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { queryById } from '@/api/business/visits'
+export default {
+  name: 'OperaVisitsWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      list: [],
+      info: null
+    }
+  },
+  methods: {
+    open (title, id) {
+      this.title = title
+      this.visible = true
+      queryById(id)
+        .then(res => {
+          console.log(res)
+          this.info = res
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .list {
+        width: 100%;
+        display: flex;
+        flex-direction: column;
+        .list_item {
+            width: 100%;
+            margin-bottom: 30px;
+            &:last-child {
+                margin-bottom: 0 !important;
+            }
+            .list_item_label {
+                font-size: 18px;
+                font-weight: 600;
+                color: #000000;
+                margin-bottom: 15px;
+            }
+            .list_item_info {
+                font-size: 14px;
+                color: #222222;
+                margin-bottom: 10px;
+            }
+            .list_item_status {
+                width: 100%;
+                display: flex;
+                flex-direction: column;
+                .list_item_status_item {
+                    width: 100%;
+                    max-height: 100px;
+                    position: relative;
+                    margin-bottom: 30px;
+                    .dian {
+                        width: 15px;
+                        height: 15px;
+                        border-radius: 50%;
+                        background: #ffb447;
+                        position: absolute;
+                        left: 0;
+                        top: 50%;
+                        transform: translate(0, -50%);
+                    }
+                    .xian {
+                        width: 1px;
+                        height: calc(100% + 30px);
+                        background: #ffb447;
+                        position: absolute;
+                        top: 50%;
+                        left: 7px;
+                        transform: translate(-50%, 0);
+                    }
+                    .status_info {
+                        /*width: 100%;*/
+                        height: 100%;
+                        display: flex;
+                        flex-direction: column;
+                        margin-left: 30px;
+                        box-sizing: border-box;
+                        .status_info_a {
+                            font-size: 16px;
+                            color: black;
+                            margin-bottom: 10px;
+                        }
+                        .status_info_b {
+                            font-size: 13px;
+                            color: #666666;
+                            margin-bottom: 10px;
+                        }
+                        .status_info_c {
+                            padding: 5px 10px;
+                            background: #ececec;
+                            font-size: 13px;
+                            color: black;
+                            border-radius: 5px;
+                            box-sizing: border-box;
+                        }
+                    }
+                }
+            }
+            .list_item_val {
+                width: 100%;
+                margin-bottom: 15px;
+                &:last-child {
+                    margin-bottom: 0 !important;
+                }
+                .list_item_val_item {
+                    font-size: 14px;
+                    color: #222222;
+                    margin-bottom: 5px;
+                    &:last-child {
+                        margin-bottom: 0 !important;
+                    }
+                }
+            }
+        }
+    }
+</style>
diff --git a/admin/src/components/common/Menu.vue b/admin/src/components/common/Menu.vue
index 9cdad55..d11fb80 100644
--- a/admin/src/components/common/Menu.vue
+++ b/admin/src/components/common/Menu.vue
@@ -5,13 +5,14 @@
       <h1 :class="{hidden: menuData.collapse}">璞嗙背璺宠烦</h1>
     </div>
     <scrollbar>
+<!--      :default-openeds="defaultOpeneds"-->
       <el-menu
         ref="menu"
+        :unique-opened="true"
         :default-active="activeIndex"
         text-color="#fff"
         active-text-color="#fff"
         :collapse="menuData.collapse"
-        :default-openeds="defaultOpeneds"
         :collapse-transition="false"
         @select="handleSelect"
       >
diff --git a/admin/src/components/common/Tree.vue b/admin/src/components/common/Tree.vue
new file mode 100644
index 0000000..47b7e6a
--- /dev/null
+++ b/admin/src/components/common/Tree.vue
@@ -0,0 +1,158 @@
+<template>
+<!--    <div class="tree">-->
+<!--        <div v-for="(item, index) of list" :key="index" @click.stop="clickIten(item)">-->
+<!--            <div class="tree_item">-->
+<!--                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item[defaultProps.status] }" v-show="item[defaultProps.status] && item[defaultProps.children]"></i>-->
+<!--                <i class="el-icon-caret-right color" v-show="item[defaultProps.children] && !item[defaultProps.status]"></i>-->
+<!--                <div class="tree_item_label long-title-style" :title="item[defaultProps.name]" :class="{ 'activeColor': item[defaultProps.status] && !item[defaultProps.children] }">{{ item[defaultProps.name] }}</div>-->
+<!--            </div>-->
+<!--            <div class="tree_childern" v-show="item[defaultProps.status]">-->
+<!--                <tree-->
+<!--                  :list="item[defaultProps.children]"-->
+<!--                  :defaultProps="defaultProps"-->
+<!--                  @callback="callback"-->
+<!--                />-->
+<!--            </div>-->
+<!--        </div>-->
+<!--    </div>-->
+    <div class="tree">
+        <div v-for="(item, index) in list" :key="index" @click.stop="clickIten(item)">
+            <div class="tree_item">
+                <i class="el-icon-caret-bottom" :class="{ 'activeColor': item.status }" v-show="item.status === 1 && item.companyDTOList.length > 0"></i>
+                <i class="el-icon-caret-right color" v-show="item.companyDTOList.length > 0 && item.status === 0"></i>
+                <div class="tree_item_label long-title-style" :title="item.name" :class="{ 'activeColor': item.status === 1 && item.companyDTOList.length === 0 }">{{ item.name }}</div>
+            </div>
+            <div class="tree_childern" v-show="item.status === 1">
+                <tree
+                    :list="item.companyDTOList"
+                    :defaultProps="defaultProps"
+                    @callback="callback"
+                />
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// import Bus from '@/utils/eventBus'
+export default {
+  name: 'tree',
+  props: {
+    list: {
+      type: Array,
+      required: false,
+      default: () => []
+    },
+    defaultProps: {
+      type: Object,
+      require: false,
+      default: () => {
+        return {
+          name: 'name',
+          status: 'status',
+          children: 'children',
+          id: 'id'
+        }
+      }
+    }
+  },
+  data () {
+    return {
+      tempItem: {
+        id: null,
+        name: null
+      }
+    }
+  },
+  methods: {
+    // 鐐瑰嚮褰撳墠椤�
+    clickIten (item) {
+      this.recursion(this.list)
+      item.status === 0 ? item.status = 1 : item.status = 0
+      // item[this.defaultProps.status] = !item[this.defaultProps.status]
+      // this.list.forEach(subItem => {
+      //   if ((subItem[this.defaultProps.id] !== item[this.defaultProps.id] && subItem[this.defaultProps.status]) || (this.list.length === 1 && subItem[this.defaultProps.status] === false)) {
+      //     subItem[this.defaultProps.status] = false
+      //     if (subItem[this.defaultProps.children]) {
+      //       this.recursion(subItem[this.defaultProps.children])
+      //     }
+      //   }
+      // })
+      // if (this.tempItem.id === item[this.defaultProps.id]) {
+      //   this.tempItem = {
+      //     id: null,
+      //     name: null
+      //   }
+      // } else {
+      //   this.tempItem.id = item[this.defaultProps.id]
+      //   this.tempItem.name = item[this.defaultProps.name]
+      // }
+
+      this.$emit('callback', item)
+    },
+    // 閫掑綊鏂规硶
+    recursion (children) {
+      // children.forEach(item => {
+      //   item[this.defaultProps.status] = false
+      //   if (item[this.defaultProps.children]) {
+      //     this.recursion(item[this.defaultProps.children])
+      //   }
+      // })
+      children.forEach(item => {
+        item.status = 0
+        if (item.companyDTOList.length > 0) {
+          this.recursion(item.companyDTOList)
+        }
+      })
+    },
+    callback (data, item) {
+      if (this.tempItem.id === data.id) {
+        this.tempItem = {}
+      } else {
+        this.tempItem.id = data.id
+        this.tempItem.name = data.name
+      }
+      this.$emit('callback', this.tempItem, item)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.tree {
+    /*width: 100%;*/
+    /*height: auto;*/
+    /*border-radius: 5px;*/
+    /*overflow: hidden;*/
+    /*border: 1px solid #eeeeee;*/
+    /*box-sizing: border-box;*/
+    .tree_childern {
+        margin-left: 20px;
+    }
+    .activeItem {
+        background: #F4F7FC;
+    }
+    .tree_item {
+        display: flex;
+        align-items: center;
+        height: 48px;
+        cursor: pointer;
+        padding-left: 10px;
+        .tree_item_label {
+            font-size: 14px;
+            font-weight: 400;
+            color: #333333;
+            white-space: nowrap;
+        }
+        i {
+            margin-right: 5px;
+        }
+        .color {
+            color: #999999 !important;
+        }
+        .activeColor {
+            color: #305ED5 !important;
+        }
+    }
+}
+</style>
diff --git a/admin/src/layouts/AppLayout.vue b/admin/src/layouts/AppLayout.vue
index 476998f..dc75809 100644
--- a/admin/src/layouts/AppLayout.vue
+++ b/admin/src/layouts/AppLayout.vue
@@ -38,7 +38,7 @@
   overflow: hidden;
   // 宸﹁竟鑿滃崟
   .el-aside {
-    width: $menu-width !important;
+    width: 250px !important;
     flex-shrink: 0;
     height: 100%;
     overflow-y: auto;
diff --git a/admin/src/layouts/TableLayout1.vue b/admin/src/layouts/TableLayout1.vue
new file mode 100644
index 0000000..934c5d5
--- /dev/null
+++ b/admin/src/layouts/TableLayout1.vue
@@ -0,0 +1,167 @@
+<template>
+    <div class="table-layout">
+        <!-- 澶撮儴 -->
+        <div v-if="withBreadcrumb" class="table-header">
+            <el-breadcrumb separator="/">
+                <el-breadcrumb-item v-for="path in paths" :key="path">{{path}}</el-breadcrumb-item>
+            </el-breadcrumb>
+        </div>
+        <Profile :roles="roles" :permissions="permissions">
+            <div style="width: 100%; height: 100%; padding: 0 16px; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between;">
+                <div style="width: 300px; height: 100%; flex-shrink: 0; background: #ffffff;">
+                    <slot name="menu"></slot>
+                </div>
+                <div style="width: calc(100% - 310px); height: 100%">
+                    <!-- 鎼滅储琛ㄥ崟閮ㄥ垎 -->
+                    <div class="table-search-form" style="padding: 0 !important;">
+                        <div class="form-wrap">
+                            <slot name="search-form"></slot>
+                        </div>
+                    </div>
+                    <slot name="space"></slot>
+                    <!-- 鍒楄〃鍜屽垎椤甸儴鍒� -->
+                    <div class="table-content" style="padding: 0 !important;">
+                        <div class="table-wrap">
+                            <slot name="table-wrap"></slot>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </Profile>
+    </div>
+</template>
+
+<script>
+import Profile from '../components/common/Profile'
+export default {
+  name: 'TableLayout1',
+  components: { Profile },
+  props: {
+    // 瑙掕壊
+    roles: {
+      type: Array
+    },
+    // 鏉冮檺
+    permissions: {
+      type: Array
+    },
+    // 鏄惁灞曠ず澶撮儴闈㈠寘灞�
+    withBreadcrumb: {
+      type: Boolean,
+      default: true
+    }
+  },
+  computed: {
+    paths () {
+      return this.$route.meta.paths
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+    @import "@/assets/style/variables.scss";
+    .table-layout {
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        .not-allow-wrap {
+            padding-top: 0;
+        }
+    }
+    // 澶撮儴
+    .table-header {
+        overflow: hidden;
+        padding: 12px 16px;
+        flex-shrink: 0;
+        // 椤甸潰璺緞
+        .el-breadcrumb {
+            .el-breadcrumb__item {
+                .el-breadcrumb__inner {
+                    color: #ABB2BE;
+                    font-size: 12px;
+                }
+                &:last-of-type .el-breadcrumb__inner {
+                    color: #606263;
+                    font-size: 14px;
+                }
+            }
+        }
+    }
+    // 鎼滅储
+    .table-search-form {
+        display: flex;
+        flex-wrap: wrap;
+        /*padding: 0 16px;*/
+        /*box-sizing: border-box;*/
+        .form-wrap {
+            padding: 16px 16px 0 16px;
+            width: 100%;
+            background: #fff;
+            &:empty {
+                padding: 0;
+            }
+        }
+        section {
+            display: inline-block;
+            margin-left: 16px;
+            margin-bottom: 18px;
+        }
+    }
+    // 鍒楄〃鍜屽垎椤�
+    .table-content {
+        margin-top: 10px;
+        /*padding: 0 16px;*/
+        .table-wrap {
+            padding: 16px 16px 0 16px;
+            background: #fff;
+            // 宸ュ叿鏍�
+            .toolbar {
+                border-bottom: 1px solid #eee;
+                padding-bottom: 10px;
+                li {
+                    display: inline-block;
+                    margin-right: 6px;
+                }
+            }
+            // 琛ㄦ牸
+            .el-table {
+                th {
+                    .cell {
+                        color: #666;
+                    }
+                }
+                // 澶嶉�夋鍒�
+                .el-table-column--selection {
+                    .cell {
+                        text-align: center !important;
+                    }
+                }
+                // 澶氬�煎瓧娈�
+                .table-column-strings {
+                    ul {
+                        li {
+                            display: inline-block;
+                            background: #eee;
+                            border-radius: 3px;
+                            padding: 0 3px;
+                            margin-right: 3px;
+                            margin-bottom: 3px;
+                        }
+                    }
+                }
+                // 鏍戣瑙夎皟鏁�
+                [class*=el-table__row--level] .el-table__expand-icon {
+                    position: relative;
+                    left: -6px;
+                    margin-right: 0;
+                }
+            }
+            // 鍒嗛〉
+            .table-pagination {
+                padding: 16px 0;
+                text-align: left;
+            }
+        }
+    }
+</style>
diff --git a/admin/src/views/business/blackmailPersonnel.vue b/admin/src/views/business/blackmailPersonnel.vue
new file mode 100644
index 0000000..8d52eb5
--- /dev/null
+++ b/admin/src/views/business/blackmailPersonnel.vue
@@ -0,0 +1,116 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヨ瀹㈠悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵嬫満鍙�" prop="code">
+                <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃鍚嶇О" prop="code">
+                <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎿嶄綔浜哄憳" prop="code">
+                <el-select v-model="searchForm.code" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="浜哄憳绫诲瀷" prop="companyId">
+                <el-select v-model="searchForm.code" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" v-permissions="['business:member:create']">绉诲嚭</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="idcard_id" label="韬唤璇佸彿鐮�" min-width="100px"></el-table-column>
+                <el-table-column label="浜哄憳绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.type === 0">鍔冲姟璁垮</span>
+                        <span v-if="row.type === 1">鏅�氳瀹�</span>
+                        <span v-if="row.type === 2">鍐呴儴浜哄憳</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="company_id" label="鍏徃" min-width="100px"></el-table-column>
+                <el-table-column prop="edit_date" label="鎿嶄綔鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="editor" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" icon="el-icon-edit" v-permissions="['business:member:update']">绉诲嚭</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'blackmailPersonnel',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        companyId: '',
+        name: '',
+        code: '',
+        status: 2,
+        type: 1
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/carEvent.vue b/admin/src/views/business/carEvent.vue
new file mode 100644
index 0000000..5644f65
--- /dev/null
+++ b/admin/src/views/business/carEvent.vue
@@ -0,0 +1,118 @@
+<template>
+    <TableLayout :permissions="['business:category:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="杞︾墝鍙�" prop="plateNos">
+                <el-input v-model="searchForm.plateNos" placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="濮撳悕/鎵嬫満鍙�" prop="plateNos">
+                <el-input v-model="searchForm.plateNos" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃/閮ㄩ棬鍚嶇О" prop="plateNos">
+                <el-input v-model="searchForm.plateNos" placeholder="璇疯緭鍏ュ叕鍙�/閮ㄩ棬鍚嶇О" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="浜哄憳绫诲瀷" prop="plateNos">
+                <el-select v-model="searchForm.plateNos" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="浜嬩欢绫诲瀷" prop="eventType">
+                <el-select v-model="searchForm.eventType" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="璧峰鏃堕棿" prop="eventType">
+                <el-date-picker
+                    v-model="searchForm.eventType"
+                    type="daterange"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫棩鏈�"
+                    end-placeholder="缁撴潫鏃ユ湡">
+                </el-date-picker>
+            </el-form-item>
+            <el-radio-group v-model="searchForm.eventType" size="small">
+                <el-radio-button label="褰撳ぉ"></el-radio-button>
+                <el-radio-button label="杩�7澶�"></el-radio-button>
+                <el-radio-button label="杩�30澶�"></el-radio-button>
+            </el-radio-group>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" v-permissions="['business:member:create']">瀵煎嚭</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="plateNos" label="杞︾墝鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="plateNos" label="褰掑睘鐢ㄦ埛绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="plateNos" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="plateNos" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="plateNos" label="鍏徃/閮ㄩ棬" min-width="100px"></el-table-column>
+                <el-table-column prop="parkName" label="鍋滆溅搴撳悕绉�" min-width="100px"></el-table-column>
+                <el-table-column prop="gateName" label="鍑哄叆鍙e悕绉�" min-width="100px"></el-table-column>
+                <el-table-column prop="eventType" label="浜嬩欢绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="inoutType" label="鍑哄叆绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.inoutType === 0">杩涘満</span>
+                        <span v-if="row.inoutType === 1">鍑哄満</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="vehiclePicUrl" label="鎶撴媿鍥剧墖" min-width="100px"></el-table-column>
+                <el-table-column prop="happenTime" label="浜嬩欢鏃堕棿" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'CarEvent',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        eventType: '',
+        plateNos: ''
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '鍋滆溅鍦轰簨浠舵帹閫佽褰曡〃',
+      api: '/business/carEvent',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/cars.vue b/admin/src/views/business/cars.vue
new file mode 100644
index 0000000..f135dec
--- /dev/null
+++ b/admin/src/views/business/cars.vue
@@ -0,0 +1,100 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="120px" inline>
+            <el-form-item label="杞︾墝鍙�" prop="code">
+                <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍛樺伐濮撳悕/鎵嬫満鍙�" prop="code">
+                <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ憳宸ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="閮ㄩ棬" prop="code">
+                <el-select v-model="value" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" @click="$refs.operaCarsWindow.open('鏂板缓杞﹁締淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓</el-button></li>
+                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="code" label="杞︾墝鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="code" label="鍋滆溅鍦�" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="鐢ㄦ埛绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="閮ㄩ棬/鍏徃" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="鏈夋晥鏈�" min-width="100px"></el-table-column>
+                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaCarsWindow.open('缂栬緫杞﹁締淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:member:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaCarsWindow ref="operaCarsWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaCarsWindow from '@/components/business/OperaCarsWindow'
+export default {
+  name: 'Cars',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaCarsWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        code: ''
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '杞﹁締淇℃伅琛�',
+      api: '/business/cars',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/category.vue b/admin/src/views/business/category.vue
new file mode 100644
index 0000000..910134b
--- /dev/null
+++ b/admin/src/views/business/category.vue
@@ -0,0 +1,93 @@
+<template>
+    <TableLayout :permissions="['business:category:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鐘舵��" prop="status">
+                <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨">
+                    <el-option label="鍚敤" value="0"></el-option>
+                    <el-option label="绂佺敤" value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
+                <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鍒嗙被淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="鍏徃绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+                <el-table-column prop="status" label="鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.status === 0">鍚敤</span>
+                        <span v-if="row.status === 1">绂佺敤</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:category:update', 'business:category:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鍒嗙被淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
+export default {
+  name: 'Category',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaCategoryWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        status: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鍒嗙被淇℃伅琛�',
+      api: '/business/category',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/company.vue b/admin/src/views/business/company.vue
new file mode 100644
index 0000000..ec0c4fb
--- /dev/null
+++ b/admin/src/views/business/company.vue
@@ -0,0 +1,114 @@
+<template>
+    <TableLayout :permissions="['business:company:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="鍏徃鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃绫诲瀷" prop="type" @keypress.enter.native="search">
+                <el-select v-model="searchForm.type" placeholder="璇烽�夋嫨">
+                    <el-option label="鍔冲姟鍏徃" value="0"></el-option>
+                    <el-option label="鍐呴儴缁勭粐" value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鑱旂郴浜哄鍚�" prop="linkName">
+                <el-input v-model="searchForm.linkName" placeholder="璇疯緭鍏ヨ仈绯讳汉濮撳悕" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鑱旂郴鐢佃瘽" prop="linkPhone">
+                <el-input v-model="searchForm.linkPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']">
+                <li><el-button type="primary" @click="$refs.operaCompanyWindow.open('鏂板')" icon="el-icon-plus" v-permissions="['business:company:create']">鏂板缓</el-button></li>
+<!--                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button></li>-->
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="鍏徃" min-width="100px"></el-table-column>
+                <el-table-column prop="type" label="鍏徃绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.type === 0">鍔冲姟鍏徃</span>
+                        <span v-if="row.type === 1">鍐呴儴缁勭粐</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="code" label="鍏徃缂栫爜" min-width="100px"></el-table-column>
+                <el-table-column prop="num" label="鍔冲姟浜烘暟" min-width="100px"></el-table-column>
+                <el-table-column prop="linkName" label="璐熻矗浜�" min-width="100px"></el-table-column>
+                <el-table-column prop="linkPhone" label="鑱旂郴鐢佃瘽" min-width="100px"></el-table-column>
+                <el-table-column prop="status" label="鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <el-switch
+                            v-model="row.status"
+                            active-color="#13ce66"
+                            inactive-color="#ff4949">
+                        </el-switch>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="creator" label="鍒涘缓浜�" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaCompanyWindow.open('缂栬緫', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaCompanyWindow ref="operaCompanyWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaCompanyWindow from '@/components/business/OperaCompanyWindow'
+export default {
+  name: 'Company',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaCompanyWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: '',
+        linkName: '',
+        linkPhone: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浼佷笟淇℃伅琛�',
+      api: '/business/company',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/device.vue b/admin/src/views/business/device.vue
new file mode 100644
index 0000000..d93229a
--- /dev/null
+++ b/admin/src/views/business/device.vue
@@ -0,0 +1,95 @@
+<template>
+    <TableLayout :permissions="['business:company:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="闂ㄧ鍚嶇О" prop="title">
+                <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ラ棬绂佸悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="闂ㄧ绛夌骇" prop="level">
+                <el-select v-model="searchForm.level" placeholder="璇烽�夋嫨闂ㄧ绛夌骇" @keypress.enter.native="search">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar">
+                <li><el-button type="primary">鍚屾</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="manufature" label="鍘傚晢" min-width="100px"></el-table-column>
+                <el-table-column prop="no" label="璁惧缂栧彿" min-width="100px"></el-table-column>
+                <el-table-column prop="title" label="闂ㄧ鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="level" label="闂ㄧ绛夌骇" min-width="100px"></el-table-column>
+                <el-table-column prop="status" label="璁惧鐘舵�� 0绂佺敤 1鍚敤" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.status === 0">绂佺敤</span>
+                        <span v-if="row.status === 1">鍚敤</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:company:update'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaDeviceWindow.open('缂栬緫璁惧淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaDeviceWindow ref="operaDeviceWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaDeviceWindow from '@/components/business/OperaDeviceWindow'
+export default {
+  name: 'Device',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaDeviceWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        title: '',
+        level: ''
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '璁惧淇℃伅琛�',
+      api: '/business/device',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/deviceEvent.vue b/admin/src/views/business/deviceEvent.vue
new file mode 100644
index 0000000..c5be976
--- /dev/null
+++ b/admin/src/views/business/deviceEvent.vue
@@ -0,0 +1,111 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕/鎵嬫満鍙�" prop="eventType">
+                <el-input v-model="searchForm.eventType" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃/缁勭粐鍚嶇О" prop="eventType">
+                <el-input v-model="searchForm.eventType" placeholder="璇疯緭鍏ュ叕鍙�/缁勭粐鍚嶇О" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="浜哄憳绫诲瀷" prop="userType">
+                <el-select v-model="searchForm.userType" placeholder="璇烽�夋嫨">
+                    <el-option label="鏈煡" value="0"></el-option>
+                    <el-option label="鏅��" value="1"></el-option>
+                    <el-option label="鏉ュ" value="2"></el-option>
+                    <el-option label="榛戝悕鍗�" value="3"></el-option>
+                    <el-option label="绠$悊鍛�" value="4"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="浜嬩欢绫诲瀷" prop="eventType">
+                <el-select v-model="searchForm.eventType" placeholder="璇烽�夋嫨">
+                    <el-option label="鏈煡" value="0"></el-option>
+                    <el-option label="鏅��" value="1"></el-option>
+                    <el-option label="鏉ュ" value="2"></el-option>
+                    <el-option label="榛戝悕鍗�" value="3"></el-option>
+                    <el-option label="绠$悊鍛�" value="4"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="璧峰鏃堕棿" prop="eventType">
+                <el-date-picker
+                    v-model="searchForm.eventType"
+                    type="daterange"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫棩鏈�"
+                    end-placeholder="缁撴潫鏃ユ湡">
+                </el-date-picker>
+            </el-form-item>
+            <el-radio-group v-model="searchForm.eventType" size="small">
+                <el-radio-button label="褰撳ぉ"></el-radio-button>
+                <el-radio-button label="杩�7澶�"></el-radio-button>
+                <el-radio-button label="杩�30澶�"></el-radio-button>
+            </el-radio-group>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:member:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="userType" label="浜哄憳绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.userType === 0">鍔冲姟璁垮</span>
+                        <span v-if="row.userType === 1">鏅�氳瀹�</span>
+                        <span v-if="row.userType === 2">鍐呴儴浜哄憳</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="idcard" label="韬唤璇佸彿鐮�" min-width="100px"></el-table-column>
+                <el-table-column prop="company" label="鍏徃/缁勭粐" min-width="100px"></el-table-column>
+                <el-table-column prop="srcName" label="闂ㄧ鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="srcName" label="闂ㄧ鐐�" min-width="100px"></el-table-column>
+                <el-table-column prop="eventType" label="浜嬩欢绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="eventType" label="鍑哄叆绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="extEventPictureURL" label="鎶撴媿鐓х墖" min-width="100px"></el-table-column>
+                <el-table-column prop="happenTime" label="浜嬩欢鏃堕棿" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'DeviceEvent',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        eventType: '',
+        userType: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '闂ㄧ浜嬩欢鎺ㄩ�佽褰曡〃',
+      api: '/business/deviceEvent',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/deviceRole.vue b/admin/src/views/business/deviceRole.vue
new file mode 100644
index 0000000..2b69060
--- /dev/null
+++ b/admin/src/views/business/deviceRole.vue
@@ -0,0 +1,91 @@
+<template>
+    <TableLayout :permissions="['business:company:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ラ棬绂佺粍鍚嶇О" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']">
+                <li><el-button type="primary" @click="$refs.operaDeviceRoleWindow.open('鏂板缓闂ㄧ瑙掕壊淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:company:create']">鏂板缓</el-button></li>
+                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="闂ㄧ缁勫悕绉�" min-width="100px"></el-table-column>
+                <el-table-column prop="name" label="浣跨敤浜烘暟" min-width="100px"></el-table-column>
+                <el-table-column prop="isDefault" label="鏄惁榛樿" min-width="100px">
+                    <template slot-scope="{row}">
+                        <el-switch
+                            v-model="row.isDefault"
+                            active-color="#13ce66"
+                            inactive-color="#ff4949"
+                            :active-value="1"
+                            :inactive-value="0">
+                        </el-switch>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('缂栬緫闂ㄧ瑙掕壊淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaDeviceRoleWindow ref="operaDeviceRoleWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaDeviceRoleWindow from '@/components/business/OperaDeviceRoleWindow'
+export default {
+  name: 'DeviceRole',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaDeviceRoleWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: '2'
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '闂ㄧ瑙掕壊淇℃伅琛�',
+      api: '/business/deviceRole',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/deviceRole_f.vue b/admin/src/views/business/deviceRole_f.vue
new file mode 100644
index 0000000..f1c14f0
--- /dev/null
+++ b/admin/src/views/business/deviceRole_f.vue
@@ -0,0 +1,85 @@
+<template>
+    <TableLayout :permissions="['business:company:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ラ棬绂佺粍鍚嶇О" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar">
+                <li><el-button type="primary">鍚屾</el-button></li>
+            </ul>
+            <el-table
+                    v-loading="isWorking.search"
+                    :data="tableData.list"
+                    stripe
+                    @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="闂ㄧ缁勫悕绉�" min-width="100px"></el-table-column>
+                <el-table-column prop="name" label="閫傜敤鐢ㄦ埛绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="name" label="浣跨敤浜烘暟" min-width="100px"></el-table-column>
+                <el-table-column prop="isDefault" label="鏄惁榛樿" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.isDefault === 1">鏄�</span>
+                        <span v-if="row.isDefault === 0">鍚�</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('缂栬緫闂ㄧ瑙掕壊淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaDeviceRoleWindow ref="operaDeviceRoleWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaDeviceRoleWindow from '@/components/business/OperaDeviceRoleFWindow'
+export default {
+  name: 'DeviceRole',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaDeviceRoleWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: '1'
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '闂ㄧ瑙掕壊淇℃伅琛�',
+      api: '/business/deviceRole',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/empower.vue b/admin/src/views/business/empower.vue
new file mode 100644
index 0000000..a6373f5
--- /dev/null
+++ b/admin/src/views/business/empower.vue
@@ -0,0 +1,116 @@
+<template>
+    <TableLayout :permissions="['business:empower:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕鎵嬫満鍙�" prop="startTime">
+                <el-input v-model="searchForm.startTime" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="涓嬪彂鐘舵��" prop="sendStatus">
+                <el-select v-model="searchForm.sendStatus" placeholder="璇烽�夋嫨">
+                    <el-option label="寰呬笅鍙�" value="0"></el-option>
+                    <el-option label="宸蹭笅鍙�" value="1"></el-option>
+                    <el-option label="宸插彇娑�" value="2"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鍏徃" prop="sendStatus">
+                <el-select v-model="searchForm.sendStatus" placeholder="璇烽�夋嫨鍏徃">
+                    <el-option label="寰呬笅鍙�" value="0"></el-option>
+                    <el-option label="宸蹭笅鍙�" value="1"></el-option>
+                    <el-option label="宸插彇娑�" value="2"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="涓嬪彂璧峰鏃堕棿" prop="startTime">
+                <el-input v-model="searchForm.startTime" placeholder="璇疯緭鍏ラ棬绂佹湁鏁堟湡寮�濮�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-radio-group v-model="searchForm.eventType" size="small">
+                <el-radio-button label="褰撳ぉ"></el-radio-button>
+                <el-radio-button label="杩�7澶�"></el-radio-button>
+                <el-radio-button label="杩�30澶�"></el-radio-button>
+            </el-radio-group>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:member:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>-->
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:empower:create', 'business:empower:delete']">
+                <li><el-button type="primary" v-permissions="['business:empower:create']">瀵煎嚭</el-button></li>
+                <li><el-button type="primary" v-permissions="['business:empower:create']">绔嬪嵆涓嬪彂</el-button></li>
+                <li><el-button type="primary" v-permissions="['business:empower:create']">鍙栨秷涓嬪彂</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="韬唤璇佸彿鐮�" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵�灞炲叕鍙�" min-width="100px"></el-table-column>
+                <el-table-column label="闂ㄧ鏈夋晥鏈�" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span>璧凤細{{row.startTime}}</span>
+                        <span>姝細{{row.endTime}}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="sendDate" label="瀵煎叆鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="sendUserId" label="鎿嶄綔浜哄憳" min-width="100px"></el-table-column>
+                <el-table-column label="涓嬪彂鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.sendStatus === 0">寰呬笅鍙�</span>
+                        <span v-if="row.sendStatus === 1">宸蹭笅鍙�</span>
+                        <span v-if="row.sendStatus === 2">宸插彇娑�</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="sendType" label="涓嬪彂绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.sendType === 0">瀹炴椂</span>
+                        <span v-if="row.sendType === 1">瀹氭椂</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="sendDate" label="涓嬪彂鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="sendInfo" label="涓嬪彂澶辫触鍘熷洜" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'Empower',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        startTime: '',
+        endTime: '',
+        sendStatus: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳鎺堟潈瀵煎叆璁板綍',
+      api: '/business/empower',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/freezePersonnel.vue b/admin/src/views/business/freezePersonnel.vue
new file mode 100644
index 0000000..9bbe5f7
--- /dev/null
+++ b/admin/src/views/business/freezePersonnel.vue
@@ -0,0 +1,112 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヨ瀹㈠悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="宸ュ彿" prop="code">
+                <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="閮ㄩ棬" prop="companyId">
+                <el-cascader
+                    :options="options"
+                    v-model="searchForm.companyId"
+                    @change="changeCompanyId"
+                    :show-all-levels="false"
+                    @keypress.enter.native="search"
+                    :props="{ checkStrictly: true, value: 'id', label: 'name', children: 'companyDTOList' }"
+                    ></el-cascader>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" v-permissions="['business:member:create']">瑙e喕</el-button></li>
+                <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:member:exportExcel']" @click="exportExcel">瀵煎嚭</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="companyId" label="閮ㄩ棬" min-width="100px"></el-table-column>
+                <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
+                <el-table-column prop="visitsLastDate" label="鏈�鍚庝竴娆¢棬绂佹椂闂�" min-width="100px"></el-table-column>
+                <el-table-column prop="userActionType1" label="鍐荤粨鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" icon="el-icon-edit" v-permissions="['business:member:update']">瑙e喕</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import { findCompanyTreePage } from '@/api/business/company'
+import { updateRemoveStatusById } from '@/api/business/block'
+export default {
+  name: 'freezePersonnel',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        companyId: '',
+        name: '',
+        code: '',
+        type: 2
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/block',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+    this.getfindCompanyTreePage()
+  },
+  methods: {
+    changeCompanyId (e) {
+      this.searchForm.companyId = e[e.length - 1]
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindCompanyTreePage () {
+      findCompanyTreePage(1)
+        .then(res => {
+          console.log(res)
+          this.options = res
+          // this.search()
+        })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/internalCompany.vue b/admin/src/views/business/internalCompany.vue
new file mode 100644
index 0000000..2cba996
--- /dev/null
+++ b/admin/src/views/business/internalCompany.vue
@@ -0,0 +1,93 @@
+<template>
+    <TableLayout :permissions="['business:company:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="缁勭粐鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ョ粍缁囧悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵�灞炰笂绾х粍缁�" prop="parentName">
+                <el-input v-model="searchForm.parentName" placeholder="璇疯緭鍏ユ墍灞炰笂绾х粍缁�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']">
+                <li><el-button type="primary" v-permissions="['business:company:create']" @click="synchronous()">鍚屾</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="缁勭粐鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="parentName" label="涓婄骇缁勭粐" min-width="100px"></el-table-column>
+                <el-table-column prop="editDate" label="鏈�鍚庢洿鏂版椂闂�" min-width="100px"></el-table-column>
+<!--                <el-table-column-->
+<!--                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"-->
+<!--                    label="鎿嶄綔"-->
+<!--                    min-width="80"-->
+<!--                    fixed="right"-->
+<!--                >-->
+<!--                    <template slot-scope="{row}">-->
+<!--                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('缂栬緫浼佷笟淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>-->
+<!--                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>-->
+<!--                    </template>-->
+<!--                </el-table-column>-->
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+<!--        <OperaInternalCompanyWindow ref="OperaInternalCompanyWindow" @success="handlePageChange"/>-->
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import { companySync } from '@/api/business/company'
+// import OperaInternalCompanyWindow from '@/components/business/OperaInternalCompanyWindow'
+export default {
+  name: 'internalCompany',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        parentName: '',
+        type: 1
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浼佷笟淇℃伅琛�',
+      api: '/business/company',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    // 鍚屾淇℃伅
+    async synchronous () {
+      const message = await companySync({})
+      this.$message.success(message)
+      this.search()
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/internalMember.vue b/admin/src/views/business/internalMember.vue
new file mode 100644
index 0000000..309695a
--- /dev/null
+++ b/admin/src/views/business/internalMember.vue
@@ -0,0 +1,167 @@
+<template>
+    <TableLayout1 :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="" prop="keyword">
+                <el-input v-model="searchForm.keyword" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�/宸ュ彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="" prop="status">
+                <el-select v-model="searchForm.status" @keypress.enter.native="search" placeholder="鏄惁鏈変汉鑴�">
+                    <el-option label="鏃�" value="0"></el-option>
+                    <el-option label="鏈�" value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="canVisit">
+                <el-select v-model="searchForm.canVisit" @keypress.enter.native="search" placeholder="鍙嫓璁�">
+                    <el-option label="鏄�" value="1"></el-option>
+                    <el-option label="鍚�" value="0"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="status">
+                <el-select v-model="searchForm.status" @keypress.enter.native="search" placeholder="鐘舵��">
+                    <el-option label="姝e父" value="0"></el-option>
+                    <el-option label="绂佺敤" value="1"></el-option>
+                    <el-option label="鎷夐粦/鍐荤粨" value="2"></el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <template v-slot:menu>
+            <div style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">浼佷笟缁勭粐鏋舵瀯</div>
+            <Tree :list="companyTree" :defaultProps="{name: 'name', status: 'status', children: 'companyDTOList', id: 'id'}" @callback="callback" />
+        </template>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:delete']">
+                <li><el-button type="primary">闂ㄧ鎺堟潈</el-button></li>
+                <li><el-button type="primary">鍚屾</el-button></li>
+                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="sex" label="鎬у埆" min-width="100px"></el-table-column>
+                <el-table-column prop="status" label="鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.status === 0">姝e父</span>
+                        <span v-if="row.status === 1">绂佺敤</span>
+                        <span v-if="row.status === 2">鎷夐粦/鍐荤粨</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
+                <el-table-column prop="code" label="閮ㄩ棬" min-width="100px"></el-table-column>
+                <el-table-column prop="code" label="鍙嫓璁�" min-width="100px"></el-table-column>
+                <el-table-column prop="roleId" label="闂ㄧ瑙掕壊" min-width="100px"></el-table-column>
+                <el-table-column fixed="right" prop="faceImg" label="浜鸿劯淇℃伅" min-width="100px"></el-table-column>
+                <el-table-column fixed="right" prop="faceImg" label="鍗$墖淇℃伅" min-width="100px"></el-table-column>
+<!--                <el-table-column-->
+<!--                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"-->
+<!--                    label="鎿嶄綔"-->
+<!--                    min-width="120"-->
+<!--                    fixed="right"-->
+<!--                >-->
+<!--                    <template slot-scope="{row}">-->
+<!--                        <el-button type="text" @click="$refs.operaMemberWindow.open('缂栬緫浜哄憳淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:member:update']">缂栬緫</el-button>-->
+<!--                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button>-->
+<!--                    </template>-->
+<!--                </el-table-column>-->
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import Pagination from '@/components/common/Pagination'
+import Tree from '@/components/common/Tree'
+import { findCompanyTreePage } from '@/api/business/company'
+export default {
+  name: 'internalMember',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree },
+  data () {
+    return {
+      TreeList: [
+        {
+          name: '鍗庢櫒',
+          status: '',
+          id: 1,
+          children: [
+            { name: '琛屾斂閮�', status: '', id: 2 },
+            { name: '淇℃伅閮�', status: '', id: 3 },
+            { name: '椤圭洰閮�', status: '', id: 4 }
+          ]
+        }
+      ],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        status: '',
+        canVisit: '',
+        companyId: '',
+        keyword: '',
+        type: 2
+      },
+      companyTree: []
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindCompanyTreePage()
+  },
+  methods: {
+    // 鑾峰彇缁勭粐鏍�
+    getfindCompanyTreePage () {
+      findCompanyTreePage(1)
+        .then(res => {
+          this.companyTree = res
+          this.searchForm.companyId = res[0].id
+          this.search()
+        })
+    },
+    callback (row) {
+      this.searchForm.companyId = row.id
+      this.search()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .box {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        .box_menu {
+            width: 100px;
+            height: 100%;
+            flex-shrink: 0;
+        }
+        .box_tab {
+            flex: 1;
+            height: 100%;
+        }
+    }
+</style>
diff --git a/admin/src/views/business/laborSource.vue b/admin/src/views/business/laborSource.vue
new file mode 100644
index 0000000..d78362e
--- /dev/null
+++ b/admin/src/views/business/laborSource.vue
@@ -0,0 +1,66 @@
+<template>
+    <div class="box">
+        <el-form :model="form" ref="form" label-width="140px">
+            <el-form-item label="鏉ヨ棰勭害鏂瑰紡:" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">棰勭害鍏嶇櫥璁�</el-radio>
+                    <el-radio :label="6">棰勭害鍚庣櫥璁�(闇�瑕侀厤澶囪瀹㈡満)</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="琚浜烘牎楠屾柟寮�:" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">浠呮墜鏈哄彿</el-radio>
+                    <el-radio :label="6">鎵嬫満鍙�&濮撳悕</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="鍋ュ悍璇佹槸鍚﹀繀濉�:" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">鍚�</el-radio>
+                    <el-radio :label="6">鏄�</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="璁垮鏄惁绛旈:" prop="doorIds">
+                <el-switch
+                        v-model="form.doorIds"
+                        active-color="#13ce66"
+                        inactive-color="#ff4949"
+                        :active-value="1"
+                        :inactive-value="0">
+                </el-switch>
+            </el-form-item>
+            <el-form-item label="璁垮绛旈涓婚:" prop="doorIds">
+                <el-input style="width: 50%;" v-model="form.doorIds" placeholder="璇疯緭鍏ョ瓟棰樻爣棰�" v-trim/>
+            </el-form-item>
+            <el-form-item label="璁垮绛旈璇存槑:" prop="doorIds">
+                <el-input style="width: 50%;" type="textarea" v-model="form.doorIds" placeholder="璇疯緭鍏�" v-trim/>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary">淇濆瓨閰嶇疆椤�</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+
+<script>
+  export default {
+    name: 'visitorSources',
+
+    data() {
+      return {
+        form: {
+          doorIds: ''
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+    .box {
+        width: 100%;
+        height: 100%;
+        padding: 30px;
+        box-sizing: border-box;
+        background: #ffffff;
+    }
+</style>
diff --git a/admin/src/views/business/parks.vue b/admin/src/views/business/parks.vue
new file mode 100644
index 0000000..9817b0b
--- /dev/null
+++ b/admin/src/views/business/parks.vue
@@ -0,0 +1,75 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="鍋滆溅搴撳悕绉�" prop="title">
+                <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ュ仠杞﹀簱鍚嶇О" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵�灞炲仠杞﹀簱" prop="title">
+                <el-select v-model="searchForm.title" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar">
+                <li><el-button type="primary">鍚屾</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="createDate" label="鍋滆溅搴撳悕绉�" min-width="100px"></el-table-column>
+                <el-table-column prop="createDate" label="鎵�灞炲仠杞﹀簱" min-width="100px"></el-table-column>
+                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handlePageChange"
+                    :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'Parks',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        title: ''
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '鍋滆溅搴撲俊鎭〃',
+      api: '/business/parks',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/problemLog.vue b/admin/src/views/business/problemLog.vue
new file mode 100644
index 0000000..546d7f4
--- /dev/null
+++ b/admin/src/views/business/problemLog.vue
@@ -0,0 +1,80 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="绛旈浜�" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃鍚嶇О" prop="companyName">
+                <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="浜哄憳绫诲瀷" prop="companyId">
+                <el-select v-model="searchForm.code" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar">
+                <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:member:exportExcel']" @click="exportExcel">瀵煎嚭</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="name" label="绛旈浜�" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" min-width="100px"></el-table-column>
+                <el-table-column prop="companyName" label="鍏徃鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鐢ㄦ埛绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="createDate" label="绛旈鏃堕棿" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'ProblemLog',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        companyName: ''
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '璁垮绛旈璁板綍琛�',
+      api: '/business/problemLog',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/problems.vue b/admin/src/views/business/problems.vue
new file mode 100644
index 0000000..b701349
--- /dev/null
+++ b/admin/src/views/business/problems.vue
@@ -0,0 +1,97 @@
+<template>
+    <TableLayout :permissions="['business:company:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="棰樼洰鍚嶇О" prop="title">
+                <el-input v-model="searchForm.title" placeholder="璇疯緭鍏�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="浜哄憳绫诲瀷" prop="useType">
+                <el-select v-model="searchForm.useType" placeholder="璇烽�夋嫨" @keypress.enter.native="search">
+                    <el-option label="鍔冲姟浜哄憳" value="0"></el-option>
+                    <el-option label="鏅�氳瀹�" value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:company:create']">
+                <li><el-button type="primary" @click="$refs.operaProblemsWindow.open('鏂板缓璇曢淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:company:create']">鏂板缓</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="title" label="棰樼洰鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="useType" label="閫傜敤浜哄憳绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.useType === 0">鍔冲姟浜哄憳</span>
+                        <span v-if="row.useType === 1">鏅�氳瀹�</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="type" label="棰樼洰绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.useType === 0">鍗曢��</span>
+                        <span v-if="row.useType === 1">澶氶��</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="sortnu" label="棰樼洰椤哄簭(鍗囧簭)" min-width="100px"></el-table-column>
+                <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaProblemsWindow.open('缂栬緫璇曢淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaProblemsWindow ref="operaProblemsWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaProblemsWindow from '@/components/business/OperaProblemsWindow'
+export default {
+  name: 'Problems',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaProblemsWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        title: '',
+        useType: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璇曢淇℃伅琛�',
+      api: '/business/problems',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/retention.vue b/admin/src/views/business/retention.vue
new file mode 100644
index 0000000..3609c9b
--- /dev/null
+++ b/admin/src/views/business/retention.vue
@@ -0,0 +1,101 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ鍚�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵嬫満鍙�" prop="phone">
+                <el-input v-model="searchForm.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃/閮ㄩ棬鍚嶇О" prop="companyId">
+                <el-input v-model="searchForm.companyId" placeholder="璇疯緭鍏ュ叕鍙�/閮ㄩ棬鍚嶇О" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="浜哄憳绫诲瀷" prop="type">
+                <el-select v-model="searchForm.type" placeholder="璇烽�夋嫨">
+                    <el-option label="鍔冲姟璁垮" value="0"></el-option>
+                    <el-option label="鏅�氳瀹�" value="1"></el-option>
+                    <el-option label="鍐呴儴鍛樺伐" value="2"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="璧峰鏃堕棿" prop="companyId">
+                <el-date-picker
+                    v-model="searchForm.companyId"
+                    type="daterange"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫棩鏈�"
+                    end-placeholder="缁撴潫鏃ユ湡">
+                </el-date-picker>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:member:exportExcel']" @click="exportExcel">瀵煎嚭</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="companyId" label="鍏徃/缁勭粐" min-width="100px"></el-table-column>
+                <el-table-column prop="type" label="浜哄憳绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.type === 0">鍔冲姟璁垮</span>
+                        <span v-if="row.type === 1">鏅�氳瀹�</span>
+                        <span v-if="row.type === 2">鍐呴儴鍛樺伐</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="idcardNo" label="韬唤璇佸彿" min-width="100px"></el-table-column>
+                <el-table-column prop="eventDate" label="杩涘満闂ㄧ" min-width="100px"></el-table-column>
+                <el-table-column prop="eventDate" label="杩涘満鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="faceImg" label="杩涘満鎶撴媿鐓х墖" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'Retention',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        companyId: '',
+        type: '',
+        name: '',
+        phone: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '鍦ㄥ巶浜哄憳淇℃伅 琛紙婊炵暀锛�',
+      api: '/business/retention',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/strandedPersonnel.vue b/admin/src/views/business/strandedPersonnel.vue
new file mode 100644
index 0000000..0ea6dd6
--- /dev/null
+++ b/admin/src/views/business/strandedPersonnel.vue
@@ -0,0 +1,115 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヨ瀹㈠悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃鍚嶇О" prop="code">
+                <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎿嶄綔浜哄憳" prop="code">
+                <el-select v-model="searchForm.code" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鐢ㄦ埛绫诲瀷" prop="companyId">
+                <el-select v-model="searchForm.code" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" v-permissions="['business:member:create']">绂诲満</el-button></li>
+            </ul>
+            <el-table
+                    v-loading="isWorking.search"
+                    :data="tableData.list"
+                    stripe
+                    @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="company_id" label="鍏徃" min-width="100px"></el-table-column>
+                <el-table-column label="鐢ㄦ埛绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.type === 0">鍔冲姟璁垮</span>
+                        <span v-if="row.type === 1">鏅�氳瀹�</span>
+                        <span v-if="row.type === 2">鍐呴儴浜哄憳</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="idcard_id" label="鍏ュ満鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="edit_date" label="鎺堟潈鍒版湡鏃堕棿" min-width="100px"></el-table-column>
+                <el-table-column prop="idcard_id" label="瓒呮椂鏃堕暱" min-width="100px"></el-table-column>
+                <el-table-column prop="idcard_id" label="鐘舵��" min-width="100px"></el-table-column>
+                <el-table-column prop="editor" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"
+                    label="鎿嶄綔"
+                    min-width="120"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" icon="el-icon-edit" v-permissions="['business:member:update']">绂诲巶</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                    @size-change="handleSizeChange"
+                    @current-change="handlePageChange"
+                    :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'strandedPersonnel',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        companyId: '',
+        name: '',
+        code: '',
+        status: 2,
+        type: 1
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/visitEvent.vue b/admin/src/views/business/visitEvent.vue
new file mode 100644
index 0000000..b26d310
--- /dev/null
+++ b/admin/src/views/business/visitEvent.vue
@@ -0,0 +1,114 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕" prop="personName">
+                <el-input v-model="searchForm.personName" placeholder="璇疯緭鍏ュ鍚�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵嬫満鍙风爜" prop="endTime">
+                <el-input v-model="searchForm.endTime" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="杞︾墝鍙�" prop="carNo">
+                <el-input v-model="searchForm.carNo" placeholder="璇疯緭鍏ヨ溅鐗屽彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃鍚嶇О" prop="endTime">
+                <el-input v-model="searchForm.endTime" placeholder="璇疯緭鍏ュ叕鍙稿悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="璁惧绫诲瀷" prop="carNo">
+                <el-select v-model="searchForm.carNo" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鍑哄叆绫诲瀷" prop="carNo">
+                <el-select v-model="searchForm.carNo" placeholder="璇烽�夋嫨">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="璧峰鏃堕棿" prop="carNo">
+                <el-date-picker
+                    v-model="searchForm.carNo"
+                    type="daterange"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫棩鏈�"
+                    end-placeholder="缁撴潫鏃ユ湡">
+                </el-date-picker>
+            </el-form-item>
+            <el-radio-group v-model="searchForm.eventType" size="small">
+                <el-radio-button label="褰撳ぉ"></el-radio-button>
+                <el-radio-button label="杩�7澶�"></el-radio-button>
+                <el-radio-button label="杩�30澶�"></el-radio-button>
+            </el-radio-group>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column prop="personName" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="endTime" label="鎵嬫満鍙风爜" min-width="100px"></el-table-column>
+                <el-table-column prop="idNo" label="韬唤璇佸彿鐮�" min-width="100px"></el-table-column>
+                <el-table-column prop="idNo" label="鍏徃" min-width="100px"></el-table-column>
+                <el-table-column prop="carNo" label="杞︾墝鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="carNo" label="璁惧绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="carNo" label="璁惧鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="carNo" label="鍑哄叆绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column prop="captureUrl" label="鎶撴媿鍥緐ri" min-width="100px"></el-table-column>
+                <el-table-column prop="happenTime" label="鎶撴媿鐓х墖" min-width="100px"></el-table-column>
+                <el-table-column prop="captureUrl" label="浜嬩欢鏃堕棿" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+export default {
+  name: 'VisitEvent',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        personName: '',
+        endTime: '',
+        carNo: ''
+      },
+      options: []
+    }
+  },
+  created () {
+    this.config({
+      module: '璁垮浜嬩欢鎺ㄩ�佽褰曡〃',
+      api: '/business/visitEvent',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/business/visitorManagement.vue b/admin/src/views/business/visitorManagement.vue
new file mode 100644
index 0000000..9ae6170
--- /dev/null
+++ b/admin/src/views/business/visitorManagement.vue
@@ -0,0 +1,112 @@
+<template>
+    <TableLayout :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ鍚�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵嬫満鍙�" prop="phone">
+                <el-input v-model="searchForm.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃鍚嶇О" prop="companyName">
+                <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏ュ叕鍙稿悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="韬唤璇佸彿" prop="idcardNo">
+                <el-input v-model="searchForm.idcardNo" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+                <li><el-button type="primary" v-permissions="['business:member:create']" @click="block">鎷夐粦</el-button></li>
+                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎬у埆" min-width="100px"></el-table-column>
+                <el-table-column label="璇佷欢绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.idcardType === 0">韬唤璇�</span>
+                        <span v-if="row.idcardType === 1">娓境璇佷欢</span>
+                        <span v-if="row.idcardType === 2">鎶ょ収</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="idcardNo" label="韬唤璇佸彿" min-width="100px"></el-table-column>
+                <el-table-column prop="companyName" label="鍏徃" min-width="100px"></el-table-column>
+                <el-table-column prop="visitTimes" label="鎷滆娆℃暟" min-width="100px"></el-table-column>
+                <el-table-column prop="lastVisitDate" label="鏈�鍚庢嫓璁挎椂闂�" min-width="100px"></el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import { batchBlock } from '@/api/business/member'
+export default {
+  name: 'visitorManagement',
+  extends: BaseTable,
+  components: { TableLayout, Pagination },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        companyName: '',
+        name: '',
+        phone: '',
+        idcardNo: '',
+        type: 1
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    block () {
+      if (this.tableData.selectedRows.length === 0) {
+        this.$message.warning('璇烽�夋嫨浜哄憳')
+        return
+      }
+      this.$confirm('纭畾瑕佹媺榛戝悧?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        batchBlock(this.tableData.selectedRows.map(item => item.id).join(','))
+          .then(res => {
+            this.$message.success('鎷夐粦鎴愬姛')
+            this.search()
+          })
+      }).catch(() => {
+
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/visitorSources.vue b/admin/src/views/business/visitorSources.vue
new file mode 100644
index 0000000..129b678
--- /dev/null
+++ b/admin/src/views/business/visitorSources.vue
@@ -0,0 +1,66 @@
+<template>
+    <div class="box">
+        <el-form :model="form" ref="form" label-width="140px">
+            <el-form-item label="鏉ヨ棰勭害鏂瑰紡:" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">棰勭害鍏嶇櫥璁�</el-radio>
+                    <el-radio :label="6">棰勭害鍚庣櫥璁�(闇�瑕侀厤澶囪瀹㈡満)</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="琚浜烘牎楠屾柟寮�:" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">浠呮墜鏈哄彿</el-radio>
+                    <el-radio :label="6">鎵嬫満鍙�&濮撳悕</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="鍋ュ悍璇佹槸鍚﹀繀濉�:" prop="doorIds">
+                <el-radio-group v-model="form.doorIds">
+                    <el-radio :label="3">鍚�</el-radio>
+                    <el-radio :label="6">鏄�</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="璁垮鏄惁绛旈:" prop="doorIds">
+                <el-switch
+                    v-model="form.doorIds"
+                    active-color="#13ce66"
+                    inactive-color="#ff4949"
+                    :active-value="1"
+                    :inactive-value="0">
+                </el-switch>
+            </el-form-item>
+            <el-form-item label="璁垮绛旈涓婚:" prop="doorIds">
+                <el-input style="width: 50%;" v-model="form.doorIds" placeholder="璇疯緭鍏ョ瓟棰樻爣棰�" v-trim/>
+            </el-form-item>
+            <el-form-item label="璁垮绛旈璇存槑:" prop="doorIds">
+                <el-input style="width: 50%;" type="textarea" v-model="form.doorIds" placeholder="璇疯緭鍏�" v-trim/>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary">淇濆瓨閰嶇疆椤�</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+
+<script>
+export default {
+  name: 'visitorSources',
+
+  data() {
+    return {
+      form: {
+        doorIds: ''
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .box {
+        width: 100%;
+        height: 100%;
+        padding: 30px;
+        box-sizing: border-box;
+        background: #ffffff;
+    }
+</style>
diff --git a/admin/src/views/business/visits.vue b/admin/src/views/business/visits.vue
new file mode 100644
index 0000000..239a1ab
--- /dev/null
+++ b/admin/src/views/business/visits.vue
@@ -0,0 +1,132 @@
+<template>
+    <TableLayout :permissions="['business:visits:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="濮撳悕/鎵嬫満鍙�" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="韬唤璇佸彿" prop="idcardNo">
+                <el-input v-model="searchForm.idcardNo" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍏徃鍚嶇О" prop="companyName">
+                <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏ュ叕鍙稿悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="瀹℃壒鐘舵��" prop="status">
+                <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨">
+                    <el-option label="寰呭鏍�" value="0"></el-option>
+                    <el-option label="宸叉彁浜RP瀹℃壒" value="1"></el-option>
+                    <el-option label="瀹℃牳閫氳繃" value="2"></el-option>
+                    <el-option label="瀹℃牳涓嶉�氳繃" value="3"></el-option>
+                    <el-option label="鍙栨秷" value="4"></el-option>
+                    <el-option label="涓嬪彂鎴愬姛" value="5"></el-option>
+                    <el-option label="涓嬪彂澶辫触" value="6"></el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:visits:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>-->
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+<!--            <ul class="toolbar" v-permissions="['business:visits:create', 'business:visits:delete']">-->
+<!--                <li><el-button type="primary" @click="$refs.operaVisitsWindow.open('鏂板缓璁垮鐢宠淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:visits:create']">鏂板缓</el-button></li>-->
+<!--                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:visits:delete']">鍒犻櫎</el-button></li>-->
+<!--            </ul>-->
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
+            >
+                <el-table-column type="selection" width="55"></el-table-column>
+                <el-table-column prop="name" label="璁垮濮撳悕" min-width="100px"></el-table-column>
+                <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="companyName" label="鍏徃鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="receptMemberName" label="琚浜�" min-width="100px"></el-table-column>
+                <el-table-column prop="reason" label="鎷滆浜嬬敱" min-width="100px"></el-table-column>
+                <el-table-column label="鎷滆鏃堕棿" min-width="170px">
+                    <template slot-scope="{row}">
+                        <span>璧凤細{{row.starttime}}</span>
+                        <span>姝細{{row.endtime}}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="闅忚浜哄憳" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.visitsList && row.visitsList.length > 0">{{row.visitsList.length}}</span>
+                        <span>0</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="闅忚杞﹁締" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.carNos">{{row.carNos.split(',').length}}</span>
+                        <span>0</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="status" fixed="right" label="鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span style="color: rgba(245, 154, 35, 0.996);" v-if="row.status === 0">寰呭鏍�</span>
+                        <span v-if="row.status === 1">宸叉彁浜RP瀹℃壒</span>
+                        <span v-if="row.status === 2">瀹℃牳閫氳繃</span>
+                        <span style="color: red;" v-if="row.status === 3">瀹℃牳涓嶉�氳繃</span>
+                        <span v-if="row.status === 4">鍙栨秷</span>
+                        <span v-if="row.status === 5">涓嬪彂鎴愬姛</span>
+                        <span v-if="row.status === 6">涓嬪彂澶辫触</span>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:visits:update', 'business:visits:delete'])"
+                    label="鎿嶄綔"
+                    min-width="190"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('璇︽儏', row.id)" v-permissions="['business:visits:update']">鏌ョ湅璇︽儏</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:visits:delete']">鏌ヨ瀹℃壒缁撴灉</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+            <!--      璇︽儏      -->
+            <OperaVisitsDesWindow ref="OperaVisitsDesWindow" />
+        </template>
+    </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
+export default {
+  name: 'Visits',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaVisitsDesWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        companyName: '',
+        idcardNo: '',
+        status: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璁垮鐢宠淇℃伅琛�',
+      api: '/business/visits',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  }
+}
+</script>
diff --git a/admin/src/views/index.vue b/admin/src/views/index.vue
index 5bb54a6..c7438de 100644
--- a/admin/src/views/index.vue
+++ b/admin/src/views/index.vue
@@ -1,33 +1,207 @@
 <template>
   <div class="home">
-    <div class="wrap">
-      <h2>娆㈣繋浣跨敤浼婂▋鏋侀�熷紑鍙戞鏋�</h2>
-      <p>鎮ㄤ娇鐢ㄧ殑姝ゅ寮�婧愭鏋舵病鏈変换浣曠増鏉冮棶棰橈紝鍙涔犲彲鍟嗙敤锛岃鏀惧績浣跨敤锛�</p>
-      <p>浼婂▋鑷村姏浜庢墦閫犵畝娲併�佸悎鐞嗐�侀珮鏁堢殑寮�鍙戜綋楠岋紝涓烘鎴戜滑灏嗕笉鏂崌绾э紝鎰熻阿鎮ㄧ殑鏀寔锛�</p>
-      <p style="margin-top: 12px;">
-        <a href="https://gitee.com/coderd-repos/eva" target="_blank">GITEE</a>
-        <a href="https://github.com/coderd-repos/eva" target="_blank">GITHUB</a>
-      </p>
-      <div class="guide">
-        <a href="http://eva.adjustrd.com" target="_blank">鍓嶅線瀹樼綉</a>
-        <a href="http://coderd.adjustrd.com/template/308/default" target="_blank">鍓嶅線CodeRd</a>
+    <div class="home_total">
+      <div class="home_total_head">鍦ㄥ巶浜哄憳鎬昏</div>
+      <div class="home_total_list">
+        <div class="home_total_list_item a">
+          <span>352</span>
+          <span>鍐呴儴鍛樺伐</span>
+        </div>
+        <div class="home_total_list_item b">
+          <span>352</span>
+          <span>璁垮</span>
+        </div>
+        <div class="home_total_list_item c">
+          <span>352</span>
+          <span>鍔冲姟浜哄憳</span>
+        </div>
+        <div class="home_total_list_item d">
+          <span>352</span>
+          <span>鍦ㄥ満杞﹁締</span>
+        </div>
+        <div class="home_total_list_item e">
+          <span>352</span>
+          <span>璁垮杞﹁締</span>
+        </div>
+        <div class="home_total_list_item f">
+          <span>352</span>
+          <span>鍔冲姟杞﹁締</span>
+        </div>
+        <div class="home_total_list_item g">
+          <span>352</span>
+          <span>渚涘簲鍟�</span>
+        </div>
       </div>
-      <img src="@/assets/images/qq.png">
-      <p>浣犲彲浠ユ壂鐮佸姞鍏ョ兢鑱婁互鑾峰緱鎶�鏈敮鎸�</p>
-      <div class="award">
-        <h4>婵�鍔变綔鑰呭仛寰楁洿濂�</h4>
-        <img src="@/assets/images/alipay.jpeg">
-        <img src="@/assets/images/wxpay.jpeg">
+    </div>
+    <div class="home_charts">
+      <div class="home_charts_item">
+        <div class="home_charts_item_label">鍦ㄥ巶浜哄憳鍗犳瘮</div>
+        <div class="home_charts_item_charts" id="chart1"></div>
+      </div>
+      <div class="home_charts_item">
+        <div class="home_charts_item_label">鍔冲姟浜哄憳鍒嗗竷鎬昏</div>
+        <div class="home_charts_item_charts" id="chart2"></div>
+      </div>
+    </div>
+    <div class="home_table">
+      <div class="home_table_head">瓒呮椂棰勮浜哄憳(3)</div>
+      <div class="home_table_box">
+        <el-table
+          :data="list"
+          :header-cell-style="{background: '#dcdde2', color: 'rgb(51, 51, 51)'}"
+          border
+          style="width: 100%">
+          <el-table-column
+            prop="date"
+            label="璁垮濮撳悕">
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            label="璁垮鐢佃瘽">
+          </el-table-column>
+          <el-table-column
+            prop="address"
+            label="璁垮鍏徃">
+          </el-table-column>
+          <el-table-column
+            prop="address"
+            label="鍏徃绫诲瀷">
+          </el-table-column>
+          <el-table-column
+            prop="address"
+            label="鎺堟潈鍒版湡鏃堕棿">
+          </el-table-column>
+          <el-table-column
+            prop="address"
+            label="鐘舵��">
+          </el-table-column>
+          <el-table-column
+            prop="address"
+            label="澶勭悊"
+            width="80">
+            <template slot-scope="scope">
+              <el-button type="text">绂诲満</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          style="margin-top: 20px;"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page"
+          :page-sizes="[100, 200, 300, 400]"
+          :page-size="100"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="400">
+        </el-pagination>
       </div>
     </div>
   </div>
 </template>
 
 <script>
+import * as echarts from 'echarts'
 export default {
   name: 'Index',
   data () {
-    return {}
+    return {
+      list: [],
+      page: 1
+    }
+  },
+  mounted () {
+    this.getcharts1()
+    this.getcharts2()
+  },
+  methods: {
+    handleSizeChange () {
+
+    },
+    handleCurrentChange () {
+
+    },
+    getcharts1 () {
+      const myChart = echarts.init(document.getElementById('chart1'))
+      // 缁樺埗鍥捐〃
+      myChart.setOption({
+        tooltip: {
+          trigger: 'item'
+        },
+        grid: {
+          bottom: '5%',
+          top: '5%'
+        },
+        legend: {
+          bottom: '0%',
+          left: 'center',
+          icon: 'circle'
+        },
+        series: [
+          {
+            type: 'pie',
+            radius: ['40%', '70%'],
+            label: {
+              formatter: '{b} {d}%'
+            },
+            data: [
+              { value: 1048, name: '鍔冲姟浜哄憳' },
+              { value: 735, name: '鍐呴儴鍛樺伐' },
+              { value: 580, name: '璁垮' }
+            ],
+            itemStyle: {
+              normal: {
+                color: function (colors) {
+                  var colorList = [
+                    '#fc8251',
+                    '#5470c6',
+                    '#91cd77'
+                  ]
+                  return colorList[colors.dataIndex]
+                }
+              }
+            },
+            emphasis: {
+              itemStyle: {
+                shadowBlur: 10,
+                shadowOffsetX: 0,
+                shadowColor: 'rgba(0, 0, 0, 0.5)'
+              }
+            }
+          }
+        ]
+      })
+    },
+    getcharts2 () {
+      const myChart = echarts.init(document.getElementById('chart2'))
+      myChart.setOption({
+        tooltip: {
+          trigger: 'item'
+        },
+        grid: {
+          bottom: '5%',
+          top: '5%'
+        },
+        xAxis: {
+          max: 'dataMax'
+        },
+        yAxis: {
+          type: 'category',
+          data: ['娴峰悍濞佽', '鍐滀笟鏈夐檺鍏徃', '瀛楀箷涔熸湁闄愬叕鍙�', '涓囪揪鑲′唤鏈夐檺鍏徃', '闃块噷宸村反闆嗗洟鏈夐檺鍏徃', '鑵捐闆嗗洟鏈夐檺鍏徃']
+        },
+        series: [
+          {
+            realtimeSort: true,
+            type: 'bar',
+            data: [1, 2, 3, 4, 5, 6],
+            itemStyle: {
+              normal: {
+                color: '#fc8251'
+              }
+            }
+          }
+        ]
+      })
+    }
   }
 }
 </script>
@@ -35,63 +209,118 @@
 <style scoped lang="scss">
 @import "@/assets/style/variables.scss";
 .home {
-  text-align: center;
-  color: #777;
-  .wrap {
-    margin-top: 80px;
-    img {
-      width: 240px;
+  width: 100%;
+  .home_table {
+    width: 100%;
+    padding: 20px;
+    box-sizing: border-box;
+    background: #ffffff;
+    margin-top: 20px;
+    .home_table_head {
+      font-size: 16px;
+      font-weight: 600;
+      color: black;
+    }
+    .home_table_box {
+      width: 100%;
+      margin-top: 15px;
     }
   }
-  h2 {
-    font-size: 32px;
-    color: #555;
-    margin-bottom: 20px;
-  }
-  p {
-    line-height: 24px;
-    margin: 0;
-  }
-  .start-up {
-    margin-top: 8px;
-  }
-  .guide {
-    margin: 30px 0 40px 0;
+  .home_charts {
+    width: 100%;
+    margin-top: 20px;
     display: flex;
-    justify-content: center;
-    a {
-      margin-right: 12px;
-      padding: 12px 40px;
-      border-radius: 30px;
-      background: $primary-color;
-      color: #fff;
-      text-decoration: none;
+    align-items: center;
+    justify-content: space-between;
+    .home_charts_item {
+      padding: 20px;
+      box-sizing: border-box;
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      margin-right: 20px;
+      background: #ffffff;
+      .home_charts_item_label {
+        font-size: 16px;
+        font-weight: 600;
+        color: black;
+      }
+      .home_charts_item_charts {
+        width: 100%;
+        height: 300px;
+      }
+      &:last-child {
+        margin: 0 !important;
+      }
     }
   }
-  em,a {
-    font-style: normal;
-    font-weight: bold;
-    margin: 0 3px;
-    color: $primary-color;
-  }
-  .award {
-    position: absolute;
-    right: 20px;
-    bottom: 60px;
-    display: flex;
-    flex-direction: column;
-    text-align: left;
-    padding: 12px;
-    border: 1px solid #eee;
-    box-shadow: -1px 1px 10px #ccc;
-    h4 {
-      font-weight: bold;
-      margin-bottom: 8px;
+  .home_total {
+    width: 100%;
+    background: #ffffff;
+    margin-top: 20px;
+    .home_total_head {
+      width: 100%;
+      font-size: 16px;
+      font-weight: 600;
+      color: black;
+      padding: 10px 20px;
+      box-sizing: border-box;
+      border-bottom: 1px solid #ececec;
     }
-    img {
-      width: 160px;
-      margin-bottom: 20px;
-      transition: opacity ease .3s;
+    .home_total_list {
+      width: 100%;
+      padding: 20px;
+      box-sizing: border-box;
+      display: flex;
+      align-items: center;
+      .a {
+        border-left: 5px solid rgba(129, 211, 248, 1) !important;
+      }
+      .b {
+        border-left: 5px solid rgba(236, 128, 141, 1) !important;
+      }
+      .c {
+        border-left: 5px solid rgba(250, 205, 145, 1) !important;
+      }
+      .d {
+        border-left: 5px solid rgba(245, 154, 35, 1) !important;
+      }
+      .e {
+        border-left: 5px solid rgba(128, 128, 255, 1) !important;
+      }
+      .f {
+        border-left: 5px solid rgba(202, 249, 130, 1) !important;
+      }
+      .g {
+        border-left: 5px solid rgba(194, 128, 255, 1) !important;
+      }
+      .home_total_list_item {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        flex-direction: column;
+        justify-content: center;
+        height: 80px;
+        border-radius: 5px;
+        border: 1px solid #ececec;
+        margin-right: 15px;
+        &:last-child {
+          margin: 0 !important;
+        }
+        span {
+          &:first-child {
+            font-weight: 500;
+            font-size: 24px;
+            color: black;
+          }
+          &:last-child {
+            font-weight: 400;
+            font-size: 14px;
+            color: #666666;
+            margin-top: 2px;
+          }
+        }
+      }
     }
   }
 }
diff --git a/admin/vue.config.js b/admin/vue.config.js
index d2a40a6..66f1a74 100644
--- a/admin/vue.config.js
+++ b/admin/vue.config.js
@@ -10,7 +10,11 @@
     port: 10012,
     proxy: {
       [process.env.VUE_APP_API_PREFIX]: {
-        target: 'http://192.168.0.197:10013',
+        // http://192.168.0.130:10013
+        // 192.168.0.110:10013  192.168.0.110:10013
+        // http://192.168.0.101:10013
+        // http://192.168.0.132:10013
+        target: 'http://192.168.0.108:10013',
         changeOrigin: true,
         pathRewrite: {
           [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''

--
Gitblit v1.9.3