Explorar el Código

v1.4版本页面添加修改

喻文俊 hace 3 años
padre
commit
dff71b858b
Se han modificado 38 ficheros con 2605 adiciones y 551 borrados
  1. 9 5
      public/index.html
  2. 159 0
      src/components/location/index.vue
  3. 4 2
      src/router/index.js
  4. 23 3
      src/router/modules/auth.js
  5. 0 31
      src/router/modules/authUser.js
  6. 1 1
      src/router/modules/doc.js
  7. 45 0
      src/router/modules/doctorAuth.js
  8. 3 3
      src/router/modules/feedback.js
  9. 3 3
      src/router/modules/helper.js
  10. 4 4
      src/router/modules/product.js
  11. 103 91
      src/router/modules/review.js
  12. 18 4
      src/router/modules/supplier.js
  13. 1 1
      src/store/modules/proxy.js
  14. 13 0
      src/styles/index.scss
  15. 232 0
      src/views/authentic/auth/add.vue
  16. 232 0
      src/views/authentic/auth/edit.vue
  17. 27 17
      src/views/authentic/auth/index.vue
  18. 0 0
      src/views/authentic/auth/user/userList.vue
  19. 0 336
      src/views/authentic/authuser/index.vue
  20. 56 0
      src/views/authentic/components/authCardTemplate.vue
  21. 156 0
      src/views/authentic/components/deviceSection.vue
  22. 196 0
      src/views/authentic/doctor/add.vue
  23. 194 0
      src/views/authentic/doctor/edit.vue
  24. 170 0
      src/views/authentic/doctor/index.vue
  25. 30 16
      src/views/authentic/product/add.vue
  26. 14 14
      src/views/authentic/product/edit.vue
  27. 9 4
      src/views/authentic/product/index.vue
  28. 4 4
      src/views/authentic/review/auth/authList.vue
  29. 1 1
      src/views/authentic/review/auth/index.vue
  30. 3 3
      src/views/authentic/review/auth/shopDetail.vue
  31. 6 6
      src/views/authentic/review/auth/shopList.vue
  32. 137 0
      src/views/authentic/review/doctor/doctorDetail.vue
  33. 164 0
      src/views/authentic/review/doctor/index.vue
  34. 8 0
      src/views/authentic/supplier/add.vue
  35. 355 0
      src/views/authentic/supplier/auth/index.vue
  36. 7 0
      src/views/authentic/supplier/edit.vue
  37. 2 2
      src/views/authentic/supplier/index.vue
  38. 216 0
      src/views/authentic/supplier/product/index.vue

+ 9 - 5
public/index.html

@@ -1,12 +1,16 @@
 <!DOCTYPE html>
 <html>
   <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="renderer" content="webkit">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+    <meta name="renderer" content="webkit" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
     <title><%= webpackConfig.name %></title>
+    <script
+      type="text/javascript"
+      src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=vsIfSztpPmCtmBRfRiIAM57hbxBQbmgQ"
+    ></script>
   </head>
   <body>
     <div id="app"></div>

+ 159 - 0
src/components/location/index.vue

@@ -0,0 +1,159 @@
+<template>
+  <div class="map">
+    <div id="allMap" />
+    <div class="point">
+      <span>您当前位置:</span>
+      <span>{{ pointText }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    // 城市名称
+    city: {
+      type: String,
+      default: ''
+    },
+    initPoint: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      map: null,
+      latlng: null,
+      marker: null
+    }
+  },
+  computed: {
+    pointText() {
+      if (!this.latlng) {
+        return '--,--'
+      } else {
+        return `${this.latlng.lat},${this.latlng.lng}`
+      }
+    }
+  },
+  watch: {
+    latlng(nVal, oVal) {
+      this.$emit('point', nVal)
+    }
+  },
+  created() {
+    this.$nextTick(() => {
+      this.makeBiduMap()
+    })
+  },
+  methods: {
+    // 根据坐标初始化地图
+    pointInit() {
+      const pointArr = this.initPoint.split(',')
+      const lat = parseFloat(pointArr[0])
+      const lng = parseFloat(pointArr[1])
+      // 初始化地图坐标
+      const point = new window.BMapGL.Point(lng, lat)
+      console.log(point)
+      // 创建标记点对象模型
+      this.marker = new window.BMapGL.Marker(point, { enableDragging: true })
+      this.map.addOverlay(this.marker)
+      this.map.centerAndZoom(point, 16)
+    },
+    // 默认初始化地图
+    defInit() {
+      // 初始化地图坐标 22.542802586057,114.10197962299
+      const point = new window.BMapGL.Point(114.10237688976471, 22.542245357146264)
+      // 创建标记点对象模型
+      this.marker = new window.BMapGL.Marker(point, { enableDragging: true })
+      this.map.addOverlay(this.marker)
+      this.map.centerAndZoom(point, 16)
+
+      // 如果有城市信息 就定位到城市
+      if (this.city) return this.locationToCity()
+      // 定位到ip
+      this.locationToSelf()
+    },
+
+    // 对地图坐标的处理
+    makeBiduMap() {
+      // 创建地图模型
+      this.map = new window.BMapGL.Map('allMap')
+      // 初始化定位坐标
+      if (this.initPoint) {
+        this.pointInit()
+      } else {
+        this.defInit()
+      }
+      // 添加控件
+      this.addControl()
+      // 绑定事件
+      this.addMapEvent()
+    },
+
+    // 添加控件
+    addControl() {
+      // 添加比例尺控件
+      var scaleCtrl = new window.BMapGL.ScaleControl()
+      this.map.addControl(scaleCtrl)
+      // 添加缩放控件
+      var zoomCtrl = new window.BMapGL.ZoomControl()
+      this.map.addControl(zoomCtrl)
+      // 允许鼠标滚轮缩放
+      this.map.enableScrollWheelZoom(true)
+      // 添加城市列表控件
+      var cityCtrl = new window.BMapGL.CityListControl()
+      this.map.addControl(cityCtrl)
+    },
+
+    // 定位到当前位置
+    locationToSelf() {
+      const that = this
+      var geolocation = new window.BMapGL.Geolocation()
+      geolocation.getCurrentPosition(function(r) {
+        if (this.getStatus() === window.BMAP_STATUS_SUCCESS) {
+          that.marker.setPosition(r.point)
+          that.map.centerAndZoom(r.point, 16)
+          that.latlng = r.point
+          // console.log('您的位置:' + r.point.lng + ',' + r.point.lat)
+        } else {
+          console.log('failed' + this.getStatus())
+        }
+      })
+    },
+
+    // 地址解析(正)
+    locationToCity() {
+      var geo = new window.BMapGL.Geocoder()
+      geo.getPoint(this.city, point => {
+        if (point) {
+          this.marker.setPosition(point)
+          this.map.centerAndZoom(point, 16)
+          this.latLng = point
+        } else {
+          console.log('您选择的地址没有解析到结果!')
+        }
+      }, this.city)
+    },
+
+    // 地图事件绑定
+    addMapEvent() {
+      this.marker.addEventListener('mouseup', e => {
+        this.latlng = e.latLng
+        // console.log('您的位置:' + e.latLng.lng + ',' + e.latLng.lat)
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+#allMap{
+  width: 100%;
+  height: 500px;
+}
+.point{
+  margin-top: 16px;
+}
+</style>

+ 4 - 2
src/router/index.js

@@ -14,7 +14,8 @@ import heloperRoutes from './modules/helper'
 // import proxyRoutes from './modules/proxy'
 import docRoutes from './modules/doc'
 import feedbackRoutes from './modules/feedback'
-import clubRoutes from './modules/authUser'
+// import clubRoutes from './modules/authUser'
+import doctorRoutes from './modules/doctorAuth'
 
 /**
  * Note: sub-menu only appear when route children.length >= 1
@@ -97,8 +98,9 @@ export const asyncRoutes = [
   ...authRoutes,
   ...productRoutes,
   ...reviewRoutes,
-  ...clubRoutes,
+  // ...clubRoutes,
   // ...proxyRoutes,
+  ...doctorRoutes,
   ...docRoutes,
   ...feedbackRoutes,
   ...heloperRoutes,

+ 23 - 3
src/router/modules/auth.js

@@ -1,6 +1,5 @@
 /* Layout */
 import Layout from '@/layout'
-
 // 授权管理页面
 const authRoutes = [
   {
@@ -10,7 +9,7 @@ const authRoutes = [
     redirect: '/auth/list',
     name: 'Auth',
     meta: {
-      title: '授权管理',
+      title: '机构认证',
       icon: 'el-icon-s-promotion',
       roles: ['admin', 'normal'],
       noCache: true,
@@ -23,7 +22,7 @@ const authRoutes = [
         component: () => import('@/views/authentic/auth/index'),
         name: 'AuthList',
         meta: {
-          title: '授权列表',
+          title: '机构列表',
           icon: 'el-icon-menu',
           roles: ['admin', 'normal'],
           affix: true,
@@ -31,6 +30,27 @@ const authRoutes = [
           proxy: true,
           id: 2
         }
+      },
+      {
+        path: 'auth-add',
+        component: () => import('@/views/authentic/auth/add'),
+        name: 'AuthAdd',
+        hidden: true,
+        meta: { title: '添加机构', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 3 }
+      },
+      {
+        path: 'auth-edit',
+        component: () => import('@/views/authentic/auth/edit'),
+        name: 'AuthEdit',
+        hidden: true,
+        meta: { title: '修改机构', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 4 }
+      },
+      {
+        path: 'user-list',
+        component: () => import('@/views/authentic/auth/user/userList'),
+        name: 'ClubUserList',
+        hidden: true,
+        meta: { title: '登录用户', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 5 }
       }
     ]
   }

+ 0 - 31
src/router/modules/authUser.js

@@ -1,31 +0,0 @@
-/* Layout */
-import Layout from '@/layout'
-
-// 授权管理页面
-const clubRoutes = [
-  {
-    path: '/club',
-    component: Layout,
-    alwaysShow: true,
-    redirect: '/club/list',
-    name: 'Club',
-    meta: { title: '机构管理', icon: 'el-icon-user-solid', roles: ['normal'], noCache: true, proxy: true, id: 3 },
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/authentic/authuser/index'),
-        name: 'ClubList',
-        meta: { title: '机构列表', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 4 }
-      },
-      {
-        path: 'user-list',
-        component: () => import('@/views/authentic/authuser/userList'),
-        name: 'ClubUserList',
-        hidden: true,
-        meta: { title: '用户列表', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 5 }
-      }
-    ]
-  }
-]
-
-export default clubRoutes

+ 1 - 1
src/router/modules/doc.js

@@ -9,7 +9,7 @@ const docRoutes = [
     alwaysShow: true,
     redirect: '/doc/article-list',
     name: 'Doc',
-    meta: { title: '资料管理', icon: 'el-icon-s-management', roles: ['normal'], noCache: true, proxy: true, id: 6 },
+    meta: { title: '资料', icon: 'el-icon-s-management', roles: ['normal'], noCache: true, proxy: true, id: 6 },
     children: [
       {
         path: 'article-list',

+ 45 - 0
src/router/modules/doctorAuth.js

@@ -0,0 +1,45 @@
+// 医师认证路由
+
+import Layout from '@/layout'
+// 授权管理页面
+const doctorAuthRoutes = [
+  {
+    path: '/doctor',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/doctor/list',
+    name: 'Doctor',
+    meta: {
+      title: '医师认证',
+      icon: 'el-icon-s-promotion',
+      roles: ['normal'],
+      noCache: true,
+      proxy: true,
+      id: 13
+    },
+    children: [
+      {
+        path: 'list',
+        component: () => import('@/views/authentic/doctor'),
+        name: 'DoctorList',
+        meta: { title: '医师列表', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 14, proxy: true }
+      },
+      {
+        hidden: true,
+        path: 'add',
+        component: () => import('@/views/authentic/doctor/add'),
+        name: 'DoctorList',
+        meta: { title: '添加医师', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 15, proxy: true }
+      },
+      {
+        hidden: true,
+        path: 'edit',
+        component: () => import('@/views/authentic/doctor/edit'),
+        name: 'DoctorList',
+        meta: { title: '修改医师资料', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 16, proxy: true }
+      }
+    ]
+  }
+]
+
+export default doctorAuthRoutes

+ 3 - 3
src/router/modules/feedback.js

@@ -9,20 +9,20 @@ const feedbackRoutes = [
     alwaysShow: true,
     redirect: '/feedback/list',
     name: 'Feedback',
-    meta: { title: '用户反馈', icon: 'el-icon-s-comment', roles: ['normal'], noCache: true, id: 13 },
+    meta: { title: '用户反馈', icon: 'el-icon-s-comment', roles: ['normal'], noCache: true, id: 17 },
     children: [
       {
         path: 'list',
         component: () => import('@/views/authentic/feedback/index'),
         name: 'FeedbackList',
-        meta: { title: '反馈列表', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 14 }
+        meta: { title: '反馈列表', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 18 }
       },
       {
         path: 'detail',
         component: () => import('@/views/authentic/feedback/detail'),
         name: 'FeedbackDetail',
         hidden: true,
-        meta: { title: '反馈处理', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 15 }
+        meta: { title: '反馈处理', icon: 'el-icon-menu', roles: ['normal'], noCache: true, id: 19 }
       }
     ]
   }

+ 3 - 3
src/router/modules/helper.js

@@ -15,7 +15,7 @@ const heloperRoutes = [
       roles: ['admin', 'normal'],
       noCache: true,
       proxy: true,
-      id: 16
+      id: 20
     },
     children: [
       {
@@ -29,7 +29,7 @@ const heloperRoutes = [
           affix: false,
           noCache: true,
           proxy: false,
-          id: 17
+          id: 21
         }
       },
       {
@@ -43,7 +43,7 @@ const heloperRoutes = [
           affix: false,
           noCache: true,
           proxy: false,
-          id: 18
+          id: 22
         }
       }
     ]

+ 4 - 4
src/router/modules/product.js

@@ -10,28 +10,28 @@ const productRoutes = [
     redirect: '/product/list',
     hidden: true,
     name: 'Product',
-    meta: { title: '商品管理', icon: 'el-icon-s-shop', roles: ['admin', 'normal'], noCache: true, id: 19 },
+    meta: { title: '设备认证', icon: 'el-icon-s-shop', roles: ['admin', 'normal'], noCache: true, id: 23 },
     children: [
       {
         hidden: true,
         path: 'list',
         component: () => import('@/views/authentic/product/index'),
         name: 'ProductList',
-        meta: { title: '商品列表', icon: 'el-icon-menu', roles: ['admin', 'normal'], noCache: true, id: 20 }
+        meta: { title: '设备列表', icon: 'el-icon-menu', roles: ['admin', 'normal'], noCache: true, id: 24 }
       },
       {
         hidden: true,
         path: 'add',
         component: () => import('@/views/authentic/product/add'),
         name: 'AddProduct',
-        meta: { title: '添加商品', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 21 }
+        meta: { title: '添加设备', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 25 }
       },
       {
         hidden: true,
         path: 'edit',
         component: () => import('@/views/authentic/product/edit'),
         name: 'EditProduct',
-        meta: { title: '修改商品', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 22 }
+        meta: { title: '修改设备', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true, id: 26 }
       }
     ]
   }

+ 103 - 91
src/router/modules/review.js

@@ -1,104 +1,116 @@
 /* Layout */
 import Layout from '@/layout'
 
+// 机构认证审核路由
+const authRoutes = [
+  {
+    path: 'auth',
+    component: () => import('@/views/authentic/review/auth/index'),
+    name: 'ReviewList',
+    meta: { title: '机构认证', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 27 }
+  },
+  {
+    path: 'auth-list',
+    hidden: true,
+    component: () => import('@/views/authentic/review/auth/authList'),
+    name: 'ReviewAuthList',
+    meta: { title: '机构认证审核', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 28 }
+  },
+  {
+    path: 'shop-list',
+    hidden: true,
+    component: () => import('@/views/authentic/review/auth/shopList'),
+    name: 'ShopList',
+    meta: { title: '设备审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 29 }
+  },
+  {
+    path: 'shop-detail',
+    hidden: true,
+    component: () => import('@/views/authentic/review/auth/shopDetail'),
+    name: 'ShopDetail',
+    meta: { title: '设备审核详情', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 30 }
+  }
+]
+
+// 医师资料审核
+const doctorRoutes = [
+  {
+    path: 'doctor-list',
+    component: () => import('@/views/authentic/review/doctor/index'),
+    name: 'ReviewDoctorList',
+    meta: { title: '医师认证', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 45 }
+  },
+  {
+    path: 'doctor/detail',
+    hidden: true,
+    component: () => import('@/views/authentic/review/doctor/doctorDetail'),
+    name: 'ReviewDoctorDetail',
+    meta: { title: '医师认证', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 46 }
+  }
+]
+
+// 资料库审核
+const docRoutes = [
+  {
+    path: 'doc-list',
+    component: () => import('@/views/authentic/review/doc/index'),
+    name: 'ReviewDocList',
+    meta: { title: '资料库', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 31 }
+  },
+  {
+    path: 'article',
+    component: () => import('@/views/authentic/review/doc/articleList'),
+    name: 'ReviewDocArticle',
+    hidden: true,
+    meta: { title: '文章审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 32 }
+  },
+  {
+    path: 'article/detail',
+    component: () => import('@/views/authentic/review/doc/articleDetail'),
+    name: 'ReviewDocArticleDetail',
+    hidden: true,
+    meta: { title: '审核文章', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 33 }
+  },
+  {
+    path: 'image',
+    component: () => import('@/views/authentic/review/doc/imageList'),
+    name: 'ReviewDocImage',
+    hidden: true,
+    meta: { title: '图片审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 34 }
+  },
+  {
+    path: 'image/detail',
+    component: () => import('@/views/authentic/review/doc/imageDetail'),
+    name: 'ReviewDocImageDetail',
+    hidden: true,
+    meta: { title: '审核图片', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 45 }
+  },
+  {
+    path: 'video',
+    component: () => import('@/views/authentic/review/doc/videoList'),
+    name: 'ReviewDocVideo',
+    hidden: true,
+    meta: { title: '视频审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 36 }
+  },
+  {
+    path: 'file',
+    component: () => import('@/views/authentic/review/doc/fileList'),
+    name: 'ReviewDocFile',
+    hidden: true,
+    meta: { title: '文件审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 37 }
+  }
+]
+
 // 审核页面路由
 const reviewRoutes = [
   // 授权机构审核路由
   {
-    path: '/review/auth',
+    path: '/review',
     component: Layout,
     alwaysShow: true,
     name: 'ReviewAuth',
-    redirect: '/review/auth/list',
-    meta: { title: '品牌授权审核', icon: 'el-icon-s-check', roles: ['admin'], noCache: true, id: 23 },
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/authentic/review/auth/index'),
-        name: 'ReviewList',
-        meta: { title: '审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 24 }
-      },
-      {
-        path: 'auth-list',
-        hidden: true,
-        component: () => import('@/views/authentic/review/auth/authList'),
-        name: 'ReviewAuthList',
-        meta: { title: '授权机构审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 25 }
-      },
-      {
-        path: 'shop-list',
-        hidden: true,
-        component: () => import('@/views/authentic/review/auth/shopList'),
-        name: 'ShopList',
-        meta: { title: '商品审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 26 }
-      },
-      {
-        path: 'shop-detail',
-        hidden: true,
-        component: () => import('@/views/authentic/review/auth/shopDetail'),
-        name: 'ShopDetail',
-        meta: { title: '商品审核详情', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 27 }
-      }
-    ]
-  },
-  // 资料审核路由
-  {
-    path: '/review/doc',
-    component: Layout,
-    alwaysShow: true,
-    name: 'ReviewDoc',
-    redirect: '/review/doc/list',
-    meta: { title: '资料审核管理', icon: 'el-icon-s-check', roles: ['admin'], noCache: true, id: 28 },
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/authentic/review/doc/index'),
-        name: 'ReviewDocList',
-        meta: { title: '审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 29 }
-      },
-      {
-        path: 'article',
-        component: () => import('@/views/authentic/review/doc/articleList'),
-        name: 'ReviewDocArticle',
-        hidden: true,
-        meta: { title: '文章审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 30 }
-      },
-      {
-        path: 'article/detail',
-        component: () => import('@/views/authentic/review/doc/articleDetail'),
-        name: 'ReviewDocArticleDetail',
-        hidden: true,
-        meta: { title: '审核文章', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 31 }
-      },
-      {
-        path: 'image',
-        component: () => import('@/views/authentic/review/doc/imageList'),
-        name: 'ReviewDocImage',
-        hidden: true,
-        meta: { title: '图片审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 32 }
-      },
-      {
-        path: 'image/detail',
-        component: () => import('@/views/authentic/review/doc/imageDetail'),
-        name: 'ReviewDocImageDetail',
-        hidden: true,
-        meta: { title: '审核图片', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 33 }
-      },
-      {
-        path: 'video',
-        component: () => import('@/views/authentic/review/doc/videoList'),
-        name: 'ReviewDocVideo',
-        hidden: true,
-        meta: { title: '视频审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 34 }
-      },
-      {
-        path: 'file',
-        component: () => import('@/views/authentic/review/doc/fileList'),
-        name: 'ReviewDocFile',
-        hidden: true,
-        meta: { title: '文件审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 35 }
-      }
-    ]
+    meta: { title: '审核管理', icon: 'el-icon-s-check', roles: ['admin'], noCache: true, id: 38 },
+    children: [...authRoutes, ...doctorRoutes, ...docRoutes]
   }
 ]
 

+ 18 - 4
src/router/modules/supplier.js

@@ -9,27 +9,41 @@ const supplierRoutes = [
     alwaysShow: true,
     name: 'Supplier',
     redirect: '/supplier/list',
-    meta: { title: '供应商管理', icon: 'el-icon-s-custom', roles: ['admin'], noCache: true, id: 36 },
+    meta: { title: '账号管理', icon: 'el-icon-s-custom', roles: ['admin'], noCache: true, id: 39 },
     children: [
       {
         path: 'list',
         component: () => import('@/views/authentic/supplier/index'),
         name: 'SupplierList',
-        meta: { title: '供应商列表', icon: 'el-icon-menu', affix: true, roles: ['admin'], noCache: true, id: 37 }
+        meta: { title: '供应商账号', icon: 'el-icon-menu', affix: true, roles: ['admin'], noCache: true, id: 40 }
       },
       {
         hidden: true,
         path: 'add',
         component: () => import('@/views/authentic/supplier/add'),
         name: 'SupplierAdd',
-        meta: { title: '添加供应商', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 38 }
+        meta: { title: '添加供应商', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 41 }
       },
       {
         hidden: true,
         path: 'edit',
         component: () => import('@/views/authentic/supplier/edit'),
         name: 'SupplierEdit',
-        meta: { title: '修改供应商', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 39 }
+        meta: { title: '修改供应商', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 42 }
+      },
+      {
+        hidden: true,
+        path: 'auth-list',
+        component: () => import('@/views/authentic/supplier/auth'),
+        name: 'AuthList',
+        meta: { title: '查看认证机构', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 43 }
+      },
+      {
+        hidden: true,
+        path: 'auth-product-list',
+        component: () => import('@/views/authentic/supplier/product'),
+        name: 'AuthList',
+        meta: { title: '查看设备认证', icon: 'el-icon-menu', roles: ['admin'], noCache: true, id: 44 }
       }
     ]
   }

+ 1 - 1
src/store/modules/proxy.js

@@ -20,7 +20,7 @@ const mutations = {
     state.isChangeProxy = true
   },
   // 关闭供应商代理
-  CLOSE_PROXY: (state) => {
+  CLOSE_PROXY: state => {
     state.proxyInfo = null
     state.proxyState = false
     state.isChangeProxy = true

+ 13 - 0
src/styles/index.scss

@@ -276,3 +276,16 @@ aside {
     margin-top: -3px;
   }
 }
+
+.el-upload-hidden {
+  .el-upload {
+    display: none;
+  }
+}
+
+.map-dialog {
+  .el-dialog__body {
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+}

+ 232 - 0
src/views/authentic/auth/add.vue

@@ -0,0 +1,232 @@
+<template>
+  <div class="club-edit">
+    <el-form class="club-edit-form" label-width="120px" :model="formData" :rules="rules">
+      <el-form-item label="机构名称:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入机构名称" />
+      </el-form-item>
+      <el-form-item label="所在地区:" prop="address">
+        <el-cascader
+          v-model="value"
+          :options="options"
+          style="width: 100%"
+          placeholder="请选择所在地区"
+          @change="handleChange"
+        />
+      </el-form-item>
+      <el-form-item label="详细地址:" prop="fullAddress">
+        <el-input v-model="formData.fullAddress" placeholder="请输入详细地址" />
+      </el-form-item>
+      <el-form-item label="经纬度:" prop="point">
+        <el-input v-model="formData.point" placeholder="请输入经纬度 (格式:纬度,经度,可通过右侧地图小按钮获取)">
+          <el-button slot="append" icon="el-icon-map-location" @click="dialogMapVisible = true" />
+        </el-input>
+      </el-form-item>
+      <el-form-item label="联系方式:" prop="mobile">
+        <el-input v-model="formData.mobile" placeholder="请输入联系方式" />
+      </el-form-item>
+      <el-form-item label="机构logo:" prop="logoImage">
+        <el-input v-show="false" v-model="formData.logoImage" />
+        <el-upload
+          :class="{ 'el-upload-hidden': logoList.length >= 1}"
+          :file-list="logoList"
+          list-type="picture-card"
+          :action="action"
+          :headers="headers"
+          :on-success="uploadLogoSuccess"
+          :before-upload="beforeLogoUpload"
+          :on-remove="handleLogoRemove"
+          :limit="1"
+        >
+          <div slot="tip" class="el-upload__tip">建议尺寸:242px * 242px</div>
+          <i slot="default" class="el-icon-plus" />
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="轮播图:" prop="banner">
+        <el-input v-show="false" v-model="formData.banner" />
+        <el-upload
+          ref="coverUploader"
+          :class="{ 'el-upload-hidden': bannerList.length >= 2}"
+          list-type="picture-card"
+          :action="action"
+          :headers="headers"
+          :on-success="uploadBannerSuccess"
+          :on-remove="handleBannerRemove"
+          :before-upload="beforeBannerUpload"
+          :limit="2"
+          multiple
+          accept=".jpg,.png,.gif"
+          :file-list="bannerList"
+        >
+          <div slot="tip" class="el-upload__tip">至少上传一张,最多6张;建议尺寸:542px * 542px</div>
+          <i slot="default" class="el-icon-plus" />
+        </el-upload>
+      </el-form-item>
+    </el-form>
+    <div class="submit-btn">
+      <el-button type="primary" @click="submit">保存</el-button>
+      <el-button type="warning" @click="$_back()">返回</el-button>
+    </div>
+
+    <el-dialog class="map-dialog" title="坐标拾取(请拖动标记点选取准确位置)" :visible.sync="dialogMapVisible" width="80%">
+      <location v-if="dialogMapVisible" :init-point="formData.point" @point="handlePointChange" />
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" size="mini" @click="dialogMapVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import Location from '@/components/location'
+import { mapGetters } from 'vuex'
+export default {
+  components: {
+    Location
+  },
+  data() {
+    return {
+      dialogMapVisible: false,
+      point: {},
+      value: [],
+      options: [{
+        value: 'zhinan',
+        label: '指南',
+        children: [{
+          value: 'shejiyuanze',
+          label: '设计原则',
+          children: [{
+            value: 'yizhi',
+            label: '一致'
+          }, {
+            value: 'fankui',
+            label: '反馈'
+          }, {
+            value: 'xiaolv',
+            label: '效率'
+          }, {
+            value: 'kekong',
+            label: '可控'
+          }]
+        }, {
+          value: 'daohang',
+          label: '导航',
+          children: [{
+            value: 'cexiangdaohang',
+            label: '侧向导航'
+          }, {
+            value: 'dingbudaohang',
+            label: '顶部导航'
+          }]
+        }]
+      }],
+      disabled: false,
+      formData: {
+        name: '',
+        address: '',
+        fullAddress: '',
+        point: '',
+        mobile: '',
+        logoImage: '',
+        banner: ''
+      },
+      rules: {
+        name: [{ required: true, message: '机构名称不能为空', trigger: ['blur', 'change'] }],
+        address: [{ required: true, message: '地址不能为空', trigger: 'change' }],
+        fullAddress: [{ required: true, message: '详细不能为空', trigger: ['blur', 'change'] }],
+        point: [{ required: true, message: '地址坐标不能为空', trigger: ['blur', 'change'] }],
+        mobile: [{ required: true, message: '联系方式不能为空', trigger: ['blur', 'change'] }],
+        logoImage: [{ required: true, message: '请上传机构logo', trigger: 'change' }],
+        banner: [{ required: true, message: '请至少上传一张banner图片', trigger: 'change' }]
+
+      },
+      // logo图片列表
+      logoList: [],
+      // banner图片列表
+      bannerList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    // 图片上传
+    action() {
+      return process.env.VUE_APP_UPLOAD_API + '/upload/image'
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    handlePointChange(point) {
+      console.log(point)
+      this.formData.point = `${point.lat},${point.lng}`
+    },
+    submit() {},
+    handleChange(e) {
+      console.log(e)
+    },
+    // logo上传
+    uploadLogoSuccess(response, file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = fileList[0].response.data
+    },
+    handleLogoRemove(file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = ''
+    },
+    beforeLogoUpload(file) {
+      const flag = file.size / 1024 < 500
+      if (!flag) {
+        this.$message.error('上传logo图片大小不能超过 500kb!')
+      }
+      return flag
+    },
+
+    // banner上传
+    uploadBannerSuccess(response, file, fileList) {
+      this.bannerList = fileList
+      console.log(this.bannerList)
+    },
+    handleBannerRemove(file, fileList) {
+      this.bannerList = fileList
+    },
+    beforeBannerUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('上传banner图片大小不能超过 1MB!')
+      }
+      return flag
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+#allmap{
+  width: 100%;
+  height: 600px;
+}
+
+.club-edit{
+  margin-bottom: 80px;
+}
+
+.club-edit-form {
+  width: 600px;
+  margin: 0 auto;
+  margin-top: 80px;
+}
+.submit-btn {
+  text-align: center;
+  .el-button {
+    width: 140px;
+  }
+}
+
+</style>

+ 232 - 0
src/views/authentic/auth/edit.vue

@@ -0,0 +1,232 @@
+<template>
+  <div class="club-edit">
+    <el-form class="club-edit-form" label-width="120px" :model="formData" :rules="rules">
+      <el-form-item label="机构名称:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入机构名称" />
+      </el-form-item>
+      <el-form-item label="所在地区:" prop="address">
+        <el-cascader
+          v-model="value"
+          :options="options"
+          style="width: 100%"
+          placeholder="请选择所在地区"
+          @change="handleChange"
+        />
+      </el-form-item>
+      <el-form-item label="详细地址:" prop="fullAddress">
+        <el-input v-model="formData.fullAddress" placeholder="请输入详细地址" />
+      </el-form-item>
+      <el-form-item label="经纬度:" prop="point">
+        <el-input v-model="formData.point" placeholder="请输入经纬度 (格式:纬度,经度,可通过右侧地图小按钮获取)">
+          <el-button slot="append" icon="el-icon-map-location" @click="dialogMapVisible = true" />
+        </el-input>
+      </el-form-item>
+      <el-form-item label="联系方式:" prop="mobile">
+        <el-input v-model="formData.mobile" placeholder="请输入联系方式" />
+      </el-form-item>
+      <el-form-item label="机构logo:" prop="logoImage">
+        <el-input v-show="false" v-model="formData.logoImage" />
+        <el-upload
+          :class="{ 'el-upload-hidden': logoList.length >= 1}"
+          :file-list="logoList"
+          list-type="picture-card"
+          :action="action"
+          :headers="headers"
+          :on-success="uploadLogoSuccess"
+          :before-upload="beforeLogoUpload"
+          :on-remove="handleLogoRemove"
+          :limit="1"
+        >
+          <div slot="tip" class="el-upload__tip">建议尺寸:242px * 242px</div>
+          <i slot="default" class="el-icon-plus" />
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="轮播图:" prop="banner">
+        <el-input v-show="false" v-model="formData.banner" />
+        <el-upload
+          ref="coverUploader"
+          :class="{ 'el-upload-hidden': bannerList.length >= 2}"
+          list-type="picture-card"
+          :action="action"
+          :headers="headers"
+          :on-success="uploadBannerSuccess"
+          :on-remove="handleBannerRemove"
+          :before-upload="beforeBannerUpload"
+          :limit="2"
+          multiple
+          accept=".jpg,.png,.gif"
+          :file-list="bannerList"
+        >
+          <div slot="tip" class="el-upload__tip">至少上传一张,最多6张;建议尺寸:542px * 542px</div>
+          <i slot="default" class="el-icon-plus" />
+        </el-upload>
+      </el-form-item>
+    </el-form>
+    <div class="submit-btn">
+      <el-button type="primary" @click="submit">保存</el-button>
+      <el-button type="warning" @click="$_back()">返回</el-button>
+    </div>
+
+    <el-dialog class="map-dialog" title="坐标拾取(请拖动标记点选取准确位置)" :visible.sync="dialogMapVisible" width="80%">
+      <location v-if="dialogMapVisible" :init-point="formData.point" @point="handlePointChange" />
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" size="mini" @click="dialogMapVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import Location from '@/components/location'
+import { mapGetters } from 'vuex'
+export default {
+  components: {
+    Location
+  },
+  data() {
+    return {
+      dialogMapVisible: false,
+      point: {},
+      value: [],
+      options: [{
+        value: 'zhinan',
+        label: '指南',
+        children: [{
+          value: 'shejiyuanze',
+          label: '设计原则',
+          children: [{
+            value: 'yizhi',
+            label: '一致'
+          }, {
+            value: 'fankui',
+            label: '反馈'
+          }, {
+            value: 'xiaolv',
+            label: '效率'
+          }, {
+            value: 'kekong',
+            label: '可控'
+          }]
+        }, {
+          value: 'daohang',
+          label: '导航',
+          children: [{
+            value: 'cexiangdaohang',
+            label: '侧向导航'
+          }, {
+            value: 'dingbudaohang',
+            label: '顶部导航'
+          }]
+        }]
+      }],
+      disabled: false,
+      formData: {
+        name: '',
+        address: '',
+        fullAddress: '',
+        point: '',
+        mobile: '',
+        logoImage: '',
+        banner: ''
+      },
+      rules: {
+        name: [{ required: true, message: '机构名称不能为空', trigger: ['blur', 'change'] }],
+        address: [{ required: true, message: '地址不能为空', trigger: 'change' }],
+        fullAddress: [{ required: true, message: '详细不能为空', trigger: ['blur', 'change'] }],
+        point: [{ required: true, message: '地址坐标不能为空', trigger: ['blur', 'change'] }],
+        mobile: [{ required: true, message: '联系方式不能为空', trigger: ['blur', 'change'] }],
+        logoImage: [{ required: true, message: '请上传机构logo', trigger: 'change' }],
+        banner: [{ required: true, message: '请至少上传一张banner图片', trigger: 'change' }]
+
+      },
+      // logo图片列表
+      logoList: [],
+      // banner图片列表
+      bannerList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    // 图片上传
+    action() {
+      return process.env.VUE_APP_UPLOAD_API + '/upload/image'
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    handlePointChange(point) {
+      console.log(point)
+      this.formData.point = `${point.lat},${point.lng}`
+    },
+    submit() {},
+    handleChange(e) {
+      console.log(e)
+    },
+    // logo上传
+    uploadLogoSuccess(response, file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = fileList[0].response.data
+    },
+    handleLogoRemove(file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = ''
+    },
+    beforeLogoUpload(file) {
+      const flag = file.size / 1024 < 500
+      if (!flag) {
+        this.$message.error('上传logo图片大小不能超过 500kb!')
+      }
+      return flag
+    },
+
+    // banner上传
+    uploadBannerSuccess(response, file, fileList) {
+      this.bannerList = fileList
+      console.log(this.bannerList)
+    },
+    handleBannerRemove(file, fileList) {
+      this.bannerList = fileList
+    },
+    beforeBannerUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('上传banner图片大小不能超过 1MB!')
+      }
+      return flag
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+#allmap{
+  width: 100%;
+  height: 600px;
+}
+
+.club-edit{
+  margin-bottom: 80px;
+}
+
+.club-edit-form {
+  width: 600px;
+  margin: 0 auto;
+  margin-top: 80px;
+}
+.submit-btn {
+  text-align: center;
+  .el-button {
+    width: 140px;
+  }
+}
+
+</style>

+ 27 - 17
src/views/authentic/auth/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="app-container">
     <div class="filter-container">
-      <span>授权机构:</span>
-      <el-input v-model="listQuery.authParty" placeholder="授权机构" style="width: 280px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>机构名称:</span>
+      <el-input v-model="listQuery.authParty" placeholder="机构名称" style="width: 280px;" class="filter-item" @keyup.enter.native="handleFilter" />
       <span>审核状态:</span>
       <el-select
         v-model="listQuery.auditStatus"
@@ -32,7 +32,8 @@
         <el-option label="未上线" :value="0" />
       </el-select>
       <el-button icon="el-icon-search" type="primary" @click="getList">查询</el-button>
-      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-edit" type="primary" @click="handleShowEditDialog('添加品牌授权')">添加品牌授权</el-button>
+      <!-- <el-button v-if="isProxy" icon="el-icon-edit" type="primary" @click="handleShowEditDialog('添加品牌授权')">添加品牌授权</el-button> -->
+      <el-button v-if="isProxy" icon="el-icon-edit" type="primary" @click="$_navigationTo('/auth/auth-add')">添加</el-button>
       <el-button icon="el-icon-upload" type="primary" @click="improtDialogVisible = true">导入</el-button>
       <el-button icon="el-icon-document" type="primary" @click="handleExportExcel">导出</el-button>
       <el-button icon="el-icon-document-copy" type="primary" @click="downLoadExportExcel">获取导入模板</el-button>
@@ -50,9 +51,9 @@
     >
       <el-table-column label="序号" :index="indexMethod" align="center" width="80" type="index" />
 
-      <el-table-column label="授权机构" align="center" prop="authParty" />
+      <el-table-column label="机构名称" align="center" prop="authParty" />
 
-      <el-table-column label="审核状态" width="220px" align="center">
+      <el-table-column label="审核状态" width="160px" align="center">
         <template slot-scope="{ row }">
           <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
           <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
@@ -76,17 +77,17 @@
         </template>
       </el-table-column>
 
-      <el-table-column label="上线状态" width="140px" align="center">
+      <el-table-column label="上线状态" width="260px" align="center">
         <template slot-scope="{row}">
           <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
           <template v-if="row.auditStatus === 1">
             <template v-if="row.status === 0">
               <span style="margin-right:10px;" class="status danger">已下线</span>
-              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+              <el-button v-if="isProxy" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
             </template>
             <template v-else>
               <span style="margin-right:10px;" class="status success ">已上线</span>
-              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+              <el-button v-if="isProxy" type="info" size="mini" @click="handleChangeStatus(row)">下线</el-button>
             </template>
           </template>
           <template v-else>
@@ -96,26 +97,33 @@
         </template>
       </el-table-column>
 
-      <el-table-column label="创建时间" class-name="status-col" width="360px">
+      <el-table-column label="创建时间" class-name="status-col" width="200px">
         <template slot-scope="{row}">
           <span>{{ row.createTime | formatTime }}</span>
         </template>
       </el-table-column>
 
       <!-- <el-table-column label="创建人" class-name="status-col" width="160px" prop="createBy" /> -->
-
-      <el-table-column label="操作" align="center" width="240px" class-name="small-padding fixed-width">
+      <el-table-column label="操作" align="center" width="400px" class-name="small-padding fixed-width">
         <template slot-scope="{row}">
-          <template v-if="userIdentity === 2|| proxyInfo!==null">
-            <el-button type="info" size="mini" @click="handleShowEditDialog('编辑品牌授权',row)">
+          <template v-if="isProxy">
+            <el-button type="primary" size="mini" @click="handleShowEditDialog('编辑品牌授权',row)">
               编辑
             </el-button>
-            <el-button type="danger" size="mini" @click="handleRemoveAuth(row)">
-              删除
+            <el-button type="primary" size="mini" @click="$_navigationTo(`/auth/user-list?id=${row.authId}&authParty=${row.authParty}`)">
+              登录用户
+            </el-button>
+          </template>
+          <template v-if="!isProxy">
+            <el-button type="primary" size="mini" @click="$_navigationTo(`/product?id=${row.authId}&authParty=${row.authParty}`)">
+              查看
             </el-button>
           </template>
           <el-button type="primary" size="mini" @click="$_navigationTo(`/product?id=${row.authId}&authParty=${row.authParty}`)">
-            商品列表
+            查看设备认证
+          </el-button>
+          <el-button v-if="isProxy" type="danger" size="mini" @click="handleRemoveAuth(row)">
+            删除
           </el-button>
         </template>
       </el-table-column>
@@ -245,8 +253,10 @@ export default {
     ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo', 'copyUserInfo']),
     saveBtnClickable() {
       return this.uploadFileList.length > 0
+    },
+    isProxy() {
+      return this.proxyInfo || this.userIdentity !== 1
     }
-
   },
   created() {
     this.listQuery.authUserId = this.$route.query.id || this.proxyInfo?.authUserId || this.authUserId

+ 0 - 0
src/views/authentic/authuser/userList.vue → src/views/authentic/auth/user/userList.vue


+ 0 - 336
src/views/authentic/authuser/index.vue

@@ -1,336 +0,0 @@
-<template>
-  <div class="app-container">
-    <div class="filter-container">
-      <span>机构名称:</span>
-      <el-input v-model="listQuery.authParty" placeholder="机构名称" style="width: 280px;" class="filter-item" @keyup.enter.native="handleFilter" />
-      <el-button icon="el-icon-search" type="primary" @click="getList">查询</el-button>
-    </div>
-    <!-- 表格区域 -->
-    <el-table
-      :key="tableKey"
-      v-loading="listLoading"
-      :data="list"
-      border
-      fit
-      highlight-current-row
-      style="width: 100%;"
-      header-row-class-name="tableHeader"
-    >
-      <el-table-column label="序号" :index="indexMethod" align="center" width="80" type="index" />
-
-      <el-table-column label="机构名称" align="center" prop="authParty" />
-
-      <el-table-column label="创建时间" class-name="status-col" width="360px">
-        <template slot-scope="{row}">
-          <span>{{ row.createTime | formatTime }}</span>
-        </template>
-      </el-table-column>
-
-      <!-- <el-table-column label="创建人" class-name="status-col" width="160px" prop="createBy" /> -->
-
-      <el-table-column label="操作" align="center" width="300" class-name="small-padding fixed-width">
-        <template slot-scope="{row}">
-          <el-button type="primary" size="mini" @click="$_navigationTo(`/club/user-list?id=${row.authId}&authParty=${row.authParty}`)">
-            用户列表
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <!-- 页码 -->
-    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
-
-    <!-- 对话框区域 -->
-    <el-dialog
-      :title="dialogTitle"
-      :visible.sync="showAddAuthDialog"
-      width="30%"
-      @close="dialogClosed"
-    >
-      <el-form ref="addAuthForm" :rules="addAuthFormRules" :model="addAuthFormData" label-width="100px">
-        <el-form-item label="授权机构:" prop="authParty">
-          <el-input v-model="addAuthFormData.authParty" placeholder="请输入授权机构名称" />
-        </el-form-item>
-        <!-- <el-form-item label="上线状态:">
-          <el-select v-model="addAuthFormData.status">
-            <el-option label="上线" :value="1" />
-            <el-option label="下线" :value="0" />
-          </el-select>
-        </el-form-item> -->
-      </el-form>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="showAddAuthDialog = false">取 消</el-button>
-        <el-button type="primary" :disabled="disabled" @click="handleUpdateBrandAuth">确 定</el-button>
-      </span>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { fecthAuthList, saveBrandAuth, changeAuthStatus, removeAuth } from '@/api/auth'
-import Pagination from '@/components/Pagination' // secondary package based on el-pagination
-import { mapGetters } from 'vuex'
-import { formatDate } from '@/utils'
-export default {
-  name: 'ComplexTable',
-  components: { Pagination },
-  filters: {
-    formatTime(time) {
-      if (!time) {
-        return ''
-      }
-      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
-    }
-  },
-  data() {
-    return {
-      noticeTitle: '添加',
-      dialogFlag: true, // 对话框状态
-      tableKey: 0,
-      list: null,
-      total: 0,
-      listLoading: true,
-      // 查询参数
-      listQuery: {
-        authParty: '', // 授权机构
-        authUserId: '', // 供应商用户id
-        pageNum: 1, // 页码
-        pageSize: 10, // 分页
-        status: ''
-      },
-      // 添加品牌授权
-      showAddAuthDialog: false, // 显示添加供应商对话框
-      dialogTitle: '',
-      addAuthFormData: {
-        authId: '', // 授权id
-        authUserId: '', // 供应商用户id
-        authParty: '', // 授权机构
-        createBy: '', // 创建人id
-        status: 2 // 授权状态 0下线,1上线  2待审核
-      },
-      addAuthFormRules: {
-        authParty: [
-          { required: true, message: '请输入授权机构名称', trigger: 'blur' }
-        ]
-      },
-      disabled: false,
-      // 审核未通过
-      auditFailedList: [],
-      auditNoticeFlag: true
-    }
-  },
-  computed: {
-    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo'])
-  },
-  created() {
-    this.listQuery.authUserId = this.$route.query.id || this.proxyInfo?.authUserId || this.authUserId
-    const type = this.$route.query.type
-    // 如果是通过路由参数传递的type,则需要同步到store
-    if (type) {
-      this.$store.commit('user/SET_SHOP_TYPE', parseInt(type))
-    }
-    this.getList()
-  },
-  destroyed() {
-    // 页面关闭时清空代理数据
-    // this.$store.commit('user/SET_PROXY_INFO', null)
-  },
-  methods: {
-    // 获取授权列表
-    getList() {
-      this.listLoading = true
-      fecthAuthList(this.listQuery).then(response => {
-        if (response.code !== 0) {
-          return this.$message.error('授权列表信息获取失败')
-        }
-        const { list, total } = response.data
-        // this.formatList(list)
-        this.list = list
-        this.total = total
-        // 获取审核未通过的列表
-        // this.checkAuditFailedList(list)
-      }).catch(err => {
-        console.log(err)
-        return this.$message.error('授权列表信息获取失败')
-      }).finally(() => {
-        this.listLoading = false
-      })
-    },
-    // 获取审核未通过条数
-    // Audit failed 审核未通过
-    checkAuditFailedList(data) {
-      this.auditFailedList = data.filter(item => item.auditStatus === 0)
-      if (this.auditFailedList.length > 0 && this.auditNoticeFlag && (this.userIdentity !== 1 || this.proxyInfo !== null)) {
-        this.$notify.info({
-          title: '消息通知',
-          dangerouslyUseHTMLString: true,
-          message: `共有<b style="color:red">${this.auditFailedList.length}</b>个授权机构未能通过审核,请查看原因并及时修改!`,
-          duration: 3000
-        })
-        this.auditNoticeFlag = false
-      }
-    },
-    // 检查机构名是否存在 true:存在  false:不存在
-    handleCheckAuthName(name) {
-      const flag = this.list.some(item => item.authParty === name)
-      console.log(flag)
-      return flag
-    },
-    // 添加授权
-    handleUpdateBrandAuth() {
-      if (this.handleCheckAuthName(this.addAuthFormData.authParty) && this.dialogFlag) {
-        this.$message({
-          message: '该授权机构已存在',
-          duration: 1000,
-          type: 'warning'
-        })
-        return
-      }
-      this.$refs.addAuthForm.validate(valide => {
-        if (valide) {
-          this.disabled = true
-          this.listLoading = true
-          // authUserId先判断是否为代理操作,是就从代理数据中获取,否则直接获取当前登录用户的信息
-          this.addAuthFormData.authUserId = this.$route.query.id || this.proxyInfo?.authUserId || this.authUserId
-          this.addAuthFormData.createBy = this.addAuthFormData.authUserId
-          saveBrandAuth(this.addAuthFormData).then(res => {
-            if (res.code !== 0) {
-              return
-            }
-            this.getList()
-            const h = this.$createElement
-            this.$notify.success({
-              title: `${this.noticeTitle}授权机构`,
-              message: h('i', { style: 'color: #333' }, `已${this.noticeTitle}授权机构:"${this.addAuthFormData.authParty}"`),
-              duration: 3000
-            })
-            this.$refs.addAuthForm.resetFields()
-          }).catch(err => {
-            console.log(err)
-            this.$message.danger('操作失败')
-          }).finally(() => {
-            this.showAddAuthDialog = false
-            this.listLoading = false
-            this.disabled = false
-          })
-        }
-      })
-    },
-    // 删除品牌授权
-    async handleRemoveAuth(item) {
-      const text = await this.$confirm('确认删除该数据吗?删除后,对应的商品数据也将全部删除', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).catch(() => {
-        this.$message.info('已取消操作')
-      })
-      if (text !== 'confirm') return
-      // 要执行的操作
-      this.listLoading = true
-      removeAuth({	authId: item.authId }).then(res => {
-        if (res.code !== 0) return
-        const h = this.$createElement
-        this.$notify.success({
-          title: '移除授权机构',
-          message: h('i', { style: 'color: #333' }, `移除授权机构:"${item.authParty}"`),
-          duration: 3000
-        })
-      }).catch(err => {
-        console.log(err)
-      }).finally(() => {
-        this.listLoading = false
-        this.getList()
-      })
-    },
-    // 格式化列表数据
-    formatList(list = []) {
-      list.forEach(i => {
-        i.status = i.status === 1
-      })
-    },
-    // 供应商状态改变
-    handleChangeStatus(item) {
-      if (this.userIdentity !== 2 && this.proxyInfo === null) return
-      this.listLoading = true
-      // const params = {
-      //   authId: item.authId,
-      //   status: item.status ? 1 : 0
-      // }
-      const params = {
-        authId: item.authId,
-        status: item.status === 1 ? 0 : 1
-      }
-      changeAuthStatus(params).then(res => {
-        // this.$message.success(res.data)
-        this.$message({
-          message: res.data,
-          duration: 500,
-          type: 'success'
-        })
-        this.getList()
-      }).catch(err => {
-        console.log(err)
-      }).finally(() => {
-        this.listLoading = false
-      })
-    },
-    // 过滤列表
-    handleFilter() {
-      this.listQuery.page = 1
-      this.getList()
-    },
-    // 添加供应商
-    handleAddAuth() {
-      console.log('添加供应商')
-    },
-    // 对话框关闭事件
-    dialogClosed() {
-      console.log('dialog is closed')
-      this.addAuthFormData.authParty = ''
-      this.addAuthFormData.authId = ''
-      this.addAuthFormData.status = 1
-      this.noticeTitle = '添加'
-      this.$refs.addAuthForm.resetFields()
-    },
-    handleShowEditDialog(title, data) {
-      this.dialogTitle = title
-      if (data) {
-        this.addAuthFormData.authId = data.authId
-        this.addAuthFormData.authUserId = data.authUserId
-        this.addAuthFormData.authParty = data.authParty
-        this.addAuthFormData.createBy = data.createBy
-        this.status = data.status
-        this.noticeTitle = '修改'
-        this.dialogFlag = false
-      } else {
-        this.dialogFlag = true
-      }
-      this.showAddAuthDialog = true
-    },
-    indexMethod(index) {
-      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.filter-container{
-  span{
-    display: inline-block;
-    margin-bottom: 10px;
-    vertical-align: middle;
-    font-size: 14px;
-  }
-  .el-button{
-    display: inline-block;
-    margin-bottom: 10px;
-    vertical-align: middle;
-  }
-  .el-input,.el-select{
-    margin-right: 10px;
-    margin-left: 10px;
-  }
-}
-</style>

+ 56 - 0
src/views/authentic/components/authCardTemplate.vue

@@ -0,0 +1,56 @@
+<template>
+  <el-radio-group v-model="radio" size="mini" class="auth-card-template">
+    <el-row :gutter="16">
+      <el-col :span="8">
+        <img class="cover" src="https://picsum.photos/160/120" alt="">
+        <div class="footer">
+          <el-radio :label="1">模板一</el-radio>
+          <el-button type="primary" size="mini" round>预览</el-button>
+        </div>
+      </el-col>
+      <el-col :span="8">
+        <img class="cover" src="https://picsum.photos/160/120" alt="">
+        <div class="footer">
+          <el-radio :label="2">模板二</el-radio>
+          <el-button type="primary" size="mini" round>预览</el-button>
+        </div>
+      </el-col>
+      <el-col :span="8">
+        <img class="cover" src="https://picsum.photos/160/120" alt="">
+        <div class="footer">
+          <el-radio :label="3">模板三</el-radio>
+          <el-button type="primary" size="mini" round>预览</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-radio-group>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      radio: 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.auth-card-template{
+  width: 100%;
+
+  .cover{
+    width: 100%;
+    display: block;
+  }
+
+  .footer{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-top: 16px;
+    padding:0 8px;
+  }
+}
+</style>

+ 156 - 0
src/views/authentic/components/deviceSection.vue

@@ -0,0 +1,156 @@
+<template>
+  <div class="device-section">
+    <div v-for="formData in formDataList" :key="formData.key" class="section">
+      <i v-if="formDataList.length > 1" class="el-icon-close remove" title="移除该项" @click="removeOne(formData)" />
+      <el-form label-width="90px" :model="formData" :rules="rules">
+        <el-form-item label="设备名称:" prop="deviceName">
+          <el-input v-model="formData.deviceName" placeholder="设备名称" />
+        </el-form-item>
+        <el-form-item label="所属品牌:" prop="deviceBrand">
+          <el-input v-model="formData.deviceBrand" placeholder="所属品牌" />
+        </el-form-item>
+        <el-form-item label="设备图片:" prop="deviceImage">
+          <el-input v-show="false" v-model="formData.deviceImage" placeholder="设备图片" />
+          <el-upload
+            ref="coverUploader"
+            :class="{ 'el-upload-hidden': bannerList.length >= 1}"
+            list-type="picture-card"
+            :action="action"
+            :headers="headers"
+            :on-success="uploadBannerSuccess"
+            :on-remove="handleBannerRemove"
+            :before-upload="beforeBannerUpload"
+            :limit="1"
+            multiple
+            accept=".jpg,.png,.gif"
+            :file-list="bannerList"
+          >
+            <div slot="tip" class="el-upload__tip">建议尺寸:542px * 542px</div>
+            <i slot="default" class="el-icon-plus" />
+          </el-upload>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-button type="primary" size="mini" round @click="insertOne">添加设备</el-button>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+export default {
+  name: 'DeviceSection',
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      uuid: 0, // key
+      formDataList: [],
+      bannerList: [],
+
+      deviceImageList: [],
+      rules: {
+        deviceName: [{ required: true, message: '设备名称不能为空', trigger: ['blur', 'change'] }],
+        deviceBrand: [{ required: true, message: '设备名称不能为空', trigger: ['blur', 'change'] }],
+        deviceImage: [{ required: true, message: '设备名称不能为空', trigger: 'change' }]
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    // 图片上传
+    action() {
+      return process.env.VUE_APP_UPLOAD_API + '/upload/image'
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  created() {
+    this.$watch(() => this.formDataList, (newVal) => {
+      this.$emit('change', newVal)
+    })
+    this.init()
+  },
+  methods: {
+    formListWatchHnadle(nVal) {
+      console.log(nVal)
+      console.log(this)
+    },
+    init() {
+      if (this.list.length <= 0) {
+        this.insertOne()
+      } else {
+        this.formDataList = this.makeUuid(this.list)
+      }
+    },
+    insertOne() {
+      this.uuid++
+      this.formDataList.push({
+        uuid: this.uuid,
+        deviceName: '',
+        deviceBrand: '',
+        deviceImage: ''
+      })
+    },
+    removeOne(formData) {
+      const findIndex = this.formDataList.findIndex(item => item.uuid === formData.uuid)
+      this.formDataList.splice(findIndex, 1)
+      console.log(findIndex)
+    },
+    // 初始化列表uuid
+    makeUuid(list = []) {
+      return list.map((item, index) => ({ uuid: index, ...item }))
+    },
+    // banner上传
+    uploadBannerSuccess(response, file, fileList) {
+      this.bannerList = fileList
+      console.log(this.bannerList)
+    },
+    handleBannerRemove(file, fileList) {
+      this.bannerList = fileList
+    },
+    beforeBannerUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('上传banner图片大小不能超过 1MB!')
+      }
+      return flag
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.device-section {
+  .section {
+    position: relative;
+    border: 1px solid #eee;
+    padding: 25px 25px 0 16px;
+    margin-bottom: 16px;
+    .remove {
+      position: absolute;
+      right: 6px;
+      top: 6px;
+      font-size: 14px;
+      cursor: pointer;
+      background: #F56C6C;
+      color: #fff;
+      padding: 2px;
+      border-radius: 50%;
+      transition:all 0.2s;
+      &:hover{
+        background: red;
+      }
+    }
+  }
+  .el-form-item {
+    padding-bottom: 25px;
+  }
+}
+</style>

+ 196 - 0
src/views/authentic/doctor/add.vue

@@ -0,0 +1,196 @@
+<template>
+  <div class="doctor-edit">
+    <el-form class="doctor-edit-form" label-width="130px" :model="formData" :rules="rules">
+      <el-form-item label="医师姓名:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入医师姓名" />
+      </el-form-item>
+      <el-form-item label="从业资格证编号:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入从业资格证编号" />
+      </el-form-item>
+      <el-form-item label="所在机构:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入机构名称" />
+      </el-form-item>
+      <el-form-item label="轮播图:" prop="banner">
+        <el-input v-show="false" v-model="formData.banner" />
+        <el-upload
+          ref="coverUploader"
+          :class="{ 'el-upload-hidden': bannerList.length >= 2}"
+          list-type="picture-card"
+          :action="action"
+          :headers="headers"
+          :on-success="uploadBannerSuccess"
+          :on-remove="handleBannerRemove"
+          :before-upload="beforeBannerUpload"
+          :limit="2"
+          multiple
+          accept=".jpg,.png,.gif"
+          :file-list="bannerList"
+        >
+          <div slot="tip" class="el-upload__tip">至少上传一张机构门店图,最多上传6张;建议尺寸:542px * 542px</div>
+          <i slot="default" class="el-icon-plus" />
+        </el-upload>
+      </el-form-item>
+
+      <el-form-item label="具备操作资格设备:">
+        <device-section :list="deviceList" @change="deviceListDataChange" />
+      </el-form-item>
+
+    </el-form>
+    <div class="submit-btn">
+      <el-button type="primary" @click="submit">保存</el-button>
+      <el-button type="warning" @click="$_back()">返回</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import DeviceSection from '../components/deviceSection.vue'
+export default {
+  components: { DeviceSection },
+  data() {
+    return {
+      dialogMapVisible: false,
+      point: {},
+      value: [],
+      options: [{
+        value: 'zhinan',
+        label: '指南',
+        children: [{
+          value: 'shejiyuanze',
+          label: '设计原则',
+          children: [{
+            value: 'yizhi',
+            label: '一致'
+          }, {
+            value: 'fankui',
+            label: '反馈'
+          }, {
+            value: 'xiaolv',
+            label: '效率'
+          }, {
+            value: 'kekong',
+            label: '可控'
+          }]
+        }, {
+          value: 'daohang',
+          label: '导航',
+          children: [{
+            value: 'cexiangdaohang',
+            label: '侧向导航'
+          }, {
+            value: 'dingbudaohang',
+            label: '顶部导航'
+          }]
+        }]
+      }],
+      disabled: false,
+      formData: {
+        name: '',
+        address: '',
+        fullAddress: '',
+        point: '',
+        mobile: '',
+        logoImage: '',
+        banner: ''
+      },
+      rules: {
+        name: [{ required: true, message: '机构名称不能为空', trigger: ['blur', 'change'] }],
+        address: [{ required: true, message: '地址不能为空', trigger: 'change' }],
+        fullAddress: [{ required: true, message: '详细不能为空', trigger: ['blur', 'change'] }],
+        point: [{ required: true, message: '地址坐标不能为空', trigger: ['blur', 'change'] }],
+        mobile: [{ required: true, message: '联系方式不能为空', trigger: ['blur', 'change'] }],
+        logoImage: [{ required: true, message: '请上传机构logo', trigger: 'change' }],
+        banner: [{ required: true, message: '请至少上传一张banner图片', trigger: 'change' }]
+
+      },
+      // logo图片列表
+      logoList: [],
+      // banner图片列表
+      bannerList: [],
+      // 资格仪器列表
+      deviceList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    // 图片上传
+    action() {
+      return process.env.VUE_APP_UPLOAD_API + '/upload/image'
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    // 具备操作资格设备列表数据变化
+    deviceListDataChange(list) {
+      console.log(list)
+    },
+    handlePointChange(point) {
+      console.log(point)
+      this.formData.point = `${point.lat},${point.lng}`
+    },
+    submit() {},
+    handleChange(e) {
+      console.log(e)
+    },
+    // logo上传
+    uploadLogoSuccess(response, file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = fileList[0].response.data
+    },
+    handleLogoRemove(file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = ''
+    },
+    beforeLogoUpload(file) {
+      const flag = file.size / 1024 < 500
+      if (!flag) {
+        this.$message.error('上传logo图片大小不能超过 500kb!')
+      }
+      return flag
+    },
+
+    // banner上传
+    uploadBannerSuccess(response, file, fileList) {
+      this.bannerList = fileList
+      console.log(this.bannerList)
+    },
+    handleBannerRemove(file, fileList) {
+      this.bannerList = fileList
+    },
+    beforeBannerUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('上传banner图片大小不能超过 1MB!')
+      }
+      return flag
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.doctor-edit{
+  margin-bottom: 80px;
+}
+
+.doctor-edit-form {
+  width: 600px;
+  margin: 0 auto;
+  margin-top: 80px;
+}
+.submit-btn {
+  text-align: center;
+  .el-button {
+    width: 140px;
+  }
+}
+
+</style>

+ 194 - 0
src/views/authentic/doctor/edit.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="doctor-edit">
+    <el-form class="doctor-edit-form" label-width="130px" :model="formData" :rules="rules">
+      <el-form-item label="医师姓名:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入医师姓名" />
+      </el-form-item>
+      <el-form-item label="从业资格证编号:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入从业资格证编号" />
+      </el-form-item>
+      <el-form-item label="所在机构:" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入机构名称" />
+      </el-form-item>
+      <el-form-item label="轮播图:" prop="banner">
+        <el-input v-show="false" v-model="formData.banner" />
+        <el-upload
+          ref="coverUploader"
+          :class="{ 'el-upload-hidden': bannerList.length >= 2}"
+          list-type="picture-card"
+          :action="action"
+          :headers="headers"
+          :on-success="uploadBannerSuccess"
+          :on-remove="handleBannerRemove"
+          :before-upload="beforeBannerUpload"
+          :limit="2"
+          multiple
+          accept=".jpg,.png,.gif"
+          :file-list="bannerList"
+        >
+          <div slot="tip" class="el-upload__tip">至少上传一张机构门店图,最多上传6张;建议尺寸:542px * 542px</div>
+          <i slot="default" class="el-icon-plus" />
+        </el-upload>
+      </el-form-item>
+
+      <el-form-item label="具备操作资格设备:">
+        <device-section @change="deviceListDataChange" />
+      </el-form-item>
+
+    </el-form>
+    <div class="submit-btn">
+      <el-button type="primary" @click="submit">保存</el-button>
+      <el-button type="warning" @click="$_back()">返回</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import DeviceSection from '../components/deviceSection.vue'
+export default {
+  components: { DeviceSection },
+  data() {
+    return {
+      dialogMapVisible: false,
+      point: {},
+      value: [],
+      options: [{
+        value: 'zhinan',
+        label: '指南',
+        children: [{
+          value: 'shejiyuanze',
+          label: '设计原则',
+          children: [{
+            value: 'yizhi',
+            label: '一致'
+          }, {
+            value: 'fankui',
+            label: '反馈'
+          }, {
+            value: 'xiaolv',
+            label: '效率'
+          }, {
+            value: 'kekong',
+            label: '可控'
+          }]
+        }, {
+          value: 'daohang',
+          label: '导航',
+          children: [{
+            value: 'cexiangdaohang',
+            label: '侧向导航'
+          }, {
+            value: 'dingbudaohang',
+            label: '顶部导航'
+          }]
+        }]
+      }],
+      disabled: false,
+      formData: {
+        name: '',
+        address: '',
+        fullAddress: '',
+        point: '',
+        mobile: '',
+        logoImage: '',
+        banner: ''
+      },
+      rules: {
+        name: [{ required: true, message: '机构名称不能为空', trigger: ['blur', 'change'] }],
+        address: [{ required: true, message: '地址不能为空', trigger: 'change' }],
+        fullAddress: [{ required: true, message: '详细不能为空', trigger: ['blur', 'change'] }],
+        point: [{ required: true, message: '地址坐标不能为空', trigger: ['blur', 'change'] }],
+        mobile: [{ required: true, message: '联系方式不能为空', trigger: ['blur', 'change'] }],
+        logoImage: [{ required: true, message: '请上传机构logo', trigger: 'change' }],
+        banner: [{ required: true, message: '请至少上传一张banner图片', trigger: 'change' }]
+
+      },
+      // logo图片列表
+      logoList: [],
+      // banner图片列表
+      bannerList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    // 图片上传
+    action() {
+      return process.env.VUE_APP_UPLOAD_API + '/upload/image'
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    // 具备操作资格设备列表数据变化
+    deviceListDataChange(list) {
+      console.log(list)
+    },
+    handlePointChange(point) {
+      console.log(point)
+      this.formData.point = `${point.lat},${point.lng}`
+    },
+    submit() {},
+    handleChange(e) {
+      console.log(e)
+    },
+    // logo上传
+    uploadLogoSuccess(response, file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = fileList[0].response.data
+    },
+    handleLogoRemove(file, fileList) {
+      this.logoList = fileList
+      this.formData.logoImage = ''
+    },
+    beforeLogoUpload(file) {
+      const flag = file.size / 1024 < 500
+      if (!flag) {
+        this.$message.error('上传logo图片大小不能超过 500kb!')
+      }
+      return flag
+    },
+
+    // banner上传
+    uploadBannerSuccess(response, file, fileList) {
+      this.bannerList = fileList
+      console.log(this.bannerList)
+    },
+    handleBannerRemove(file, fileList) {
+      this.bannerList = fileList
+    },
+    beforeBannerUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('上传banner图片大小不能超过 1MB!')
+      }
+      return flag
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.doctor-edit{
+  margin-bottom: 80px;
+}
+
+.doctor-edit-form {
+  width: 600px;
+  margin: 0 auto;
+  margin-top: 80px;
+}
+.submit-btn {
+  text-align: center;
+  .el-button {
+    width: 140px;
+  }
+}
+
+</style>

+ 170 - 0
src/views/authentic/doctor/index.vue

@@ -0,0 +1,170 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <span>医师姓名:</span>
+      <el-input v-model="listQuery.productName" placeholder="医师姓名" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.auditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="1" />
+        <el-option label="审核未通过" :value="0" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button type="primary" icon="el-icon-edit" @click="$_navigationTo('/doctor/add')">添加</el-button>
+    </div>
+    <!-- 表格区域 -->
+    <el-table
+      :key="tableKey"
+      v-loading="listLoading"
+      :data="list"
+      border
+      fit
+      highlight-current-row
+      style="width: 100%;"
+      header-row-class-name="tableHeader"
+    >
+      <el-table-column label="序号" :index="indexMethod" type="index" align="center" width="80" />
+      <el-table-column label="医生姓名" align="center" prop="productName" />
+      <el-table-column label="从业资格证编号" align="center" prop="snCode" />
+
+      <el-table-column label="审核状态" width="220px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <!-- 未通过原因展示 -->
+          <template v-if="row.auditStatus === 0">
+            <!-- <span class="status danger">审核未通过&nbsp;</span> -->
+            <el-popover
+              placement="top-start"
+              title="审核说明"
+              width="400"
+              trigger="hover"
+              :content="row.invalidReason"
+            >
+              <el-tag slot="reference" size="small" type="danger" class="reason">
+                <span>审核未通过</span>
+                <span class="el-icon-question status danger " />
+              </el-tag>
+            </el-popover>
+            <!-- 未通过原因展示END -->
+          </template>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="上线状态" width="140px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="isProxy" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="isProxy" type="info" size="mini" @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" class-name="status-col" width="300px" align="center">
+        <template slot-scope="{row}">
+          <span>{{ row.createTime | formatTime }}</span>
+        </template>
+      </el-table-column>
+
+      <!-- <el-table-column v-if="false" label="创建人" width="180px" align="center" prop="createBy" /> -->
+      <el-table-column label="操作" align="center" width="240px" class-name="small-padding fixed-width">
+        <template slot-scope="{row}">
+          <template v-if="userIdentity === 2|| proxyInfo !== null">
+            <el-button type="default" size="mini" @click="$_navigationTo(`edit?id=${row.productId}`)">
+              编辑
+            </el-button>
+            <el-button type="danger" size="mini" @click="handleRemoveDoctor(row)">
+              删除
+            </el-button>
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
+export default {
+  components: { Pagination },
+  data() {
+    return {
+      listLoading: false,
+      tableKey: 0,
+      total: 0,
+      listQuery: {
+        status: '',
+        auditStatus: '',
+        authId: '',
+        productName: '',
+        snCode: '',
+        pageNum: 1,
+        pageSize: 10
+      },
+      list: []
+    }
+  },
+  methods: {
+    getList() {},
+    handleChangeStatus() {},
+    handleRemoveDoctor() {},
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container{
+  span{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,.el-select{
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+</style>

+ 30 - 16
src/views/authentic/product/add.vue

@@ -1,12 +1,12 @@
 <template>
   <div v-loading="isLoading" class="addProduct">
-    <el-form ref="addFormRef" label-width="120px" class="addForm" :model="formData" :rules="rules">
-      <el-form-item label="商品名称:" prop="productName">
+    <el-form ref="addFormRef" label-width="130px" class="addForm" :model="formData" :rules="rules">
+      <el-form-item label="设备名称:" prop="productName">
         <el-input v-model="formData.productName" placeholder="建议输入30个字符效果最佳" />
       </el-form-item>
 
-      <el-form-item label="商品SN码:" prop="snCode">
-        <el-input v-model="formData.snCode" placeholder="请输入商品SN码" />
+      <el-form-item label="设备SN码:" prop="snCode">
+        <el-input v-model="formData.snCode" placeholder="请输入设备SN码" />
       </el-form-item>
 
       <el-form-item v-if="shopType === 2" label="所属品牌:" prop="brandId">
@@ -21,7 +21,7 @@
         </el-select>
       </el-form-item>
 
-      <el-form-item label="商品图片:" prop="productImage">
+      <el-form-item label="设备图片:" prop="productImage">
         <upload-image ref="uploadImageRef2" tip-title="542px*542px" @success="imageUploadSuccess1" />
         <el-input v-model="formData.productImage" class="hiddenInput" />
       </el-form-item>
@@ -29,6 +29,18 @@
         <upload-image ref="uploadImageRef2" tip-title="150px*112px" @success="imageUploadSuccess2" />
         <el-input v-model="formData.certificateImage" class="hiddenInput" />
       </el-form-item>
+      <!-- 是否生成二维码授权牌 -->
+      <el-form-item label="生成二维码授权牌:">
+        <el-radio-group v-model="radio" size="mini">
+          <el-radio :label="0" border>否</el-radio>
+          <el-radio :label="1" border>是</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <!-- 二维码授权牌模板 -->
+      <el-form-item v-if="radio===1" label="选择模板:">
+        <auth-card-template />
+      </el-form-item>
+
       <el-form-item label="相关参数:" prop="paramList">
         <div v-for="(item, index) in paramList" :key="index" class="form-group paramsItem">
           <el-input v-model="item.paramName" class="param-title" :placeholder="item.tip.first" maxlength="10" />
@@ -61,8 +73,9 @@ import { saveProduct } from '@/api/product'
 import { fetchBrandList } from '@/api/brand'
 import { mapGetters } from 'vuex'
 import { isSnCode } from '@/utils/validate'
+import AuthCardTemplate from '../components/authCardTemplate.vue'
 export default {
-  components: { UploadImage },
+  components: { UploadImage, AuthCardTemplate },
   data() {
     const valideSNcode = (rules, value, callback) => {
       if (!isSnCode(value)) {
@@ -77,6 +90,7 @@ export default {
       callback()
     }
     return {
+      radio: 0,
       isLoading: false,
       paramsCount: 4,
       brandList: [],
@@ -85,12 +99,12 @@ export default {
         authId: '', //	授权id
         certificateImage: '', //	授权牌照
         createBy: '', //	创建人id
-        // 	商品参数列表
+        // 	设备参数列表
         paramList: [],
-        productId: '', //	授权商品id
-        productImage: '', //	商品图片
-        productName: '', //	商品名称
-        snCode: '', //	商品SN码
+        productId: '', //	授权设备id
+        productImage: '', //	设备图片
+        productName: '', //	设备名称
+        snCode: '', //	设备SN码
         status: 2, //	上架状态:0下线,1上线 2待审核
         brandId: ''
       },
@@ -98,10 +112,10 @@ export default {
       rules: {
         certificateImage: [{ required: true, message: '授权牌照不能为空' }],
         paramList: [{ required: true, message: '参数不能为空' }],
-        productImage: [{ required: true, message: '商品图片不能为空' }],
+        productImage: [{ required: true, message: '设备图片不能为空' }],
         snCode: [{ required: true, message: 'SN码不能为空' }, { validator: valideSNcode }],
         productName: [
-          { required: true, message: '商品名称不能为空' },
+          { required: true, message: '设备名称不能为空' },
           { max: 50, message: '字数在50字符以内' }
         ],
         brandId: [{ required: true, validator: valideBrandId, tigger: 'change' }]
@@ -158,8 +172,8 @@ export default {
           if (res.code !== 0) return
           const h = this.$createElement
           this.$notify.success({
-            title: '新增商品',
-            message: h('i', { style: 'color: #333' }, `已添加商品:"${this.formData.productName}"`),
+            title: '新增设备',
+            message: h('i', { style: 'color: #333' }, `已添加设备:"${this.formData.productName}"`),
             duration: 2000
           })
           this.$refs.addFormRef.resetFields()
@@ -245,7 +259,7 @@ export default {
   }
 }
 .addForm {
-  width: 500px;
+  width: 800px;
   margin: 0 auto;
   margin-top: 80px;
 }

+ 14 - 14
src/views/authentic/product/edit.vue

@@ -1,12 +1,12 @@
 <template>
   <div v-loading="isLoading" class="addProduct">
     <el-form ref="addFormRef" label-width="120px" class="addForm" :model="formData" :rules="rules">
-      <el-form-item label="商品名称:" prop="productName">
-        <el-input v-model="formData.productName" placeholder="请输入商品名称" />
+      <el-form-item label="设备名称:" prop="productName">
+        <el-input v-model="formData.productName" placeholder="请输入设备名称" />
       </el-form-item>
 
-      <el-form-item label="商品SN码:" prop="snCode">
-        <el-input v-model="formData.snCode" placeholder="请输入商品SN码" />
+      <el-form-item label="设备SN码:" prop="snCode">
+        <el-input v-model="formData.snCode" placeholder="请输入设备SN码" />
       </el-form-item>
 
       <el-form-item v-if="shopType === 2" label="所属品牌:" prop="brandId">
@@ -15,7 +15,7 @@
         </el-select>
       </el-form-item>
 
-      <el-form-item label="商品图片:" prop="productImage">
+      <el-form-item label="设备图片:" prop="productImage">
         <upload-image ref="uploadImageRef2" :file-list="fileList1" @success="imageUploadSuccess1" />
         <el-input v-model="formData.productImage" class="hiddenInput" />
       </el-form-item>
@@ -65,12 +65,12 @@ export default {
         authId: '', //	授权id
         certificateImage: '', //	授权牌照
         createBy: '', //	创建人id
-        // 	商品参数列表
+        // 	设备参数列表
         paramList: [],
-        productId: '', //	授权商品id
-        productImage: '', //	商品图片
-        productName: '', //	商品名称
-        snCode: '', //	商品SN码
+        productId: '', //	授权设备id
+        productImage: '', //	设备图片
+        productName: '', //	设备名称
+        snCode: '', //	设备SN码
         brandId: ''
       },
       paramList: [],
@@ -78,10 +78,10 @@ export default {
       rules: {
         certificateImage: [{ required: true, message: '授权牌照不能为空' }],
         paramList: [{ required: true, message: '参数不能为空' }],
-        productImage: [{ required: true, message: '商品图片不能为空' }],
+        productImage: [{ required: true, message: '设备图片不能为空' }],
         snCode: [{ required: true, message: 'SN码不能为空' }],
         productName: [
-          { required: true, message: '商品名称不能为空' },
+          { required: true, message: '设备名称不能为空' },
           { max: 50, message: '字数在50字符以内' }
         ]
       },
@@ -175,8 +175,8 @@ export default {
           if (res.code !== 0) return
           const h = this.$createElement
           this.$notify.success({
-            title: '修改商品',
-            message: h('i', { style: 'color: #333' }, `已修改商品:"${this.formData.productName}"`),
+            title: '修改设备',
+            message: h('i', { style: 'color: #333' }, `已修改设备:"${this.formData.productName}"`),
             duration: 2000
           })
           this.$store.dispatch('tagsView/delView', this.$route)

+ 9 - 4
src/views/authentic/product/index.vue

@@ -34,7 +34,9 @@
         <el-option label="未上线" :value="0" />
       </el-select>
       <el-button type="primary" icon="el-icon-search" @click="handleFilter">查询</el-button>
-      <el-button v-if="userIdentity === 2 || proxyInfo !== null" icon="el-icon-edit" type="primary" @click="$_navigationTo(`add?id=${listQuery.authId}`)">添加商品</el-button>
+      <el-button v-if="isProxy" icon="el-icon-edit" type="primary" @click="$_navigationTo(`add?id=${listQuery.authId}`)">添加</el-button>
+      <el-button type="primary" icon="el-icon-download" @click="handleFilter">一键下载授权牌</el-button>
+      <el-button type="primary" icon="el-icon-download" @click="handleFilter">一键下载二维码</el-button>
     </div>
     <!-- 表格区域 -->
     <el-table
@@ -81,11 +83,11 @@
           <template v-if="row.auditStatus === 1">
             <template v-if="row.status === 0">
               <span style="margin-right:10px;" class="status danger">已下线</span>
-              <el-button v-if="userIdentity===2 || proxyInfo !== null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+              <el-button v-if="isProxy" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
             </template>
             <template v-else>
               <span style="margin-right:10px;" class="status success ">已上线</span>
-              <el-button v-if="userIdentity===2 || proxyInfo !== null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+              <el-button v-if="isProxy" type="info" size="mini" @click="handleChangeStatus(row)">下线</el-button>
             </template>
           </template>
           <template v-else>
@@ -172,7 +174,10 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['userIdentity', 'proxyInfo'])
+    ...mapGetters(['userIdentity', 'proxyInfo']),
+    isProxy() {
+      return this.proxyInfo || this.userIdentity !== 1
+    }
   },
   created() {
     this.listQuery.authId = this.$route.query.id

+ 4 - 4
src/views/authentic/review/auth/authList.vue

@@ -2,10 +2,10 @@
   <div class="app-container">
     <!-- 搜索区域 -->
     <div class="filter-container">
-      <span>授权机构名称:</span>
+      <span>机构名称:</span>
       <el-input
         v-model="listQuery.authParty"
-        placeholder="授权机构名称"
+        placeholder="机构名称"
         style="width: 200px"
         class="filter-item"
         @keyup.enter.native="getList"
@@ -24,7 +24,7 @@
         <el-option label="审核通过" :value="1" />
         <el-option label="审核未通过" :value="0" />
       </el-select>
-      <span>商品信息审核状态:</span>
+      <span>设备认证审核状态:</span>
       <el-select
         v-model="listQuery.lowerAuditStatus"
         placeholder="供应商类型"
@@ -107,7 +107,7 @@
             @click="handleShowDialog(row)"
           >审核</el-button>
           <el-badge :hidden="row.lowerAuditStatus === 1" :value="row.waitAuditNum" :max="99">
-            <el-button icon="el-icon-s-shop" type="primary" size="mini" @click="$_navigationTo(`shop-list?authId=${row.authId}`)">商品信息审核</el-button>
+            <el-button icon="el-icon-s-shop" type="primary" size="mini" @click="$_navigationTo(`shop-list?authId=${row.authId}`)">设备认证审核</el-button>
           </el-badge>
         </template>
       </el-table-column>

+ 1 - 1
src/views/authentic/review/auth/index.vue

@@ -89,7 +89,7 @@
               icon="el-icon-s-check"
               size="mini"
               @click="$_navigationTo(`auth-list?authUserId=${row.authUserId}`)"
-            >品牌授权信息审核</el-button>
+            >机构认证审核</el-button>
           </el-badge>
         </template>
       </el-table-column>

+ 3 - 3
src/views/authentic/review/auth/shopDetail.vue

@@ -1,13 +1,13 @@
 <template>
   <div v-loading="isLoading" class="shop-detail">
     <el-form v-if="product!==null" ref="formRef" :model="formData" :rules="formRules" label-width="120px">
-      <el-form-item label="商品名称:">
+      <el-form-item label="设备名称:">
         <span>{{ product.productName }}</span>
       </el-form-item>
-      <el-form-item label="商品SN码:">
+      <el-form-item label="设备SN码:">
         <span>{{ product.snCode }}</span>
       </el-form-item>
-      <el-form-item label="商品图片:">
+      <el-form-item label="设备图片:">
         <el-image
           style="width: 140px; height: 140px"
           :src="product.productImage"

+ 6 - 6
src/views/authentic/review/auth/shopList.vue

@@ -2,18 +2,18 @@
   <div class="app-container">
     <!-- 搜索区域 -->
     <div class="filter-container">
-      <span>商品名称:</span>
+      <span>设备名称:</span>
       <el-input
         v-model="listQuery.productName"
-        placeholder="请输入商品名称"
+        placeholder="请输入设备名称"
         style="width: 200px"
         class="filter-item"
         @keyup.enter.native="getList"
       />
-      <span>商品SN码:</span>
+      <span>设备SN码:</span>
       <el-input
         v-model="listQuery.snCode"
-        placeholder="请输入商品SN码"
+        placeholder="请输入设备SN码"
         style="width: 200px"
         class="filter-item"
         @keyup.enter.native="getList"
@@ -46,8 +46,8 @@
       cell-class-name="table-cell"
     >
       <el-table-column :index="indexMethod" label="序号" type="index" width="80" align="center" />
-      <el-table-column prop="productName" label="商品名称" align="center" />
-      <el-table-column prop="snCode" label="商品SN码" align="center" />
+      <el-table-column prop="productName" label="设备名称" align="center" />
+      <el-table-column prop="snCode" label="设备SN码" align="center" />
       <el-table-column label="审核状态" width="220px" align="center">
         <template slot-scope="{ row }">
           <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>

+ 137 - 0
src/views/authentic/review/doctor/doctorDetail.vue

@@ -0,0 +1,137 @@
+<template>
+  <div class="doctor-edit">
+    <el-form class="doctor-edit-form" label-width="130px" :model="formData" :rules="rules">
+      <el-form-item label="医师姓名:" prop="name">
+        <span>{{ formData.name }}</span>
+      </el-form-item>
+      <el-form-item label="从业资格证编号:" prop="name">
+        <span>{{ formData.name }}</span>
+      </el-form-item>
+      <el-form-item label="所在机构:" prop="name">
+        <span>{{ formData.name }}</span>
+      </el-form-item>
+      <el-form-item label="轮播图:" prop="banner">
+        <img src="https://picsum.photos/200/200" alt="">
+        <img src="https://picsum.photos/200/200" alt="">
+        <img src="https://picsum.photos/200/200" alt="">
+      </el-form-item>
+
+      <el-form-item label="具备操作资格设备:">
+        <div class="section" />
+
+      </el-form-item>
+
+    </el-form>
+    <div class="submit-btn">
+      <el-button type="primary" @click="submit">通过</el-button>
+      <el-button type="warning" @click="$_back()">不通过</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+export default {
+  data() {
+    return {
+      dialogMapVisible: false,
+      point: {},
+      value: [],
+      options: [{
+        value: 'zhinan',
+        label: '指南',
+        children: [{
+          value: 'shejiyuanze',
+          label: '设计原则',
+          children: [{
+            value: 'yizhi',
+            label: '一致'
+          }, {
+            value: 'fankui',
+            label: '反馈'
+          }, {
+            value: 'xiaolv',
+            label: '效率'
+          }, {
+            value: 'kekong',
+            label: '可控'
+          }]
+        }, {
+          value: 'daohang',
+          label: '导航',
+          children: [{
+            value: 'cexiangdaohang',
+            label: '侧向导航'
+          }, {
+            value: 'dingbudaohang',
+            label: '顶部导航'
+          }]
+        }]
+      }],
+      disabled: false,
+      formData: {
+        name: '',
+        address: '',
+        fullAddress: '',
+        point: '',
+        mobile: '',
+        logoImage: '',
+        banner: ''
+      },
+      rules: {
+        name: [{ required: true, message: '机构名称不能为空', trigger: ['blur', 'change'] }],
+        address: [{ required: true, message: '地址不能为空', trigger: 'change' }],
+        fullAddress: [{ required: true, message: '详细不能为空', trigger: ['blur', 'change'] }],
+        point: [{ required: true, message: '地址坐标不能为空', trigger: ['blur', 'change'] }],
+        mobile: [{ required: true, message: '联系方式不能为空', trigger: ['blur', 'change'] }],
+        logoImage: [{ required: true, message: '请上传机构logo', trigger: 'change' }],
+        banner: [{ required: true, message: '请至少上传一张banner图片', trigger: 'change' }]
+
+      },
+      // logo图片列表
+      logoList: [],
+      // banner图片列表
+      bannerList: [],
+      // 资格仪器列表
+      deviceList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['token']),
+    // 图片上传
+    action() {
+      return process.env.VUE_APP_UPLOAD_API + '/upload/image'
+    },
+    headers() {
+      return {
+        'X-Token': this.token
+      }
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    submit() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.doctor-edit{
+  margin-bottom: 80px;
+}
+
+.doctor-edit-form {
+  width: 600px;
+  margin: 0 auto;
+  margin-top: 80px;
+}
+.submit-btn {
+  text-align: center;
+  .el-button {
+    width: 140px;
+  }
+}
+
+</style>

+ 164 - 0
src/views/authentic/review/doctor/index.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <span>医师姓名:</span>
+      <el-input v-model="listQuery.productName" placeholder="医师姓名" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.auditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="1" />
+        <el-option label="审核未通过" :value="0" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+    </div>
+    <!-- 表格区域 -->
+    <el-table
+      :key="tableKey"
+      v-loading="listLoading"
+      :data="list"
+      border
+      fit
+      highlight-current-row
+      style="width: 100%;"
+      header-row-class-name="tableHeader"
+    >
+      <el-table-column label="序号" :index="indexMethod" type="index" align="center" width="80" />
+      <el-table-column label="医生姓名" align="center" prop="productName" />
+      <el-table-column label="从业资格证编号" align="center" prop="snCode" />
+
+      <el-table-column label="审核状态" width="220px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <!-- 未通过原因展示 -->
+          <template v-if="row.auditStatus === 0">
+            <!-- <span class="status danger">审核未通过&nbsp;</span> -->
+            <el-popover
+              placement="top-start"
+              title="审核说明"
+              width="400"
+              trigger="hover"
+              :content="row.invalidReason"
+            >
+              <el-tag slot="reference" size="small" type="danger" class="reason">
+                <span>审核未通过</span>
+                <span class="el-icon-question status danger " />
+              </el-tag>
+            </el-popover>
+            <!-- 未通过原因展示END -->
+          </template>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="上线状态" width="140px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="isProxy" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="isProxy" type="info" size="mini" @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" class-name="status-col" width="300px" align="center">
+        <template slot-scope="{row}">
+          <span>{{ row.createTime | formatTime }}</span>
+        </template>
+      </el-table-column>
+
+      <!-- <el-table-column v-if="false" label="创建人" width="180px" align="center" prop="createBy" /> -->
+      <el-table-column label="操作" align="center" width="240px" class-name="small-padding fixed-width">
+        <template slot-scope="{row}">
+          <el-button type="default" size="mini" @click="$_navigationTo(`detail?id=${row.productId}`)">
+            审核
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 页码 -->
+    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
+export default {
+  components: { Pagination },
+  data() {
+    return {
+      listLoading: false,
+      tableKey: 0,
+      total: 0,
+      listQuery: {
+        status: '',
+        auditStatus: '',
+        authId: '',
+        productName: '',
+        snCode: '',
+        pageNum: 1,
+        pageSize: 10
+      },
+      list: []
+    }
+  },
+  methods: {
+    getList() {},
+    handleChangeStatus() {},
+    handleRemoveDoctor() {},
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container{
+  span{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,.el-select{
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+</style>

+ 8 - 0
src/views/authentic/supplier/add.vue

@@ -76,7 +76,14 @@
           <el-input v-model="formData1.securityLink" placeholder="请输入官网认证链接" />
         </el-form-item>
       </template>
+
       <!-- 公众号信息 -->
+      <el-form-item label="微信公众号:">
+        <el-select v-model="formData1.appType" placeholder="请选择微信公众号类型" style="width: 100%">
+          <el-option label="服务号" :value="1" />
+          <el-option label="订阅号" :value="0" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="appID:">
         <el-input v-model="formData1.appId" placeholder="微信公众号appID,没有就不填" />
       </el-form-item>
@@ -254,6 +261,7 @@ export default {
         securityLink: '', // 官网认证链接
         shopStatus: 1, // 供应商状态,
         shopInfo: '',
+        appType: '',
         appId: '',
         appSecret: '',
         qrCodeImage: '' // 微信公众号二维码

+ 355 - 0
src/views/authentic/supplier/auth/index.vue

@@ -0,0 +1,355 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <span>机构名称:</span>
+      <el-input v-model="listQuery.authParty" placeholder="授权机构" style="width: 280px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.auditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="1" />
+        <el-option label="审核未通过" :value="0" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button icon="el-icon-search" type="primary" @click="getList">查询</el-button>
+      <el-button icon="el-icon-upload" type="primary" @click="improtDialogVisible = true">导入</el-button>
+      <el-button icon="el-icon-document" type="primary" @click="handleExportExcel">导出</el-button>
+      <el-button icon="el-icon-document-copy" type="primary" @click="downLoadExportExcel">获取导入模板</el-button>
+    </div>
+    <!-- 表格区域 -->
+    <el-table
+      :key="tableKey"
+      v-loading="listLoading"
+      :data="list"
+      border
+      fit
+      highlight-current-row
+      style="width: 100%;"
+      header-row-class-name="tableHeader"
+    >
+      <el-table-column label="序号" :index="indexMethod" align="center" width="80" type="index" />
+
+      <el-table-column label="机构名称" align="center" prop="authParty" />
+
+      <el-table-column label="审核状态" width="220px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <!-- 未通过原因展示 -->
+          <template v-if="row.auditStatus === 0">
+            <!-- <span class="status danger">审核未通过&nbsp;</span> -->
+            <el-popover
+              placement="top-start"
+              title="审核说明"
+              width="400"
+              trigger="hover"
+              :content="row.invalidReason"
+            >
+              <el-tag slot="reference" size="small" type="danger" class="reason">
+                <span>审核未通过</span>
+                <span class="el-icon-question status danger " />
+              </el-tag>
+            </el-popover>
+            <!-- 未通过原因展示END -->
+          </template>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="上线状态" width="140px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="创建时间" class-name="status-col" width="360px">
+        <template slot-scope="{row}">
+          <span>{{ row.createTime | formatTime }}</span>
+        </template>
+      </el-table-column>
+
+      <!-- <el-table-column label="创建人" class-name="status-col" width="160px" prop="createBy" /> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="{row}">
+          <el-button type="primary" size="mini" @click="$_navigationTo(`/product?id=${row.authId}&authParty=${row.authParty}`)">
+            查看
+          </el-button>
+          <el-button type="primary" size="mini" @click="$_navigationTo(`/supplier/auth-product-list?id=${row.authId}&authParty=${row.authParty}`)">
+            查看设备认证
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 页码 -->
+    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+
+    <!-- 导入对话框 -->
+    <!-- dialog Start -->
+    <el-dialog
+      title="导入"
+      :visible.sync="improtDialogVisible"
+      width="30%"
+      @close="improtDialogClose"
+    >
+      <el-form ref="dialogForm" :model="improtDialogFormData" label-width="86px" :rules="improtDialogFormRules">
+        <el-form-item label="文件路径:" prop="fileUrl">
+          <file-upload ref="fileUpload" :file-list="uploadFileList" @change="fileUploadChange" />
+          <el-input v-show="false" v-model="improtDialogFormData.fileUrl" />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="improtDialogVisible = false">取 消</el-button>
+        <el-button type="primary" :disabled="!saveBtnClickable" :loading="requestLoading" @click="submitUpload">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- dialog END -->
+  </div>
+</template>
+
+<script>
+import FileUpload from '@/components/FileUpload'
+import { fecthAuthList, authImportExcel } from '@/api/auth'
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
+import { mapGetters } from 'vuex'
+import { formatDate } from '@/utils'
+import { debounce, downLoadWithATag } from '@/utils/tools'
+export default {
+  name: 'ComplexTable',
+  components: { Pagination, FileUpload },
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      tableKey: 0,
+      list: null,
+      total: 0,
+      listLoading: true,
+      // 查询参数
+      listQuery: {
+        authParty: '', // 授权机构
+        authUserId: '', // 供应商用户id
+        pageNum: 1, // 页码
+        pageSize: 10, // 分页
+        status: ''
+      },
+      disabled: false,
+
+      // ------------------
+      improtDialogVisible: false,
+      requestLoading: false,
+      uploadFileList: [],
+      improtDialogFormData: {
+        fileUrl: ''
+      },
+      improtDialogFormRules: {
+        fileUrl: [
+          {
+            required: true,
+            message: '请选择文件', trigger: 'change'
+          }
+        ]
+      },
+      chooseFile: ''
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo', 'copyUserInfo']),
+    saveBtnClickable() {
+      return this.uploadFileList.length > 0
+    }
+  },
+  created() {
+    this.listQuery.authUserId = this.$route.query.id || this.proxyInfo?.authUserId || this.authUserId
+    const type = this.$route.query.type
+    // 如果是通过路由参数传递的type,则需要同步到store
+    if (type) {
+      this.$store.commit('user/SET_SHOP_TYPE', parseInt(type))
+    }
+    this.getList()
+  },
+  methods: {
+    // 上传文件
+    submitUpload() {
+      this.$refs.dialogForm.validate(valid => {
+        console.log(valid)
+        if (!valid) return
+        this.requestLoading = true // 上传文件
+        // this.$refs.fileUpload.submit()
+        this.handleSave()
+      })
+    },
+    // 监听上传文件的状态变化
+    async fileUploadChange(fileList) {
+      this.uploadFileList = fileList
+      try {
+        await this.handleFileUploadStatus(fileList)
+        this.handleSave.apply(this)
+      } catch (error) {
+        console.log(error)
+      }
+    },
+
+    // 下载模板
+    downLoadExportExcel() {
+      downLoadWithATag(`${process.env.VUE_APP_BASE_API}/download/file?ossName=%E6%AD%A3%E5%93%81%E8%81%94%E7%9B%9F%E6%9C%BA%E6%9E%84%E3%80%81%E5%95%86%E5%93%81%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx&fileName=%E6%AD%A3%E5%93%81%E8%81%94%E7%9B%9F%E6%9C%BA%E6%9E%84%E3%80%81%E5%95%86%E5%93%81%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx`)
+    },
+
+    // 导出为Excel
+    async handleExportExcel() {
+      const text = await this.$confirm('确认导出所有授权机构的数据吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).catch(() => {
+        this.$message.info('已取消操作')
+      })
+      if (text !== 'confirm') return
+      // 使用a链接下载
+      downLoadWithATag(`${process.env.VUE_APP_BASE_API}/auth/export/excel?authUserId=${this.authUserId}`)
+    },
+
+    // 导入Excel 并提交
+    handleSave: debounce(function() {
+      console.log('保存')
+      console.log(this.improtDialogFormData)
+      console.log(this.proxyInfo, this.authUserId)
+      // 上传文件使用 multipart/form-data
+      const formData = new FormData()
+
+      formData.append('authUserId', this.authUserId)
+      formData.append('createBy', this.copyUserInfo.authUserId)
+      formData.append('file', this.chooseFile)
+
+      authImportExcel(formData)
+        .then(res => {
+          this.$message.success(res.data)
+          this.improtDialogVisible = false
+          this.getList()
+        })
+        .catch(err => { console.log(err) })
+        .finally(() => {
+          this.requestLoading = false
+        })
+    }, 200),
+
+    // 处理文件上传状态
+    handleFileUploadStatus(fileList) {
+      console.log(fileList)
+      this.chooseFile = fileList[0].raw
+      // 文件列表为空
+      if (fileList.length <= 0) {
+        this.improtDialogFormData.fileUrl = ''
+        return Promise.reject('faild')
+      }
+      // 取第一个文件
+      const { response, status } = fileList[0]
+      // 文件已选择但未上传
+      if (status === 'ready') {
+        this.improtDialogFormData.fileUrl = status
+        return Promise.reject('faild')
+      }
+      // 文件已上传
+      if (status === 'success') {
+        this.improtDialogFormData.fileUrl = response.previewUrl
+        return Promise.resolve('success')
+      }
+    },
+    improtDialogClose() {
+      console.log(123)
+      // this.uploadFileList = []
+      this.$refs.fileUpload.clearAllFiles()
+      this.$refs.dialogForm.resetFields()
+    },
+    // 获取授权列表
+    getList() {
+      this.listLoading = true
+      fecthAuthList(this.listQuery).then(response => {
+        if (response.code !== 0) {
+          return this.$message.error('授权列表信息获取失败')
+        }
+        const { list, total } = response.data
+        this.list = list
+        this.total = total
+      }).catch(err => {
+        console.log(err)
+        return this.$message.error('授权列表信息获取失败')
+      }).finally(() => {
+        this.listLoading = false
+      })
+    },
+    // 格式化列表数据
+    formatList(list = []) {
+      list.forEach(i => {
+        i.status = i.status === 1
+      })
+    },
+    // 过滤列表
+    handleFilter() {
+      this.listQuery.page = 1
+      this.getList()
+    },
+
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container{
+  span{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,.el-select{
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+</style>

+ 7 - 0
src/views/authentic/supplier/edit.vue

@@ -81,6 +81,12 @@
         </el-form-item>
       </template>
       <!-- 公众号信息 -->
+      <el-form-item label="微信公众号:">
+        <el-select v-model="formData1.appType" placeholder="请选择微信公众号类型" style="width: 100%">
+          <el-option label="服务号" :value="1" />
+          <el-option label="订阅号" :value="0" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="appID:">
         <el-input v-model="formData1.appId" placeholder="微信公众号appID,没有就不填" />
       </el-form-item>
@@ -262,6 +268,7 @@ export default {
         securityLink: '', // 官网认证链接
         shopStatus: 1, // 供应商状态,
         shopInfo: '',
+        appType: '',
         appId: '',
         appSecret: '',
         qrCodeImage: '' // 公众号二维码

+ 2 - 2
src/views/authentic/supplier/index.vue

@@ -66,8 +66,8 @@
           <el-button size="mini" type="primary" @click="handleProxy(row)">
             代他操作
           </el-button>
-          <el-button size="mini" type="primary" @click="$_navigationTo(`/auth/list?id=${row.authUserId}`)">
-            授权信息
+          <el-button size="mini" type="primary" @click="$_navigationTo(`/supplier/auth-list?id=${row.authUserId}`)">
+            查看机构认证
           </el-button>
           <el-button size="mini" type="primary" @click="handleResetPwd(row)">
             重置密码

+ 216 - 0
src/views/authentic/supplier/product/index.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <span>设备名称:</span>
+      <el-input v-model="listQuery.productName" placeholder="商品名称" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>设备SN码:</span>
+      <el-input v-model="listQuery.snCode" placeholder="商品SN码" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.auditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="1" />
+        <el-option label="审核未通过" :value="0" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="handleFilter">查询</el-button>
+    </div>
+    <!-- 表格区域 -->
+    <el-table
+      :key="tableKey"
+      v-loading="listLoading"
+      :data="list"
+      border
+      fit
+      highlight-current-row
+      style="width: 100%;"
+      header-row-class-name="tableHeader"
+    >
+      <el-table-column label="序号" :index="indexMethod" type="index" align="center" width="80" />
+      <el-table-column label="设备名称" align="center" prop="productName" />
+      <el-table-column label="设备SN码" align="center" prop="snCode" />
+
+      <el-table-column label="审核状态" width="220px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <!-- 未通过原因展示 -->
+          <template v-if="row.auditStatus === 0">
+            <!-- <span class="status danger">审核未通过&nbsp;</span> -->
+            <el-popover
+              placement="top-start"
+              title="审核说明"
+              width="400"
+              trigger="hover"
+              :content="row.invalidReason"
+            >
+              <el-tag slot="reference" size="small" type="danger" class="reason">
+                <span>审核未通过</span>
+                <span class="el-icon-question status danger " />
+              </el-tag>
+            </el-popover>
+            <!-- 未通过原因展示END -->
+          </template>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="上线状态" width="140px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo !== null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo !== null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" class-name="status-col" width="300px" align="center">
+        <template slot-scope="{row}">
+          <span>{{ row.createTime | formatTime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" width="240px" class-name="small-padding fixed-width">
+        <template slot-scope="{row}">
+          <el-button type="primary" size="mini" @click="handleShowQRcode(row)">查看</el-button>
+          <el-button type="primary" size="mini" :disabled="row.auditStatus !== 1" @click="handleShowQRcode(row)">
+            二维码
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 页码 -->
+    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+
+    <!-- 二维码 -->
+    <transition name="fade">
+      <qrcode v-if="showQRcode" :product-info="productInfo" @close="showQRcode = false" />
+    </transition>
+  </div>
+</template>
+
+<script>
+import { getProdList } from '@/api/product'
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
+import Qrcode from '@/components/qrcode'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+export default {
+  name: 'ComplexTable',
+  components: { Pagination, Qrcode },
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+
+  data() {
+    return {
+      authParty: '',
+      tableKey: 0,
+      list: null,
+      total: 0,
+      listLoading: true,
+      listQuery: {
+        status: '',
+        auditStatus: '',
+        authId: '',
+        productName: '',
+        snCode: '',
+        pageNum: 1,
+        pageSize: 10
+      },
+      showQRcode: false,
+      productInfo: {}
+    }
+  },
+  computed: {
+    ...mapGetters(['userIdentity', 'proxyInfo'])
+  },
+  created() {
+    this.listQuery.authId = this.$route.query.id
+    this.authParty = this.$route.query.authParty
+    this.getList()
+  },
+
+  methods: {
+    // 获取列表信息
+    getList() {
+      getProdList(this.listQuery).then(res => {
+        const { total, list } = res.data
+        this.total = total
+        this.list = list
+        // this.checkAuditFailedList(list)
+      }).finally(() => {
+        this.listLoading = false
+      })
+    },
+    // 过滤列表
+    handleFilter() {
+      this.listQuery.page = 1
+      this.getList()
+    },
+    // 显示二维码
+    handleShowQRcode(item) {
+      this.productInfo = item
+      this.productInfo.authParty = this.authParty
+      this.showQRcode = true
+    },
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container{
+  span{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button{
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,.el-select{
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+</style>