Sfoglia il codice sorgente

页面绘制完成

yuwenjun 3 anni fa
parent
commit
88025a501b
60 ha cambiato i file con 3530 aggiunte e 273 eliminazioni
  1. 30 0
      mock/doc.js
  2. 10 8
      mock/index.js
  3. 9 0
      src/api/doc.js
  4. BIN
      src/assets/img/pdf_cover.png
  5. 22 11
      src/components/Tinymce/components/EditorImage.vue
  6. 39 41
      src/components/Tinymce/index.vue
  7. 1 1
      src/components/Tinymce/toolbar.js
  8. 21 8
      src/layout/components/Navbar.vue
  9. 2 2
      src/layout/components/NoticeTodo/index.vue
  10. 5 9
      src/main.js
  11. 32 20
      src/permission.js
  12. 17 4
      src/router/index.js
  13. 1 1
      src/router/modules/auth.js
  14. 31 0
      src/router/modules/authUser.js
  15. 56 0
      src/router/modules/doc.js
  16. 31 0
      src/router/modules/feedback.js
  17. 7 7
      src/router/modules/product.js
  18. 66 7
      src/router/modules/review.js
  19. 3 3
      src/router/modules/supplier.js
  20. 7 1
      src/settings.js
  21. 4 1
      src/store/getters.js
  22. 38 0
      src/store/modules/proxy.js
  23. 3 2
      src/store/modules/settings.js
  24. 27 7
      src/store/modules/user.js
  25. 134 115
      src/styles/index.scss
  26. 1 1
      src/utils/WebSocketUtil.js
  27. 16 0
      src/utils/auth.js
  28. 14 11
      src/utils/open-window.js
  29. 4 0
      src/views/authentic/auth/index.vue
  30. 333 0
      src/views/authentic/authuser/index.vue
  31. 161 0
      src/views/authentic/authuser/userList.vue
  32. 0 0
      src/views/authentic/components/uploadFile.vue
  33. 1 1
      src/views/authentic/components/uploadImage.vue
  34. 70 0
      src/views/authentic/doc/articleEdit.vue
  35. 194 0
      src/views/authentic/doc/articleList.vue
  36. 247 0
      src/views/authentic/doc/fileList.vue
  37. 101 0
      src/views/authentic/doc/imageEdit.vue
  38. 186 0
      src/views/authentic/doc/imageList.vue
  39. 247 0
      src/views/authentic/doc/videoList.vue
  40. 65 0
      src/views/authentic/feedback/detail.vue
  41. 202 0
      src/views/authentic/feedback/index.vue
  42. 0 0
      src/views/authentic/product/add.vue
  43. 0 0
      src/views/authentic/product/edit.vue
  44. 0 0
      src/views/authentic/product/index.vue
  45. 16 0
      src/views/authentic/proxy/proxy.vue
  46. 0 0
      src/views/authentic/review/auth/authList.vue
  47. 1 1
      src/views/authentic/review/auth/index.vue
  48. 1 1
      src/views/authentic/review/auth/shopDetail.vue
  49. 0 0
      src/views/authentic/review/auth/shopList.vue
  50. 19 0
      src/views/authentic/review/doc/articleDetail.vue
  51. 166 0
      src/views/authentic/review/doc/articleList.vue
  52. 225 0
      src/views/authentic/review/doc/fileList.vue
  53. 77 0
      src/views/authentic/review/doc/imageDetail.vue
  54. 151 0
      src/views/authentic/review/doc/imageList.vue
  55. 196 0
      src/views/authentic/review/doc/index.vue
  56. 211 0
      src/views/authentic/review/doc/videoList.vue
  57. 20 5
      src/views/authentic/supplier/add.vue
  58. 0 0
      src/views/authentic/supplier/edit.vue
  59. 5 3
      src/views/authentic/supplier/index.vue
  60. 4 2
      src/views/login/index.vue

+ 30 - 0
mock/doc.js

@@ -0,0 +1,30 @@
+const Mock = require('mockjs')
+
+const count = 10
+const list = []
+
+for (let i = 0; i < count; i++) {
+  list.push(Mock.mock({
+    name: '@ctitle(5,10)', // 供应商名称
+    shopType: '@natural(1,2)', // 供应商类型
+    mobile: "@string('number',11)", // 手机号
+    linkMan: '@cname(2,6)', // 联系人
+    lowerAuditStatus: '@natural(0,1)' // 审核状态
+  }))
+}
+
+module.exports = [
+  {
+    url: '/review/doc/list',
+    type: 'get',
+    response: () => {
+      console.log('123')
+      return {
+        code: 0,
+        data: {
+          list
+        }
+      }
+    }
+  }
+]

+ 10 - 8
mock/index.js

@@ -1,16 +1,18 @@
 const Mock = require('mockjs')
 const { param2Obj } = require('./utils')
 
-const user = require('./user')
-const role = require('./role')
-const supplier = require('./supplier')
-const auth = require('./auth')
+// const user = require('./user')
+// const role = require('./role')
+// const supplier = require('./supplier')
+// const auth = require('./auth')
+const doc = require('./doc')
 
 const mocks = [
-  ...user,
-  ...role,
-  ...supplier,
-  ...auth
+  // ...user,
+  // ...role,
+  // ...supplier,
+  // ...auth
+  ...doc
 ]
 
 // for front mock

+ 9 - 0
src/api/doc.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 获取审核资料列表
+export function getReviewDocList(params) {
+  return request({
+    url: '/review/doc/list',
+    method: 'get'
+  })
+}

BIN
src/assets/img/pdf_cover.png


+ 22 - 11
src/components/Tinymce/components/EditorImage.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="upload-container">
     <el-button :style="{background:color,borderColor:color}" icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true">
-      upload
+      批量上传图片
     </el-button>
-    <el-dialog :visible.sync="dialogVisible">
+    <el-dialog :visible.sync="dialogVisible" title="批量上传图片">
       <el-upload
         :multiple="true"
         :file-list="fileList"
@@ -12,19 +12,22 @@
         :on-success="handleSuccess"
         :before-upload="beforeUpload"
         class="editor-slide-upload"
-        action="https://httpbin.org/post"
+        :action="action"
+        :headers="headers"
         list-type="picture-card"
       >
         <el-button size="small" type="primary">
-          Click upload
+          点击上传
         </el-button>
       </el-upload>
-      <el-button @click="dialogVisible = false">
-        Cancel
-      </el-button>
-      <el-button type="primary" @click="handleSubmit">
-        Confirm
-      </el-button>
+      <div slot="footer">
+        <el-button @click="dialogVisible = false">
+          取消
+        </el-button>
+        <el-button type="primary" @click="handleSubmit">
+          提交
+        </el-button>
+      </div>
     </el-dialog>
   </div>
 </template>
@@ -38,6 +41,14 @@ export default {
     color: {
       type: String,
       default: '#1890ff'
+    },
+    action: {
+      type: String,
+      required: true
+    },
+    headers: {
+      type: Object,
+      default: () => {}
     }
   },
   data() {
@@ -67,7 +78,7 @@ export default {
       const objKeyArr = Object.keys(this.listObj)
       for (let i = 0, len = objKeyArr.length; i < len; i++) {
         if (this.listObj[objKeyArr[i]].uid === uid) {
-          this.listObj[objKeyArr[i]].url = response.files.file
+          this.listObj[objKeyArr[i]].url = response.data
           this.listObj[objKeyArr[i]].hasSuccess = true
           return
         }

+ 39 - 41
src/components/Tinymce/index.vue

@@ -2,7 +2,7 @@
   <div :class="{fullscreen:fullscreen}" class="tinymce-container" :style="{width:containerWidth}">
     <textarea :id="tinymceId" class="tinymce-textarea" />
     <div class="editor-custom-btn-container">
-      <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" />
+      <editorImage :headers="{'X-Token':token}" :action="action" color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" />
     </div>
   </div>
 </template>
@@ -54,6 +54,14 @@ export default {
       type: [Number, String],
       required: false,
       default: 'auto'
+    },
+    action: {
+      type: String,
+      required: true
+    },
+    token: {
+      type: String,
+      required: true
     }
   },
   data() {
@@ -116,7 +124,7 @@ export default {
       const _this = this
       window.tinymce.init({
         selector: `#${this.tinymceId}`,
-        language: this.languageTypeList['en'],
+        language: this.languageTypeList['zh'],
         height: this.height,
         body_class: 'panel-body ',
         object_resizing: false,
@@ -129,10 +137,10 @@ export default {
         code_dialog_width: 1000,
         advlist_bullet_styles: 'square',
         advlist_number_styles: 'default',
-        imagetools_cors_hosts: ['www.tinymce.com', 'codepen.io'],
         default_link_target: '_blank',
+        fontsize_formats: '11px 12px 14px 16px 18px 24px 36px 48px',
         link_title: false,
-        nonbreaking_force_tab: true, // inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin
+        nonbreaking_force_tab: true,
         init_instance_callback: editor => {
           if (_this.value) {
             editor.setContent(_this.value)
@@ -148,43 +156,33 @@ export default {
             _this.fullscreen = e.state
           })
         },
-        // it will try to keep these URLs intact
-        // https://www.tiny.cloud/docs-3x/reference/configuration/Configuration3x@convert_urls/
-        // https://stackoverflow.com/questions/5196205/disable-tinymce-absolute-to-relative-url-conversions
-        convert_urls: false
-        // 整合七牛上传
-        // images_dataimg_filter(img) {
-        //   setTimeout(() => {
-        //     const $image = $(img);
-        //     $image.removeAttr('width');
-        //     $image.removeAttr('height');
-        //     if ($image[0].height && $image[0].width) {
-        //       $image.attr('data-wscntype', 'image');
-        //       $image.attr('data-wscnh', $image[0].height);
-        //       $image.attr('data-wscnw', $image[0].width);
-        //       $image.addClass('wscnph');
-        //     }
-        //   }, 0);
-        //   return img
-        // },
-        // images_upload_handler(blobInfo, success, failure, progress) {
-        //   progress(0);
-        //   const token = _this.$store.getters.token;
-        //   getToken(token).then(response => {
-        //     const url = response.data.qiniu_url;
-        //     const formData = new FormData();
-        //     formData.append('token', response.data.qiniu_token);
-        //     formData.append('key', response.data.qiniu_key);
-        //     formData.append('file', blobInfo.blob(), url);
-        //     upload(formData).then(() => {
-        //       success(url);
-        //       progress(100);
-        //     })
-        //   }).catch(err => {
-        //     failure('出现未知问题,刷新页面,或者联系程序员')
-        //     console.log(err);
-        //   });
-        // },
+        convert_urls: false,
+        // 自定义上传操作
+        images_upload_handler: function(blobInfo, succFun, failFun) {
+          var xhr, formData
+          var file = blobInfo.blob()// 转化为易于理解的file对象
+          xhr = new XMLHttpRequest()
+          xhr.withCredentials = false
+          xhr.open('POST', _this.action)
+          xhr.setRequestHeader('X-Token', _this.token)
+          xhr.onload = function() {
+            var json
+            if (xhr.status !== 200) {
+              failFun('HTTP Error: ' + xhr.status)
+              return
+            }
+            json = JSON.parse(xhr.responseText)
+            var result = { location: json.data }
+            if (!result || typeof result.location !== 'string') {
+              failFun('上传结果: ' + xhr.responseText)
+              return
+            }
+            succFun(result.location)
+          }
+          formData = new FormData()
+          formData.append('file', file, file.name)
+          xhr.send(formData)
+        }
       })
     },
     destroyTinymce() {

+ 1 - 1
src/components/Tinymce/toolbar.js

@@ -1,6 +1,6 @@
 // Here is a list of the toolbar
 // Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols
 
-const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent  blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']
+const toolbar = ['searchreplace styleselect fontsizeselect bold italic underline strikethrough alignleft aligncenter alignright outdent indent  blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']
 
 export default toolbar

+ 21 - 8
src/layout/components/Navbar.vue

@@ -12,7 +12,7 @@
     <div class="right-menu">
       <template v-if="device !== 'mobile'">
         <!-- <search id="header-search" class="right-menu-item" /> -->
-        <notice-todo v-if="userIdentity === 1" />
+        <notice-todo v-if="userIdentity === 1 && openSoket" />
         <!-- <error-log class="errLog-container right-menu-item hover-effect" /> -->
 
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
@@ -25,12 +25,19 @@
           <i class="el-icon-caret-bottom" />
         </div>
         <el-dropdown-menu slot="dropdown">
-          <router-link to="/password/edit">
-            <el-dropdown-item>修改密码</el-dropdown-item>
-          </router-link>
-          <el-dropdown-item divided @click.native="logout">
-            <span style="display:block;">退出</span>
-          </el-dropdown-item>
+          <template v-if="!proxyState">
+            <router-link to="/password/edit">
+              <el-dropdown-item>修改密码</el-dropdown-item>
+            </router-link>
+            <el-dropdown-item divided @click.native="logout">
+              <span style="display:block;">退出</span>
+            </el-dropdown-item>
+          </template>
+          <template v-else>
+            <el-dropdown-item divided @click.native="proxyLogout">
+              退出代理
+            </el-dropdown-item>
+          </template>
         </el-dropdown-menu>
       </el-dropdown>
     </div>
@@ -56,7 +63,7 @@ export default {
     // Search
   },
   computed: {
-    ...mapGetters(['sidebar', 'device', 'name', 'proxyInfo', 'userIdentity']),
+    ...mapGetters(['sidebar', 'device', 'name', 'userIdentity', 'openSoket', 'proxyState']),
     userName() {
       return this.name
     }
@@ -74,6 +81,12 @@ export default {
         this.$store.dispatch('resetState')
         this.$router.replace('/login')
       }, 500)
+    },
+    proxyLogout() {
+      // 切换到真实登录用户的数据
+      this.$store.dispatch('user/proxyLogout')
+      this.$store.commit('proxy/CLOSE_PROXY')
+      this.$router.replace('/proxy')
     }
   }
 }

+ 2 - 2
src/layout/components/NoticeTodo/index.vue

@@ -110,9 +110,9 @@ export default {
     goReviewPage(msg) {
       if (msg.status !== 0) return
       if (msg.type === 1) {
-        this.$router.push(`/review/auth-list?authUserId=${msg.authUserId}`)
+        this.$router.push(`/review/auth/auth-list?authUserId=${msg.authUserId}`)
       } else {
-        this.$router.push(`/review/shop-list?authId=${msg.authId}`)
+        this.$router.push(`/review/auth/shop-list?authId=${msg.authId}`)
       }
       this.drawer = false
     }

+ 5 - 9
src/main.js

@@ -18,7 +18,6 @@ import './permission' // permission control
 import './utils/error-log' // error log
 
 import * as filters from './filters' // global filters
-// import WebSocket from './utils/WebSocketUtil'
 import './mixin/base' // 公共方法
 /**
  * If you don't want to use mock-server
@@ -28,23 +27,20 @@ import './mixin/base' // 公共方法
  * Currently MockJs will be used in the production environment,
  * please remove it before going online ! ! !
  */
-// if (process.env.NODE_ENV === 'production') {
+// if (process.env.NODE_ENV === 'developer') {
 //   const { mockXHR } = require('../mock')
 //   mockXHR()
 // }
 
-// 开启会话
-// if (store.getters.userIdentity === 1) {
-//   Vue.use(WebSocket, {
-//     namespaced: 'webSocket'
-//   })
-// }
-
 Vue.use(Element, {
   size: Cookies.get('size') || 'medium' // set element-ui default size
   // locale: enLang // 如果使用中文,无需设置,请删除
 })
 
+window.addEventListener('popstate', function() {
+  history.pushState(null, null, document.URL)
+})
+
 // register global utility filters
 Object.keys(filters).forEach(key => {
   Vue.filter(key, filters[key])

+ 32 - 20
src/permission.js

@@ -1,11 +1,13 @@
-import router from './router'
+import router, { resetRouter } from './router'
 import store from './store'
 import { Message } from 'element-ui'
-import { getToken } from '@/utils/auth'
+import { hasLogin, initGoPage } from '@/utils/auth'
 import { createHash } from '@/utils/tools'
 import getPageTitle from '@/utils/get-page-title'
 
+// 不用拦截的路由
 const whiteList = ['/login', '/auth-redirect']
+// 需要添加跳转限制的路由,防止数据冲突
 const toSupplier = ['/supplier/list', '/supplier']
 
 // 重置登录信息和路由信息及标签页信息
@@ -14,13 +16,18 @@ const resetState = () => {
   store.dispatch('resetState')
 }
 
+// 是否开启会话 条件:当前用户为管理员 && socket对象已创建成功
+const isOpenSocket = () => {
+  return store.getters.openSoket && !store.getters.socketState && store.getters.userIdentity === 1
+}
+
 router.beforeEach(async(to, from, next) => {
   // 设置页面名称
   document.title = getPageTitle(to.meta.title)
-  // 获取token
-  const hasToken = getToken()
-
-  if (hasToken) {
+  const proxyInfo = store.getters.proxyInfo
+  const isChangeProxy = store.getters.isChangeProxy
+  // 如果登录过
+  if (hasLogin()) {
     /**
      * 满足要求则关闭所有标签,防止代理数据冲突
      * 条件:1、sotre中存有代理数据 即 proxyInfo !== null
@@ -30,33 +37,38 @@ router.beforeEach(async(to, from, next) => {
       store.dispatch('tagsView/delAllProxyView')
       store.commit('user/SET_PROXY_INFO', null)
     }
-
-    if (to.path === '/login') {
-      // 在登录状态下访问login页面,直接跳转到首页
-      next()
+    // 是否需要初始化路由
+    const hasInitRouter = store.getters.initRouter
+    // 在登录状态下访问login页面,直接跳转到首页
+    if (to.path === '/login' && hasInitRouter) {
+      next(initGoPage())
     } else {
       // 加载国家列表
       store.dispatch('app/setCountry')
-      // 是否需要初始化路由
-      const hasInitRouter = store.getters.initRouter
-      if (hasInitRouter) {
+      // 如果路由已经初始化则不需要再次初始化路由
+      if (hasInitRouter && !isChangeProxy) {
         next()
       } else {
         try {
+          // 是否需要登录代理数据
+          if (proxyInfo !== null) {
+            store.dispatch('user/proxyLogin', proxyInfo) // 代理登录 模拟
+          }
+          resetRouter()
+          console.log(router)
+          store.commit('proxy/CHANGE_PROXY_STATE', false)
+          store.dispatch('resetState')
           // 设置路由的初始化状态
+          store.commit('permission/RESET_STATE')
           store.commit('permission/SET_INITROUTER', true)
-
-          // 通过
           const accessRoutes = await store.dispatch('permission/generateRoutes', store.getters.roles)
-
           // 设置路由
           router.addRoutes(accessRoutes)
-
-          // 初始化会话信息 条件:当前用户为管理员 && socket对象已创建成功
-          if (!store.getters.socketState && store.getters.userIdentity === 1) {
+          // 初始化会话信息
+          if (isOpenSocket()) {
             store.dispatch('webSocket/initMessage')
           }
-
+          // 放行
           next({ ...to, replace: true })
         } catch (error) {
           Message.error(error || '未知错误,请重新登录')

+ 17 - 4
src/router/index.js

@@ -10,6 +10,10 @@ import supplierRoutes from './modules/supplier'
 import authRoutes from './modules/auth'
 import productRoutes from './modules/product'
 import reviewRoutes from './modules/review'
+// import proxyRoutes from './modules/proxy'
+import docRoutes from './modules/doc'
+import feedbackRoutes from './modules/feedback'
+import clubRoutes from './modules/authUser'
 
 /**
  * Note: sub-menu only appear when route children.length >= 1
@@ -36,6 +40,12 @@ import reviewRoutes from './modules/review'
 // 默认路由列表 全部用户都可以访问
 export const constantRoutes = [
   // 登录
+  // 首页显示的页面
+  {
+    path: '/',
+    component: Layout,
+    redirect: '/login'
+  },
   {
     path: '/login',
     component: () => import('@/views/login/index'),
@@ -56,11 +66,10 @@ export const constantRoutes = [
     component: () => import('@/views/error-page/401'),
     hidden: true
   },
-  // 首页显示的页面
   {
-    path: '/',
-    component: Layout,
-    redirect: '/login'
+    path: '/proxy',
+    component: () => import('@/views/authentic/proxy/proxy'),
+    hidden: true
   },
   // 修改密码
   {
@@ -87,6 +96,10 @@ export const asyncRoutes = [
   ...authRoutes,
   ...productRoutes,
   ...reviewRoutes,
+  ...clubRoutes,
+  // ...proxyRoutes,
+  ...docRoutes,
+  ...feedbackRoutes,
 
   // 404页面 放在最后面
   { path: '*', redirect: '/404', hidden: true }

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

@@ -13,7 +13,7 @@ const authRoutes = [
     children: [
       {
         path: 'list',
-        component: () => import('@/views/supplier/auth/index'),
+        component: () => import('@/views/authentic/auth/index'),
         name: 'AuthList',
         meta: { title: '授权列表', icon: 'el-icon-menu', roles: ['admin', 'normal'], affix: true, noCache: true, proxy: true }
       }

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

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

+ 56 - 0
src/router/modules/doc.js

@@ -0,0 +1,56 @@
+/* Layout */
+import Layout from '@/layout'
+
+// 资料管理页面路由
+const docRoutes = [
+  {
+    path: '/doc',
+    component: Layout,
+    alwaysShow: true,
+    redirect: '/doc/article-list',
+    name: 'Doc',
+    meta: { title: '资料管理', icon: 'el-icon-s-management', roles: ['normal'], noCache: true, proxy: true },
+    children: [
+      {
+        path: 'article-list',
+        component: () => import('@/views/authentic/doc/articleList'),
+        name: 'ArticleList',
+        meta: { title: '文章列表', icon: 'el-icon-tickets', roles: ['normal'], noCache: true, proxy: true }
+      },
+      {
+        path: 'article-edit',
+        component: () => import('@/views/authentic/doc/articleEdit'),
+        hidden: true,
+        name: 'ArticleEdit',
+        meta: { title: '编辑文章', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true }
+      },
+      {
+        path: 'image-list',
+        component: () => import('@/views/authentic/doc/imageList'),
+        name: 'ImageList',
+        meta: { title: '图片列表', icon: 'el-icon-picture-outline', roles: ['normal'], noCache: true, proxy: true }
+      },
+      {
+        path: 'image-edit',
+        component: () => import('@/views/authentic/doc/imageEdit'),
+        hidden: true,
+        name: 'ImageEdit',
+        meta: { title: '编辑图片', icon: 'el-icon-menu', roles: ['normal'], noCache: true, proxy: true }
+      },
+      {
+        path: 'video-list',
+        component: () => import('@/views/authentic/doc/videoList'),
+        name: 'VideoList',
+        meta: { title: '视频列表', icon: 'el-icon-video-camera', roles: ['normal'], noCache: true, proxy: true }
+      },
+      {
+        path: 'file-list',
+        component: () => import('@/views/authentic/doc/fileList'),
+        name: 'FileList',
+        meta: { title: '文件列表', icon: 'el-icon-receiving', roles: ['normal'], noCache: true, proxy: true }
+      }
+    ]
+  }
+]
+
+export default docRoutes

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

@@ -0,0 +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: ['admin'], noCache: true },
+    children: [
+      {
+        path: 'list',
+        component: () => import('@/views/authentic/feedback/index'),
+        name: 'FeedbackList',
+        meta: { title: '反馈列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'detail',
+        component: () => import('@/views/authentic/feedback/detail'),
+        name: 'FeedbackDetail',
+        hidden: true,
+        meta: { title: '反馈处理', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      }
+    ]
+  }
+]
+
+export default feedbackRoutes

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

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

+ 66 - 7
src/router/modules/review.js

@@ -3,42 +3,101 @@ import Layout from '@/layout'
 
 // 审核页面路由
 const reviewRoutes = [
+  // 授权机构审核路由
   {
-    path: '/review',
+    path: '/review/auth',
     component: Layout,
     alwaysShow: true,
-    redirect: '/review/list',
-    name: 'Review',
+    name: 'ReviewAuth',
+    redirect: '/review/auth/list',
     meta: { title: '品牌授权审核', icon: 'el-icon-s-check', roles: ['admin'], noCache: true },
     children: [
       {
         path: 'list',
-        component: () => import('@/views/supplier/review/index'),
+        component: () => import('@/views/authentic/review/auth/index'),
         name: 'ReviewList',
         meta: { title: '审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
       },
       {
         path: 'auth-list',
         hidden: true,
-        component: () => import('@/views/supplier/review/authList'),
+        component: () => import('@/views/authentic/review/auth/authList'),
         name: 'ReviewAuthList',
         meta: { title: '授权机构审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
       },
       {
         path: 'shop-list',
         hidden: true,
-        component: () => import('@/views/supplier/review/shopList'),
+        component: () => import('@/views/authentic/review/auth/shopList'),
         name: 'ShopList',
         meta: { title: '商品审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
       },
       {
         path: 'shop-detail',
         hidden: true,
-        component: () => import('@/views/supplier/review/shopDetail'),
+        component: () => import('@/views/authentic/review/auth/shopDetail'),
         name: 'ShopDetail',
         meta: { title: '商品审核详情', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
       }
     ]
+  },
+  // 资料审核路由
+  {
+    path: '/review/doc',
+    component: Layout,
+    alwaysShow: true,
+    name: 'ReviewDoc',
+    meta: { title: '资料审核管理', icon: 'el-icon-s-check', roles: ['admin'], noCache: true },
+    children: [
+      {
+        path: 'list',
+        component: () => import('@/views/authentic/review/doc/index'),
+        name: 'ReviewDocList',
+        meta: { title: '审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'article',
+        component: () => import('@/views/authentic/review/doc/articleList'),
+        name: 'ReviewDocArticle',
+        hidden: true,
+        meta: { title: '文章审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'article/detail',
+        component: () => import('@/views/authentic/review/doc/articleDetail'),
+        name: 'ReviewDocArticleDetail',
+        hidden: true,
+        meta: { title: '审核文章', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'image',
+        component: () => import('@/views/authentic/review/doc/imageList'),
+        name: 'ReviewDocImage',
+        hidden: true,
+        meta: { title: '图片审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'image/detail',
+        component: () => import('@/views/authentic/review/doc/imageDetail'),
+        name: 'ReviewDocImageDetail',
+        hidden: true,
+        meta: { title: '审核图片', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'video',
+        component: () => import('@/views/authentic/review/doc/videoList'),
+        name: 'ReviewDocVideo',
+        hidden: true,
+        meta: { title: '视频审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      },
+      {
+        path: 'file',
+        component: () => import('@/views/authentic/review/doc/fileList'),
+        name: 'ReviewDocFile',
+        hidden: true,
+        meta: { title: '文件审核列表', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
+      }
+    ]
   }
 ]
 

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

@@ -13,21 +13,21 @@ const supplierRoutes = [
     children: [
       {
         path: 'list',
-        component: () => import('@/views/supplier/user/index'),
+        component: () => import('@/views/authentic/supplier/index'),
         name: 'SupplierList',
         meta: { title: '供应商列表', icon: 'el-icon-menu', affix: true, roles: ['admin'], noCache: true }
       },
       {
         hidden: true,
         path: 'add',
-        component: () => import('@/views/supplier/user/add'),
+        component: () => import('@/views/authentic/supplier/add'),
         name: 'SupplierAdd',
         meta: { title: '添加供应商', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
       },
       {
         hidden: true,
         path: 'edit',
-        component: () => import('@/views/supplier/user/edit'),
+        component: () => import('@/views/authentic/supplier/edit'),
         name: 'SupplierEdit',
         meta: { title: '修改供应商', icon: 'el-icon-menu', roles: ['admin'], noCache: true }
       }

+ 7 - 1
src/settings.js

@@ -31,5 +31,11 @@ module.exports = {
    * The default is only used in the production env
    * If you want to also use it in dev, you can pass ['production', 'development']
    */
-  errorLog: 'production'
+  errorLog: 'production',
+
+  /**
+   * @type {boolean} true | false
+   * @description 是否开启消息接收
+   */
+  openSoket: false
 }

+ 4 - 1
src/store/getters.js

@@ -1,4 +1,5 @@
 const getters = {
+  openSoket: state => state.settings.openSoket,
   sidebar: state => state.app.sidebar,
   size: state => state.app.size,
   countryList: state => state.app.countryList,
@@ -13,7 +14,9 @@ const getters = {
   permission_routes: state => state.permission.routes,
   errorLogs: state => state.errorLog.logs,
   initRouter: state => state.permission.initRouter,
-  proxyInfo: state => state.user.proxyInfo,
+  proxyInfo: state => state.proxy.proxyInfo,
+  proxyState: state => state.proxy.proxyState,
+  isChangeProxy: state => state.proxy.isChangeProxy,
   shopType: state => state.user.shopType,
   brandId: state => state.user.brandId,
   socketState: state => state.webSocket.socketState,

+ 38 - 0
src/store/modules/proxy.js

@@ -0,0 +1,38 @@
+const state = {
+  proxyInfo: null,
+  proxyState: false,
+  isChangeProxy: false
+}
+
+const mutations = {
+  // 开启用供应商代理
+  OPEN_PROXY: (state, proxy) => {
+    state.proxyInfo = {
+      authUserId: proxy.authUserId,
+      brandId: proxy.brandId,
+      name: proxy.name,
+      password: proxy.password,
+      shopStatus: proxy.shopStatus ? 1 : 0,
+      shopType: proxy.shopType,
+      userIdentity: 2 // 开启代理
+    }
+    state.proxyState = true // 用于判断是否需要更新路由 ture:需要更新, false:不需要更新
+    state.isChangeProxy = true
+  },
+  // 关闭供应商代理
+  CLOSE_PROXY: (state) => {
+    state.proxyInfo = null
+    state.proxyState = false
+    state.isChangeProxy = true
+  },
+  // 更改代理状态
+  CHANGE_PROXY_STATE: (state, status) => {
+    state.isChangeProxy = status
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations
+}

+ 3 - 2
src/store/modules/settings.js

@@ -1,14 +1,15 @@
 import variables from '@/styles/element-variables.scss'
 import defaultSettings from '@/settings'
 
-const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
+const { showSettings, tagsView, fixedHeader, sidebarLogo, openSoket } = defaultSettings
 
 const state = {
   theme: variables.theme,
   showSettings: showSettings,
   tagsView: tagsView,
   fixedHeader: fixedHeader,
-  sidebarLogo: sidebarLogo
+  sidebarLogo: sidebarLogo,
+  openSoket: openSoket
 }
 
 const mutations = {

+ 27 - 7
src/store/modules/user.js

@@ -3,7 +3,7 @@ import { getToken, setToken, removeToken, setUser, getUser, removeUser } from '@
 import { resetRouter } from '@/router'
 const userInfo = getUser() && JSON.parse(getUser())
 
-function formatRoles(userIdentity) {
+const formatRoles = (userIdentity) => {
   let roles = []
   switch (userIdentity) {
     case 1:
@@ -32,15 +32,19 @@ const state = {
 }
 
 const mutations = {
+  // 设置token
   SET_TOKEN: (state, token) => {
     state.token = token
   },
+  // 设置用户名
   SET_NAME: (state, name) => {
     state.name = name
   },
+  // 设置角色
   SET_ROLES: (state, roles) => {
     state.roles = roles
   },
+  // 设置用户信息
   SET_USERINFO: (state, userInfo) => {
     state.shopStatus = userInfo.shopStatus
     state.authUserId = userInfo.authUserId
@@ -48,12 +52,15 @@ const mutations = {
     state.shopType = userInfo.shopType
     state.brandId = userInfo.brandId
   },
+  // 设置代理供应商信息
   SET_PROXY_INFO: (state, proxyInfo) => {
     state.proxyInfo = proxyInfo
   },
+  // 设置供应商类型
   SET_SHOP_TYPE: (state, shopType) => {
     state.shopType = shopType
   },
+  // 重置用户状态
   RESET_STATE: (state) => {
     state.token = getToken()
     state.name = userInfo?.name || ''
@@ -74,15 +81,14 @@ const actions = {
     return new Promise((resolve, reject) => {
       login({ mobileOrName: username.trim(), password: password })
         .then(response => {
-          const { shopStatus, token, authUserId, userIdentity, name, shopType, brandId } = response.data
-          const roles = formatRoles(userIdentity)
+          console.log(response)
+          const { token, userIdentity, name } = response.data
           commit('SET_TOKEN', token) // 保存token
-          commit('SET_USERINFO', { shopStatus, authUserId, userIdentity, shopType, brandId }) // 保存用户信息
-          commit('SET_ROLES', roles) // 根据用户类型生成角色列表
+          commit('SET_USERINFO', response.data) // 保存用户信息
+          commit('SET_ROLES', formatRoles(userIdentity)) // 根据用户类型生成角色列表
           commit('SET_NAME', name) // 保存用户名称
           setToken(token) // cokies保存token
           setUser(response.data) // cokies保存当前用户信息
-          console.log(response)
           resolve()
         })
         .catch(error => {
@@ -90,7 +96,21 @@ const actions = {
         })
     })
   },
-
+  // 代理用户登录
+  proxyLogin({ commit }, proxy) {
+    const { name, userIdentity } = proxy
+    commit('SET_USERINFO', proxy)
+    commit('SET_ROLES', formatRoles(userIdentity)) // 根据用户类型生成角色列表
+    commit('SET_NAME', name) // 保存用户名称
+  },
+  // 代理用户登出
+  proxyLogout({ commit }) {
+    // 从cookie中重新获取用户信息
+    const userInfo = getUser() && JSON.parse(getUser())
+    commit('SET_USERINFO', userInfo)
+    commit('SET_ROLES', formatRoles(userInfo.userIdentity)) // 根据用户类型生成角色列表
+    commit('SET_NAME', userInfo.name) // 保存用户名称
+  },
   // 退出登录
   logout({ commit }) {
     commit('RESET_STATE')

+ 134 - 115
src/styles/index.scss

@@ -5,234 +5,253 @@
 @import './sidebar.scss';
 @import './btn.scss';
 body {
-    height: 100%;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    text-rendering: optimizeLegibility;
-    font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+  height: 100%;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  text-rendering: optimizeLegibility;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
 }
 
 label {
-    font-weight: 700;
+  font-weight: 700;
 }
 
 html {
-    height: 100%;
-    box-sizing: border-box;
+  height: 100%;
+  box-sizing: border-box;
 }
 
 #app {
-    height: 100%;
+  height: 100%;
 }
 
 *,
 *:before,
 *:after {
-    box-sizing: inherit;
+  box-sizing: inherit;
 }
 
 .no-padding {
-    padding: 0px !important;
+  padding: 0px !important;
 }
 
 .padding-content {
-    padding: 4px 0;
+  padding: 4px 0;
 }
 
 a:focus,
 a:active {
-    outline: none;
+  outline: none;
 }
 
 a,
 a:focus,
 a:hover {
-    cursor: pointer;
-    color: inherit;
-    text-decoration: none;
+  cursor: pointer;
+  color: inherit;
+  text-decoration: none;
 }
 
 div:focus {
-    outline: none;
+  outline: none;
 }
 
 .fr {
-    float: right;
+  float: right;
 }
 
 .fl {
-    float: left;
+  float: left;
 }
 
 .pr-5 {
-    padding-right: 5px;
+  padding-right: 5px;
 }
 
 .pl-5 {
-    padding-left: 5px;
+  padding-left: 5px;
 }
 
 .block {
-    display: block;
+  display: block;
 }
 
 .pointer {
-    cursor: pointer;
+  cursor: pointer;
 }
 
 .inlineBlock {
-    display: block;
+  display: block;
 }
 
 .clearfix {
-    &:after {
-        visibility: hidden;
-        display: block;
-        font-size: 0;
-        content: " ";
-        clear: both;
-        height: 0;
-    }
+  &:after {
+    visibility: hidden;
+    display: block;
+    font-size: 0;
+    content: ' ';
+    clear: both;
+    height: 0;
+  }
 }
 
 aside {
-    background: #eef1f6;
-    padding: 8px 24px;
-    margin-bottom: 20px;
-    border-radius: 2px;
-    display: block;
-    line-height: 32px;
-    font-size: 16px;
-    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
-    color: #2c3e50;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    a {
-        color: #337ab7;
-        cursor: pointer;
-        &:hover {
-            color: rgb(32, 160, 255);
-        }
+  background: #eef1f6;
+  padding: 8px 24px;
+  margin-bottom: 20px;
+  border-radius: 2px;
+  display: block;
+  line-height: 32px;
+  font-size: 16px;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans',
+    'Droid Sans', 'Helvetica Neue', sans-serif;
+  color: #2c3e50;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  a {
+    color: #337ab7;
+    cursor: pointer;
+    &:hover {
+      color: rgb(32, 160, 255);
     }
+  }
 }
 
 //main-container全局样式
 .app-container {
-    padding: 20px;
+  padding: 20px;
 }
 
 .components-container {
-    margin: 30px 50px;
-    position: relative;
+  margin: 30px 50px;
+  position: relative;
 }
 
 .pagination-container {
-    margin-top: 30px;
+  margin-top: 30px;
 }
 
 .text-center {
-    text-align: center
+  text-align: center;
 }
 
 .sub-navbar {
-    height: 50px;
-    line-height: 50px;
-    position: relative;
-    width: 100%;
-    text-align: right;
-    padding-right: 20px;
-    transition: 600ms ease position;
-    background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
-    .subtitle {
-        font-size: 20px;
-        color: #fff;
-    }
-    &.draft {
-        background: #d0d0d0;
-    }
-    &.deleted {
-        background: #d0d0d0;
-    }
+  height: 50px;
+  line-height: 50px;
+  position: relative;
+  width: 100%;
+  text-align: right;
+  padding-right: 20px;
+  transition: 600ms ease position;
+  background: linear-gradient(
+    90deg,
+    rgba(32, 182, 249, 1) 0%,
+    rgba(32, 182, 249, 1) 0%,
+    rgba(33, 120, 241, 1) 100%,
+    rgba(33, 120, 241, 1) 100%
+  );
+  .subtitle {
+    font-size: 20px;
+    color: #fff;
+  }
+  &.draft {
+    background: #d0d0d0;
+  }
+  &.deleted {
+    background: #d0d0d0;
+  }
 }
 
 .link-type,
 .link-type:focus {
-    color: #337ab7;
-    cursor: pointer;
-    &:hover {
-        color: rgb(32, 160, 255);
-    }
+  color: #337ab7;
+  cursor: pointer;
+  &:hover {
+    color: rgb(32, 160, 255);
+  }
 }
 
 .filter-container {
-    padding-bottom: 10px;
-    .filter-item {
-        display: inline-block;
-        vertical-align: middle;
-        margin-bottom: 10px;
-    }
+  padding-bottom: 10px;
+  .filter-item {
+    display: inline-block;
+    vertical-align: middle;
+    margin-bottom: 10px;
+  }
 }
 
 //refine vue-multiselect plugin
 .multiselect {
-    line-height: 16px;
+  line-height: 16px;
 }
 
 .multiselect--active {
-    z-index: 1000 !important;
+  z-index: 1000 !important;
 }
 
 .status {
-    &.success {
-        color: #67C23A;
-    }
-    &.danger {
-        color: #F56C6C;
-    }
-    &.warning {
-        color: #E6A23C;
-    }
+  &.success {
+    color: #67c23a;
+  }
+  &.danger {
+    color: #f56c6c;
+  }
+  &.warning {
+    color: #e6a23c;
+  }
 }
 
 .hidden {
-    .el-upload {
-        display: none !important;
-    }
+  .el-upload {
+    display: none !important;
+  }
 }
 
 .tableHeader {
-    th {
-        background-color: #f7f7f7 !important;
-    }
+  th {
+    background-color: #f7f7f7 !important;
+  }
 }
 
 // .el-badge__content.is-fixed{
 //   top: 14px !important;
 // }
 .el-drawer__header {
-    margin-bottom: 0 !important;
+  margin-bottom: 0 !important;
 }
 
 .table-cell {
-    .cell {
-        overflow: visible !important;
-        .el-badge {
-            vertical-align: 0;
-        }
+  .cell {
+    overflow: visible !important;
+    .el-badge {
+      vertical-align: 0;
     }
+  }
 }
 
 .el-drawer {
-    header {
-        span {
-            outline: none;
-        }
-    }
-    button {
-        outline: none !important;
+  header {
+    span {
+      outline: none;
     }
+  }
+  button {
+    outline: none !important;
+  }
 }
 
 .reason {
-    cursor: pointer;
-}
+  cursor: pointer;
+}
+
+.el-badge {
+  sup {
+    right: 25px !important;
+  }
+}
+
+.review-box {
+  .el-dialog__body {
+    padding-bottom: 0;
+  }
+}

+ 1 - 1
src/utils/WebSocketUtil.js

@@ -46,7 +46,7 @@ export function init() {
 
 // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
 window.onbeforeunload = function() {
-  websocket.close()
+  websocket && websocket.close()
 }
 
 // 关闭连接

+ 16 - 0
src/utils/auth.js

@@ -2,27 +2,43 @@ import Cookies from 'js-cookie'
 
 const TokenKey = 'Admin-Token'
 
+// 获取token
 export function getToken() {
   return Cookies.get(TokenKey)
 }
 
+// 设置token
 export function setToken(token) {
   return Cookies.set(TokenKey, token)
 }
 
+// 移除token
 export function removeToken() {
   return Cookies.remove(TokenKey)
 }
 
+// 设置用户信息
 export function setUser(userInfo) {
   return Cookies.set('userInfo', userInfo)
 }
 
+// 获取用户信息
 export function getUser() {
   return Cookies.get('userInfo')
 }
 
+// 移除用户信息
 export function removeUser() {
   return Cookies.remove('userInfo')
 }
 
+// 用户是否登录
+export function hasLogin() {
+  return getToken() && getUser()
+}
+
+// 跳转页面判定
+export function initGoPage() {
+  const isAdmin = JSON.parse(getUser()).userIdentity === 1
+  return isAdmin ? '/supplier/list' : '/auth/list'
+}

+ 14 - 11
src/utils/open-window.js

@@ -1,22 +1,25 @@
 /**
  *Created by PanJiaChen on 16/11/29.
- * @param {Sting} url
- * @param {Sting} title
- * @param {Number} w
- * @param {Number} h
+ * @param {Sting} url 子窗口需要打开的页面url
+ * @param {Sting} title 页面标题
  */
 export default function openWindow(url, title, w, h) {
   // Fixes dual-screen position                            Most browsers       Firefox
-  const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
-  const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top
+  // const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
+  // const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top
 
-  const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
-  const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height
+  // const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
+  // const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height
 
-  const left = ((width / 2) - (w / 2)) + dualScreenLeft
-  const top = ((height / 2) - (h / 2)) + dualScreenTop
-  const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)
+  const width = w || screen.availWidth - 40
+  const height = h || screen.availHeight - 50
+  // const newWindow = window.open(url, title, 'height=' + (screen.availHeight - 50) + ',width=' + (screen.availWidth - 10) + ',top=0,left=0,toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no')
+  // const left = ((width / 2) - (w / 2)) + dualScreenLeft
+  // const top = ((height / 2) - (h / 2)) + dualScreenTop
+  const left = (screen.availWidth - width) / 2
+  const top = (screen.availHeight - height) / 2
 
+  const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + width + ', height=' + height + ', top=' + top + ', left=' + left)
   // Puts focus on the newWindow
   if (window.focus) {
     newWindow.focus()

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

@@ -212,6 +212,10 @@ export default {
     }
     this.getList()
   },
+  destroyed() {
+    // 页面关闭时清空代理数据
+    // this.$store.commit('user/SET_PROXY_INFO', null)
+  },
   methods: {
     // 获取授权列表
     getList() {

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

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

+ 161 - 0
src/views/authentic/authuser/userList.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>手机号:</span>
+      <el-input
+        v-model="listQuery.InvitationCode"
+        placeholder="手机号"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="邀请码状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已绑定" :value="2" />
+        <el-option label="未绑定" :value="0" />
+        <el-option label="已过期" :value="1" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-thumb" type="primary">生成邀请码</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80px" align="center" />
+      <el-table-column label="邀请码" prop="invitationCode" width="100px" align="center" />
+      <el-table-column label="状态" width="100px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.status === 0" size="small" type="warning">未绑定</el-tag>
+          <el-tag v-if="row.status === 1" size="small" type="success">已绑定</el-tag>
+          <el-tag v-if="row.status === 2" size="small" type="danger">已过期</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="添加时间" width="200px" align="center">
+        <template slot-scope="{row}">
+          <span v-if="row.status!==2">{{ row.createTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="微信昵称" prop="nickName" align="center" />
+      <el-table-column label="手机号" width="140" prop="mobile" align="center" />
+      <el-table-column label="openID" prop="openid" align="center" />
+      <el-table-column label="绑定时间" width="200px" align="center">
+        <template slot-scope="{row}">
+          <span v-if="row.status!==1">{{ row.bindTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="200px" align="center">
+        <template slot-scope="{row}">
+          <el-button v-if="row.status === 1" type="danger" size="mini" style="margin-right:5px">解绑邀请码</el-button>
+          <el-button v-else type="primary" size="mini" style="margin-right:5px">更新邀请码</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        invitationCode: '', // 供应商类型
+        status: '' // 审核状态
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo'])
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          invitationCode: '@string("number",6)',
+          nickName: '@ctitle(4,10)',
+          status: '@natural(0,2)',
+          mobile: '@string("number",11)',
+          openid: '@string(30)',
+          createTime: '@date("yy-MM-dd hh:mm:ss")',
+          bindTime: '@date("yy-MM-dd hh:mm:ss")'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 0 - 0
src/views/supplier/components/uploadFile.vue → src/views/authentic/components/uploadFile.vue


+ 1 - 1
src/views/supplier/components/uploadImage.vue → src/views/authentic/components/uploadImage.vue

@@ -16,7 +16,7 @@
     >
       <!-- :class="{hidden:(hasUpload && fileList===[]) || !hasUpload}" -->
       <div slot="tip" class="el-upload__tip">建议尺寸:{{ tipTitle }}</div>
-      <i class="el-icon-plus" />
+      <i class="el-icon-picture-outline" />
     </el-upload>
     <el-dialog :visible.sync="dialogVisible">
       <img width="100%" :src="dialogImageUrl" alt="">

+ 70 - 0
src/views/authentic/doc/articleEdit.vue

@@ -0,0 +1,70 @@
+<template>
+  <div v-loading="isLoading" class="app-container">
+    <div class="form">
+      <el-form label-width="120px">
+        <el-form-item label="标题:">
+          <el-input placeholder="请输入文章标题" maxlength="50" show-word-limit />
+        </el-form-item>
+        <el-form-item label="头图:">
+          <upload-image tip-title="128px * 128px" />
+          <el-input class="hiddenInput" />
+        </el-form-item>
+        <el-form-item label="文章内容:">
+          <tinymce v-model="content" :token="token" :action="action" :height="300" />
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="submit-btn">
+      <el-button type="primary" @click="submit">保存</el-button>
+      <el-button type="warning" @click="$_back()">返回</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import UploadImage from '../components/uploadImage'
+import Tinymce from '@/components/Tinymce'
+import { getToken } from '@/utils/auth'
+export default {
+  components: { UploadImage, Tinymce },
+  data() {
+    return {
+      isLoading: true,
+      token: '',
+      action: process.env.VUE_APP_UPLOAD_API + '/upload/image',
+      content: ''
+    }
+  },
+  created() {
+    this.token = getToken()
+  },
+  mounted() {
+    setTimeout(() => {
+      this.isLoading = false
+    }, 500)
+  },
+  methods: {
+    submit() {}
+
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container{
+  .form{
+    width: 1000px;
+    margin: 30px auto;
+  }
+}
+.hiddenInput{
+  height: 0;
+  display: none;
+}
+.submit-btn {
+  text-align: center;
+  .el-button {
+    width: 140px;
+  }
+}
+</style>

+ 194 - 0
src/views/authentic/doc/articleList.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>文章标题:</span>
+      <el-input
+        v-model="listQuery.articleTitle"
+        placeholder="文章标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-edit" type="primary">添加文章</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="文章标题" prop="articleTitle" align="center" />
+      <el-table-column label="文章头图" width="200" align="center">
+        <template slot-scope="{ row }">
+          <el-image
+            style="width: 50px; height: 50px"
+            :src="row.articleCover"
+            :preview-src-list="srcList"
+          /></template>
+      </el-table-column>
+      <el-table-column label="审核状态" width="180px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="上线状态" width="180px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="240px" 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>
+          <el-button type="primary" size="mini" style="margin-right:5px" icon="el-icon-edit" @click="$_navigationTo(`/doc/article-edit`)">编辑</el-button>
+          <el-button type="danger" size="mini" style="margin-right:5px" icon="el-icon-s-check">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        articleTitle: '', // 供应商类型
+        lowerAuditStatus: '', // 审核状态
+        status: ''
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo'])
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          articleId: '@natural',
+          articleTitle: '@ctitle(20,30)',
+          articleCover: '@image("100x100")',
+          auditStatus: '@natural(0,2)',
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)',
+          status: '@natural(0,1)'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 247 - 0
src/views/authentic/doc/fileList.vue

@@ -0,0 +1,247 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>文件标题:</span>
+      <el-input
+        v-model="listQuery.articleTitle"
+        placeholder="文件标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-edit" type="primary" @click="handleShowDialog('add')">添加文件</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="文件标题" prop="articleTitle" align="center" />
+      <el-table-column label="审核状态" width="180px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="上线状态" width="180px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="240px" 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>
+          <el-button type="primary" size="mini" style="margin-right:5px" icon="el-icon-edit" @click="handleShowDialog('edit')">编辑</el-button>
+          <el-button type="danger" size="mini" style="margin-right:5px" icon="el-icon-s-check">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <!-- 视频预览对话框 -->
+    <el-dialog
+      :title="dialogTitle"
+      :visible.sync="dialogVisible"
+      width="40%"
+      @closed="dialogColosed"
+    >
+      <el-form ref="formRef" :model="dialogData" label-width="110px" :rules="dialogFormRules">
+        <el-form-item label="标题:" prop="title">
+          <el-input v-model="dialogData.title" maxlength="50" show-word-limit />
+        </el-form-item>
+        <el-form-item label="文件链接:" prop="url">
+          <div class="clearfix">
+            <el-input v-model="dialogData.url" style="width:80%" class="fl" />
+            <el-upload
+              style="width:18%"
+              class="upload-demo fr"
+              accept=".mp4"
+              :headers="headers"
+              :action="action"
+            >
+              <el-button type="primary" style="width:100%">上传文件</el-button>
+            </el-upload>
+          </div>
+          <span style="color:#999;font-size:12px">如果没有链接,可以点击右侧的上传文件,文件只支持pdf</span>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="handleAuditStatus">提 交</el-button>
+      </div>
+    </el-dialog>
+    <!-- 视频预览对话框END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+import { getToken } from '@/utils/auth'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      dialogVisible: false,
+      dialogTitle: '添加文件',
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        articleTitle: '', // 供应商类型
+        lowerAuditStatus: '', // 审核状态
+        status: ''
+      },
+      dialogData: {
+        title: '',
+        url: ''
+      },
+      dialogFormRules: {
+        title: [{ required: true, message: '标题不能为空', trigger: 'blur' }],
+        url: [{ required: true, message: '链接不能为空', trigger: 'blur' }]
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo']),
+    headers() {
+      return {
+        'X-Token': getToken()
+      }
+    },
+    action() {
+      return `${process.env.VUE_APP_UPLOAD_API}/upload/image`
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          articleId: '@natural',
+          articleTitle: '@ctitle(20,30)',
+          articleCover: '@image("100x100")',
+          auditStatus: '@natural(0,2)',
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)',
+          status: '@natural(0,1)'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    },
+    handleAuditStatus() {
+    },
+    handleShowDialog() {
+      this.dialogVisible = true
+    },
+    dialogColosed(type) {
+      this.dialogTitle = type === 'add' ? '添加文件' : '修改文件'
+      this.$refs.formRef.resetFields()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 101 - 0
src/views/authentic/doc/imageEdit.vue

@@ -0,0 +1,101 @@
+<template>
+  <div class="app-container">
+    <div class="form">
+      <el-form ref="formRef" :model="formData" :rules="formRules" label-width="70px">
+        <el-form-item label="标题:" prop="title">
+          <el-input v-model="formData.title" placeholder="图片列表标题" maxlength="50" show-word-limit />
+        </el-form-item>
+        <el-form-item label="图片:" prop="imgUrl">
+          <el-upload
+            class="upload-control"
+            :class="{hidden:count === 8}"
+            list-type="picture-card"
+            accept=".png,.jpg,.gif"
+            :action="action"
+            :headers="headers"
+            :multiple="true"
+            :limit="8"
+            :file-list="imageList"
+            :on-remove="handleRemove"
+            :on-success="handleUploadSuccess"
+          >
+            <i class="el-icon-picture-outline" />
+            <div slot="tip" class="el-upload__tip" style="color:#999"><span style="color:red">*</span>最多只能上传8张图片</div>
+          </el-upload>
+          <el-input v-model="formData.imgUrl" class="hiddenInput" />
+        </el-form-item>
+      </el-form>
+      <div class="submit-btn">
+        <el-button type="primary" @click="submit">保存</el-button>
+        <el-button type="warning" @click="$_back()">返回</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getToken } from '@/utils/auth'
+export default {
+  data() {
+    return {
+      imageList: [],
+      count: 0,
+      formData: {
+        title: '',
+        imgUrl: ''
+      },
+      formRules: {
+        title: [
+          { required: true, message: '标题不能为空', trigger: 'blur' },
+          { max: 50, message: '标题不能超过50个字符', trigger: 'blur' }
+        ],
+        imgUrl: [
+          { required: true, message: '图片列表不能为空', trigger: 'change' }
+        ]
+      }
+    }
+  },
+  computed: {
+    headers() {
+      return {
+        'X-Token': getToken()
+      }
+    },
+    action() {
+      return `${process.env.VUE_APP_UPLOAD_API}/upload/image`
+    }
+  },
+  watch: {
+    count(nVal, oVal) {
+      this.formData.imgUrl = (nVal > 0 ? 'has image' : '')
+    }
+  },
+  methods: {
+    submit() {},
+    handleUploadSuccess(response, file, fileList) {
+      this.count = fileList.length
+    },
+    handleRemove(file, fileList) {
+      this.count = fileList.length
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.form{
+  width: 700px;
+  margin: 30px auto;
+  .submit-btn {
+    text-align: left;
+    padding-left: 70px;
+    .el-button {
+      width: 140px;
+    }
+  }
+}
+.hiddenInput{
+  height: 0;
+  display: none;
+}
+</style>

+ 186 - 0
src/views/authentic/doc/imageList.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>文章标题:</span>
+      <el-input
+        v-model="listQuery.articleTitle"
+        placeholder="图片标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-edit" type="primary">添加图片</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="图片标题" prop="articleTitle" align="center" />
+      <el-table-column label="审核状态" width="180px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="上线状态" width="180px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="240px" 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>
+          <el-button type="primary" size="mini" style="margin-right:5px" icon="el-icon-edit" @click="$_navigationTo(`/doc/image-edit`)">编辑</el-button>
+          <el-button type="danger" size="mini" style="margin-right:5px" icon="el-icon-s-check">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        articleTitle: '', // 供应商类型
+        lowerAuditStatus: '', // 审核状态
+        status: ''
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo'])
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          articleId: '@natural',
+          articleTitle: '@ctitle(20,30)',
+          articleCover: '@image("100x100")',
+          auditStatus: '@natural(0,2)',
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)',
+          status: '@natural(0,1)'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 247 - 0
src/views/authentic/doc/videoList.vue

@@ -0,0 +1,247 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>视频标题:</span>
+      <el-input
+        v-model="listQuery.articleTitle"
+        placeholder="视频标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <span>上线状态:</span>
+      <el-select
+        v-model="listQuery.status"
+        placeholder="上线状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已上线" :value="1" />
+        <el-option label="待上线" :value="2" />
+        <el-option label="未上线" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-edit" type="primary" @click="handleShowDialog('add')">添加视频</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="视频标题" prop="articleTitle" align="center" />
+      <el-table-column label="审核状态" width="180px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.auditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="上线状态" width="180px" align="center">
+        <template slot-scope="{row}">
+          <!-- 只有审核通过了才能操作上下线 auditStatus :审核状态 -->
+          <template v-if="row.auditStatus === 1">
+            <template v-if="row.status === 0">
+              <span style="margin-right:10px;" class="status danger">已下线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="primary" size="mini" @click="handleChangeStatus(row)">上线</el-button>
+            </template>
+            <template v-else>
+              <span style="margin-right:10px;" class="status success ">已上线</span>
+              <el-button v-if="userIdentity===2 || proxyInfo!==null" type="info" size="mini" plain @click="handleChangeStatus(row)">下线</el-button>
+            </template>
+          </template>
+          <template v-else>
+            <!-- <el-tag type="warning">待上线</el-tag> -->
+            <span style="margin-right:10px;" class="status warning">待上线</span>
+          </template>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="240px" 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>
+          <el-button type="primary" size="mini" style="margin-right:5px" icon="el-icon-edit" @click="handleShowDialog('edit')">编辑</el-button>
+          <el-button type="danger" size="mini" style="margin-right:5px" icon="el-icon-s-check">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <!-- 视频预览对话框 -->
+    <el-dialog
+      :title="dialogTitle"
+      :visible.sync="dialogVisible"
+      width="40%"
+      @closed="dialogColosed"
+    >
+      <el-form ref="formRef" :model="dialogData" label-width="110px" :rules="dialogFormRules">
+        <el-form-item label="标题:" prop="title">
+          <el-input v-model="dialogData.title" maxlength="50" show-word-limit />
+        </el-form-item>
+        <el-form-item label="视频链接:" prop="url">
+          <div class="clearfix">
+            <el-input v-model="dialogData.url" style="width:80%" class="fl" />
+            <el-upload
+              style="width:18%"
+              class="upload-demo fr"
+              accept=".mp4"
+              :headers="headers"
+              :action="action"
+            >
+              <el-button type="primary" style="width:100%">上传视频</el-button>
+            </el-upload>
+          </div>
+          <span style="color:#999;font-size:12px">如果没有链接,可以点击右侧的上传视频,视频大小不能超过<i style="color:red">*50MB*</i></span>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="handleAuditStatus">提 交</el-button>
+      </div>
+    </el-dialog>
+    <!-- 视频预览对话框END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+import { getToken } from '@/utils/auth'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      dialogVisible: false,
+      dialogTitle: '添加视频',
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        articleTitle: '', // 供应商类型
+        lowerAuditStatus: '', // 审核状态
+        status: ''
+      },
+      dialogData: {
+        title: '',
+        url: ''
+      },
+      dialogFormRules: {
+        title: [{ required: true, message: '标题不能为空', trigger: 'blur' }],
+        url: [{ required: true, message: '链接不能为空', trigger: 'blur' }]
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo']),
+    headers() {
+      return {
+        'X-Token': getToken()
+      }
+    },
+    action() {
+      return `${process.env.VUE_APP_UPLOAD_API}/upload/image`
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          articleId: '@natural',
+          articleTitle: '@ctitle(20,30)',
+          articleCover: '@image("100x100")',
+          auditStatus: '@natural(0,2)',
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)',
+          status: '@natural(0,1)'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    },
+    handleAuditStatus() {
+    },
+    handleShowDialog() {
+      this.dialogVisible = true
+    },
+    dialogColosed(type) {
+      this.dialogTitle = type === 'add' ? '添加视频' : '修改视频'
+      this.$refs.formRef.resetFields()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 65 - 0
src/views/authentic/feedback/detail.vue

@@ -0,0 +1,65 @@
+<template>
+  <div class="app-container">
+    <div class="form">
+      <h2>反馈处理</h2>
+      <el-form label-width="100px" :rules="formRules" :model="formData">
+        <el-form-item label="机构名称:">
+          专业线贵妇级除皱产品--希腊YELLOW ROSE黄玫瑰弹力除皱精华和玻尿酸花瓣保湿水
+        </el-form-item>
+        <el-form-item label="手机号:">15818778888</el-form-item>
+        <el-form-item label="反馈内容:">
+          输入关键词“希腊YELLOW ROSE”、“希腊黄玫瑰”即可在采美365网和百度上搜索到相关商品信息。
+          皱纹是青春的头号杀手。面部肌肤的皱纹、松弛、暗沉、下垂、眼袋等,一直是广大的爱美朋友关注的保养问题,除皱抗衰类的保养品一直是化妆品市场的宠儿。
+          皱纹是日积月累的阳光伤害和皮肤的天然支撑结构不可避免的弱化造成的,与皮肤干燥引起的浅表性细纹完全不同,难以通过水乳或基础的护肤品来淡化,需高浓度的产品才能快速淡化。
+          在科学上,有效的除皱成分其实很少,在运用护肤品去除皱纹时,除了选择有科学支持的淡皱成分为主,最好搭配其它具延缓衰老的成分为辅,通力合作,协同增效。
+          本期新品推荐希腊品牌YELLOW ROSE的两款专业线贵妇级除皱产品:金色系列-弹力除皱精华和玻尿酸系
+        </el-form-item>
+        <el-form-item label="处理状态:">
+          <span v-if="formData.auditStatus===0" class="status danger">未处理</span>
+          <span v-if="formData.auditStatus===1" class="status success">已处理</span>
+        </el-form-item>
+        <el-form-item label="处理结果:" prop="invalidReason">
+          <el-input v-model="formData.invalidReason" type="textarea" placeholder="请说明原因" />
+        </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 {
+      formData: {
+        auditStatus: 0,
+        invalidReason: ''
+      },
+      formRules: {
+        invalidReason: { required: true, message: '处理结果不能为空', tigger: 'blur' }
+      }
+    }
+  },
+  methods: {
+    submit() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.form{
+  width: 800px;
+  margin: 30px auto;
+  .el-button{
+    width: 120px;
+  }
+  h2{
+    text-align: center;
+    margin-bottom: 45px;
+    color: #444;
+  }
+}
+</style>

+ 202 - 0
src/views/authentic/feedback/index.vue

@@ -0,0 +1,202 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>机构名称:</span>
+      <el-input
+        v-model="listQuery.articleTitle"
+        placeholder="机构名称"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>手机号:</span>
+      <el-input v-model="listQuery.mobile" placeholder="手机号" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
+      <span>处理状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="处理状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已处理" :value="2" />
+        <el-option label="未处理" :value="0" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+      <el-button v-if="userIdentity === 2 || proxyInfo!==null" icon="el-icon-edit" type="primary">添加文章</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column type="expand" width="50">
+        <template slot-scope="{row}">
+          <el-form label-position="left" class="table-expand">
+            <el-form-item label="机构名称:">
+              <span>{{ row.articleTitle }}</span>
+            </el-form-item>
+            <el-form-item label="手机号:">
+              <span>{{ row.mobile }}</span>
+            </el-form-item>
+            <el-form-item label="提交时间:">
+              <span>{{ row.auditTime }}</span>
+            </el-form-item>
+            <el-form-item label="处理状态:">
+              <span>
+                <el-tag v-if="row.auditStatus === 0" size="small" type="danger">未处理</el-tag>
+                <el-tag v-if="row.auditStatus === 1" size="small" type="success">已处理</el-tag>
+              </span>
+            </el-form-item>
+            <el-form-item label="反馈内容:">
+              <span>{{ row.mobile }}</span>
+            </el-form-item>
+            <el-form-item label="处理结果:">
+              <span>{{ row.mobile }}</span>
+            </el-form-item>
+          </el-form>
+        </template>
+      </el-table-column>
+      <el-table-column label="机构名称" prop="articleTitle" align="center" />
+      <el-table-column label="手机号" prop="mobile" width="120" align="center" />
+      <el-table-column label="反馈内容" prop="mobile" align="center" />
+      <el-table-column label="提交时间" width="180px" 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="100px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.auditStatus === 0" size="small" type="danger">未处理</el-tag>
+          <el-tag v-if="row.auditStatus === 1" size="small" type="success">已处理</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理结果" prop="mobile" align="center" />
+      <el-table-column label="处理时间" width="180px" 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="120px" align="center">
+        <template>
+          <el-button type="primary" size="mini" style="margin-right:5px" icon="el-icon-edit" @click="$_navigationTo(`/feedback/detail`)">处理</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+import { mapGetters } from 'vuex'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        articleTitle: '', // 供应商类型
+        lowerAuditStatus: '', // 审核状态
+        status: ''
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['authUserId', 'userIdentity', 'proxyInfo'])
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          articleId: '@natural',
+          mobile: "@string('number',11)", // 手机号
+          articleTitle: '@ctitle(4,15)',
+          articleCover: '@image("100x100")',
+          auditStatus: '@natural(0,2)',
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)',
+          status: '@natural(0,1)'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+// .table-expand {
+//     font-size: 0;
+//     padding-left: 130px;
+//   }
+//   .table-expand label {
+//     width: 90px;
+//     color: #99a9bf;
+//   }
+//   .table-expand .el-form-item {
+//     margin-right: 0;
+//     margin-bottom: 0;
+//     width: 30%;
+//   }
+</style>

+ 0 - 0
src/views/supplier/product/add.vue → src/views/authentic/product/add.vue


+ 0 - 0
src/views/supplier/product/edit.vue → src/views/authentic/product/edit.vue


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


+ 16 - 0
src/views/authentic/proxy/proxy.vue

@@ -0,0 +1,16 @@
+<template>
+  <div />
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+export default {
+  computed: {
+    ...mapGetters(['proxyState'])
+  },
+  created() {
+    const path = this.proxyState ? '/auth' : '/supplier'
+    this.$router.push(path)
+  }
+}
+</script>

+ 0 - 0
src/views/supplier/review/authList.vue → src/views/authentic/review/auth/authList.vue


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

@@ -34,7 +34,7 @@
       <span>审核状态:</span>
       <el-select
         v-model="listQuery.lowerAuditStatus"
-        placeholder="供应商类型"
+        placeholder="审核状态"
         clearable
         style="width: 200px"
         class="filter-item"

+ 1 - 1
src/views/supplier/review/shopDetail.vue → src/views/authentic/review/auth/shopDetail.vue

@@ -104,7 +104,7 @@ export default {
             if (res.code !== 0) return
             this.$message.success(res.data)
             this.$store.dispatch('tagsView/delView', this.$route)
-            this.$router.replace(`/review/shop-list?authId=${this.authId}`)
+            this.$router.replace(`/review/auth/shop-list?authId=${this.authId}`)
             this.setMessageState({ id: parseInt(this.formData.productId), type: 2 })
           }).finally(() => {
             this.isLoading = false

+ 0 - 0
src/views/supplier/review/shopList.vue → src/views/authentic/review/auth/shopList.vue


+ 19 - 0
src/views/authentic/review/doc/articleDetail.vue

@@ -0,0 +1,19 @@
+<template>
+  <div class="app-container">
+    <div v-html="innerHtml" />
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      innerHtml: '<h2>我是文章标题</h2>'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 166 - 0
src/views/authentic/review/doc/articleList.vue

@@ -0,0 +1,166 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>文章标题:</span>
+      <el-input
+        v-model="listQuery.articleTitle"
+        placeholder="文章标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="文章标题" prop="articleTitle" align="center" />
+      <el-table-column label="文章头图" width="200" align="center">
+        <template slot-scope="{ row }">
+          <el-image
+            style="width: 50px; height: 50px"
+            :src="row.articleCover"
+            :preview-src-list="srcList"
+          /></template>
+      </el-table-column>
+      <el-table-column label="审核状态" width="150px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.articleAuditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.articleAuditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.articleAuditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="250px" align="center">
+        <template slot-scope="{row}">
+          <span v-if="row.articleAuditStatus!==2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="审核人" align="center" width="200px">
+        <template slot-scope="{row}">
+          <span v-if="row.articleAuditStatus!==2">{{ row.auditBy }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="150px" align="center">
+        <template slot-scope="{row}">
+          <el-button
+            type="warning"
+            size="mini"
+            style="margin-right:5px"
+            icon="el-icon-s-check"
+            @click="$_navigationTo(`/review/doc/article/detail?articleId=${row.articleId}`)"
+          >审核</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        articleTitle: '', // 供应商类型
+        lowerAuditStatus: '' // 审核状态
+      },
+      list: [],
+      srcList: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          articleId: '@natural',
+          articleTitle: '@ctitle(5,10)', // 供应商名称
+          articleCover: '@image("100x100")',
+          articleAuditStatus: '@natural(0,2)', // 审核状态
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)'
+        }))
+      }
+      this.list = list
+      this.initPreviewList(list)
+    },
+    // 初始化预览图片列表
+    initPreviewList(list) {
+      list.forEach(item => this.srcList.push(item.articleCover))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 225 - 0
src/views/authentic/review/doc/fileList.vue

@@ -0,0 +1,225 @@
+<template>
+  <div class="app-container review-box">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>文件名称:</span>
+      <el-input
+        v-model="listQuery.fileTitle"
+        placeholder="文件名称"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="文件名称" prop="fileTitle" align="center" />
+      <el-table-column label="审核状态" width="150px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.fileAuditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.fileAuditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.fileAuditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="250px" align="center">
+        <template slot-scope="{row}">
+          <span v-if="row.fileAuditStatus!==2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="审核人" align="center" width="200px">
+        <template slot-scope="{row}">
+          <span v-if="row.fileAuditStatus!==2">{{ row.auditBy }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="150px" align="center">
+        <template slot-scope="{row}">
+          <el-button
+            type="warning"
+            size="mini"
+            style="margin-right:5px"
+            icon="el-icon-s-check"
+            @click="handleShowDialog(row)"
+          >审核</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <!-- 视频预览对话框 -->
+    <el-dialog
+      title="视频审核"
+      :visible.sync="dialogVisible"
+      width="40%"
+      @closed="dialogColosed"
+    >
+      <el-form ref="formRef" :model="dialogData" label-width="65px" :rules="dialogFormRules">
+        <el-form-item label="标题:">
+          专业线贵妇级除皱产品--希腊YELLOW ROSE黄玫瑰弹力除皱精华和玻尿酸花瓣保湿水
+        </el-form-item>
+        <el-form-item label="文件:">
+          <img src="@/assets/img/pdf_cover.png" alt="文件封面" width="60" height="60">
+          <span class="preview" @click.prevent="handlePreviewFile">预览</span>
+        </el-form-item>
+        <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 slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="handleAuditStatus">提 交</el-button>
+      </div>
+    </el-dialog>
+    <!-- 视频预览对话框END -->
+  </div>
+</template>
+
+<script>
+import openWindow from '@/utils/open-window'
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        fileTitle: '', // 供应商类型
+        lowerAuditStatus: '' // 审核状态
+      },
+      list: [],
+      current: {
+        currentfileUrl: 'https://element.eleme.io',
+        fileName: '文件预览'
+      },
+      dialogData: {
+        auditStatus: 1,
+        invalidReason: ''
+      },
+      dialogFormRules: {
+        invalidReason: {
+          required: true,
+          message: '不通过原因不能为空',
+          tigger: 'blur'
+        }
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          fileId: '@natural',
+          fileTitle: '@ctitle(5,10)', // 供应商名称
+          fileAuditStatus: '@natural(0,2)', // 审核状态
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)'
+        }))
+      }
+      this.list = list
+    },
+    handleShowDialog({ url, fileName }) {
+      // this.current.currentfileUrl = url
+      // this.current.fileName = fileName
+      this.dialogVisible = true
+    },
+    dialogColosed() {
+      this.currentfileUrl = ''
+      this.dialogData.auditStatus = 1
+    },
+    handleAuditStatus() {
+      this.$refs.formRef.validate(valid => {
+        if (valid) {
+          console.log(valid)
+        }
+      })
+    },
+    handlePreviewFile() {
+      console.log(this.current)
+      openWindow(this.current.currentfileUrl, this.current.fileName, 1200, 600)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+.preview{
+  cursor: pointer;
+  margin-left: 5px;
+  color: #0eaae7;
+}
+</style>

+ 77 - 0
src/views/authentic/review/doc/imageDetail.vue

@@ -0,0 +1,77 @@
+<template>
+  <div class="app-container">
+    <div class="detail">
+      <el-form ref="formRef" label-width="120px" :model="formData" :rules="formRules">
+        <el-form-item label="标题:">
+          {{ title }}
+        </el-form-item>
+        <el-form-item label="图片:">
+          <template v-for="(item,index) in srcList">
+            <el-image :key="index" style="width: 150px; height: 150px" :src="item" :preview-src-list="srcList" />
+          </template>
+        </el-form-item>
+        <el-form-item label="审核状态:">
+          <el-radio-group v-model="formData.auditStatus">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="0">不通过</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item v-if="formData.auditStatus!==1" prop="invalidReason" label="原因:">
+          <el-input v-model="formData.invalidReason" type="textarea" placeholder="请说明原因" />
+        </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 {
+      srcList: [
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
+        'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg'
+      ],
+      title: '专业线贵妇级除皱产品--希腊YELLOW ROSE黄玫瑰弹力除皱精华和玻尿酸花瓣保湿水',
+      formData: {
+        auditStatus: 1,
+        invalidReason: ''
+      },
+      formRules: {
+        invalidReason: { required: true, message: '不通过原因不能为空', tigger: 'blur' }
+      }
+    }
+  },
+  created() {
+  },
+  methods: {
+    submit() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.detail{
+  width: 800px;
+  margin: 25px auto;
+  .el-image{
+    margin-right: 12px;
+    &:nth-child(4n){
+      margin-right: 0;
+    }
+  }
+  .el-button{
+    width: 120px;
+  }
+}
+</style>

+ 151 - 0
src/views/authentic/review/doc/imageList.vue

@@ -0,0 +1,151 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>图片标题:</span>
+      <el-input
+        v-model="listQuery.imageTitle"
+        placeholder="文章标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="图片标题" prop="imageTitle" align="center" />
+      <el-table-column label="审核状态" width="150px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.imageAuditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.imageAuditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.imageAuditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="250px" align="center">
+        <template slot-scope="{row}">
+          <span v-if="row.imageAuditStatus!==2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="审核人" align="center" width="200px">
+        <template slot-scope="{row}">
+          <span v-if="row.imageAuditStatus!==2">{{ row.auditBy }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="150px" align="center">
+        <template slot-scope="{row}">
+          <el-button
+            type="warning"
+            size="mini"
+            style="margin-right:5px"
+            icon="el-icon-s-check"
+            @click="$_navigationTo(`/review/doc/image/detail?imageId=${row.imageId}`)"
+          >审核</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        imageTitle: '', // 供应商类型
+        lowerAuditStatus: '' // 审核状态
+      },
+      list: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          imageId: '@natural',
+          imageTitle: '@ctitle(5,10)', // 供应商名称
+          imageAuditStatus: '@natural(0,2)', // 审核状态
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)'
+        }))
+      }
+      this.list = list
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 196 - 0
src/views/authentic/review/doc/index.vue

@@ -0,0 +1,196 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>供应商名称:</span>
+      <el-input
+        v-model="listQuery.shopName"
+        placeholder="供应商名称"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>供应商类型:</span>
+      <el-select
+        v-model="listQuery.shopType"
+        placeholder="供应商类型"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="所有类型" value="" />
+        <el-option label="代理商" :value="2" />
+        <el-option label="品牌方" :value="1" />
+      </el-select>
+      <span>手机号:</span>
+      <el-input
+        v-model="listQuery.mobile"
+        placeholder="手机号"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="供应商类型"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="已完成审核" :value="1" />
+        <el-option label="未完成审核" :value="0" />
+      </el-select>
+      <span>联系人:</span>
+      <el-input
+        v-model="listQuery.linkMan"
+        placeholder="联系人"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column prop="name" label="供应商名称" align="center" />
+      <el-table-column label="供应商类型" width="150px" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.shopType === 1">品牌方</span>
+          <span v-if="row.shopType === 2">代理商</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="mobile" label="手机号" width="200px" align="center" />
+      <el-table-column prop="linkMan" label="联系人" width="200px" align="center" />
+      <el-table-column label="审核状态" width="150px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.lowerAuditStatus === 0" size="small" type="danger">未完成审核</el-tag>
+          <el-tag v-if="row.lowerAuditStatus === 1" size="small" type="success">已完成审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="待审核" width="460px" align="center">
+        <template slot-scope="{ row }">
+          <el-badge :hidden="row.lowerAuditStatus === 1" :value="row.waitAuditArticleNum" :max="99">
+            <el-button
+              type="primary"
+              icon="el-icon-tickets"
+              size="mini"
+              @click="$_navigationTo(`/review/doc/article?authUserId=${row.authUserId}`)"
+            >文章</el-button>
+          </el-badge>
+          <el-badge :hidden="row.lowerAuditStatus === 1" :value="row.waitAuditimageNum" :max="99">
+            <el-button
+              type="primary"
+              icon="el-icon-picture-outline"
+              size="mini"
+              @click="$_navigationTo(`/review/doc/image?authUserId=${row.authUserId}`)"
+            >图片</el-button>
+          </el-badge>
+          <el-badge :hidden="row.lowerAuditStatus === 1" :value="row.waitAuditVideoNum" :max="99">
+            <el-button
+              type="primary"
+              icon="el-icon-video-camera"
+              size="mini"
+              @click="$_navigationTo(`/review/doc/video?authUserId=${row.authUserId}`)"
+            >视频</el-button>
+          </el-badge>
+          <el-badge :hidden="row.lowerAuditStatus === 1" :value="row.waitAuditfileNum" :max="99">
+            <el-button
+              type="primary"
+              icon="el-icon-document-copy"
+              size="mini"
+              @click="$_navigationTo(`/review/doc/file?authUserId=${row.authUserId}`)"
+            >文件</el-button>
+          </el-badge>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+export default {
+  data() {
+    return {
+      listLoading: false,
+      listQuery: {
+        linkMan: '', // 联系人
+        mobile: '', // 手机号
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        shopName: '', // 供应商名称
+        shopType: '', // 供应商类型
+        lowerAuditStatus: '' // 审核状态
+      },
+      list: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          authUserId: '@natural',
+          name: '@ctitle(5,10)', // 供应商名称
+          shopType: '@natural(1,2)', // 供应商类型
+          mobile: "@string('number',11)", // 手机号
+          linkMan: '@cname(2,6)', // 联系人
+          lowerAuditStatus: '@natural(0,1)', // 审核状态
+          waitAuditArticleNum: '@natural(0,200)', // 待审核文章条数
+          waitAuditimageNum: '@natural(0,200)', // 待审核图片条数
+          waitAuditVideoNum: '@natural(0,200)', // 待审核视频条数
+          waitAuditfileNum: '@natural(0,200)' // 待审核文件条数
+        }))
+      }
+      this.list = list
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 211 - 0
src/views/authentic/review/doc/videoList.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="app-container review-box">
+    <!-- 搜索区域 -->
+    <div class="filter-container">
+      <span>视频名称:</span>
+      <el-input
+        v-model="listQuery.videoTitle"
+        placeholder="文章标题"
+        style="width: 200px"
+        class="filter-item"
+        @keyup.enter.native="getList"
+      />
+      <span>审核状态:</span>
+      <el-select
+        v-model="listQuery.lowerAuditStatus"
+        placeholder="审核状态"
+        clearable
+        style="width: 200px"
+        class="filter-item"
+        @change="getList"
+      >
+        <el-option label="全部" value="" />
+        <el-option label="待审核" :value="2" />
+        <el-option label="审核通过" :value="0" />
+        <el-option label="审核未通过" :value="1" />
+      </el-select>
+      <el-button type="primary" icon="el-icon-search" @click="getList">查询</el-button>
+    </div>
+    <!-- 搜索区域END -->
+    <!-- 表格区域 -->
+    <el-table
+      v-loading="listLoading"
+      :data="list"
+      style="width: 100%"
+      border
+      fit
+      highlight-current-row
+      cell-class-name="table-cell"
+    >
+      <el-table-column label="序号" type="index" width="80" align="center" />
+      <el-table-column label="视频名称" prop="videoTitle" align="center" />
+      <el-table-column label="审核状态" width="150px" align="center">
+        <template slot-scope="{ row }">
+          <el-tag v-if="row.videoAuditStatus === 0" size="small" type="danger">审核未通过</el-tag>
+          <el-tag v-if="row.videoAuditStatus === 1" size="small" type="success">审核通过</el-tag>
+          <el-tag v-if="row.videoAuditStatus === 2" size="small" type="warning">待审核</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核时间" width="250px" align="center">
+        <template slot-scope="{row}">
+          <span v-if="row.videoAuditStatus!==2">{{ row.auditTime | formatTime }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="审核人" align="center" width="200px">
+        <template slot-scope="{row}">
+          <span v-if="row.videoAuditStatus!==2">{{ row.auditBy }}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="150px" align="center">
+        <template slot-scope="{row}">
+          <el-button
+            type="warning"
+            size="mini"
+            style="margin-right:5px"
+            icon="el-icon-s-check"
+            @click="handleShowDialog(row)"
+          >审核</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 表格区域END -->
+    <!-- 视频预览对话框 -->
+    <el-dialog
+      title="视频审核"
+      :visible.sync="dialogVisible"
+      width="40%"
+      @closed="dialogColosed"
+    >
+      <el-form ref="formRef" :model="dialogData" label-width="65px" :rules="dialogFormRules">
+        <el-form-item label="标题:">
+          专业线贵妇级除皱产品--希腊YELLOW ROSE黄玫瑰弹力除皱精华和玻尿酸花瓣保湿水
+        </el-form-item>
+        <el-form-item label="视频:">
+          <video src="movie.ogg" controls="controls" width="100%">
+            您的浏览器不支持播放该视频
+          </video>
+        </el-form-item>
+        <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 slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="handleAuditStatus">提 交</el-button>
+      </div>
+    </el-dialog>
+    <!-- 视频预览对话框END -->
+  </div>
+</template>
+
+<script>
+import Mock from 'mockjs'
+import { formatDate } from '@/utils'
+export default {
+  filters: {
+    formatTime(time) {
+      if (!time) {
+        return ''
+      }
+      return formatDate(time, 'yyyy-MM-DD HH:mm:ss')
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      listLoading: false,
+      listQuery: {
+        pageNum: 0, // 页码
+        pageSize: 20, // 分页大小
+        videoTitle: '', // 供应商类型
+        lowerAuditStatus: '' // 审核状态
+      },
+      list: [],
+      currentVideoUrl: '',
+      dialogData: {
+        auditStatus: 1,
+        invalidReason: ''
+      },
+      dialogFormRules: {
+        invalidReason: {
+          required: true,
+          message: '不通过原因不能为空',
+          tigger: 'blur'
+        }
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 获取列表数据
+    getList() {
+      const count = 10
+      const list = []
+
+      for (let i = 0; i < count; i++) {
+        list.push(Mock.mock({
+          videoId: '@natural',
+          videoTitle: '@ctitle(5,10)', // 供应商名称
+          videoAuditStatus: '@natural(0,2)', // 审核状态
+          auditTime: '@date("yy-MM-dd hh:mm:ss")',
+          auditBy: '@cname(2,6)'
+        }))
+      }
+      this.list = list
+    },
+    handleShowDialog({ url }) {
+      this.currentVideoUrl = url
+      this.dialogVisible = true
+    },
+    dialogColosed() {
+      this.currentVideoUrl = ''
+      this.dialogData.auditStatus = 1
+    },
+    handleAuditStatus() {
+      this.$refs.formRef.validate(valid => {
+        if (valid) {
+          console.log(valid)
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+  span {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+    font-size: 14px;
+  }
+  .el-button {
+    display: inline-block;
+    margin-bottom: 10px;
+    vertical-align: middle;
+  }
+  .el-input,
+  .el-select {
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+}
+.el-table .cell {
+  overflow: visible;
+}
+.el-badge{
+  margin: 0 6px;
+}
+</style>

+ 20 - 5
src/views/supplier/user/add.vue → src/views/authentic/supplier/add.vue

@@ -76,7 +76,17 @@
           <el-input v-model="formData1.securityLink" placeholder="请输入官网认证链接" />
         </el-form-item>
       </template>
-
+      <el-form-item label="公众号二维码:" prop="ewmUrl">
+        <upload-image
+          ref="uploadImageRef1"
+          :file-list="ewmUrl"
+          tip-title="128px*128px"
+          @success="imageUploadSuccess1"
+          @error="imageUploadFaild1"
+          @remove="imageRemove1"
+        />
+        <el-input v-model="formData1.ewmUrl" type="hidden" class="hiddenInput" />
+      </el-form-item>
       <el-form-item label="供应商状态:">
         <el-select v-model="formData1.shopStatus" placeholder="请选择供应商状态" style="width: 100%">
           <el-option label="启用" :value="1" />
@@ -235,7 +245,8 @@ export default {
         brandAuthLogo: '', // 品牌logo
         securityLink: '', // 官网认证链接
         shopStatus: 1, // 供应商状态,
-        shopInfo: ''
+        shopInfo: '',
+        ewmUrl: '' // 微信公众号二维码
       },
       // 表单2
       formData2: {
@@ -268,13 +279,15 @@ export default {
         statementContent: { required: true, message: '声明内容不能为空', tigger: 'change' }, // 声明内容
         statementFileId: { required: true, message: '声明文件不能为空', tigger: 'change', type: 'number' }, // 声明文件id
         statementImage: { required: true, message: '声明图片不能为空', tigger: 'change' }, // 声明图片
-        statementLink: { required: true, message: '声明链接不能为空', tigger: 'change' } // 声明链接
+        statementLink: { required: true, message: '声明链接不能为空', tigger: 'change' }, // 声明链接
+        ewmUrl: { required: true, message: '微信公众号二维码不能为空', tigger: 'change' }
       },
       // 上传的文件列表
       fileList1: [],
       fileList2: [],
       fileList3: [],
-      fileList4: [] // 文件
+      fileList4: [], // 文件
+      ewmUrl: []
     }
   },
   computed: {
@@ -569,12 +582,14 @@ export default {
         brandAuthLogo: '', // 品牌logo
         securityLink: '', // 官网认证链接
         shopStatus: 1, // 供应商状态,
-        shopInfo: []
+        shopInfo: [],
+        ewmUrl: ''
       }
       this.fileList1 = []
       this.fileList2 = []
       this.fileList3 = []
       this.fileList4 = []
+      this.ewmUrl = []
       this.$refs.formData1Ref.clearValidate()
     },
     // 重置表单2

+ 0 - 0
src/views/supplier/user/edit.vue → src/views/authentic/supplier/edit.vue


+ 5 - 3
src/views/supplier/user/index.vue → src/views/authentic/supplier/index.vue

@@ -88,7 +88,7 @@ import { fetchSupplierList, supplierStatusChange } from '@/api/supplier'
 import { resetPassword } from '@/api/user'
 import { fetchBrandList } from '@/api/brand'
 import { formatDate } from '@/utils'
-// import scrollTo from '@/mixin/scrollTo'
+
 export default {
   name: 'ComplexTable',
   components: { Pagination },
@@ -215,8 +215,10 @@ export default {
       if (text !== 'confirm') return
       // 要执行的操作
       console.log(item)
-      this.$store.commit('user/SET_PROXY_INFO', item)
-      this.$router.push(`/auth/list?type=${item.shopType}`)
+      // this.$store.commit('user/SET_PROXY_INFO', item)
+      this.$store.commit('proxy/OPEN_PROXY', item)
+      // this.$router.push(`/auth/list?type=${item.shopType}`)
+      this.$router.push(`/proxy`)
     },
     // 过滤列表
     handleFilter() {

+ 4 - 2
src/views/login/index.vue

@@ -62,6 +62,7 @@
 </template>
 
 <script>
+import { initGoPage } from '@/utils/auth'
 export default {
   name: 'Login',
 
@@ -126,8 +127,9 @@ export default {
           this.$store
             .dispatch('user/login', this.loginForm)
             .then(() => {
-              const isAdmin = this.$store.getters.userIdentity === 1
-              isAdmin ? this.$router.replace('/supplier/list') : this.$router.replace('/auth/list')
+              // const isAdmin = this.$store.getters.userIdentity === 1
+              // isAdmin ? this.$router.replace('/supplier/list') : this.$router.replace('/auth/list')
+              this.$router.replace(initGoPage())
               this.loading = false
               this.$message.success('登录成功')
             })