jiangping
2023-12-20 8290ea4b91e33fc8d0b3007ca7802836cee0b2ba
Merge remote-tracking branch 'origin/master'
已添加50个文件
已修改6个文件
4252 ■■■■■ 文件已修改
admin/package-lock.json 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/block.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/carEvent.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/cars.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/category.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/company.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/device.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/deviceEvent.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/deviceRole.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/empower.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/parks.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/problemLog.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/problems.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/retention.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/visitEvent.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/visits.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarsWindow.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCategoryWindow.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCompanyWindow.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceRoleFWindow.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceRoleWindow.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceWindow.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaInternalCompanyWindow.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaProblemsWindow.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaVisitsDesWindow.vue 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/Menu.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/Tree.vue 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/layouts/AppLayout.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/layouts/TableLayout1.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/blackmailPersonnel.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/carEvent.vue 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/cars.vue 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/category.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/company.vue 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/device.vue 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceEvent.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole_f.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/empower.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/freezePersonnel.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/laborSource.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/parks.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/problemLog.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/problems.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/retention.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/strandedPersonnel.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitEvent.vue 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitorManagement.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitorSources.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visits.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 367 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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=="
        }
      }
    }
  }
}
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",
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
  })
}
// äººå‘˜ç§»é™¤-解冻
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
  })
}
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
  })
}
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
    }
  })
}
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
    }
  })
}
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
    }
  })
}
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)
}
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
  })
}
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
    }
  })
}
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
    }
  })
}
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
    }
  })
}
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
  })
}
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
  })
}
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}`)
}
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
    }
  })
}
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
  })
}
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
    }
  })
}
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>
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>
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>
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>
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>
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>
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>
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="正确答案" prop="answer">
                <el-select v-model="form.answer" multiple placeholder="请选择正确答案">
                    <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>
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>
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"
      >
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>
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;
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>
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>
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="出入口名称" 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>
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>
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>
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>
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>
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>
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>
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>
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>
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']">解冻</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']">解冻</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>
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>
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="正常" 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">正常</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>
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>
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>
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>
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>
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>
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>
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="抓拍图uri" 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>
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>
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>
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="已提交ERP审批" 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">已提交ERP审批</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>
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;
          }
        }
      }
    }
  }
}
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]}`]: ''