浏览代码

认证通v1.7版本页面新增修改

yuwenjun1997 3 年之前
父节点
当前提交
bfd4f9f127

+ 10 - 4
src/components/AMapUI/index.vue

@@ -20,6 +20,10 @@ export default {
     initPoint: {
       type: String,
       default: ''
+    },
+    markFlag: {
+      type: Boolean,
+      default: true
     }
   },
   data() {
@@ -102,10 +106,12 @@ export default {
       this.map.on('complete', () => {
         this.mapLoading = false
       })
-      this.map.on('click', ev => {
-        const { lng, lat } = ev.lnglat
-        this.markerTo(new this.AMap.LngLat(lng, lat))
-      })
+      if (this.markFlag) {
+        this.map.on('click', ev => {
+          const { lng, lat } = ev.lnglat
+          this.markerTo(new this.AMap.LngLat(lng, lat))
+        })
+      }
     },
 
     // 移动点标记

+ 1 - 0
src/permission.js

@@ -48,6 +48,7 @@ router.beforeEach(async(to, from, next) => {
           await store.dispatch('user/fetchUserVipInfo')
           // 根据用户角色获取路由配置
           const accessRoutes = await store.dispatch('permission/generateRoutes')
+          console.log(accessRoutes)
           // 添加路由配置
           router.addRoutes(accessRoutes)
           // 放行

+ 37 - 108
src/router/index.js

@@ -1,122 +1,51 @@
 import Vue from 'vue'
 import Router from 'vue-router'
-import Layout from '@/layout'
 
 Vue.use(Router)
 
-// 引入路由
-import supplierRoutes from './module/supplier'
-import clubRoutes from './module/club'
-import personnelRoutes from './module/personnel'
-import feedbackRoutes from './module/feedback'
-import helperRoutes from './module/helper'
-import materialRoutes from './module/material'
-import auditRoutes from './module/audit'
-import memberRoutes from './module/member'
-import vipRoutes from './module/vip'
-import personalRoutes from './module/personal'
-import settingRoutes from './module/settings'
-import shareRoutes from './module/share'
-import logisticsRoutes from './module/logistics'
+// base
+import baseRoutes from './module/base'
+
+// 引入公共路由
+import commonHelper from './module/common/helper'
+import commonShare from './module/common/share'
+
+// 管理员端路由
+import adminSupplierRoutes from './module/admin/supplier'
+import adminLogistics from './module/admin/logistics'
+import admimAudit from './module/admin/audit'
+import adminMember from './module/admin/member'
+import adminSettings from './module/admin/settings'
+
+// 供应商端路由
+import normalAduit from './module/normal/audit'
+import normalClub from './module/normal/club'
+import normalFeedback from './module/normal/feedback'
+import normalMaterial from './module/normal/material'
+import normalPersonal from './module/normal/personal'
+import normalPersonnel from './module/normal/personnel'
+import normalVip from './module/normal/vip'
+import normalUser from './module/normal/user'
 
 // 需要权限访问的路由列表
 export const asyncRoutes = [
-  ...supplierRoutes,
-  ...auditRoutes,
-  ...memberRoutes,
-  ...clubRoutes,
-  ...personnelRoutes,
-  ...materialRoutes,
-  ...feedbackRoutes,
-  ...settingRoutes,
-  ...helperRoutes,
-  ...personalRoutes,
-  ...logisticsRoutes
+  ...commonHelper,
+  ...adminSupplierRoutes,
+  ...adminLogistics,
+  ...admimAudit,
+  ...adminMember,
+  ...adminSettings,
+  ...normalAduit,
+  ...normalClub,
+  ...normalFeedback,
+  ...normalMaterial,
+  ...normalPersonal,
+  ...normalPersonnel,
+  ...normalUser
 ]
 
 // 默认路由列表 全部用户都可以访问
-export const constantRoutes = [
-  ...vipRoutes,
-  ...shareRoutes,
-  {
-    path: '/',
-    component: () => import(/* webpackChunkName: "common-page" */ '@/views/index'),
-    hidden: true
-  },
-  {
-    path: '/login',
-    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/login'),
-    hidden: true
-  },
-  {
-    path: '/password',
-    component: Layout,
-    name: 'Password',
-    meta: { title: '密码管理' },
-    hidden: true,
-    children: [
-      {
-        path: 'edit',
-        meta: { title: '修改密码' },
-        component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/password'),
-        hidden: true
-      }
-    ]
-  },
-  {
-    path: '/proxy',
-    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/proxy'),
-    hidden: true
-  },
-  {
-    path: '/redirect',
-    component: Layout,
-    hidden: true,
-    children: [
-      {
-        path: '/redirect/:path(.*)',
-        component: () => import('@/views/common/redirect/index')
-      }
-    ]
-  },
-  {
-    path: '/pay',
-    component: Layout,
-    name: 'PayStatus',
-    meta: { title: '支付状态' },
-    hidden: true,
-    redirect: '/pay/success',
-    children: [
-      {
-        path: 'success',
-        component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/payment/success'),
-        hidden: true
-      },
-      {
-        path: 'faild',
-        component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/payment/faild'),
-        hidden: true
-      }
-    ]
-  },
-  {
-    path: '/login/redirect',
-    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/login/redirect'),
-    hidden: true
-  },
-  {
-    path: '/404',
-    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/error-page/404'),
-    hidden: true
-  },
-  {
-    path: '/401',
-    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/error-page/401'),
-    hidden: true
-  },
-  // 404页面 放在最后面
-  { path: '*', redirect: '/404', hidden: true }
-]
+export const constantRoutes = [...normalVip, ...commonShare, ...baseRoutes]
 
 // 创建路由对象
 const createRouter = () =>

+ 167 - 167
src/router/module/audit.js → src/router/module/admin/audit.js

@@ -1,167 +1,167 @@
-/* Layout */
-import Layout from '@/layout'
-
-// 机构认证审核路由
-const clubAuditRoutes = [
-  {
-    path: 'club',
-    component: () => import('@/views/admin/audit/club'),
-    name: 'AuditClub',
-    meta: { title: '机构认证', noCache: true }
-  },
-  {
-    path: 'club/club-list',
-    hidden: true,
-    component: () => import('@/views/admin/audit/club/list'),
-    name: 'AuditClubList',
-    meta: { title: '机构认证审核', noCache: true }
-  },
-  {
-    path: 'club/club-detail',
-    hidden: true,
-    component: () => import('@/views/admin/audit/club/review'),
-    name: 'AuditClubDetail',
-    meta: { title: '机构认证审核详情', noCache: true }
-  },
-  {
-    path: 'club/device/list',
-    hidden: true,
-    component: () => import('@/views/admin/audit/club/device'),
-    name: 'AuditClubDeviceList',
-    meta: { title: '设备审核列表', noCache: true }
-  },
-  {
-    path: 'club/device-detail',
-    hidden: true,
-    component: () => import('@/views/admin/audit/club/device/review'),
-    name: 'AuditClubDeviceDetail',
-    meta: { title: '设备审核详情', noCache: true }
-  }
-]
-
-// 医师资料审核
-const personnelAuditRoutes = [
-  {
-    path: 'personnel',
-    component: () => import('@/views/admin/audit/personnel'),
-    name: 'AuditPersonnel',
-    meta: { title: '人员认证', noCache: true }
-  },
-  {
-    path: 'personnel/operate/doctor-list',
-    hidden: true,
-    component: () => import('@/views/admin/audit/personnel/operate'),
-    name: 'AuditOperateDoctorList',
-    meta: { title: '操作医师审核列表', noCache: true }
-  },
-  {
-    path: 'personnel/operate/doctor-detail',
-    hidden: true,
-    component: () => import('@/views/admin/audit/personnel/operate/review'),
-    name: 'AuditOperateDoctorDetail',
-    meta: { title: '操作医师审核详情', noCache: true }
-  },
-  {
-    path: 'personnel/training/doctor-list',
-    hidden: true,
-    component: () => import('@/views/admin/audit/personnel/training'),
-    name: 'AuditTrainingDoctorList',
-    meta: { title: '培训医师审核列表', noCache: true }
-  },
-  {
-    path: 'personnel/training/doctor-detail',
-    hidden: true,
-    component: () => import('@/views/admin/audit/personnel/training/review'),
-    name: 'AuditTrainingDoctorDetail',
-    meta: { title: '培训医师审核详情', noCache: true }
-  }
-]
-
-// 资料库审核
-const materialAuditRoutes = [
-  {
-    path: 'material',
-    component: () => import('@/views/admin/audit/material'),
-    name: 'AuditMaterial',
-    meta: { title: '资料库', noCache: true }
-  },
-  {
-    path: 'material/article-list',
-    component: () => import('@/views/admin/audit/material/article'),
-    name: 'AuditMaterialArticleList',
-    hidden: true,
-    meta: { title: '文章审核列表', noCache: true }
-  },
-  {
-    path: 'material/article-detail',
-    component: () => import('@/views/admin/audit/material/article/review'),
-    name: 'AuditMaterialArticleDetail',
-    hidden: true,
-    meta: { title: '审核文章', noCache: true }
-  },
-  {
-    path: 'material/image-list',
-    component: () => import('@/views/admin/audit/material/image'),
-    name: 'AuditMaterialImageList',
-    hidden: true,
-    meta: { title: '图片审核列表', noCache: true }
-  },
-  {
-    path: 'material/image-detail',
-    component: () => import('@/views/admin/audit/material/image/review'),
-    name: 'AuditMaterialImageDetail',
-    hidden: true,
-    meta: { title: '审核图片', noCache: true }
-  },
-  {
-    path: 'material/video-list',
-    component: () => import('@/views/admin/audit/material/video'),
-    name: 'AuditMaterialVideoList',
-    hidden: true,
-    meta: { title: '视频审核列表', noCache: true }
-  },
-  {
-    path: 'material/file-list',
-    component: () => import('@/views/admin/audit/material/file'),
-    name: 'AuditMaterialFileList',
-    hidden: true,
-    meta: { title: '文件审核列表', noCache: true }
-  },
-  {
-    path: 'material/package-list',
-    component: () => import('@/views/admin/audit/material/package'),
-    name: 'AuditMaterialPackageList',
-    hidden: true,
-    meta: { title: '资料包审核列表', noCache: true }
-  }
-]
-
-// 设备管理审核
-const deviceAuditRoutes = [
-  {
-    path: 'device/club-list',
-    component: () => import('@/views/admin/audit/device'),
-    name: 'AuditDevice',
-    meta: { title: '设备管理', noCache: true }
-  },
-  {
-    path: 'device/device-list',
-    component: () => import('@/views/admin/audit/device/list'),
-    name: 'AuditDeviceCateList',
-    meta: { title: '设备管理审核', noCache: true }
-  }
-]
-
-// 审核页面路由
-const AuditRoutes = [
-  {
-    path: '/audit',
-    component: Layout,
-    alwaysShow: true,
-    name: 'Audit',
-    meta: { title: '审核管理', icon: 'el-icon-s-check', roles: ['admin'], noCache: true },
-    children: [...clubAuditRoutes, ...personnelAuditRoutes, ...materialAuditRoutes, ...deviceAuditRoutes]
-  }
-]
-
-export default AuditRoutes
+/* Layout */
+import Layout from '@/layout'
+
+// 机构认证审核路由
+const clubAuditRoutes = [
+  {
+    path: 'club',
+    component: () => import('@/views/admin/audit/club'),
+    name: 'AuditClub',
+    meta: { title: '机构认证', noCache: true }
+  },
+  {
+    path: 'club/club-list',
+    hidden: true,
+    component: () => import('@/views/admin/audit/club/list'),
+    name: 'AuditClubList',
+    meta: { title: '机构认证审核', noCache: true }
+  },
+  {
+    path: 'club/club-detail',
+    hidden: true,
+    component: () => import('@/views/admin/audit/club/review'),
+    name: 'AuditClubDetail',
+    meta: { title: '机构认证审核详情', noCache: true }
+  },
+  {
+    path: 'club/device/list',
+    hidden: true,
+    component: () => import('@/views/admin/audit/club/device'),
+    name: 'AuditClubDeviceList',
+    meta: { title: '设备审核列表', noCache: true }
+  },
+  {
+    path: 'club/device-detail',
+    hidden: true,
+    component: () => import('@/views/admin/audit/club/device/review'),
+    name: 'AuditClubDeviceDetail',
+    meta: { title: '设备审核详情', noCache: true }
+  }
+]
+
+// 医师资料审核
+const personnelAuditRoutes = [
+  {
+    path: 'personnel',
+    component: () => import('@/views/admin/audit/personnel'),
+    name: 'AuditPersonnel',
+    meta: { title: '人员认证', noCache: true }
+  },
+  {
+    path: 'personnel/operate/doctor-list',
+    hidden: true,
+    component: () => import('@/views/admin/audit/personnel/operate'),
+    name: 'AuditOperateDoctorList',
+    meta: { title: '操作医师审核列表', noCache: true }
+  },
+  {
+    path: 'personnel/operate/doctor-detail',
+    hidden: true,
+    component: () => import('@/views/admin/audit/personnel/operate/review'),
+    name: 'AuditOperateDoctorDetail',
+    meta: { title: '操作医师审核详情', noCache: true }
+  },
+  {
+    path: 'personnel/training/doctor-list',
+    hidden: true,
+    component: () => import('@/views/admin/audit/personnel/training'),
+    name: 'AuditTrainingDoctorList',
+    meta: { title: '培训医师审核列表', noCache: true }
+  },
+  {
+    path: 'personnel/training/doctor-detail',
+    hidden: true,
+    component: () => import('@/views/admin/audit/personnel/training/review'),
+    name: 'AuditTrainingDoctorDetail',
+    meta: { title: '培训医师审核详情', noCache: true }
+  }
+]
+
+// 资料库审核
+const materialAuditRoutes = [
+  {
+    path: 'material',
+    component: () => import('@/views/admin/audit/material'),
+    name: 'AuditMaterial',
+    meta: { title: '资料库', noCache: true }
+  },
+  {
+    path: 'material/article-list',
+    component: () => import('@/views/admin/audit/material/article'),
+    name: 'AuditMaterialArticleList',
+    hidden: true,
+    meta: { title: '文章审核列表', noCache: true }
+  },
+  {
+    path: 'material/article-detail',
+    component: () => import('@/views/admin/audit/material/article/review'),
+    name: 'AuditMaterialArticleDetail',
+    hidden: true,
+    meta: { title: '审核文章', noCache: true }
+  },
+  {
+    path: 'material/image-list',
+    component: () => import('@/views/admin/audit/material/image'),
+    name: 'AuditMaterialImageList',
+    hidden: true,
+    meta: { title: '图片审核列表', noCache: true }
+  },
+  {
+    path: 'material/image-detail',
+    component: () => import('@/views/admin/audit/material/image/review'),
+    name: 'AuditMaterialImageDetail',
+    hidden: true,
+    meta: { title: '审核图片', noCache: true }
+  },
+  {
+    path: 'material/video-list',
+    component: () => import('@/views/admin/audit/material/video'),
+    name: 'AuditMaterialVideoList',
+    hidden: true,
+    meta: { title: '视频审核列表', noCache: true }
+  },
+  {
+    path: 'material/file-list',
+    component: () => import('@/views/admin/audit/material/file'),
+    name: 'AuditMaterialFileList',
+    hidden: true,
+    meta: { title: '文件审核列表', noCache: true }
+  },
+  {
+    path: 'material/package-list',
+    component: () => import('@/views/admin/audit/material/package'),
+    name: 'AuditMaterialPackageList',
+    hidden: true,
+    meta: { title: '资料包审核列表', noCache: true }
+  }
+]
+
+// 设备管理审核
+const deviceAuditRoutes = [
+  {
+    path: 'device/club-list',
+    component: () => import('@/views/admin/audit/device'),
+    name: 'AuditDevice',
+    meta: { title: '设备管理', noCache: true }
+  },
+  {
+    path: 'device/device-list',
+    component: () => import('@/views/admin/audit/device/list'),
+    name: 'AuditDeviceCateList',
+    meta: { title: '设备管理审核', noCache: true }
+  }
+]
+
+// 审核页面路由
+const AuditRoutes = [
+  {
+    path: '/audit',
+    component: Layout,
+    alwaysShow: true,
+    name: 'Audit',
+    meta: { title: '审核管理', icon: 'el-icon-s-check', roles: ['admin'], noCache: true },
+    children: [...clubAuditRoutes, ...personnelAuditRoutes, ...materialAuditRoutes, ...deviceAuditRoutes]
+  }
+]
+
+export default AuditRoutes

+ 0 - 0
src/router/module/logistics.js → src/router/module/admin/logistics.js


+ 56 - 56
src/router/module/member.js → src/router/module/admin/member.js

@@ -1,56 +1,56 @@
-/* Layout */
-import Layout from '@/layout'
-
-const memberRoutes = [
-  {
-    path: '/member',
-    component: Layout,
-    alwaysShow: true,
-    redirect: '/member/member-list',
-    name: 'Member',
-    meta: { title: '会员管理', icon: 'el-icon-star-on', roles: ['admin'] },
-    children: [
-      {
-        path: 'member-list',
-        component: () => import('@/views/admin/member'),
-        name: 'MemberList',
-        meta: { title: '会员列表', roles: ['admin'] }
-      },
-      {
-        path: 'handsel',
-        component: () => import('@/views/admin/member/handsel'),
-        name: 'Handsel',
-        meta: { title: '赠送会员', roles: ['admin'] },
-        hidden: true
-      },
-      {
-        path: 'service',
-        component: () => import('@/views/admin/member/service'),
-        name: 'Service',
-        meta: { title: '配置定制化服务', roles: ['admin'] },
-        hidden: true
-      },
-      {
-        path: 'record',
-        component: () => import('@/views/admin/member/record'),
-        name: 'Record',
-        meta: { title: '购买记录', roles: ['admin'] },
-        hidden: true
-      },
-      {
-        path: 'combo-edit',
-        component: () => import('@/views/admin/member/settings/combo-edit'),
-        name: 'ComboEdit',
-        meta: { title: '会员套餐配置', roles: ['admin'] }
-      },
-      {
-        path: 'service-edit',
-        component: () => import('@/views/admin/member/settings/service-edit'),
-        name: 'ServiceEdit',
-        meta: { title: '会员服务配置', roles: ['admin'] }
-      }
-    ]
-  }
-]
-
-export default memberRoutes
+/* Layout */
+import Layout from '@/layout'
+
+const memberRoutes = [
+  {
+    path: '/member',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/member/member-list',
+    name: 'Member',
+    meta: { title: '会员管理', noCache: true },
+    children: [
+      {
+        path: 'member-list',
+        component: () => import('@/views/admin/member'),
+        name: 'MemberList',
+        meta: { title: '会员列表', noCache: true }
+      },
+      {
+        path: 'handsel',
+        component: () => import('@/views/admin/member/handsel'),
+        name: 'Handsel',
+        meta: { title: '赠送会员', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'service',
+        component: () => import('@/views/admin/member/service'),
+        name: 'Service',
+        meta: { title: '配置定制化服务', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'record',
+        component: () => import('@/views/admin/member/record'),
+        name: 'Record',
+        meta: { title: '购买记录', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'combo-edit',
+        component: () => import('@/views/admin/member/settings/combo-edit'),
+        name: 'ComboEdit',
+        meta: { title: '会员套餐配置', noCache: true }
+      },
+      {
+        path: 'service-edit',
+        component: () => import('@/views/admin/member/settings/service-edit'),
+        name: 'ServiceEdit',
+        meta: { title: '会员服务配置', noCache: true }
+      }
+    ]
+  }
+]
+
+export default memberRoutes

+ 97 - 97
src/router/module/settings.js → src/router/module/admin/settings.js

@@ -1,97 +1,97 @@
-/* Layout */
-import Layout from '@/layout'
-
-const settingRoutes = [
-  {
-    path: '/settings',
-    component: Layout,
-    redirect: '/settings/menus',
-    name: 'Settings',
-    meta: { title: '系统设置', icon: 'el-icon-s-tools', roles: ['admin'], noCache: true },
-    children: [
-      {
-        path: 'menus',
-        name: 'SettingsMenus',
-        meta: { title: '菜单管理', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/menus')
-      },
-      {
-        path: 'menus/add',
-        name: 'SettingsMenusAdd',
-        hidden: true,
-        meta: { title: '添加菜单', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/menus/edit')
-      },
-      {
-        path: 'menus/edit',
-        name: 'SettingsMenusEdit',
-        hidden: true,
-        meta: { title: '修改菜单', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/menus/edit')
-      },
-      {
-        path: 'menus/children/:menuType/:id/:title',
-        name: 'SettingsChildrenMenus',
-        hidden: true,
-        meta: { title: '子菜单管理', roles: ['admin'], noCache: false },
-        component: () => import('@/views/admin/settings/menus/children-list')
-      },
-      {
-        path: 'menus/children/add',
-        name: 'SettingsChildrenMenusAdd',
-        hidden: true,
-        meta: { title: '添加子菜单', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/menus/edit')
-      },
-      {
-        path: 'menus/children/edit',
-        name: 'SettingsChildrenMenusEdit',
-        hidden: true,
-        meta: { title: '修改子菜单', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/menus/edit')
-      },
-      {
-        path: 'roles',
-        name: 'SettingsRoles',
-        meta: { title: '角色管理', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/roles')
-      },
-      {
-        path: 'roles/add',
-        name: 'SettingsRolesAdd',
-        hidden: true,
-        meta: { title: '添加角色', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/roles/edit')
-      },
-      {
-        path: 'roles/edit',
-        name: 'SettingsRolesEdit',
-        hidden: true,
-        meta: { title: '修改角色', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/roles/edit')
-      },
-      {
-        path: 'accounts',
-        name: 'SettingsAccounts',
-        meta: { title: '用户管理', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/accounts')
-      },
-      {
-        path: 'accounts/add',
-        name: 'SettingsAccountsAdd',
-        hidden: true,
-        meta: { title: '添加用户', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/accounts/edit')
-      },
-      {
-        path: 'accounts/edit',
-        name: 'SettingsAccountsEdit',
-        hidden: true,
-        meta: { title: '修改用户', roles: ['admin'], noCache: true },
-        component: () => import('@/views/admin/settings/accounts/edit')
-      }
-    ]
-  }
-]
-
-export default settingRoutes
+/* Layout */
+import Layout from '@/layout'
+
+const settingRoutes = [
+  {
+    path: '/settings',
+    component: Layout,
+    redirect: '/settings/menus',
+    name: 'Settings',
+    meta: { title: '系统设置', icon: 'el-icon-s-tools', noCache: true },
+    children: [
+      {
+        path: 'menus',
+        name: 'SettingsMenus',
+        meta: { title: '菜单管理', noCache: true },
+        component: () => import('@/views/admin/settings/menus')
+      },
+      {
+        path: 'menus/add',
+        name: 'SettingsMenusAdd',
+        hidden: true,
+        meta: { title: '添加菜单', noCache: true },
+        component: () => import('@/views/admin/settings/menus/edit')
+      },
+      {
+        path: 'menus/edit',
+        name: 'SettingsMenusEdit',
+        hidden: true,
+        meta: { title: '修改菜单', noCache: true },
+        component: () => import('@/views/admin/settings/menus/edit')
+      },
+      {
+        path: 'menus/children/:menuType/:id/:title',
+        name: 'SettingsChildrenMenus',
+        hidden: true,
+        meta: { title: '子菜单管理', noCache: false },
+        component: () => import('@/views/admin/settings/menus/children-list')
+      },
+      {
+        path: 'menus/children/add',
+        name: 'SettingsChildrenMenusAdd',
+        hidden: true,
+        meta: { title: '添加子菜单', noCache: true },
+        component: () => import('@/views/admin/settings/menus/edit')
+      },
+      {
+        path: 'menus/children/edit',
+        name: 'SettingsChildrenMenusEdit',
+        hidden: true,
+        meta: { title: '修改子菜单', noCache: true },
+        component: () => import('@/views/admin/settings/menus/edit')
+      },
+      {
+        path: 'roles',
+        name: 'SettingsRoles',
+        meta: { title: '角色管理', noCache: true },
+        component: () => import('@/views/admin/settings/roles')
+      },
+      {
+        path: 'roles/add',
+        name: 'SettingsRolesAdd',
+        hidden: true,
+        meta: { title: '添加角色', noCache: true },
+        component: () => import('@/views/admin/settings/roles/edit')
+      },
+      {
+        path: 'roles/edit',
+        name: 'SettingsRolesEdit',
+        hidden: true,
+        meta: { title: '修改角色', noCache: true },
+        component: () => import('@/views/admin/settings/roles/edit')
+      },
+      {
+        path: 'accounts',
+        name: 'SettingsAccounts',
+        meta: { title: '用户管理', noCache: true },
+        component: () => import('@/views/admin/settings/accounts')
+      },
+      {
+        path: 'accounts/add',
+        name: 'SettingsAccountsAdd',
+        hidden: true,
+        meta: { title: '添加用户', noCache: true },
+        component: () => import('@/views/admin/settings/accounts/edit')
+      },
+      {
+        path: 'accounts/edit',
+        name: 'SettingsAccountsEdit',
+        hidden: true,
+        meta: { title: '修改用户', noCache: true },
+        component: () => import('@/views/admin/settings/accounts/edit')
+      }
+    ]
+  }
+]
+
+export default settingRoutes

+ 66 - 66
src/router/module/supplier.js → src/router/module/admin/supplier.js

@@ -1,66 +1,66 @@
-/* Layout */
-import Layout from '@/layout'
-
-// 供应商管理页面
-const supplierRoutes = [
-  {
-    path: '/supplier',
-    component: Layout,
-    alwaysShow: true,
-    name: 'Supplier',
-    redirect: '/supplier/list',
-    meta: { title: '账号管理', icon: 'el-icon-s-custom', roles: ['admin'], noCache: true },
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/admin/supplier'),
-        name: 'SupplierList',
-        meta: { title: '供应商账号', affix: true, roles: ['admin'], noCache: true }
-      },
-      {
-        hidden: true,
-        path: 'supplier-add',
-        component: () => import('@/views/admin/supplier/edit'),
-        name: 'SupplierAdd',
-        meta: { title: '添加供应商', roles: ['admin'], noCache: true }
-      },
-      {
-        hidden: true,
-        path: 'supplier-edit',
-        component: () => import('@/views/admin/supplier/edit'),
-        name: 'SupplierEdit',
-        meta: { title: '修改供应商', roles: ['admin'], noCache: true }
-      },
-      {
-        hidden: true,
-        path: 'club-list',
-        component: () => import('@/views/admin/supplier/club'),
-        name: 'SupplierClubList',
-        meta: { title: '查看认证机构', roles: ['admin'], noCache: true }
-      },
-      {
-        hidden: true,
-        path: 'club-detail',
-        component: () => import('@/views/admin/supplier/club/detail'),
-        name: 'SupplierClubDetail',
-        meta: { title: '认证机构详情', roles: ['admin'], noCache: true }
-      },
-      {
-        hidden: true,
-        path: 'club-device-list',
-        component: () => import('@/views/admin/supplier/club/device'),
-        name: 'SupplierClubDeviceList',
-        meta: { title: '查看设备认证', roles: ['admin'], noCache: true }
-      },
-      {
-        hidden: true,
-        path: 'club-device-detail',
-        component: () => import('@/views/admin/supplier/club/device/detail'),
-        name: 'SupplierClubDeviceDetail',
-        meta: { title: '设备认证详情', roles: ['admin'], noCache: true }
-      }
-    ]
-  }
-]
-
-export default supplierRoutes
+/* Layout */
+import Layout from '@/layout'
+
+// 供应商管理页面
+const supplierRoutes = [
+  {
+    path: '/supplier',
+    component: Layout,
+    alwaysShow: true,
+    name: 'Supplier',
+    redirect: '/supplier/list',
+    meta: { title: '账号管理', icon: 'el-icon-s-custom', noCache: true },
+    children: [
+      {
+        path: 'list',
+        component: () => import('@/views/admin/supplier'),
+        name: 'SupplierList',
+        meta: { title: '供应商账号', affix: true, noCache: true }
+      },
+      {
+        hidden: true,
+        path: 'supplier-add',
+        component: () => import('@/views/admin/supplier/edit'),
+        name: 'SupplierAdd',
+        meta: { title: '添加供应商', noCache: true }
+      },
+      {
+        hidden: true,
+        path: 'supplier-edit',
+        component: () => import('@/views/admin/supplier/edit'),
+        name: 'SupplierEdit',
+        meta: { title: '修改供应商', noCache: true }
+      },
+      {
+        hidden: true,
+        path: 'club-list',
+        component: () => import('@/views/admin/supplier/club'),
+        name: 'SupplierClubList',
+        meta: { title: '查看认证机构', noCache: true }
+      },
+      {
+        hidden: true,
+        path: 'club-detail',
+        component: () => import('@/views/admin/supplier/club/detail'),
+        name: 'SupplierClubDetail',
+        meta: { title: '认证机构详情', noCache: true }
+      },
+      {
+        hidden: true,
+        path: 'club-device-list',
+        component: () => import('@/views/admin/supplier/club/device'),
+        name: 'SupplierClubDeviceList',
+        meta: { title: '查看设备认证', noCache: true }
+      },
+      {
+        hidden: true,
+        path: 'club-device-detail',
+        component: () => import('@/views/admin/supplier/club/device/detail'),
+        name: 'SupplierClubDeviceDetail',
+        meta: { title: '设备认证详情', noCache: true }
+      }
+    ]
+  }
+]
+
+export default supplierRoutes

+ 83 - 0
src/router/module/base.js

@@ -0,0 +1,83 @@
+/* Layout */
+import Layout from '@/layout'
+
+export default [
+  {
+    path: '/',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/index'),
+    hidden: true
+  },
+  {
+    path: '/login',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/login'),
+    hidden: true
+  },
+  {
+    path: '/proxy',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/proxy'),
+    hidden: true
+  },
+  {
+    path: '/login/redirect',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/login/redirect'),
+    hidden: true
+  },
+  {
+    path: '/redirect',
+    component: Layout,
+    hidden: true,
+    children: [
+      {
+        path: '/redirect/:path(.*)',
+        component: () => import('@/views/common/redirect/index')
+      }
+    ]
+  },
+  {
+    path: '/pay',
+    component: Layout,
+    name: 'PayStatus',
+    meta: { title: '支付状态' },
+    hidden: true,
+    redirect: '/pay/success',
+    children: [
+      {
+        path: 'success',
+        component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/payment/success'),
+        hidden: true
+      },
+      {
+        path: 'faild',
+        component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/payment/faild'),
+        hidden: true
+      }
+    ]
+  },
+  {
+    path: '/password',
+    component: Layout,
+    name: 'Password',
+    meta: { title: '密码管理' },
+    hidden: true,
+    children: [
+      {
+        path: 'edit',
+        meta: { title: '修改密码' },
+        component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/password'),
+        hidden: true
+      }
+    ]
+  },
+  {
+    path: '/404',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/error-page/404'),
+    hidden: true
+  },
+  {
+    path: '/401',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/error-page/401'),
+    hidden: true
+  },
+  // 404页面 放在最后面
+  { path: '*', redirect: '/404', hidden: true }
+]

+ 30 - 0
src/router/module/common/helper.js

@@ -0,0 +1,30 @@
+/* Layout */
+import Layout from '@/layout'
+
+// 授权管理页面
+const helperRoutes = [
+  {
+    path: '/helper',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/helper/video',
+    name: 'Helper',
+    meta: { title: '新手帮助', noCache: true },
+    children: [
+      {
+        path: 'video',
+        component: () => import('@/views/common/helper/video'),
+        name: 'HelperVideo',
+        meta: { title: '视频教程', noCache: true }
+      },
+      {
+        path: 'document',
+        component: () => import('@/views/common/helper/document'),
+        name: 'HelperDocument',
+        meta: { title: '文档教程', noCache: true }
+      }
+    ]
+  }
+]
+
+export default helperRoutes

+ 36 - 39
src/router/module/share.js → src/router/module/common/share.js

@@ -1,39 +1,36 @@
-/* Layout */
-import Layout from '@/views/common/share/pay'
-
-const vipRoutes = [
-  {
-    path: '/share',
-    component: Layout,
-    redirect: '/share/pay',
-    name: 'Share',
-    meta: { title: '分享' },
-    alwaysShow: false,
-    hidden: true,
-    children: [
-      {
-        path: 'pay/:linkLogo',
-        component: () => import('@/views/common/share/pay/pay'),
-        name: 'SharePayVip',
-        meta: { title: '支付会员' },
-        hidden: true
-      },
-      {
-        path: 'pay-success',
-        component: () => import('@/views/common/share/pay/success'),
-        name: 'SharePaySuccess',
-        meta: { title: '支付成功' },
-        hidden: true
-      },
-      {
-        path: 'pay-faild',
-        component: () => import('@/views/common/share/pay/faild'),
-        name: 'SharePayFaild',
-        meta: { title: '支付失败' },
-        hidden: true
-      }
-    ]
-  }
-]
-
-export default vipRoutes
+/* Layout */
+import Layout from '@/views/common/share/pay'
+
+const vipRoutes = [
+  {
+    path: '/share',
+    component: Layout,
+    redirect: '/share/pay',
+    name: 'Share',
+    meta: { title: '分享' },
+    alwaysShow: false,
+    hidden: true,
+    children: [
+      {
+        path: 'pay/:linkLogo',
+        component: () => import('@/views/common/share/pay/pay'),
+        name: 'SharePayVip',
+        meta: { title: '支付会员', noCache: true }
+      },
+      {
+        path: 'pay-success',
+        component: () => import('@/views/common/share/pay/success'),
+        name: 'SharePaySuccess',
+        meta: { title: '支付成功', noCache: true }
+      },
+      {
+        path: 'pay-faild',
+        component: () => import('@/views/common/share/pay/faild'),
+        name: 'SharePayFaild',
+        meta: { title: '支付失败', noCache: true }
+      }
+    ]
+  }
+]
+
+export default vipRoutes

+ 0 - 44
src/router/module/helper.js

@@ -1,44 +0,0 @@
-/* Layout */
-import Layout from '@/layout'
-
-// 授权管理页面
-const helperRoutes = [
-  {
-    path: '/helper',
-    component: Layout,
-    alwaysShow: true,
-    redirect: '/helper/video',
-    name: 'Helper',
-    meta: { title: '新手帮助', icon: 'el-icon-s-promotion', roles: ['admin', 'normal'], noCache: true, proxy: true },
-    children: [
-      {
-        path: 'video',
-        component: () => import('@/views/common/helper/video'),
-        name: 'HelperVideo',
-        meta: {
-          title: '视频教程',
-          icon: 'iconfont icon-shipinjiaocheng',
-          roles: ['admin', 'normal'],
-          affix: false,
-          noCache: true,
-          proxy: false
-        }
-      },
-      {
-        path: 'document',
-        component: () => import('@/views/common/helper/document'),
-        name: 'HelperDocument',
-        meta: {
-          title: '文档教程',
-          icon: 'iconfont icon-wendangjiaocheng',
-          roles: ['admin', 'normal'],
-          affix: false,
-          noCache: true,
-          proxy: false
-        }
-      }
-    ]
-  }
-]
-
-export default helperRoutes

+ 42 - 0
src/router/module/normal/audit.js

@@ -0,0 +1,42 @@
+/* Layout */
+import Layout from '@/layout'
+
+// 审核页面路由
+const SupplierAuditRoutes = [
+  {
+    path: '/supplier-audit',
+    alwaysShow: true,
+    component: Layout,
+    name: 'SupplierAudit',
+    redirect: '/supplier-audit/club',
+    meta: { title: '审核管理', noCache: true },
+    children: [
+      {
+        path: 'club',
+        component: () => import('@/views/normal/audit/club'),
+        name: 'SupplierAuditClub',
+        meta: { title: '机构认证', noCache: true }
+      },
+      {
+        path: 'club/club-detail',
+        component: () => import('@/views/normal/audit/club/review'),
+        name: 'SupplierAuditClubDetail',
+        meta: { title: '机构认证审核详情', noCache: true }
+      },
+      {
+        path: 'club/device/list',
+        component: () => import('@/views/normal/audit/club/device'),
+        name: 'SupplierAuditClubDeviceList',
+        meta: { title: '设备审核列表', noCache: true }
+      },
+      {
+        path: 'club/device-detail',
+        component: () => import('@/views/normal/audit/club/device/review'),
+        name: 'SupplierAuditClubDeviceDetail',
+        meta: { title: '设备审核详情', noCache: true }
+      }
+    ]
+  }
+]
+
+export default SupplierAuditRoutes

+ 75 - 75
src/router/module/club.js → src/router/module/normal/club.js

@@ -1,75 +1,75 @@
-/* Layout */
-import Layout from '@/layout'
-// 认证机构路由
-const clubRoutes = [
-  {
-    path: '/club',
-    component: Layout,
-    alwaysShow: true,
-    redirect: '/club/list',
-    name: 'Club',
-    meta: { title: '机构认证', icon: 'icon-jigourenzheng iconfont', noCache: true },
-    children: [
-      // 机构
-      {
-        path: 'list',
-        component: () => import('@/views/normal/club'),
-        name: 'ClubList',
-        meta: { title: '机构列表', icon: 'icon-jigouliebiao iconfont', affix: true, noCache: true }
-      },
-      {
-        path: 'club-add',
-        component: () => import('@/views/normal/club/edit'),
-        name: 'ClubAdd',
-        hidden: true,
-        meta: { title: '添加机构', noCache: true }
-      },
-      {
-        path: 'club-edit',
-        component: () => import('@/views/normal/club/edit'),
-        name: 'ClubEdit',
-        hidden: true,
-        meta: { title: '修改机构', noCache: true }
-      },
-      // 用户
-      {
-        path: 'user-list',
-        component: () => import('@/views/normal/club/user'),
-        name: 'ClubUserList',
-        hidden: true,
-        meta: { title: '登录用户', noCache: true }
-      },
-      // 设备
-      {
-        hidden: true,
-        path: 'device-list',
-        component: () => import('@/views/normal/club/device'),
-        name: 'ClubDeviceList',
-        meta: { title: '设备列表', noCache: true, id: 24 }
-      },
-      {
-        hidden: true,
-        path: 'device-add',
-        component: () => import('@/views/normal/club/device/edit'),
-        name: 'ClubDeviceAdd',
-        meta: { title: '添加设备', noCache: true, id: 25 }
-      },
-      {
-        hidden: true,
-        path: 'device-edit',
-        component: () => import('@/views/normal/club/device/edit'),
-        name: 'ClubDeviceEdit',
-        meta: { title: '修改设备', noCache: true, id: 26 }
-      },
-      {
-        hidden: true,
-        path: 'device-cate',
-        component: () => import('@/views/normal/club/device-cate'),
-        name: 'ClubDeviceCate',
-        meta: { title: '设备管理', noCache: true, id: 26 }
-      }
-    ]
-  }
-]
-
-export default clubRoutes
+/* Layout */
+import Layout from '@/layout'
+// 认证机构路由
+const clubRoutes = [
+  {
+    path: '/club',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/club/list',
+    name: 'Club',
+    meta: { title: '机构认证', noCache: true },
+    children: [
+      // 机构
+      {
+        path: 'list',
+        component: () => import('@/views/normal/club'),
+        name: 'ClubList',
+        meta: { title: '机构列表', affix: true, noCache: true }
+      },
+      {
+        path: 'club-add',
+        component: () => import('@/views/normal/club/edit'),
+        name: 'ClubAdd',
+        meta: { title: '添加机构', noCache: true }
+      },
+      {
+        path: 'logistics-licensed',
+        component: () => import('@/views/normal/club/logistics-licensed'),
+        name: 'ClubLogisticsLicensed',
+        meta: { title: '授权牌物流', noCache: true }
+      },
+      {
+        path: 'club-edit',
+        component: () => import('@/views/normal/club/edit'),
+        name: 'ClubEdit',
+        meta: { title: '修改机构', noCache: true }
+      },
+      // 用户
+      // {
+      //   path: 'user-list',
+      //   component: () => import('@/views/normal/club/user'),
+      //   name: 'ClubUserList',
+      //   hidden: true,
+      //   meta: { title: '登录用户', noCache: true }
+      // },
+      // 设备
+      {
+        path: 'device-list',
+        component: () => import('@/views/normal/club/device'),
+        name: 'ClubDeviceList',
+        meta: { title: '设备列表', noCache: true }
+      },
+      {
+        path: 'device-add',
+        component: () => import('@/views/normal/club/device/edit'),
+        name: 'ClubDeviceAdd',
+        meta: { title: '添加设备', noCache: true }
+      },
+      {
+        path: 'device-edit',
+        component: () => import('@/views/normal/club/device/edit'),
+        name: 'ClubDeviceEdit',
+        meta: { title: '修改设备', noCache: true }
+      },
+      {
+        path: 'device-cate',
+        component: () => import('@/views/normal/club/device-cate'),
+        name: 'ClubDeviceCate',
+        meta: { title: '设备管理', noCache: true }
+      }
+    ]
+  }
+]
+
+export default clubRoutes

+ 31 - 31
src/router/module/feedback.js → src/router/module/normal/feedback.js

@@ -1,31 +1,31 @@
-/* Layout */
-import Layout from '@/layout'
-
-// 授权管理页面
-const feedbackRoutes = [
-  {
-    path: '/feedback',
-    component: Layout,
-    alwaysShow: true,
-    redirect: '/feedback/list',
-    name: 'Feedback',
-    meta: { title: '用户反馈', icon: 'el-icon-s-comment', roles: ['normal'], noCache: true },
-    children: [
-      {
-        path: 'list',
-        component: () => import('@/views/normal/feedback'),
-        name: 'FeedbackList',
-        meta: { title: '反馈列表', icon: 'iconfont icon-fankuiliebiao', roles: ['normal'], noCache: true }
-      },
-      {
-        path: 'detail',
-        component: () => import('@/views/normal/feedback/detail'),
-        name: 'FeedbackDetail',
-        hidden: true,
-        meta: { title: '反馈处理', roles: ['normal'], noCache: true }
-      }
-    ]
-  }
-]
-
-export default feedbackRoutes
+/* Layout */
+import Layout from '@/layout'
+
+// 授权管理页面
+const feedbackRoutes = [
+  {
+    path: '/feedback',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/feedback/list',
+    name: 'Feedback',
+    meta: { title: '用户反馈', noCache: true },
+    children: [
+      {
+        path: 'list',
+        component: () => import('@/views/normal/feedback'),
+        name: 'FeedbackList',
+        meta: { title: '反馈列表', noCache: true }
+      },
+      {
+        path: 'detail',
+        component: () => import('@/views/normal/feedback/detail'),
+        name: 'FeedbackDetail',
+        hidden: true,
+        meta: { title: '反馈处理', noCache: true }
+      }
+    ]
+  }
+]
+
+export default feedbackRoutes

+ 62 - 62
src/router/module/material.js → src/router/module/normal/material.js

@@ -1,62 +1,62 @@
-/* Layout */
-import Layout from '@/layout'
-
-// 资料管理页面路由
-const materialRoutes = [
-  {
-    path: '/material',
-    component: Layout,
-    alwaysShow: true,
-    redirect: '/material/article-list',
-    name: 'Material',
-    meta: { title: '资料库', icon: 'icon-ziliaoku iconfont', noCache: true },
-    children: [
-      {
-        path: 'article-list',
-        component: () => import('@/views/normal/material/article'),
-        name: 'MaterialArticleList',
-        meta: { title: '文章列表', icon: 'icon-wenjianliebiao iconfont', noCache: true }
-      },
-      {
-        path: 'article-edit',
-        component: () => import('@/views/normal/material/article/edit'),
-        hidden: true,
-        name: 'MaterialArticleEdit',
-        meta: { title: '编辑文章', icon: 'el-icon-menu', noCache: true }
-      },
-      {
-        path: 'image-list',
-        component: () => import('@/views/normal/material/image'),
-        name: 'MaterialImageList',
-        meta: { title: '图片列表', icon: 'el-icon-picture-outline', noCache: true }
-      },
-      {
-        path: 'image-edit',
-        component: () => import('@/views/normal/material/image/edit'),
-        hidden: true,
-        name: 'MaterialImageEdit',
-        meta: { title: '编辑图片', icon: 'el-icon-menu', noCache: true }
-      },
-      {
-        path: 'video-list',
-        component: () => import('@/views/normal/material/video'),
-        name: 'MaterialVideoList',
-        meta: { title: '视频列表', icon: 'el-icon-video-camera', noCache: true }
-      },
-      {
-        path: 'file-list',
-        component: () => import('@/views/normal/material/file'),
-        name: 'MaterialFileList',
-        meta: { title: '文件列表', icon: 'el-icon-receiving', noCache: true }
-      },
-      {
-        path: 'package-list',
-        component: () => import('@/views/normal/material/package'),
-        name: 'MaterialPackageList',
-        meta: { title: '资料包列表', icon: 'el-icon-receiving', noCache: true }
-      }
-    ]
-  }
-]
-
-export default materialRoutes
+/* Layout */
+import Layout from '@/layout'
+
+// 资料管理页面路由
+const materialRoutes = [
+  {
+    path: '/material',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/material/article-list',
+    name: 'Material',
+    meta: { title: '资料库', noCache: true },
+    children: [
+      {
+        path: 'article-list',
+        component: () => import('@/views/normal/material/article'),
+        name: 'MaterialArticleList',
+        meta: { title: '文章列表', noCache: true }
+      },
+      {
+        path: 'article-edit',
+        component: () => import('@/views/normal/material/article/edit'),
+        hidden: true,
+        name: 'MaterialArticleEdit',
+        meta: { title: '编辑文章', noCache: true }
+      },
+      {
+        path: 'image-list',
+        component: () => import('@/views/normal/material/image'),
+        name: 'MaterialImageList',
+        meta: { title: '图片列表', noCache: true }
+      },
+      {
+        path: 'image-edit',
+        component: () => import('@/views/normal/material/image/edit'),
+        hidden: true,
+        name: 'MaterialImageEdit',
+        meta: { title: '编辑图片', noCache: true }
+      },
+      {
+        path: 'video-list',
+        component: () => import('@/views/normal/material/video'),
+        name: 'MaterialVideoList',
+        meta: { title: '视频列表', noCache: true }
+      },
+      {
+        path: 'file-list',
+        component: () => import('@/views/normal/material/file'),
+        name: 'MaterialFileList',
+        meta: { title: '文件列表', noCache: true }
+      },
+      {
+        path: 'package-list',
+        component: () => import('@/views/normal/material/package'),
+        name: 'MaterialPackageList',
+        meta: { title: '资料包列表', noCache: true }
+      }
+    ]
+  }
+]
+
+export default materialRoutes

+ 44 - 44
src/router/module/personal.js → src/router/module/normal/personal.js

@@ -1,44 +1,44 @@
-/* Layout */
-import Layout from '@/layout'
-
-const personalRoutes = [
-  {
-    path: '/personal',
-    component: Layout,
-    redirect: '/personal/info',
-    name: 'Personal',
-    meta: { title: '个人资料', roles: ['normal'] },
-    children: [
-      {
-        path: 'info',
-        component: () => import('@/views/normal/personal'),
-        name: 'PersonalInfo',
-        meta: { title: '个人资料', roles: ['normal'] }
-        // hidden: true
-      },
-      {
-        path: 'mobile',
-        component: () => import('@/views/normal/personal/set-mobile'),
-        name: 'PersonalMobile',
-        meta: { title: '修改手机号', roles: ['normal'] }
-        // hidden: true
-      },
-      {
-        path: 'account',
-        component: () => import('@/views/normal/personal/set-account'),
-        name: 'PersonalAccount',
-        meta: { title: '绑定登录账号', roles: ['normal'] }
-        // hidden: true
-      },
-      {
-        path: 'vip-record',
-        component: () => import('@/views/normal/personal/vip-record'),
-        name: 'PersonalVipRecord',
-        meta: { title: '会员购买记录', roles: ['normal'] }
-        // hidden: true
-      }
-    ]
-  }
-]
-
-export default personalRoutes
+/* Layout */
+import Layout from '@/layout'
+
+const personalRoutes = [
+  {
+    path: '/personal',
+    component: Layout,
+    redirect: '/personal/info',
+    name: 'Personal',
+    meta: { title: '个人资料', noCache: true },
+    children: [
+      {
+        path: 'info',
+        component: () => import('@/views/normal/personal'),
+        name: 'PersonalInfo',
+        meta: { title: '个人资料', noCache: true }
+        // hidden: true
+      },
+      {
+        path: 'mobile',
+        component: () => import('@/views/normal/personal/set-mobile'),
+        name: 'PersonalMobile',
+        meta: { title: '修改手机号', noCache: true }
+        // hidden: true
+      },
+      {
+        path: 'account',
+        component: () => import('@/views/normal/personal/set-account'),
+        name: 'PersonalAccount',
+        meta: { title: '绑定登录账号', noCache: true }
+        // hidden: true
+      },
+      {
+        path: 'vip-record',
+        component: () => import('@/views/normal/personal/vip-record'),
+        name: 'PersonalVipRecord',
+        meta: { title: '会员购买记录', noCache: true }
+        // hidden: true
+      }
+    ]
+  }
+]
+
+export default personalRoutes

+ 64 - 64
src/router/module/personnel.js → src/router/module/normal/personnel.js

@@ -1,64 +1,64 @@
-// 医师认证路由
-
-import Layout from '@/layout'
-
-// 操作医师
-const operate = [
-  {
-    path: 'operate/list',
-    component: () => import('@/views/normal/personnel/operate'),
-    name: 'OperateDoctorList',
-    meta: { title: '操作医师', noCache: true }
-  },
-  {
-    hidden: true,
-    path: 'operate/add',
-    component: () => import('@/views/normal/personnel/operate/edit'),
-    name: 'OperateDoctorAdd',
-    meta: { title: '添加操作医师', noCache: true }
-  },
-  {
-    hidden: true,
-    path: 'operate/edit',
-    component: () => import('@/views/normal/personnel/operate/edit'),
-    name: 'OperateDoctorEdit',
-    meta: { title: '修改操作医师资料', noCache: true }
-  }
-]
-
-// 培训医师
-const training = [
-  {
-    path: 'training/list',
-    component: () => import('@/views/normal/personnel/training'),
-    name: 'TrainingDoctorList',
-    meta: { title: '培训医师', noCache: true }
-  },
-  {
-    hidden: true,
-    path: 'training/add',
-    component: () => import('@/views/normal/personnel/training/edit'),
-    name: 'TrainingDoctorAdd',
-    meta: { title: '添加培训医师', noCache: true }
-  },
-  {
-    hidden: true,
-    path: 'training/edit',
-    component: () => import('@/views/normal/personnel/training/edit'),
-    name: 'TrainingDoctorEdit',
-    meta: { title: '修改培训医师资料', noCache: true }
-  }
-]
-
-const personnelRoutes = [
-  {
-    path: '/personnel',
-    component: Layout,
-    alwaysShow: true,
-    name: 'Personnel',
-    meta: { title: '人员认证', icon: 'el-icon-s-check', noCache: true },
-    children: [...operate, ...training]
-  }
-]
-
-export default personnelRoutes
+// 医师认证路由
+
+import Layout from '@/layout'
+
+// 操作医师
+const operate = [
+  {
+    path: 'operate/list',
+    component: () => import('@/views/normal/personnel/operate'),
+    name: 'OperateDoctorList',
+    meta: { title: '操作医师', noCache: true }
+  },
+  {
+    hidden: true,
+    path: 'operate/add',
+    component: () => import('@/views/normal/personnel/operate/edit'),
+    name: 'OperateDoctorAdd',
+    meta: { title: '添加操作医师', noCache: true }
+  },
+  {
+    hidden: true,
+    path: 'operate/edit',
+    component: () => import('@/views/normal/personnel/operate/edit'),
+    name: 'OperateDoctorEdit',
+    meta: { title: '修改操作医师资料', noCache: true }
+  }
+]
+
+// 培训医师
+const training = [
+  {
+    path: 'training/list',
+    component: () => import('@/views/normal/personnel/training'),
+    name: 'TrainingDoctorList',
+    meta: { title: '培训医师', noCache: true }
+  },
+  {
+    hidden: true,
+    path: 'training/add',
+    component: () => import('@/views/normal/personnel/training/edit'),
+    name: 'TrainingDoctorAdd',
+    meta: { title: '添加培训医师', noCache: true }
+  },
+  {
+    hidden: true,
+    path: 'training/edit',
+    component: () => import('@/views/normal/personnel/training/edit'),
+    name: 'TrainingDoctorEdit',
+    meta: { title: '修改培训医师资料', noCache: true }
+  }
+]
+
+const personnelRoutes = [
+  {
+    path: '/personnel',
+    component: Layout,
+    alwaysShow: true,
+    name: 'Personnel',
+    meta: { title: '人员认证', noCache: true },
+    children: [...operate, ...training]
+  }
+]
+
+export default personnelRoutes

+ 20 - 0
src/router/module/normal/user.js

@@ -0,0 +1,20 @@
+import Layout from '@/layout'
+
+export default [
+  {
+    path: '/supplier-user',
+    component: Layout,
+    redirect: '/supplier-user/list',
+    name: 'SupplierUser',
+    meta: { title: '账号管理', noCache: true },
+    alwaysShow: true,
+    children: [
+      {
+        path: 'list',
+        component: () => import('@/views/normal/user'),
+        name: 'SupplierUserList',
+        meta: { title: '账号列表', noCache: true }
+      }
+    ]
+  }
+]

+ 39 - 39
src/router/module/vip.js → src/router/module/normal/vip.js

@@ -1,39 +1,39 @@
-/* Layout */
-import Layout from '@/layout'
-
-const vipRoutes = [
-  {
-    path: '/vip',
-    component: Layout,
-    redirect: '/vip/vip-open',
-    name: 'Member',
-    meta: { title: '权益与支付', roles: ['normal'] },
-    alwaysShow: false,
-    hidden: true,
-    children: [
-      {
-        path: 'vip-open',
-        component: () => import('@/views/normal/vip'),
-        name: 'VipOpen',
-        meta: { title: '开通会员', roles: ['normal'] },
-        hidden: true
-      },
-      {
-        path: 'vip-renewal',
-        component: () => import('@/views/normal/vip'),
-        name: 'VipRenewal',
-        meta: { title: '续费会员', roles: ['normal'] },
-        hidden: true
-      },
-      {
-        path: 'vip-pay',
-        component: () => import('@/views/normal/vip/buy'),
-        name: 'VipPay',
-        meta: { title: '购买会员', roles: ['normal'] },
-        hidden: true
-      }
-    ]
-  }
-]
-
-export default vipRoutes
+/* Layout */
+import Layout from '@/layout'
+
+const vipRoutes = [
+  {
+    path: '/vip',
+    component: Layout,
+    redirect: '/vip/vip-open',
+    name: 'Member',
+    meta: { title: '权益与支付', noCache: true },
+    alwaysShow: false,
+    hidden: true,
+    children: [
+      {
+        path: 'vip-open',
+        component: () => import('@/views/normal/vip'),
+        name: 'VipOpen',
+        meta: { title: '开通会员', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'vip-renewal',
+        component: () => import('@/views/normal/vip'),
+        name: 'VipRenewal',
+        meta: { title: '续费会员', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'vip-pay',
+        component: () => import('@/views/normal/vip/buy'),
+        name: 'VipPay',
+        meta: { title: '购买会员', noCache: true },
+        hidden: true
+      }
+    ]
+  }
+]
+
+export default vipRoutes

+ 247 - 0
src/views/normal/audit/club/components/club-list.vue

@@ -0,0 +1,247 @@
+<template>
+  <div>
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>机构名称:</span>
+        <el-input v-model="listQuery.shopName" placeholder="机构名称" @keyup.enter.native="handleFilter" />
+      </div>
+      <div class="filter-control">
+        <span>手机号:</span>
+        <el-input
+          v-model="listQuery.mobile"
+          placeholder="手机号"
+          style="width: 200px"
+          class="filter-item"
+          @keyup.enter.native="handleFilter"
+        />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList(listQuery)">查询</el-button>
+      </div>
+    </div>
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      header-row-class-name="tableHeader"
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" :index="indexMethod" type="index" width="80" align="center" />
+      <el-table-column prop="authParty" label="机构名称" align="center" />
+      <el-table-column label="手机号" width="120px" align="center" prop="mobile" />
+      <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="审核人" align="center" width="200px">
+        <template slot-scope="{ row }">
+          <span v-if="row.auditStatus !== 2">{{ row.auditBy }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="250px" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.auditStatus !== 2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="注册时间" width="250px" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.auditStatus !== 2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" width="240px" align="center">
+        <template slot-scope="{ row }">
+          <!-- v-if="row.auditStatus !== 1" -->
+          <el-button
+            type="warning"
+            size="mini"
+            style="margin-right:5px"
+            @click="$_navigationTo(`/supplier-audit/club/club-detail?authId=${row.authId}`)"
+          >审核</el-button>
+          <el-badge :hidden="row.lowerAuditStatus === 1" :value="row.waitAuditNum" :max="99">
+            <el-button
+              type="primary"
+              size="mini"
+              @click="$_navigationTo(`/supplier-audit/club/device/list?authId=${row.authId}`)"
+            >设备认证</el-button>
+          </el-badge>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <!-- 页码 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList"
+    />
+    <!-- 审核弹窗 -->
+    <el-dialog title="授权机构审核" :visible.sync="dialogVisible" width="450px" @close="dialogClosed">
+      <div class="auth-info">
+        <div class="auth-name">
+          <i>授权机构:</i>
+          <b>{{ dialogData.authParty }}</b>
+        </div>
+        <el-form ref="formRef" :model="dialogData" label-width="85px" :rules="dialogFormRules">
+          <el-form-item label="审核状态:">
+            <el-radio-group v-model="dialogData.auditStatus">
+              <el-radio :label="1">通过</el-radio>
+              <el-radio :label="0">不通过</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item v-if="dialogData.auditStatus === 0" label="原因:" prop="invalidReason">
+            <el-input v-model="dialogData.invalidReason" type="textarea" placeholder="请说明原因" />
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="auditStatusHandle">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Pagination from '@/components/Pagination'
+import { fecthAuthList, auditAuth } from '@/api/auth'
+import { formatDate } from '@/utils'
+import { mapGetters, mapMutations } from 'vuex'
+export default {
+  components: { Pagination },
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      // 是否显示dialog
+      dialogVisible: false,
+      listLoading: false,
+      // 查询参数
+      listQuery: {
+        listType: 2,
+        authParty: '', // 授权机构
+        authUserId: '', // 供应商用户id
+        pageNum: 1, // 页码
+        pageSize: 10, // 分页
+        auditStatus: '', // 审核状态
+        lowerAuditStatus: '' // 下属内容审核状态
+      },
+      total: 0,
+      dialogData: {
+        auditBy: '', // 审核人
+        authId: '', // 授权机构id
+        authParty: '', // 授权机构名称
+        auditStatus: 1, // 审核状态
+        invalidReason: '' // 审核信息
+      },
+      dialogFormRules: {
+        invalidReason: {
+          required: true,
+          message: '不通过原因不能为空',
+          tigger: 'blur'
+        }
+      },
+      // 机构信息审核列表
+      list: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId'])
+  },
+  created() {
+    this.listQuery.authUserId = this.authUserId
+    this.getList()
+  },
+  methods: {
+    ...mapMutations({ setMessageState: 'webSocket/SET_MESSAGE_STATE' }),
+    // 获取授权列表
+    getList() {
+      this.listLoading = true
+      fecthAuthList(this.listQuery)
+        .then(response => {
+          if (response.code !== 0) return
+          const { list, total } = response.data
+          this.list = list
+          this.total = total
+        })
+        .finally(() => {
+          this.listLoading = false
+        })
+    },
+    // 审核
+    auditStatusHandle() {
+      this.$refs.formRef.validate(valid => {
+        if (valid) {
+          // 指定审核人
+          this.dialogData.auditBy = this.authUserId
+          // 提交审核信息
+          auditAuth(this.dialogData)
+            .then(res => {
+              if (res.code !== 0) return
+              this.$message.success(res.data)
+              this.setMessageState({ id: this.dialogData.authId, type: 1 })
+            })
+            .finally(() => {
+              this.dialogVisible = false
+              this.getList()
+            })
+        }
+      })
+    },
+    // 审核对话框
+    handleShowDialog(item) {
+      console.log(item)
+      this.dialogData.authParty = item.authParty
+      this.dialogData.authId = item.authId
+      this.dialogVisible = true
+    },
+    // 审核对话框关闭
+    dialogClosed() {
+      this.dialogData.authParty = ''
+      this.dialogData.reviewStatus = 1
+    },
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.auth-info {
+  .auth-name {
+    font-size: 16px;
+    padding-bottom: 25px;
+    border-bottom: 1px solid #ddd;
+    margin-bottom: 25px;
+  }
+}
+</style>

+ 154 - 0
src/views/normal/audit/club/components/device-list.vue

@@ -0,0 +1,154 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>设备名称:</span>
+        <el-input v-model="listQuery.productName" placeholder="请输入设备名称" @keyup.enter.native="getList" />
+      </div>
+      <div class="filter-control">
+        <span>设备SN码:</span>
+        <el-input v-model="listQuery.snCode" placeholder="请输入设备SN码" @keyup.enter.native="getList" />
+      </div>
+      <div class="filter-control">
+        <el-button type="primary" @click="getList">查询</el-button>
+      </div>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      header-row-class-name="tableHeader"
+      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 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="审核人" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.auditStatus !== 2">{{ row.auditBy }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="250px" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.auditStatus !== 2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="注册时间" width="250px" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.auditStatus !== 2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="240px" align="center">
+        <template slot-scope="{ row }">
+          <el-button
+            v-if="row.auditStatus !== 1"
+            type="primary"
+            icon="el-icon-s-check"
+            size="mini"
+            @click="$_navigationTo(`/supplier-audit/club/device-detail?id=${row.productId}&authId=${listQuery.authId}`)"
+          >审核</el-button>
+          <span v-else class="status success el-icon-check">&nbsp;已审核</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <!-- 页码 -->
+    <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'
+import { getProdList } from '@/api/product'
+import { formatDate } from '@/utils'
+export default {
+  components: { Pagination },
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        listType: 2,
+        authId: '',
+        productName: '',
+        reviewStatus: '',
+        snCode: '',
+        pageNum: 1,
+        pageSize: 10
+      },
+      total: 0,
+      list: []
+    }
+  },
+  created() {
+    this.listQuery.authId = this.$route.query.authId
+    this.getList()
+  },
+  methods: {
+    // 过滤列表
+    handleFilter() {},
+    // 获取列表信息
+    getList() {
+      this.listLoading = true
+      getProdList(this.listQuery)
+        .then((res) => {
+          if (res.code !== 0) return
+          this.total = res.data.total
+          this.list = res.data.list
+        })
+        .finally(() => {
+          this.listLoading = false
+        })
+    },
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-table .cell {
+  overflow: visible;
+}
+</style>

+ 31 - 0
src/views/normal/audit/club/device/index.vue

@@ -0,0 +1,31 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="未审核" name="first">
+        <device-list />
+      </el-tab-pane>
+      <el-tab-pane label="已审核" name="second">
+        <device-list />
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import DeviceList from '../components/device-list.vue'
+export default {
+  components: {
+    DeviceList
+  },
+  data() {
+    return {
+      activeName: 'first'
+    }
+  },
+  methods: {
+    handleClick() {}
+  }
+}
+</script>
+
+<style></style>

+ 177 - 0
src/views/normal/audit/club/device/review.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="app-container">
+    <div class="audit-content">
+      <div class="grid">
+        <div class="row">
+          <div class="col">设备名称:</div>
+          <div class="col">{{ productInfo.productName }}</div>
+        </div>
+        <div class="row">
+          <div class="col">设备SN码:</div>
+          <div class="col">{{ productInfo.snCode }}</div>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">设备图片:</div>
+        <div class="col">
+          <el-image
+            style="width: 120px; height: 120px"
+            :src="productInfo.productImage"
+            :preview-src-list="[productInfo.productImage]"
+          />
+        </div>
+      </div>
+
+      <div class="row">
+        <div class="col">所属品牌:</div>
+        <div class="col">{{ productInfo.brandName }}</div>
+      </div>
+
+      <div class="row">
+        <div class="col">购买渠道:</div>
+        <div class="col">{{ productInfo.buyChannel }}</div>
+      </div>
+
+      <div class="row">
+        <div class="col">发票:</div>
+        <div class="col">
+          <el-image
+            style="width: 120px; height: 120px"
+            :src="productInfo.invoiceImage"
+            :preview-src-list="[productInfo.invoiceImage]"
+          />
+        </div>
+      </div>
+
+      <div class="row">
+        <div class="col">设备参数:</div>
+        <div class="col">
+          <template v-for="(param, index) in productInfo.paramList">
+            <div :key="index" class="param">
+              <div class="label">{{ param.paramName }}:</div>
+              <div class="content">{{ param.paramContent }}</div>
+            </div>
+          </template>
+        </div>
+      </div>
+
+      <div class="row">
+        <div class="col">审核状态:</div>
+        <div class="col">待审核</div>
+      </div>
+      <el-form label-width="112px" :model="auditForm" :rules="rules">
+        <el-form-item label="审核:">
+          <el-radio-group v-model="auditForm.auditStatus">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="0">不通过</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item v-if="auditForm.auditStatus === 0" label="原因:" prop="invalidReason">
+          <el-input v-model="auditForm.invalidReason" type="textarea" :rows="3" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="info" @click="$_back">返回</el-button>
+          <el-button type="primary" @click="submit">提交</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      productInfo: {
+        productName: '产品名称产品名称',
+        snCode: 'adsgfadsgdsagasg',
+        productImage: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        certificateImage: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        paramList: [{
+          paramName: '参数名称',
+          paramContent: '参数信息信息'
+        }, {
+          paramName: '参数名称',
+          paramContent: '参数信息信息'
+        }, {
+          paramName: '参数名称',
+          paramContent: '参数信息信息'
+        }],
+        invoiceImage: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        brandName: '品牌名',
+        buyChannel: '购买渠道'
+      },
+      auditForm: {
+        auditBy: '', // 审核人id
+        authId: '', // 机构id
+        auditStatus: 1, // 审核状态
+        invalidReason: '' // 审核信息
+      },
+      rules: {
+        invalidReason: { required: true, message: '不通过原因不能为空', tigger: 'blur' }
+      }
+    }
+  },
+  methods: {
+    submit() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  .audit-content {
+    max-width: 1000px;
+    margin: 0 auto;
+    margin-top: 25px;
+  }
+  .grid,
+  .param {
+    display: grid;
+    grid-template-columns: repeat(2, 1fr);
+    // grid-template-rows: repeat(2, 1fr);
+    grid-column-gap: 0px;
+    grid-row-gap: 0px;
+  }
+
+  .param {
+    div {
+      padding-bottom: 16px;
+      text-align: left;
+
+      &:first-child{
+        text-align: right;
+      }
+    }
+  }
+
+  .row {
+    display: flex;
+    justify-content: flex-start;
+    align-items: flex-start;
+    margin-bottom: 25px;
+    .col {
+      font-size: 14px;
+      color: #333;
+      &:first-child {
+        min-width: 100px;
+        text-align: right;
+        margin-right: 8px;
+        font-weight: bold;
+        color: #666;
+      }
+
+      .el-image {
+        margin-left: 12px;
+        &:first-child {
+          margin-left: 0;
+        }
+      }
+    }
+  }
+
+  .el-button {
+    width: 120px;
+  }
+}
+</style>

+ 31 - 0
src/views/normal/audit/club/index.vue

@@ -0,0 +1,31 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="未审核" name="first">
+        <club-list />
+      </el-tab-pane>
+      <el-tab-pane label="已审核" name="second">
+        <club-list />
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import ClubList from './components/club-list.vue'
+export default {
+  components: {
+    ClubList
+  },
+  data() {
+    return {
+      activeName: 'first'
+    }
+  },
+  methods: {
+    handleClick() {}
+  }
+}
+</script>
+
+<style></style>

+ 247 - 0
src/views/normal/audit/club/review.vue

@@ -0,0 +1,247 @@
+<template>
+  <div class="app-container">
+    <div class="audit-content">
+      <div class="grid">
+        <div class="row">
+          <div class="col">机构名称:</div>
+          <div class="col">{{ clubInfo.authParty }}</div>
+        </div>
+        <div class="row">
+          <div class="col">联系电话:</div>
+          <div class="col">{{ clubInfo.mobile }}</div>
+        </div>
+        <div class="row">
+          <div class="col">所在地区:</div>
+          <div class="col">{{ clubInfo.area }}</div>
+        </div>
+        <div class="row">
+          <div class="col">详细地址:</div>
+          <div class="col">{{ clubInfo.address }}</div>
+        </div>
+        <div class="row">
+          <div class="col">所在位置:</div>
+          <div class="col">
+            <div class="map" @click="dialogMapVisible = true">
+              <i class="el-icon-map-location" />
+              <span>点击查看</span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">logo:</div>
+        <div class="col">
+          <el-image style="width: 120px; height: 120px" :src="clubInfo.logo" :preview-src-list="[clubInfo.logo]" />
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">门头照:</div>
+        <div class="col">
+          <template v-for="(image, index) in clubInfo.bannerList">
+            <el-image
+              :key="index"
+              style="width: 120px; height: 120px"
+              :src="image"
+              :preview-src-list="clubInfo.bannerList"
+            />
+          </template>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">机构类型:</div>
+        <div class="col">
+          <el-radio-group v-model="clubInfo.clubType">
+            <el-radio
+              v-for="item in clubTypeList"
+              :key="item.id"
+              :label="item.id"
+              :disabled="clubInfo.clubType !== item.id"
+            >{{ item.name }}</el-radio>
+          </el-radio-group>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">医美类型:</div>
+        <div class="col">
+          <el-radio-group v-model="clubInfo.medicalType">
+            <el-radio
+              v-for="item in medicalTypeList"
+              :key="item.id"
+              :label="item.id"
+              :disabled="clubInfo.clubType !== item.id"
+            >{{ item.name }}</el-radio>
+          </el-radio-group>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">医疗许可证:</div>
+        <div class="col">
+          <el-image
+            style="width: 120px; height: 120px"
+            :src="clubInfo.licenseImage"
+            :preview-src-list="[clubInfo.licenseImage]"
+          />
+        </div>
+      </div>
+      <div class="row">
+        <div class="col">员工人数:</div>
+        <div class="col">{{ clubInfo.memberCount }}人</div>
+      </div>
+
+      <div class="row">
+        <div class="col">自定义属性:</div>
+        <div class="col">
+          <el-radio-group v-model="clubInfo.customFlag">
+            <el-radio :label="1" :disabled="clubInfo.customFlag !== 1">是</el-radio>
+            <el-radio :label="0" :disabled="clubInfo.customFlag !== 0">否</el-radio>
+          </el-radio-group>
+        </div>
+      </div>
+      <div v-if="clubInfo.customFlag > 0" class="row">
+        <div class="col">店铺备注:</div>
+        <div class="col">{{ clubInfo.remarks }}人</div>
+      </div>
+
+      <div class="row">
+        <div class="col">审核状态:</div>
+        <div class="col">待审核</div>
+      </div>
+      <el-form label-width="112px" :model="auditForm" :rules="rules">
+        <el-form-item label="审核:">
+          <el-radio-group v-model="auditForm.auditStatus">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="0">不通过</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item v-if="auditForm.auditStatus === 0" label="原因:" prop="invalidReason">
+          <el-input v-model="auditForm.invalidReason" type="textarea" :rows="3" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="info" @click="$_back">返回</el-button>
+          <el-button type="primary" @click="submit">提交</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <!-- 地图坐标拾取 -->
+    <el-dialog class="map-dialog" title="地图信息" :visible.sync="dialogMapVisible" width="80%">
+      <!-- <location v-if="dialogMapVisible" :init-point="formData.point" @point="handlePointChange" /> -->
+      <map-ui :init-point="clubInfo.lngAndLat" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import AMapUI from '@/components/AMapUI'
+export default {
+  components: {
+    [AMapUI.name]: AMapUI
+  },
+  data() {
+    return {
+      dialogMapVisible: false,
+      clubTypeList: [
+        { id: 1, name: '医美' },
+        { id: 2, name: '生美' },
+        { id: 3, name: '项目公司' },
+        { id: 4, name: '个人' },
+        { id: 5, name: '其他' }
+      ],
+      medicalTypeList: [
+        { id: 1, name: '诊所' },
+        { id: 2, name: '门诊' },
+        { id: 3, name: '医院' },
+        { id: 4, name: '其他' }
+      ],
+      clubInfo: {
+        medicalType: 1,
+        clubType: 1,
+        licenseImage: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        memberCount: 10,
+        address: '广东省深圳市龙华区大浪街道',
+        area: '广东省深圳市龙华区',
+        authId: '',
+        authParty: '水柔医美',
+        bannerList: [
+          'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+          'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg'
+        ],
+        cityId: '',
+        lngAndLat: '116.42729,39.904993',
+        logo: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        mobile: '15872950940',
+        provinceId: '',
+        townId: '',
+        customFlag: 0,
+        remarks: ''
+      },
+      auditForm: {
+        auditBy: '', // 审核人id
+        authId: '', // 机构id
+        auditStatus: 1, // 审核状态
+        invalidReason: '' // 审核信息
+      },
+      rules: {
+        invalidReason: { required: true, message: '不通过原因不能为空', tigger: 'blur' }
+      }
+    }
+  },
+  methods: {
+    submit() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  .audit-content {
+    max-width: 1000px;
+    margin: 0 auto;
+    margin-top: 25px;
+  }
+
+  .map {
+    cursor: pointer;
+    span {
+      margin-left: 4px;
+      color: #409eff;
+    }
+  }
+
+  .grid {
+    display: grid;
+    grid-template-columns: repeat(2, 1fr);
+    // grid-template-rows: repeat(2, 1fr);
+    grid-column-gap: 0px;
+    grid-row-gap: 0px;
+  }
+  .row {
+    display: flex;
+    justify-content: flex-start;
+    align-items: flex-start;
+    margin-bottom: 25px;
+    .col {
+      font-size: 14px;
+      color: #333;
+      &:first-child {
+        min-width: 100px;
+        text-align: right;
+        margin-right: 8px;
+        font-weight: bold;
+        color: #666;
+      }
+
+      .el-image {
+        margin-left: 12px;
+        &:first-child {
+          margin-left: 0;
+        }
+      }
+    }
+  }
+
+  .el-button {
+    width: 120px;
+  }
+}
+</style>

+ 40 - 2
src/views/normal/club/device/edit.vue

@@ -66,6 +66,22 @@
         <auth-card-template v-model="formData.addTemplateType" :image-list="certificateImageList" />
       </el-form-item>
 
+      <el-form-item label="购买渠道:">
+        <el-input v-model="formData.buyChannel" placeholder="请输入购买渠道" />
+      </el-form-item>
+
+      <el-form-item label="发票:">
+        <upload-image
+          tip="建议图片分辨率:242px*242px"
+          :limit="1"
+          :image-list="invoiceImageList"
+          :before-upload="beforeInvoiceImageUpload"
+          @success="uploadInvoiceImageSuccess"
+          @remove="handleInvoiceImageRemove"
+        />
+        <el-input v-show="false" v-model="formData.invoiceImage" />
+      </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" />
@@ -126,7 +142,9 @@ export default {
         brandId: '',
         addQrCodeFlag: 0,
         addTemplateType: 1,
-        productTypeId: ''
+        productTypeId: '',
+        buyChannel: '', // 购买渠道
+        invoiceImage: ''// 发票
       },
       paramList: [], // 参数列表
       rules: {
@@ -147,7 +165,9 @@ export default {
       // 商品图片列表
       productImageList: [],
       // 授权牌照图片列表
-      certificateImageList: []
+      certificateImageList: [],
+      // 发票
+      invoiceImageList: []
     }
   },
   computed: {
@@ -370,6 +390,24 @@ export default {
       this.formData.certificateImage = ''
       this.formData.addQrCodeFlag = 0
     },
+
+    // 发票上传
+    beforeInvoiceImageUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('上传授权牌图片大小不能超过 1MB!')
+      }
+      return flag
+    },
+    uploadInvoiceImageSuccess({ response, file, fileList }) {
+      this.invoiceImageList = fileList
+      this.formData.invoiceImage = response.data
+    },
+    handleInvoiceImageRemove({ file, fileList }) {
+      this.invoiceImageList = fileList
+      this.formData.invoiceImage = ''
+    },
+
     // 清除表单数据
     clearFormData() {
       this.paramList = []

+ 81 - 7
src/views/normal/club/edit.vue

@@ -29,9 +29,12 @@
           <el-button slot="append" icon="el-icon-map-location" @click="dialogMapVisible = true" />
         </el-input>
       </el-form-item>
-      <el-form-item label="联系方式:" prop="mobile">
+      <el-form-item label="联系电话:" prop="mobile">
         <el-input v-model="formData.mobile" placeholder="请输入联系方式" clearable />
       </el-form-item>
+      <el-form-item label="手机号:" prop="phoneNumber">
+        <el-input v-model="formData.phoneNumber" placeholder="请输入手机号" clearable maxlength="11" />
+      </el-form-item>
       <el-form-item label="机构logo:" prop="logoImage">
         <el-input v-show="false" v-model="formData.logoImage" />
         <upload-image
@@ -42,7 +45,7 @@
           @remove="handleLogoRemove"
         />
       </el-form-item>
-      <el-form-item label="轮播图:" prop="banner">
+      <el-form-item label="门头照:" prop="banner">
         <el-input v-show="false" v-model="formData.banner" />
         <upload-image
           tip="至少上传一张,最多6张;建议尺寸:542px * 542px"
@@ -54,6 +57,41 @@
         />
       </el-form-item>
 
+      <el-form-item label="机构类型:">
+        <el-radio-group v-model="formData.clubType">
+          <el-radio :label="1">医美</el-radio>
+          <el-radio :label="2">生美</el-radio>
+          <el-radio :label="3">项目公司</el-radio>
+          <el-radio :label="4">个人</el-radio>
+          <el-radio :label="5">其他</el-radio>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item label="医美类型:">
+        <el-radio-group v-model="formData.medicalType">
+          <el-radio :label="1">诊所</el-radio>
+          <el-radio :label="2">门诊</el-radio>
+          <el-radio :label="3">医院</el-radio>
+          <el-radio :label="4">其他</el-radio>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item label="医疗许可证:" prop="licenseImage">
+        <el-input v-show="false" v-model="formData.licenseImage" />
+        <upload-image
+          tip="请上传医疗许可证;建议尺寸:542px * 542px"
+          :limit="1"
+          :image-list="licenseImageList"
+          :before-upload="beforeLicenseImageUpload"
+          @success="uploadLicenseImageSuccess"
+          @remove="handleLicenseImageRemove"
+        />
+      </el-form-item>
+
+      <el-form-item label="员工人数:" prop="memberCount">
+        <el-input v-model.number="formData.memberCount" placeholder="请输入员工人数" clearable />
+      </el-form-item>
+
       <el-form-item label="自定义属性:">
         <el-radio-group v-model="formData.customFlag" size="mini">
           <el-radio :label="0" border>否</el-radio>
@@ -97,7 +135,7 @@ import UploadImage from '@/components/UploadImage'
 import { mapGetters } from 'vuex'
 import { saveBrandAuth, getAuthFormData } from '@/api/auth'
 import { getAddress } from '@/api/common'
-import { isPoint, isNumber } from '@/utils/validate'
+import { isPoint, isMobile } from '@/utils/validate'
 
 export default {
   components: {
@@ -122,7 +160,7 @@ export default {
       if (value === '') {
         callback(new Error('联系方式不能为空'))
       } else {
-        if (isNumber(value)) {
+        if (isMobile(value)) {
           callback()
         } else {
           callback(new Error('联系方式格式不正确'))
@@ -130,6 +168,14 @@ export default {
       }
     }
 
+    var validatePhoneNumber = (rule, value, callback) => {
+      if (!value || isMobile(value)) {
+        callback()
+      } else {
+        callback(new Error('手机号格式不正确'))
+      }
+    }
+
     return {
       editType: 'add',
       dialogMapVisible: false,
@@ -147,10 +193,15 @@ export default {
         fullAddress: '',
         point: '',
         mobile: '',
+        phoneNumber: '',
         logoImage: '',
         banner: '',
         customFlag: 0,
-        remarks: ''
+        remarks: '',
+        memberCount: '',
+        clubType: 1,
+        medicalType: 1,
+        licenseImage: ''
       },
       rules: {
         name: [{ required: true, message: '机构名称不能为空', trigger: ['blur', 'change'] }],
@@ -160,14 +211,19 @@ export default {
         mobile: [{ required: true, validator: validateMobile, trigger: ['blur', 'change'] }],
         logoImage: [{ required: true, message: '请上传机构logo', trigger: 'change' }],
         banner: [{ required: true, message: '请至少上传一张banner图片', trigger: 'change' }],
-        remarks: [{ required: true, message: '店铺备注不能为空', trigger: 'blur' }]
+        remarks: [{ required: true, message: '店铺备注不能为空', trigger: 'blur' }],
+        licenseImage: [{ required: true, message: '请上传医疗许可证', trigger: 'change' }],
+        memberCount: [{ required: true, message: '员工人数不能为空', trigger: 'change' }],
+        phoneNumber: [{ validator: validatePhoneNumber, trigger: 'change' }]
       },
       // logo图片列表
       logoList: [],
       // banner图片列表
       bannerList: [],
       // 级联选择的地址
-      address: ''
+      address: '',
+      // 医疗许可证图片
+      licenseImageList: []
     }
   },
   computed: {
@@ -336,6 +392,24 @@ export default {
         this.$message.error('上传banner图片大小不能超过 1MB!')
       }
       return flag
+    },
+
+    // 医疗许可证图片上传
+    uploadLicenseImageSuccess({ response, file, fileList }) {
+      this.licenseImageList = fileList
+      console.log(this.licenseImageList)
+      this.formData.licenseImage = response.data
+    },
+    handleLicenseImageRemove({ file, fileList }) {
+      this.licenseImageList = fileList
+      this.formData.licenseImage = ''
+    },
+    beforeLicenseImageUpload(file) {
+      const flag = file.size / 1024 / 1024 < 1
+      if (!flag) {
+        this.$message.error('医疗许可证图片大小不能超过 1MB!')
+      }
+      return flag
     }
   }
 }

+ 31 - 27
src/views/normal/club/index.vue

@@ -43,7 +43,7 @@
       border
       fit
       highlight-current-row
-      style="width: 100%;"
+      style="width: 100%"
       header-row-class-name="tableHeader"
     >
       <el-table-column label="序号" :index="indexMethod" align="center" width="80" type="index" />
@@ -60,7 +60,7 @@
             <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 " />
+                <span class="el-icon-question status danger" />
               </el-tag>
             </el-popover>
             <!-- 未通过原因展示END -->
@@ -73,17 +73,17 @@
           <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
           <template v-if="row.auditStatus === 1">
             <template v-if="row.status === 0">
-              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <span style="margin-right: 10px" class="status danger">已下线</span>
               <permission-button type="primary" size="mini" @click="handleChangeStatus(row)">上线</permission-button>
             </template>
             <template v-else>
-              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <span style="margin-right: 10px" class="status success">已上线</span>
               <permission-button type="info" size="mini" @click="handleChangeStatus(row)">下线</permission-button>
             </template>
           </template>
           <template v-else>
             <!-- <el-tag type="warning">待上线</el-tag> -->
-            <span style="margin-right:10px;" class="status warning">待上线</span>
+            <span style="margin-right: 10px" class="status warning">待上线</span>
           </template>
         </template>
       </el-table-column>
@@ -94,20 +94,19 @@
         </template>
       </el-table-column>
 
-      <!-- <el-table-column label="创建人" class-name="status-col" width="160px" prop="createBy" /> -->
-      <el-table-column label="操作" align="center" width="400px" class-name="small-padding fixed-width">
+      <el-table-column label="创建人" class-name="status-col" width="160px" prop="createBy" />
+      <el-table-column label="操作" align="center" width="440px" class-name="small-padding fixed-width">
         <template slot-scope="{ row }">
           <permission-button type="primary" size="mini" @click="$_navigationTo(`club-edit?type=edit&id=${row.authId}`)">
             编辑
           </permission-button>
-          <permission-button type="primary" size="mini" @click="$_navigationTo(`user-list?id=${row.authId}`)">
-            登录用户
-          </permission-button>
+          <permission-button type="danger" size="mini" @click="handleRemoveAuth(row)"> 删除 </permission-button>
           <permission-button type="primary" size="mini" @click="$_navigationTo(`device-list?id=${row.authId}`)">
             查看设备认证
           </permission-button>
-          <permission-button type="danger" size="mini" @click="handleRemoveAuth(row)">
-            删除
+          <permission-button type="primary" size="mini" @click="createClubQrcode"> 二维码 </permission-button>
+          <permission-button type="primary" size="mini" @click="$_navigationTo(`logistics-licensed?id=${row.authId}`)">
+            授权牌物流
           </permission-button>
         </template>
       </el-table-column>
@@ -250,9 +249,14 @@ export default {
     this.getList()
   },
   methods: {
+    // 机构二维码
+    createClubQrcode() {
+      console.log('机构二维码')
+    },
+
     // 上传文件
     submitUpload() {
-      this.$refs.dialogForm.validate(valid => {
+      this.$refs.dialogForm.validate((valid) => {
         console.log(valid)
         if (!valid) return
         this.requestLoading = true // 上传文件
@@ -319,12 +323,12 @@ export default {
       formData.append('file', this.chooseFile)
 
       authImportExcel(formData)
-        .then(res => {
+        .then((res) => {
           this.$message.success(res.data)
           this.improtDialogVisible = false
           this.getList()
         })
-        .catch(err => {
+        .catch((err) => {
           console.log(err)
         })
         .finally(() => {
@@ -364,7 +368,7 @@ export default {
     getList() {
       this.listLoading = true
       fecthAuthList(this.listQuery)
-        .then(response => {
+        .then((response) => {
           if (response.code !== 0) {
             return this.$message.error('授权列表信息获取失败')
           }
@@ -375,7 +379,7 @@ export default {
           // 获取审核未通过的列表
           // this.checkAuditFailedList(list)
         })
-        .catch(err => {
+        .catch((err) => {
           console.log(err)
           return this.$message.error('授权列表信息获取失败')
         })
@@ -386,7 +390,7 @@ export default {
     // 获取审核未通过条数
     // Audit failed 审核未通过
     checkAuditFailedList(data) {
-      this.auditFailedList = data.filter(item => item.auditStatus === 0)
+      this.auditFailedList = data.filter((item) => item.auditStatus === 0)
       if (this.auditFailedList.length > 0 && this.auditNoticeFlag) {
         this.$notify.info({
           title: '消息通知',
@@ -399,7 +403,7 @@ export default {
     },
     // 检查机构名是否存在 true:存在  false:不存在
     handleCheckAuthName(name) {
-      const flag = this.list.some(item => item.authParty === name)
+      const flag = this.list.some((item) => item.authParty === name)
       console.log(flag)
       return flag
     },
@@ -413,7 +417,7 @@ export default {
         })
         return
       }
-      this.$refs.addAuthForm.validate(valide => {
+      this.$refs.addAuthForm.validate((valide) => {
         if (valide) {
           this.disabled = true
           this.listLoading = true
@@ -421,7 +425,7 @@ export default {
           this.addAuthFormData.authUserId = this.authUserId
           this.addAuthFormData.createBy = this.addAuthFormData.authUserId
           saveBrandAuth(this.addAuthFormData)
-            .then(res => {
+            .then((res) => {
               if (res.code !== 0) {
                 return
               }
@@ -438,7 +442,7 @@ export default {
               })
               this.$refs.addAuthForm.resetFields()
             })
-            .catch(err => {
+            .catch((err) => {
               console.log(err)
               this.$message.danger('操作失败')
             })
@@ -463,7 +467,7 @@ export default {
       // 要执行的操作
       this.listLoading = true
       removeAuth({ authId: item.authId })
-        .then(res => {
+        .then((res) => {
           if (res.code !== 0) return
           const h = this.$createElement
           this.$notify.success({
@@ -472,7 +476,7 @@ export default {
             duration: 3000
           })
         })
-        .catch(err => {
+        .catch((err) => {
           console.log(err)
         })
         .finally(() => {
@@ -482,7 +486,7 @@ export default {
     },
     // 格式化列表数据
     formatList(list = []) {
-      list.forEach(i => {
+      list.forEach((i) => {
         i.status = i.status === 1
       })
     },
@@ -494,7 +498,7 @@ export default {
         status: item.status === 1 ? 0 : 1
       }
       changeAuthStatus(params)
-        .then(res => {
+        .then((res) => {
           // this.$message.success(res.data)
           this.$message({
             message: res.data,
@@ -503,7 +507,7 @@ export default {
           })
           this.getList()
         })
-        .catch(err => {
+        .catch((err) => {
           console.log(err)
         })
         .finally(() => {

+ 56 - 0
src/views/normal/club/logistics-licensed.vue

@@ -0,0 +1,56 @@
+<template>
+  <div class="page-section">
+    <div class="app-container">
+      <div class="row">
+        <div class="col">货物名称:</div>
+        <div class="col">机构名称+授权牌</div>
+      </div>
+      <div class="row">
+        <div class="col">物流公司:</div>
+        <div class="col">顺丰到家</div>
+      </div>
+      <div class="row">
+        <div class="col">物流单号:</div>
+        <div class="col">SDLAJ454654464646</div>
+      </div>
+
+      <div class="title">物流详情</div>
+      <el-divider />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {}
+</script>
+
+<style lang="scss" scoped>
+.page-section{
+  width: 100%;
+  height: calc(100vh - 84px);
+  background: #f7f7f7;
+  box-sizing: border-box;
+  padding: 20px;
+}
+
+.app-container {
+  background: #fff;
+  box-sizing: border-box;
+  .row{
+    display: flex;
+    justify-content: flex-start;
+    align-items: flex-start;
+    .col{
+      line-height: 36px;
+      font-size: 14px;
+      color: #333;
+    }
+  }
+
+  .title{
+    font-size: 28px;
+    color: #409eff;
+    margin-top: 35px;
+  }
+}
+</style>

+ 270 - 0
src/views/normal/user/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <div class="filter-control">
+        <span>姓名:</span>
+        <el-input v-model="listQuery.name" placeholder="姓名" @keyup.enter.native="getList" />
+      </div>
+      <div class="filter-control">
+        <span>手机号:</span>
+        <el-input v-model="listQuery.mobile" placeholder="手机号" @keyup.enter.native="getList" />
+      </div>
+      <div class="filter-control">
+        <permission-button type="primary" @click="getList">查询</permission-button>
+        <permission-button type="primary" @click="handleCreate">添加用户</permission-button>
+      </div>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+      header-row-class-name="tableHeader"
+    >
+      <el-table-column label="序号" :index="indexMethod" type="index" width="80px" align="center" />
+      <el-table-column label="机构名称" prop="name" align="center" />
+      <el-table-column label="手机号" width="140" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.mobile">{{ row.mobile }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="注册时间" width="200px" align="center">
+        <template slot-scope="{ row }">
+          <span>{{ row.addTime | formatTime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="微信昵称" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.nickName">{{ row.nickName }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="openID" width="280" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.openId">{{ row.openId }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="200px" align="center">
+        <template slot-scope="{ row }">
+          <permission-button
+            type="danger"
+            size="mini"
+            style="margin-right: 5px"
+            @click="handleEdit(row)"
+          >编辑</permission-button>
+          <permission-button
+            type="primary"
+            size="mini"
+            style="margin-right: 5px"
+            @click="handleRemove(row)"
+          >删除</permission-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList(listQuery)"
+    />
+
+    <el-dialog title="添加用户" width="30%" :visible.sync="dialogVisible" @close="onDialogClose">
+      <el-form ref="form" label-width="80px" :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="mobile">
+          <el-input v-model="formData.mobile" placeholder="请输入手机号" maxlength="11" show-word-limit />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="onSave">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import PermissionButton from '@/views/components/PermissionButton'
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+import { createClubUser, getAuthUserList, removeClubUser } from '@/api/auth'
+import { isMobile } from '@/utils/validate'
+
+const resetFormData = () => ({
+  clubUserId: '',
+  authId: '',
+  name: '',
+  mobile: ''
+})
+
+export default {
+  components: { Pagination, PermissionButton },
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    const validateMobile = (rule, value, callback) => {
+      console.log(value)
+      if (isMobile(value)) {
+        callback()
+      } else {
+        callback(new Error('手机号格式不正确'))
+      }
+    }
+
+    return {
+      total: 0,
+      authId: '', // 机构id
+      listLoading: false,
+      listQuery: {
+        authId: '', // 机构id
+        name: '', // 用户名
+        mobile: '', // 手机号
+        pageNum: 0, // 页码
+        pageSize: 10 // 分页大小
+      },
+      list: [],
+      srcList: [],
+      dialogVisible: false,
+      formData: resetFormData(),
+      rules: {
+        name: [{ required: true, message: '请输入用户姓名', trigger: ['blur'] }],
+        mobile: [
+          { required: true, message: '请输入手机号', trigger: ['blur'] },
+          { validator: validateMobile, message: '手机号格式不正确', trigger: ['blur'] }
+        ]
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'authUserId'])
+  },
+  created() {
+    this.authId = parseInt(this.$route.query.id)
+    this.getList()
+  },
+  methods: {
+    // 更新列表
+    getList() {
+      this.listQuery.pageNum = 1
+      this.fetchUserList()
+    },
+
+    // 获取列表数据
+    async fetchUserList() {
+      this.listLoading = true
+      this.listQuery.authId = this.authId
+      try {
+        const res = await getAuthUserList(this.listQuery)
+        this.list = res.data.list
+        this.total = res.data.total
+      } catch (error) {
+        console.log(error)
+      } finally {
+        this.listLoading = false
+      }
+    },
+
+    // 创建用户
+    handleCreate() {
+      this.dialogVisible = true
+    },
+    // 修改用户
+    handleEdit(row) {
+      this.formData.clubUserId = row.clubUserId
+      this.formData.authId = row.authId
+      this.formData.name = row.name
+      this.formData.mobile = row.mobile
+      this.dialogVisible = true
+    },
+
+    // 保存用户信息
+    async onSave() {
+      let valide = false
+      try {
+        valide = await this.$refs.form.validate()
+      } catch (error) {
+        console.log(error)
+      }
+      if (!valide) return
+
+      this.formData.authId = this.authId
+      try {
+        await createClubUser(this.formData)
+        this.$message.success('添加用户成功')
+        this.fetchUserList()
+        this.dialogVisible = false
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 删除用户
+    async handleRemove(row) {
+      let confirmType = ''
+      try {
+        confirmType = await this.$confirm('确认删除改用户?', '提示', {
+          confirmButtonText: '确认',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+      } catch (error) {
+        console.log(error)
+      }
+
+      if (!confirmType) return
+
+      try {
+        await removeClubUser({ clubUserId: row.clubUserId })
+        this.$message.success('删除用户成功')
+        this.fetchUserList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+
+    onDialogClose() {
+      this.$refs.form.resetFields()
+      this.formData = resetFormData()
+    },
+
+    indexMethod(index) {
+      return index + this.listQuery.pageSize * (this.listQuery.pageNum - 1) + 1
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  ::v-deep {
+    .el-dialog__body {
+      padding-bottom: 0;
+    }
+  }
+}
+
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge {
+  margin: 0 6px;
+}
+</style>