瀏覽代碼

bug修改,新增分享支付页面

喻文俊 3 年之前
父節點
當前提交
1bc5cda040
共有 44 個文件被更改,包括 1102 次插入168 次删除
  1. 6 2
      .env.development
  2. 9 0
      src/api/pay.js
  3. 二進制
      src/assets/img/avatar.png
  4. 1 0
      src/components/AMapUI/index.vue
  5. 284 0
      src/components/IconList/element-icons.js
  6. 16 0
      src/components/IconList/icons.js
  7. 112 0
      src/components/IconList/index.vue
  8. 10 0
      src/components/IconList/svg-icons.js
  9. 1 1
      src/filters/index.js
  10. 6 0
      src/layout/components/AvatarWrapper/index.vue
  11. 8 4
      src/layout/components/Navbar.vue
  12. 1 0
      src/layout/components/UserCard/index.vue
  13. 1 0
      src/layout/components/VipTipDialog/index.vue
  14. 4 10
      src/permission.js
  15. 12 5
      src/router/index.js
  16. 39 0
      src/router/module/share.js
  17. 3 2
      src/store/modules/permission.js
  18. 14 15
      src/store/modules/user.js
  19. 2 0
      src/utils/auth.js
  20. 11 11
      src/views/admin/member/handsel.vue
  21. 17 4
      src/views/admin/member/index.vue
  22. 5 5
      src/views/admin/member/record.vue
  23. 1 1
      src/views/admin/member/service.vue
  24. 7 3
      src/views/admin/member/settings/service-edit.vue
  25. 20 0
      src/views/admin/settings/menus/components/table-list.vue
  26. 41 4
      src/views/admin/settings/menus/edit.vue
  27. 3 3
      src/views/admin/supplier/edit.vue
  28. 16 5
      src/views/admin/supplier/index.vue
  29. 1 1
      src/views/common/error-page/401.vue
  30. 6 1
      src/views/common/error-page/404.vue
  31. 5 60
      src/views/common/login/index.vue
  32. 11 0
      src/views/common/login/redirect.vue
  33. 47 0
      src/views/common/share/pay/faild.vue
  34. 74 0
      src/views/common/share/pay/index.vue
  35. 185 0
      src/views/common/share/pay/pay.vue
  36. 47 0
      src/views/common/share/pay/success.vue
  37. 4 1
      src/views/components/RadioCard/index.vue
  38. 38 6
      src/views/components/payment/pay-bank.vue
  39. 1 0
      src/views/normal/club/edit.vue
  40. 5 5
      src/views/normal/personal/set-account.vue
  41. 2 2
      src/views/normal/personal/set-mobile.vue
  42. 5 5
      src/views/normal/personal/vip-record.vue
  43. 11 2
      src/views/normal/vip/buy.vue
  44. 10 10
      src/views/normal/vip/index.vue

+ 6 - 2
.env.development

@@ -13,8 +13,12 @@ VUE_APP_UPLOAD_API='https://zplma-b.caimei365.com'
 VUE_APP_BASE_SERVER = 'https://www-b.caimei365.com'
 
 # 消息接口地址 WebSocket
-# VUE_APP_SOCKET_SERVER = 'wss://zplma-b.caimei365.com/websocket?sessionSource=zplm_admin'
-VUE_APP_SOCKET_SERVER = 'ws://192.168.2.68:8012/websocket?sessionSource=zplm_admin'
+VUE_APP_SOCKET_SERVER = 'wss://zplma-b.caimei365.com/websocket?sessionSource=zplm_admin'
+# VUE_APP_SOCKET_SERVER = 'ws://192.168.2.68:8012/websocket?sessionSource=zplm_admin'
+
+# 网站地址
+VUE_APP_LOCAL = 'http://zplm-b.caimei365.com'
+
 
 # 支付
 VUE_APP_PAY_LOCAL = 'http://192.168.2.68:18014'

+ 9 - 0
src/api/pay.js

@@ -62,3 +62,12 @@ export function payVipWithUnion(data) {
     data
   })
 }
+
+/** 复制网银支付链接 */
+export function createPayUrl(data) {
+  return request({
+    url: '/pay/link',
+    method: 'POST',
+    data
+  })
+}

二進制
src/assets/img/avatar.png


+ 1 - 0
src/components/AMapUI/index.vue

@@ -33,6 +33,7 @@ export default {
   },
   created() {
     this.$nextTick(() => {
+      console.log(this.address)
       this.init()
     })
   },

+ 284 - 0
src/components/IconList/element-icons.js

@@ -0,0 +1,284 @@
+const elementIcons = [
+  'platform-eleme',
+  'eleme',
+  'delete-solid',
+  'delete',
+  's-tools',
+  'setting',
+  'user-solid',
+  'user',
+  'phone',
+  'phone-outline',
+  'more',
+  'more-outline',
+  'star-on',
+  'star-off',
+  's-goods',
+  'goods',
+  'warning',
+  'warning-outline',
+  'question',
+  'info',
+  'remove',
+  'circle-plus',
+  'success',
+  'error',
+  'zoom-in',
+  'zoom-out',
+  'remove-outline',
+  'circle-plus-outline',
+  'circle-check',
+  'circle-close',
+  's-help',
+  'help',
+  'minus',
+  'plus',
+  'check',
+  'close',
+  'picture',
+  'picture-outline',
+  'picture-outline-round',
+  'upload',
+  'upload2',
+  'download',
+  'camera-solid',
+  'camera',
+  'video-camera-solid',
+  'video-camera',
+  'message-solid',
+  'bell',
+  's-cooperation',
+  's-order',
+  's-platform',
+  's-fold',
+  's-unfold',
+  's-operation',
+  's-promotion',
+  's-home',
+  's-release',
+  's-ticket',
+  's-management',
+  's-open',
+  's-shop',
+  's-marketing',
+  's-flag',
+  's-comment',
+  's-finance',
+  's-claim',
+  's-custom',
+  's-opportunity',
+  's-data',
+  's-check',
+  's-grid',
+  'menu',
+  'share',
+  'd-caret',
+  'caret-left',
+  'caret-right',
+  'caret-bottom',
+  'caret-top',
+  'bottom-left',
+  'bottom-right',
+  'back',
+  'right',
+  'bottom',
+  'top',
+  'top-left',
+  'top-right',
+  'arrow-left',
+  'arrow-right',
+  'arrow-down',
+  'arrow-up',
+  'd-arrow-left',
+  'd-arrow-right',
+  'video-pause',
+  'video-play',
+  'refresh',
+  'refresh-right',
+  'refresh-left',
+  'finished',
+  'sort',
+  'sort-up',
+  'sort-down',
+  'rank',
+  'loading',
+  'view',
+  'c-scale-to-original',
+  'date',
+  'edit',
+  'edit-outline',
+  'folder',
+  'folder-opened',
+  'folder-add',
+  'folder-remove',
+  'folder-delete',
+  'folder-checked',
+  'tickets',
+  'document-remove',
+  'document-delete',
+  'document-copy',
+  'document-checked',
+  'document',
+  'document-add',
+  'printer',
+  'paperclip',
+  'takeaway-box',
+  'search',
+  'monitor',
+  'attract',
+  'mobile',
+  'scissors',
+  'umbrella',
+  'headset',
+  'brush',
+  'mouse',
+  'coordinate',
+  'magic-stick',
+  'reading',
+  'data-line',
+  'data-board',
+  'pie-chart',
+  'data-analysis',
+  'collection-tag',
+  'film',
+  'suitcase',
+  'suitcase-1',
+  'receiving',
+  'collection',
+  'files',
+  'notebook-1',
+  'notebook-2',
+  'toilet-paper',
+  'office-building',
+  'school',
+  'table-lamp',
+  'house',
+  'no-smoking',
+  'smoking',
+  'shopping-cart-full',
+  'shopping-cart-1',
+  'shopping-cart-2',
+  'shopping-bag-1',
+  'shopping-bag-2',
+  'sold-out',
+  'sell',
+  'present',
+  'box',
+  'bank-card',
+  'money',
+  'coin',
+  'wallet',
+  'discount',
+  'price-tag',
+  'news',
+  'guide',
+  'male',
+  'female',
+  'thumb',
+  'cpu',
+  'link',
+  'connection',
+  'open',
+  'turn-off',
+  'set-up',
+  'chat-round',
+  'chat-line-round',
+  'chat-square',
+  'chat-dot-round',
+  'chat-dot-square',
+  'chat-line-square',
+  'message',
+  'postcard',
+  'position',
+  'turn-off-microphone',
+  'microphone',
+  'close-notification',
+  'bangzhu',
+  'time',
+  'odometer',
+  'crop',
+  'aim',
+  'switch-button',
+  'full-screen',
+  'copy-document',
+  'mic',
+  'stopwatch',
+  'medal-1',
+  'medal',
+  'trophy',
+  'trophy-1',
+  'first-aid-kit',
+  'discover',
+  'place',
+  'location',
+  'location-outline',
+  'location-information',
+  'add-location',
+  'delete-location',
+  'map-location',
+  'alarm-clock',
+  'timer',
+  'watch-1',
+  'watch',
+  'lock',
+  'unlock',
+  'key',
+  'service',
+  'mobile-phone',
+  'bicycle',
+  'truck',
+  'ship',
+  'basketball',
+  'football',
+  'soccer',
+  'baseball',
+  'wind-power',
+  'light-rain',
+  'lightning',
+  'heavy-rain',
+  'sunrise',
+  'sunrise-1',
+  'sunset',
+  'sunny',
+  'cloudy',
+  'partly-cloudy',
+  'cloudy-and-sunny',
+  'moon',
+  'moon-night',
+  'dish',
+  'dish-1',
+  'food',
+  'chicken',
+  'fork-spoon',
+  'knife-fork',
+  'burger',
+  'tableware',
+  'sugar',
+  'dessert',
+  'ice-cream',
+  'hot-water',
+  'water-cup',
+  'coffee-cup',
+  'cold-drink',
+  'goblet',
+  'goblet-full',
+  'goblet-square',
+  'goblet-square-full',
+  'refrigerator',
+  'grape',
+  'watermelon',
+  'cherry',
+  'apple',
+  'pear',
+  'orange',
+  'coffee',
+  'ice-tea',
+  'ice-drink',
+  'milk-tea',
+  'potato-strips',
+  'lollipop',
+  'ice-cream-square',
+  'ice-cream-round'
+]
+
+export default elementIcons

+ 16 - 0
src/components/IconList/icons.js

@@ -0,0 +1,16 @@
+const myIcons = [
+  'icon-daoru',
+  'icon-shipinjiaocheng',
+  'icon-fankuiliebiao',
+  'icon-jigourenzheng',
+  'icon-yishirenzheng',
+  'icon-wenjianliebiao',
+  'icon-ziliaoku',
+  'icon-tianjia',
+  'icon-wendangjiaocheng',
+  'icon-yishiliebiao',
+  'icon-jigouliebiao',
+  'icon-zhankai'
+]
+
+export default myIcons

+ 112 - 0
src/components/IconList/index.vue

@@ -0,0 +1,112 @@
+<template>
+  <div class="icons-container">
+    <el-tabs type="border-card">
+      <el-tab-pane label="Icons">
+        <div class="grid">
+          <div v-for="item of svgIcons" :key="item" @click="handleClick(item)">
+            <el-tooltip placement="top">
+              <div slot="content">
+                {{ item }}
+              </div>
+              <div class="icon-item">
+                <svg-icon :icon-class="item" class-name="disabled" />
+                <span>{{ item }}</span>
+              </div>
+            </el-tooltip>
+          </div>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="Element-UI Icons">
+        <div class="grid">
+          <div v-for="item of elementIcons" :key="item" @click="handleClick(`el-icon-${item}`)">
+            <el-tooltip placement="top">
+              <div slot="content">
+                {{ item }}
+              </div>
+              <div class="icon-item">
+                <i :class="'el-icon-' + item" />
+                <span>{{ item }}</span>
+              </div>
+            </el-tooltip>
+          </div>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="更多 Icons">
+        <div class="grid">
+          <div v-for="item of myIcons" :key="item" @click="handleClick(`iconfont ${item}`)">
+            <el-tooltip placement="top">
+              <div slot="content">
+                {{ item }}
+              </div>
+              <div class="icon-item">
+                <i :class="'iconfont ' + item" />
+                <span>{{ item }}</span>
+              </div>
+            </el-tooltip>
+          </div>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import svgIcons from './svg-icons'
+import elementIcons from './element-icons'
+import myIcons from './icons'
+export default {
+  name: 'Icons',
+  data() {
+    return {
+      svgIcons,
+      elementIcons,
+      myIcons
+    }
+  },
+  methods: {
+    handleClick(text) {
+      this.$emit('click', text)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.icons-container {
+  margin: 10px 20px 0;
+  overflow: hidden;
+
+  .el-tab-pane{
+    max-height: 500px;
+    overflow-y: auto;
+  }
+
+  .grid {
+    position: relative;
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
+  }
+  .icon-item {
+    padding-top: 8px;
+    margin: 16px;
+    height: 80px;
+    text-align: center;
+    width: 100px;
+    float: left;
+    font-size: 28px;
+    color: #24292e;
+    cursor: pointer;
+    &:hover{
+      background: rgba($color: #000000, $alpha: 0.1);
+    }
+  }
+  span {
+    display: block;
+    font-size: 16px;
+    margin-top: 10px;
+  }
+  .disabled {
+    pointer-events: none;
+  }
+}
+</style>

+ 10 - 0
src/components/IconList/svg-icons.js

@@ -0,0 +1,10 @@
+const req = require.context('../../icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const svgIcons = requireAll(req).map(i => {
+  return i.match(re)[1]
+})
+
+export default svgIcons

+ 1 - 1
src/filters/index.js

@@ -79,5 +79,5 @@ export function formatPrice(price) {
   if (!price) {
     return 0
   }
-  return parseInt(price).toFixed(2)
+  return parseFloat(price).toFixed(2)
 }

+ 6 - 0
src/layout/components/AvatarWrapper/index.vue

@@ -1,5 +1,6 @@
 <template>
   <div class="avatar-wrapper">
+    <!-- <img :src="avatar" class="user-avatar"> -->
     <img src="https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif" class="user-avatar">
     <span>{{ userName }}</span>
     <template v-if="isSupplier">
@@ -28,6 +29,7 @@
 
 <script>
 import { mapGetters } from 'vuex'
+import avatar from '@/assets/img/avatar.png'
 export default {
   name: 'AvatarWrapper',
   computed: {
@@ -50,6 +52,9 @@ export default {
     // 已到期
     beExpired() {
       return this.vipInfo.vipStatus === 0
+    },
+    avatar() {
+      return avatar
     }
   },
   methods: {
@@ -84,6 +89,7 @@ export default {
   .el-button{
     height: 24px;
     padding: 0 12px;
+    margin-left: 10px;
   }
 }
 </style>

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

@@ -17,7 +17,7 @@
       <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
         <!-- 登录用户头像名称 -->
         <avatar-wrapper />
-        <el-dropdown-menu slot="dropdown">
+        <el-dropdown-menu slot="dropdown" :class="{ 'is-supplier': isSupplier }">
           <template v-if="isSupplier">
             <el-dropdown-item class="user-info">
               <!-- 供应商用户信息卡片 -->
@@ -66,7 +66,6 @@ import UserCard from './UserCard'
 import VipTipDialog from './VipTipDialog'
 
 export default {
-
   components: {
     Breadcrumb,
     Hamburger,
@@ -122,7 +121,10 @@ export default {
       color: #f1f1f1;
     }
   }
-  .popper__arrow {
+}
+
+.is-supplier {
+  ::v-deep .popper__arrow {
     &::after {
       border-bottom-color: #2c3e50 !important;
     }
@@ -130,7 +132,9 @@ export default {
 }
 
 .el-dropdown-menu {
-  padding-top: 0;
+  &.is-supplier {
+    padding-top: 0;
+  }
 }
 
 .navbar {

+ 1 - 0
src/layout/components/UserCard/index.vue

@@ -17,6 +17,7 @@
 <script>
 import { mapGetters } from 'vuex'
 import { formatDate } from '@/utils'
+// import avatar from '@/assets/img/avatar.png'
 export default {
   name: 'AvatarWrapper',
   filters: {

+ 1 - 0
src/layout/components/VipTipDialog/index.vue

@@ -35,6 +35,7 @@ export default {
   },
   methods: {
     toOpenVipPage() {
+      this.allShowVipTip = false
       this.$router.push('/vip/vip-open')
     }
   }

+ 4 - 10
src/permission.js

@@ -2,7 +2,6 @@ import router from '@/router'
 import store from '@/store'
 import { getToken, getUserInfo, initGoPage } from '@/utils/auth'
 import getPageTitle from './utils/get-page-title'
-import { setStorage } from './utils/storage'
 
 // 获取用户信息
 const userInfo = getUserInfo()
@@ -11,7 +10,7 @@ if (userInfo) {
 }
 
 // 路由白名单
-const whiteList = ['/login']
+const whiteList = ['/login', '/share', '/share/pay', '/share/pay-success', '/share/pay-faild']
 
 // 路由拦截器
 router.beforeEach(async(to, from, next) => {
@@ -26,12 +25,10 @@ router.beforeEach(async(to, from, next) => {
       next({ path: initGoPage() })
     } else {
       // 加载国家列表并保存到store
-      // store.dispatch('app/setCountry')
+      store.dispatch('app/setCountry')
       // 判断当前用户是否拥有角色
       const hasRoles = store.getters.roles && store.getters.roles.length > 0
       if (hasRoles) {
-        // 获取用户vip信息
-        await store.dispatch('user/fetchUserVipInfo')
         // 放行
         next()
       } else {
@@ -47,6 +44,7 @@ router.beforeEach(async(to, from, next) => {
           const accessRoutes = await store.dispatch('permission/generateRoutes')
           // 添加路由配置
           router.addRoutes(accessRoutes)
+          console.log(accessRoutes)
           // 放行
           next({ ...to, replace: true })
         } catch (err) {
@@ -56,13 +54,9 @@ router.beforeEach(async(to, from, next) => {
     }
   } else {
     if (whiteList.indexOf(to.path) !== -1) {
-      // 放行
       next()
     } else {
-      if (Object.keys(to.query).length > 0) {
-        setStorage('redirect-route-query', JSON.stringify(to.query))
-      }
-      next(`/login?redirect=${to.path}`)
+      next('/login')
     }
   }
 })

+ 12 - 5
src/router/index.js

@@ -16,6 +16,7 @@ import MemberRoutes from './module/member'
 import vipRoutes from './module/vip'
 import personalRoutes from './module/personal'
 import settingRoutes from './module/settings'
+import shareRoutes from './module/share'
 
 // 需要权限访问的路由列表
 export const asyncRoutes = [
@@ -28,13 +29,13 @@ export const asyncRoutes = [
   ...feedbackRoutes,
   ...settingRoutes,
   ...helperRoutes,
-  ...personalRoutes,
-  // 404页面 放在最后面
-  { path: '*', redirect: '/404', hidden: true }
+  ...personalRoutes
 ]
 
 // 默认路由列表 全部用户都可以访问
 export const constantRoutes = [
+  ...vipRoutes,
+  ...shareRoutes,
   {
     path: '/',
     redirect: '/login'
@@ -88,7 +89,11 @@ export const constantRoutes = [
       }
     ]
   },
-  ...vipRoutes,
+  {
+    path: '/login/redirect',
+    component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/login/redirect'),
+    hidden: true
+  },
   {
     path: '/404',
     component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/error-page/404'),
@@ -98,7 +103,9 @@ export const constantRoutes = [
     path: '/401',
     component: () => import(/* webpackChunkName: "common-page" */ '@/views/common/error-page/401'),
     hidden: true
-  }
+  },
+  // 404页面 放在最后面
+  { path: '*', redirect: '/404', hidden: true }
 ]
 
 // 创建路由对象

+ 39 - 0
src/router/module/share.js

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

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

@@ -28,7 +28,7 @@ function filterAsyncRoutes(sourceRoutes, targetRoutes) {
       res.push(route)
     }
   })
-  return res
+  return res.sort((a, b) => a.meta.sort - b.meta.sort)
 }
 
 const state = {
@@ -38,7 +38,8 @@ const state = {
 const mutations = {
   SET_ROUTES: (state, routes) => {
     state.addRoutes = routes
-    state.routes = constantRoutes.concat(routes)
+    // state.routes = constantRoutes.concat(routes)
+    state.routes = [...routes, ...constantRoutes]
   }
 }
 

+ 14 - 15
src/store/modules/user.js

@@ -1,6 +1,6 @@
 import { login, fetchUserInfo, fetchUserVipInfo } from '@/api/user'
 import { resetRouter } from '@/router'
-import { getToken, getUserInfo, removeToken, removeUserInfo, setToken, setUserInfo } from '@/utils/auth'
+import { getToken, getUserInfo, removeToken, removeUserInfo } from '@/utils/auth'
 
 // 用户信息
 const state = {
@@ -59,21 +59,19 @@ const mutations = {
 
 const actions = {
   // 登录操作
-  login({ commit }, userInfo) {
+  async login({ commit }, userInfo) {
     const { username, password } = userInfo
-    return login({ mobileOrName: username.trim(), password: password })
-      .then(res => {
-        // 保存token及用户信息
-        setToken(res.data.token)
-        setUserInfo(res.data)
-        commit('SAVE_USER_INOF', res.data)
-        commit('SET_TOKEN', res.data.token)
-      })
-      .catch(() => {
-        commit('SAVE_USER_INOF', {})
-        commit('SET_TOKEN', '')
-        commit('SET_ROLES', [])
-      })
+    try {
+      const res = await login({ mobileOrName: username.trim(), password: password })
+      commit('SAVE_USER_INOF', res.data)
+      commit('SET_TOKEN', res.data.token)
+      return res
+    } catch (error) {
+      commit('SAVE_USER_INOF', {})
+      commit('SET_TOKEN', '')
+      commit('SET_ROLES', [])
+      return error
+    }
   },
 
   // 获取用户菜单列表
@@ -114,6 +112,7 @@ const actions = {
   proxyLogout({ commit }) {
     commit('SET_ROLES', [])
     commit('SAVE_USER_INOF', getUserInfo())
+    commit('SET_VIPINFO', {})
   }
 }
 

+ 2 - 0
src/utils/auth.js

@@ -36,7 +36,9 @@ export function removeUserInfo() {
 // 跳转页面判定
 export function initGoPage() {
   const userInfo = getUserInfo()
+  console.log(userInfo)
   if (!userInfo) {
+    console.log(userInfo)
     return '/404'
   }
   return userInfo.userIdentity === 1 ? '/supplier/list' : '/club'

+ 11 - 11
src/views/admin/member/handsel.vue

@@ -9,8 +9,8 @@
       <!-- 选中的供应商列表 -->
       <el-table v-loading="listLoading" :data="currentSupplierList" class="table-cell" empty-text="请选择供应商">
         <el-table-column label="序号" type="index" width="80" align="center" />
-        <el-table-column property="name" label="供应商名称" width="150" />
-        <el-table-column label="供应商类型" align="center">
+        <el-table-column property="name" label="供应商名称" />
+        <el-table-column label="供应商类型" align="center" width="120">
           <template slot-scope="{ row }">
             <span v-if="row.shopType === 1">品牌方</span>
             <span v-else>代理商</span>
@@ -19,7 +19,7 @@
         <el-table-column label="登录账号" align="center">
           <template slot-scope="{ row }">
             <span v-if="row.loginAccount">{{ row.loginAccount }}</span>
-            <span v-else></span>
+            <span v-else>未绑定</span>
           </template>
         </el-table-column>
         <el-table-column prop="mobile" label="手机号" align="center" />
@@ -67,7 +67,7 @@
     </div>
 
     <!-- 选择供应商dialog -->
-    <el-dialog title="选择供应商" :visible.sync="dialogTableVisible" width="68%" @closed="handleDialogClosed">
+    <el-dialog title="选择供应商" :visible.sync="dialogTableVisible" width="66%" @closed="handleDialogClosed">
       <div>
         <div class="filter-container">
           <div class="filter-control">
@@ -108,7 +108,7 @@
             <div class="filter-control">
               <span>联系人:</span>
               <el-input
-                v-model="listQuery.limkMan"
+                v-model="listQuery.linkMan"
                 clearable
                 size="mini"
                 placeholder="联系人"
@@ -138,8 +138,8 @@
             </template>
           </el-table-column>
           <el-table-column label="序号" type="index" width="80" align="center" />
-          <el-table-column property="name" label="供应商名称" width="150" />
-          <el-table-column label="供应商类型" align="center">
+          <el-table-column property="name" label="供应商名称" />
+          <el-table-column label="供应商类型" align="center" width="120">
             <template slot-scope="{ row }">
               <span v-if="row.shopType === 1">品牌方</span>
               <span v-else>代理商</span>
@@ -148,10 +148,10 @@
           <el-table-column label="登录账号" align="center">
             <template slot-scope="{ row }">
               <span v-if="row.loginAccount">{{ row.loginAccount }}</span>
-              <span v-else></span>
+              <span v-else>未绑定</span>
             </template>
           </el-table-column>
-          <el-table-column prop="mobile" label="手机号" align="center" />
+          <el-table-column prop="mobile" label="手机号" align="center" width="160" />
           <el-table-column prop="linkMan" label="联系人" align="center" />
         </el-table>
         <!-- <div class="loading">没有更多了</div> -->
@@ -184,7 +184,7 @@ export default {
         shopType: '',
         mobile: '',
         state: '',
-        limkMan: '',
+        linkMan: '',
         pageNum: 1,
         pageSize: 10
       },
@@ -237,7 +237,7 @@ export default {
       this.listQuery.shopName = ''
       this.listQuery.shopType = ''
       this.listQuery.mobile = ''
-      this.listQuery.limkMan = ''
+      this.listQuery.linkMan = ''
     },
     // 筛选供应商
     filterSupplierList() {

+ 17 - 4
src/views/admin/member/index.vue

@@ -20,14 +20,14 @@
       </div>
       <div class="filter-control">
         <span>联系人:</span>
-        <el-input v-model="listQuery.limkMan" placeholder="联系人" @keyup.enter.native="getList" />
+        <el-input v-model="listQuery.linkMan" placeholder="联系人" @keyup.enter.native="getList" />
       </div>
       <div class="filter-control">
         <span>会员状态:</span>
         <el-select v-model="listQuery.vipStatus" placeholder="会员状态" clearable @change="getList">
           <el-option label="全部" value="" />
           <el-option label="生效中" value="1" />
-          <el-option label="已过期" value="2" />
+          <el-option label="已过期" value="0" />
         </el-select>
       </div>
       <div class="filter-control">
@@ -57,7 +57,7 @@
       <el-table-column label="登录账号" align="center">
         <template slot-scope="{ row }">
           <span v-if="row.loginAccount">{{ row.loginAccount }}</span>
-          <span v-else></span>
+          <span v-else>未绑定</span>
         </template>
       </el-table-column>
       <el-table-column prop="mobile" label="手机号" align="center" />
@@ -71,16 +71,28 @@
       <el-table-column label="操作" align="center" width="280">
         <template slot-scope="{row}">
           <el-button type="primary" size="mini" @click="$_navigationTo(`/member/record?id=${row.authUserId}`)">购买记录</el-button>
-          <el-button type="primary" size="mini" @click="$_navigationTo(`/member/service?id=${row.authUserId}`)">配置制化服务</el-button>
+          <el-button type="primary" size="mini" @click="$_navigationTo(`/member/service?id=${row.authUserId}`)">配置制化服务</el-button>
         </template>
       </el-table-column>
     </el-table>
+    <!-- 页码 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList"
+    />
   </div>
 </template>
 
 <script>
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
 import { fetchMemberList } from '@/api/member'
 export default {
+  components: {
+    Pagination
+  },
   data() {
     return {
       listLoading: false,
@@ -94,6 +106,7 @@ export default {
         pageSize: 10
       },
       list: [],
+      total: 0,
       hasNextPage: false
     }
   },

+ 5 - 5
src/views/admin/member/record.vue

@@ -107,16 +107,16 @@
       </el-table-column>
       <el-table-column label="操作" align="center">
         <template slot-scope="{ row }">
-          <el-button type="primary" size="mini" @click="handleShowDemand(row)">制需求</el-button>
+          <el-button type="primary" size="mini" @click="handleShowDemand(row)">制需求</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <!-- 制需求dialog -->
-    <el-dialog title="制需求" :visible.sync="dialogTableVisible" width="30%">
-      <el-table :data="demandList" border fit empty-text="暂无制需求">
+    <!-- 制需求dialog -->
+    <el-dialog title="制需求" :visible.sync="dialogTableVisible" width="30%">
+      <el-table :data="demandList" border fit empty-text="暂无制需求">
         <el-table-column label="序号" type="index" width="80" align="center" />
-        <el-table-column label="制需求" prop="demand" align="center" />
+        <el-table-column label="制需求" prop="demand" align="center" />
       </el-table>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="dialogTableVisible = false">关闭</el-button>

+ 1 - 1
src/views/admin/member/service.vue

@@ -8,7 +8,7 @@
     <!-- 表格区域 -->
     <el-table :data="serviceList" border fit height="600" header-row-class-name="tableHeader">
       <el-table-column label="序号" type="index" width="80" align="center" />
-      <el-table-column label="制需求" prop="title" align="center" />
+      <el-table-column label="制需求" prop="title" align="center" />
       <el-table-column label="是否配置" align="center" width="120">
         <template slot-scope="{ row }">
           <el-checkbox v-model="row.checkFlag" :true-label="1" :false-label="0" />

+ 7 - 3
src/views/admin/member/settings/service-edit.vue

@@ -16,7 +16,7 @@
             </template>
           </el-table-column>
           <el-table-column label="序号" type="index" width="80" align="center" />
-          <el-table-column label="制需求" prop="title" align="center" />
+          <el-table-column label="制需求" prop="title" align="center" />
           <el-table-column label="是否配置" align="center" width="120">
             <template slot-scope="{ row }">
               <el-checkbox v-model="row.status" :true-label="0" :false-label="1" :disabled="row.moveFlag === 0" />
@@ -50,7 +50,7 @@
             </template>
           </el-table-column>
           <el-table-column label="序号" type="index" width="80" align="center" />
-          <el-table-column label="制需求" prop="title" align="center" />
+          <el-table-column label="制需求" prop="title" align="center" />
           <el-table-column label="是否配置" align="center" width="120">
             <template slot-scope="{ row }">
               <el-checkbox v-model="row.status" :true-label="0" :false-label="1" :disabled="row.moveFlag === 0" />
@@ -137,7 +137,9 @@ export default {
     },
     handleCellClick(row) {
       console.log(row)
-      row.checked = !row.checked
+      if (row.moveFlag) {
+        row.checked = !row.checked
+      }
     }
   }
 }
@@ -145,6 +147,8 @@ export default {
 
 <style scoped lang="scss">
 .app-container {
+  width: 100%;
+  overflow-x: auto;
   margin: 0 auto;
 
   .list{

+ 20 - 0
src/views/admin/settings/menus/components/table-list.vue

@@ -39,6 +39,12 @@
           <span v-else>无</span>
         </template>
       </el-table-column>
+      <el-table-column v-if="listQuery.menuType === 2" prop="name" label="会员功能" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.baseFlag === 1">基础功能</span>
+          <span v-else>订制功能</span>
+        </template>
+      </el-table-column>
       <el-table-column label="启用状态" align="center" width="100">
         <template slot-scope="{ row }">
           <el-switch v-model="row.status" :active-value="0" :inactive-value="1" @change="updateMenuStatus(row)" />
@@ -67,13 +73,25 @@
         </template>
       </el-table-column>
     </el-table>
+    <!-- 页码 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList"
+    />
   </div>
 </template>
 
 <script>
 import { fetchMenuList, deleteMenu, updateMenuSelective } from '@/api/system'
+import Pagination from '@/components/Pagination' // secondary package based on el-pagination
 export default {
   name: 'TableList',
+  components: {
+    Pagination
+  },
   props: {
     menuType: {
       type: Number,
@@ -91,6 +109,7 @@ export default {
         pageSize: 10,
         pageNum: 1
       },
+      total: 0,
       // 菜单列表
       list: []
     }
@@ -164,6 +183,7 @@ export default {
     fetchMenuList() {
       fetchMenuList(this.listQuery).then(res => {
         this.list = [...this.list, ...res.data.list]
+        this.total = res.data.total
       })
     },
     // 更新状态

+ 41 - 4
src/views/admin/settings/menus/edit.vue

@@ -17,10 +17,13 @@
         </el-radio-group>
       </el-form-item>
       <el-form-item label="前端图标:">
-        <el-input v-model="menuData.icon" style="width: 80%" placeholder="系统图标里拷贝Class" />
+        <el-input v-model="menuData.icon" style="width: 80%" placeholder="选择图标" clearable>
+          <template><el-button slot="append" icon="el-icon-edit" @click="handleChooseIcon" /></template>
+        </el-input>
         <template>
-          <i v-if="isElementIcon(menuData.icon)" :class="menuData.icon" />
-          <svg-icon v-else-if="menuData.icon" :icon-class="menuData.icon" />
+          <i v-if="isElementIcon(menuData.icon)" :class="menuData.icon" class="preview-icon" />
+          <i v-if="isOurIcon(menuData.icon)" :class="menuData.icon" class="preview-icon" />
+          <svg-icon v-else-if="menuData.icon" :icon-class="menuData.icon" class="preview-icon" />
         </template>
       </el-form-item>
       <template v-if="!parentMenuData && menuType!== 1">
@@ -80,15 +83,29 @@
         </div>
       </el-form-item>
     </el-form>
+
+    <!-- 选择图标icons -->
+    <el-dialog
+      title="提示"
+      :visible.sync="showIcons"
+      width="80%"
+    >
+      <icon-list @click="onChooseIcon" />
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import { createMenu, getMenu, updateMenu } from '@/api/system'
+import IconList from '@/components/IconList'
 let uuid = 0
 export default {
+  components: {
+    IconList
+  },
   data() {
     return {
+      showIcons: false,
       // 编辑类型
       editType: 'add',
       menuType: '',
@@ -124,6 +141,15 @@ export default {
     this.init()
   },
   methods: {
+    onChooseIcon(item) {
+      this.showIcons = false
+      this.menuData.icon = item
+    },
+    // 选择图标
+    handleChooseIcon() {
+      this.showIcons = true
+    },
+    // 初始化
     init() {
       this.menuType = parseInt(this.$route.query.menuType)
       // 编辑修改菜单
@@ -134,7 +160,8 @@ export default {
       // 添加菜单
       if (this.editType === 'add') {
         this.menuData.parentId = parseInt(this.$route.query.parentId)
-        this.menuData.menuType = parseInt(this.$route.query.menuType)
+        this.menuData.menuType = this.menuType
+        console.log(this.menuType)
         if (this.menuData.parentId > 0) {
           this.fetchParentMenuInfo()
         }
@@ -144,6 +171,7 @@ export default {
     fetchParentMenuInfo() {
       getMenu(this.menuData.parentId).then(res => {
         this.parentMenuData = res.data
+        this.menuData.baseFlag = res.data.baseFlag
         console.log(res.data)
       })
     },
@@ -174,6 +202,10 @@ export default {
     isElementIcon(value) {
       return value && value.substr(0, 7) === 'el-icon'
     },
+    // 判断自定义图标
+    isOurIcon(value) {
+      return value && value.startsWith('iconfont')
+    },
     // 提交
     submit() {
       console.log(this.menuData)
@@ -228,6 +260,11 @@ export default {
   width: 600px;
   margin: 0 auto;
   margin-top: 40px;
+
+  .preview-icon{
+    font-size: 24px;
+    margin-left: 8px;
+  }
 }
 .control-box {
   margin: 20px 0;

+ 3 - 3
src/views/admin/supplier/edit.vue

@@ -104,10 +104,10 @@
       <transition-group name="fade">
         <template v-if="submitForm.wxAccountType !== 0">
           <el-form-item key="appID" label="appID:">
-            <el-input v-model="submitForm.appId" placeholder="微信公众号appID,没有就不填" />
+            <el-input v-model="submitForm.appId" placeholder="微信公众号appID" />
           </el-form-item>
-          <el-form-item key="appSecret" label="appSecret:">
-            <el-input v-model="submitForm.appSecret" placeholder="微信公众号appsecret,没有就不填" />
+          <el-form-item v-if="submitForm.wxAccountType === 2" key="appSecret" label="appSecret:">
+            <el-input v-model="submitForm.appSecret" placeholder="微信公众号appsecret" />
           </el-form-item>
           <el-form-item key="qrCodeImage" label="公众号二维码:" prop="qrCodeImage">
             <upload-image

+ 16 - 5
src/views/admin/supplier/index.vue

@@ -22,6 +22,10 @@
         </el-select>
       </div>
       <div class="filter-control">
+        <span>登录账号:</span>
+        <el-input v-model="listQuery.loginAccount" placeholder="登录账号" @keyup.enter.native="handleFilter" />
+      </div>
+      <!-- <div class="filter-control">
         <span>所属品牌:</span>
         <el-select
           v-model="listQuery.brandId"
@@ -35,7 +39,7 @@
           <el-option label="所有品牌" value="" />
           <el-option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
-      </div>
+      </div> -->
       <div class="filter-control">
         <span>手机号:</span>
         <el-input
@@ -75,15 +79,21 @@
     >
       <el-table-column label="序号" :index="indexMethod" type="index" sortable="custom" align="center" width="80" />
       <el-table-column label="供应商名称" align="center" prop="name" />
-      <el-table-column label="供应商类型" width="150px" align="center">
+      <el-table-column label="供应商类型" width="100px" align="center">
         <template v-slot="{ row }">
           <span v-if="row.shopType === 1">品牌方</span>
           <span v-if="row.shopType === 2">代理商</span>
         </template>
       </el-table-column>
+      <el-table-column label="登录账号" width="120px" align="center">
+        <template slot-scope="{ row }">
+          <span v-if="row.loginAccount">{{ row.loginAccount }}</span>
+          <span v-else>未绑定</span>
+        </template>
+      </el-table-column>
       <el-table-column label="手机号" width="120px" align="center" prop="mobile" />
       <el-table-column label="联系人" width="100px" align="center" prop="linkMan" />
-      <el-table-column label="供应商状态" align="center" width="140px">
+      <el-table-column label="供应商状态" align="center" width="100px">
         <template v-slot="{ row }">
           <el-switch v-model="row.shopStatus" @change="handleChangeStatus(row)" />
         </template>
@@ -93,7 +103,7 @@
           <span>{{ row.createTime | formatTime }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="创建人" class-name="status-col" width="100px" prop="createBy" />
+      <!-- <el-table-column label="创建人" class-name="status-col" width="100px" prop="createBy" /> -->
       <el-table-column label="操作" align="center" width="360" class-name="small-padding fixed-width">
         <template slot-scope="{ row }">
           <el-button size="mini" type="primary" @click="$_navigationTo(`supplier-edit?id=${row.authUserId}&type=edit`)">
@@ -155,7 +165,8 @@ export default {
         pageNum: 0, // 页码
         pageSize: 10, // 分页大小
         shopName: '', // 供应商名称
-        shopType: '' // 供应商类型
+        shopType: '', // 供应商类型
+        loginAccount: '' // 登录账号
       },
       list: [],
       brandList: [], // 品牌列表

+ 1 - 1
src/views/common/error-page/401.vue

@@ -14,7 +14,7 @@
         <ul class="list-unstyled">
           <li>或者你可以去:</li>
           <li class="link-type">
-            <router-link to="/">
+            <router-link replace="/#/">
               回首页
             </router-link>
           </li>

+ 6 - 1
src/views/common/error-page/404.vue

@@ -11,7 +11,7 @@
         <div class="bullshit__oops">NOT FOUND</div>
         <div class="bullshit__headline">{{ message }}</div>
         <div class="bullshit__info">Please check that the URL you entered is correct, or click the button below to return to the homepage.</div>
-        <a href="/" class="bullshit__return-home">返回首页</a>
+        <a class="bullshit__return-home" @click="handleClick">返回首页</a>
       </div>
     </div>
   </div>
@@ -25,6 +25,11 @@ export default {
     message() {
       return '您无权访问该页面...'
     }
+  },
+  methods: {
+    handleClick() {
+      this.$router.replace('/')
+    }
   }
 }
 </script>

+ 5 - 60
src/views/common/login/index.vue

@@ -62,8 +62,7 @@
 </template>
 
 <script>
-import { initGoPage } from '@/utils/auth'
-import { getStorage, removeStorage } from '@/utils/storage'
+import { setToken, setUserInfo } from '@/utils/auth'
 export default {
   name: 'Login',
 
@@ -84,38 +83,12 @@ export default {
       otherQuery: {}
     }
   },
-  watch: {
-    $route: {
-      handler: function(route) {
-        const query = route.query
-        if (query) {
-          this.redirect = query.redirect
-          this.otherQuery = {
-            ...this.otherQuery,
-            ...this.getOtherQuery(query)
-          }
-        }
-      },
-      immediate: true
-    }
-  },
   mounted() {
     if (this.loginForm.username === '') {
       this.$refs.username.focus()
     } else if (this.loginForm.password === '') {
       this.$refs.password.focus()
     }
-    const routeQuery = getStorage('redirect-route-query')
-    if (routeQuery) {
-      this.otherQuery = {
-        ...this.otherQuery,
-        ...JSON.parse(routeQuery)
-      }
-    }
-  },
-  beforeDestroy() {
-    // window.removeEventListener('storage', this.afterQRScan)
-    removeStorage('redirect-route-query')
   },
   methods: {
     checkCapslock(e) {
@@ -137,47 +110,19 @@ export default {
         if (!valid) return
         this.loading = true
         this.$store.dispatch('user/login', this.loginForm).then(res => {
+          // 保存token及用户信息
+          setToken(res.data.token)
+          setUserInfo(res.data)
           this.$store.commit('tagsView/CLEAR_ALL_VIEW')
-          // this.$router.replace(initGoPage())
-          this.$router.push({
-            // path: this.redirect || '/',
-            path: this.redirect || initGoPage(),
-            query: this.otherQuery
-          })
+          this.$router.replace({ path: '/login/redirect' })
         }).finally(() => {
           this.loading = false
         })
       })
     },
-    getOtherQuery(query) {
-      return Object.keys(query).reduce((acc, cur) => {
-        if (cur !== 'redirect') {
-          acc[cur] = query[cur]
-        }
-        return acc
-      }, {})
-    },
     handleInput() {
       this.loginForm.username = this.loginForm.username.replace(/[^\w\.\/]/gi, '')
     }
-    // afterQRScan() {
-    //   if (e.key === 'x-admin-oauth-code') {
-    //     const code = getQueryObject(e.newValue)
-    //     const codeMap = {
-    //       wechat: 'code',
-    //       tencent: 'code'
-    //     }
-    //     const type = codeMap[this.auth_type]
-    //     const codeName = code[type]
-    //     if (codeName) {
-    //       this.$store.dispatch('LoginByThirdparty', codeName).then(() => {
-    //         this.$router.push({ path: this.redirect || '/' })
-    //       })
-    //     } else {
-    //       alert('第三方登录失败')
-    //     }
-    //   }
-    // }
   }
 }
 </script>

+ 11 - 0
src/views/common/login/redirect.vue

@@ -0,0 +1,11 @@
+<script>
+import { initGoPage } from '@/utils/auth'
+export default {
+  created() {
+    this.$router.replace(initGoPage())
+  },
+  render: function(h) {
+    return h()
+  }
+}
+</script>

+ 47 - 0
src/views/common/share/pay/faild.vue

@@ -0,0 +1,47 @@
+<template>
+  <div class="pay-status">
+    <empty title="支付失败" :image="payFaild" color="#FF6D6D" />
+    <div class="info">
+      <span>待付金额:</span>
+      <span class="price">¥{{ payAmount | formatPrice }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+import Empty from '@/components/Empty'
+import payFaild from '@/assets/pay/pay-faild.png'
+export default {
+  components: {
+    Empty
+  },
+  data() {
+    return {
+      payFaild,
+      payAmount: ''
+    }
+  },
+  created() {
+    this.payAmount = this.$route.query.payAmount
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.pay-status{
+  width: 1200px;
+  margin: 0 auto;
+  padding-top: 160px;
+  padding-bottom: 160px;
+  background: #fff;
+}
+.info{
+  text-align: center;
+  margin-top: 16px;
+  font-size: 14px;
+  .price{
+    font-size: 20px;
+    color: #FF6D6D
+  }
+}
+</style>

+ 74 - 0
src/views/common/share/pay/index.vue

@@ -0,0 +1,74 @@
+<template>
+  <el-container>
+    <el-header>
+      <div class="logo">
+        <img src="https://static.caimei365.com/www/authentic/h5/icon-logo.png" class="image">
+        <span class="name">认证通</span>
+      </div>
+    </el-header>
+    <el-main>
+      <router-view />
+    </el-main>
+    <el-footer>- 由采美网提供技术支持 -</el-footer>
+  </el-container>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style scoped lang="scss">
+
+$header-height: 80px;
+$footer-height: 124px;
+
+.el-container{
+  background: #f1f1f1;
+}
+
+.el-header{
+  height: $header-height !important;
+  background: linear-gradient(270deg, #404040 0%, #101010 100%);
+}
+
+.el-main{
+  position: relative;
+  min-height: calc(100vh - 80px - 124px);
+  box-sizing: border-box;
+}
+
+.header {
+  height: $header-height;
+  opacity: 1;
+}
+
+.el-footer {
+  height: $footer-height !important;
+  background: #2c3038;
+  color: #fff;
+  text-align: center;
+  line-height: $footer-height;
+  font-size: 14px;
+}
+
+.logo{
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  width: 1200px;
+  height: 100%;
+  margin: 0 auto;
+  .image{
+    display: inline-block;
+    width: 36px;
+    height: 36px;
+  }
+  span{
+    margin-left: 8px;
+    font-size: 24px;
+    color: #fff;
+  }
+}
+</style>

+ 185 - 0
src/views/common/share/pay/pay.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="share-pay container">
+    <div class="section supplier">
+      <div class="info">
+        <span class="name">上海维沙美容美发经营管理有限公司</span>
+        <span class="mobile">15889588265</span>
+      </div>
+      <div class="current-down">
+        <span class="tip">倒计时</span>
+        <span class="bg">72</span>
+        <span class="exp">:</span>
+        <span class="bg">26</span>
+        <span class="exp">:</span>
+        <span class="bg">30</span>
+      </div>
+    </div>
+    <div class="section package">
+      <div class="info">
+        <span class="vip-icon" />
+        <span>购买认证通会员</span>
+        <span>套餐</span>
+        <span>1年</span>
+      </div>
+      <div class="total">
+        <span>支付总额:</span>
+        <span class="price">¥5980.00</span>
+      </div>
+    </div>
+    <div class="section bank">
+      <div class="tip">
+        请选择以下一家银行进行付款<span>(请在倒计时时间内使用</span><i>企业网银</i><span>完成本次支付)</span>
+      </div>
+      <pay-bank
+        :data="orderInfo"
+        :show-price="false"
+        :coty-status="false"
+        :pay-way="3"
+        @pay-confirm="handlePayConfirm"
+      />
+    </div>
+    <div class="submit">
+      <div class="container">
+        <el-button type="danger">立即支付</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import PayBank from '@/views/components/payment/pay-bank.vue'
+export default {
+  components: {
+    PayBank
+  },
+  data() {
+    return {
+      orderInfo: {}
+    }
+  },
+  methods: {
+    handlePayConfirm() {}
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.share-pay {
+  width: 1200px;
+  margin: 0 auto;
+  margin-bottom: 100px;
+}
+
+.section {
+  padding: 24px;
+  margin-bottom: 16px;
+  background: #fff;
+}
+
+.supplier {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+
+  .info {
+    font-size: 18px;
+
+    .name {
+      font-weight: bold;
+      margin-right: 48px;
+    }
+    .mobile {
+      color: #333333;
+    }
+  }
+}
+
+.package {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  .info {
+    color: #333333;
+    font-size: 18px;
+
+    span {
+      &:nth-child(2) {
+        margin: 0 16px 30px;
+      }
+    }
+  }
+  .total {
+    font-size: 24px;
+
+    .price {
+      color: #bc1724;
+      font-weight: bold;
+    }
+  }
+}
+
+.bank {
+  .tip {
+    font-size: 18px;
+    margin-bottom: 24px;
+    span {
+      color: #bc1724;
+    }
+    i {
+      color: #bc1724;
+      font-style: normal;
+      font-weight: bold;
+    }
+  }
+}
+
+.submit {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  padding: 24px 0;
+  background: #fff;
+  opacity: 1;
+
+  .container {
+    width: 1200px;
+    margin: 0 auto;
+    text-align: right;
+  }
+
+  .el-button {
+    width: 232px;
+    height: 48px;
+  }
+  .el-button--danger {
+    color: #ffffff;
+    background-color: #bc1724;
+    border-color: #bc1724;
+  }
+}
+
+.current-down {
+  span {
+    display: inline-block;
+    vertical-align: middle;
+    &.tip {
+      font-family: 'YouSheBiaoTiHei';
+      margin-right: 10px;
+      font-size: 24px;
+      font-weight: bold;
+      font-style: italic;
+    }
+    &.exp {
+      font-weight: bold;
+      margin: 0 8px;
+    }
+    &.bg {
+      background: #bc1724;
+      color: #fff;
+      padding: 4px;
+      border-radius: 2px;
+    }
+  }
+}
+</style>

+ 47 - 0
src/views/common/share/pay/success.vue

@@ -0,0 +1,47 @@
+<template>
+  <div class="pay-status">
+    <empty title="支付成功" :image="paySuccess" color="#1890FF" />
+    <div class="info">
+      <span>支付金额:</span>
+      <span class="price">¥{{ payAmount | formatPrice }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+import Empty from '@/components/Empty'
+import paySuccess from '@/assets/pay/pay-success.png'
+export default {
+  components: {
+    Empty
+  },
+  data() {
+    return {
+      paySuccess,
+      payAmount: ''
+    }
+  },
+  created() {
+    this.payAmount = this.$route.query.payAmount
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.pay-status{
+  width: 1200px;
+  margin: 0 auto;
+  padding-top: 160px;
+  padding-bottom: 160px;
+  background: #fff;
+}
+.info{
+  text-align: center;
+  margin-top: 16px;
+  font-size: 14px;
+  .price{
+    font-size: 20px;
+    color: #FF6D6D
+  }
+}
+</style>

+ 4 - 1
src/views/components/RadioCard/index.vue

@@ -16,7 +16,7 @@
       </el-radio>
     </el-radio-group>
     <!-- 多选 -->
-    <el-checkbox-group v-else v-model="checkList" @change="value => $emit('change', value)">
+    <el-checkbox-group v-else v-model="checkList" @change="handleCheckBoxChange">
       <el-checkbox v-for="item in list" :key="item.id" :label="item.id" :style="{ marginRight: gutter ,marginBottom: gutter }">
         <div class="radio__card" :class="objectClass(item.id)">
           <slot :row="item" name="item" />
@@ -91,6 +91,9 @@ export default {
         redio__hidden_icon: !this.showUnActiveIcon && this.checkList.includes(id),
         radio__border: this.border
       }
+    },
+    handleCheckBoxChange(value) {
+      this.$emit('change', value)
     }
   }
 }

+ 38 - 6
src/views/components/payment/pay-bank.vue

@@ -1,6 +1,6 @@
 <template>
   <div v-loading="isLoading" class="pay-bank">
-    <div class="paymount">
+    <div v-if="showPrice" class="paymount">
       支付金额:<span class="exp">¥</span><span class="price">{{ data.payAmount | formatPrice }}</span>
     </div>
     <radio-card
@@ -14,7 +14,7 @@
         <el-image :src="row.bankLogo" class="bank-icon" />
       </template>
     </radio-card>
-    <div v-if="checkedBank" class="pay-submit">
+    <div v-if="payWay === 3 && cotyStatus" class="pay-submit">
       <div class="tip">
         <div class="copy-tip">
           若您在公司的职位无法直接使用企业网银付款,请点击右侧“复制支付链接”按钮,将该链接发送给公司财务人员进行企业网银付款
@@ -37,7 +37,7 @@
 import handleClipboard from '@/utils/clipboard'
 // 单选 / 多选
 import RadioCard from '@/views/components/RadioCard'
-import { fetchBankcodeList, payVipWithUnion } from '@/api/pay'
+import { createPayUrl, fetchBankcodeList, payVipWithUnion } from '@/api/pay'
 export default {
   components: { RadioCard },
   props: {
@@ -48,6 +48,14 @@ export default {
     payWay: {
       type: Number,
       default: 0
+    },
+    showPrice: {
+      type: Boolean,
+      default: true
+    },
+    cotyStatus: {
+      type: Boolean,
+      default: true
     }
   },
   data() {
@@ -57,11 +65,18 @@ export default {
       checkedBank: '',
       payData: {},
       confirmVisiable: false,
-      userType: ''
+      userType: '',
+      payUrl: ''
+    }
+  },
+  computed: {
+    bankCode() {
+      return this.bankList.find(item => item.id === this.checkedBank)
     }
   },
   created() {
     this.fetchBankcodeList()
+    this.handleCreatePayUrl()
   },
   methods: {
     // 获取网银支付列表
@@ -81,10 +96,24 @@ export default {
       this.isLoading = true
       this.handlePay()
     },
+    // 生成网银支付链接
+    async handleCreatePayUrl() {
+      try {
+        const res = await createPayUrl({
+          authVipRecordId: this.data.vipRecordId,
+          unpaidAmount: this.data.payAmount,
+          payType: 1
+        })
+        const linkLogo = res.data.slice(res.data.lastIndexOf('=') + 1)
+        this.payUrl = `${process.env.VUE_APP_LOCAL}/#/share/pay?linkLogo=${linkLogo}`
+      } catch (error) {
+        console.log(error)
+      }
+    },
     // 复制支付链接
     handleClipboard($event) {
       this.confirmVisiable = true
-      handleClipboard(this.payData.payUrl, '支付链接已复制到剪切板', $event)
+      handleClipboard(this.payUrl, '支付链接已复制到剪切板', $event)
     },
     // 提交
     onSubmit() {
@@ -94,14 +123,17 @@ export default {
     },
     // 提交支付
     handlePay() {
+      let code = ''
       if (this.payWay === 3) {
         this.userType = 'ENTERPRISE'
+        code = this.bankCode.b2B
       }
       if (this.payWay === 4) {
         this.userType = 'USER'
+        code = this.bankCode.b2C
       }
       const params = {
-        bankCode: parseInt(this.checkedBank),
+        bankCode: code,
         returnUrl: 'https://www.caimei365.com',
         userType: this.userType,
         vipRecordId: this.data.vipRecordId

+ 1 - 0
src/views/normal/club/edit.vue

@@ -209,6 +209,7 @@ export default {
         this.formData.address = [res.data.provinceId, res.data.cityId, res.data.townId]
         // this.formData.address = '广东省/深圳市/福田区'
         this.area = res.data.area
+        this.address = res.data.area
       })
     },
 

+ 5 - 5
src/views/normal/personal/set-account.vue

@@ -6,11 +6,11 @@
       </el-form-item>
       <el-form-item label="验证码" prop="verifyCode">
         <el-row>
-          <el-col :span="18">
+          <el-col :span="17">
             <el-input v-model="formData.verifyCode" placeholder="请输入验证码" />
           </el-col>
-          <el-col :span="6" class="send-code">
-            <el-button type="primary" @click="handleSendVerifyCode">{{ sendCodeBtnText }}</el-button>
+          <el-col :span="7" class="send-code">
+            <el-button type="primary" :disabled="sendStatus > 0" @click="handleSendVerifyCode">{{ sendCodeBtnText }}</el-button>
           </el-col>
         </el-row>
       </el-form-item>
@@ -87,11 +87,11 @@ export default {
     },
     // 发送验证码
     handleSendVerifyCode() {
-      if (!isMobile(this.formData.oldMobile)) {
+      if (!isMobile(this.formData.mobile)) {
         this.$message.warning('请输入正确的手机号')
         return
       }
-      sendVerifyCode({ mobile: this.formData.oldMobile }).then(res => {
+      sendVerifyCode({ mobile: this.formData.mobile }).then(res => {
         this.$message.success('验证码已发送')
         this.countdown()
       })

+ 2 - 2
src/views/normal/personal/set-mobile.vue

@@ -6,10 +6,10 @@
       </el-form-item>
       <el-form-item label="验证码" prop="verifyCode">
         <el-row>
-          <el-col :span="18">
+          <el-col :span="17">
             <el-input v-model="formData.verifyCode" placeholder="请输入验证码" />
           </el-col>
-          <el-col :span="6" class="send-code">
+          <el-col :span="7" class="send-code">
             <el-button type="primary" @click="handleSendVerifyCode()">{{ sendCodeBtnText }}</el-button>
           </el-col>
         </el-row>

+ 5 - 5
src/views/normal/personal/vip-record.vue

@@ -98,16 +98,16 @@
       </el-table-column>
       <el-table-column label="操作" align="center">
         <template slot-scope="{ row }">
-          <el-button type="primary" size="mini" @click="handleShowDemand(row)">制需求</el-button>
+          <el-button type="primary" size="mini" @click="handleShowDemand(row)">制需求</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <!-- 制需求dialog -->
-    <el-dialog title="制需求" :visible.sync="dialogTableVisible" width="30%">
-      <el-table :data="demandList" border fit empty-text="暂无制需求">
+    <!-- 制需求dialog -->
+    <el-dialog title="制需求" :visible.sync="dialogTableVisible" width="30%">
+      <el-table :data="demandList" border fit empty-text="暂无制需求">
         <el-table-column label="序号" type="index" width="80" align="center" />
-        <el-table-column label="制需求" prop="demand" align="center" />
+        <el-table-column label="制需求" prop="demand" align="center" />
       </el-table>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="dialogTableVisible = false">关闭</el-button>

+ 11 - 2
src/views/normal/vip/buy.vue

@@ -26,7 +26,7 @@
     <!-- 定制服务 -->
     <div class="section">
       <div class="subtitle">定制服务<span class="tip">(勾选且付费后,将会有专人与您进行沟通)</span></div>
-      <radio-card v-model="checkedServiceList" :list="serviceList" type="checkbox">
+      <radio-card v-model="checkedServiceList" :list="serviceList" type="checkbox" @change="handleServiceChange">
         <template #item="{ row }">
           <div class="service-package">
             <div class="name">{{ row.name }}</div>
@@ -189,11 +189,19 @@ export default {
       this.registerSuperPay()
       this.setOrderInfo()
     },
+    // 服务修改
+    handleServiceChange() {
+      console.log(this.serviceList)
+      this.checkedPayWay = 0
+      this.registerSuperPay()
+      this.setOrderInfo()
+    },
     // 在线支付开通会员预处理
     registerSuperPay() {
       registerSuperPay({
         authUserId: this.$store.getters.authUserId,
-        packageId: this.checkedPackage
+        packageId: this.checkedPackage,
+        services: this.checkedServiceList.join(',')
       }).then(res => {
         this.orderInfo.vipRecordId = res.data
       })
@@ -236,6 +244,7 @@ export default {
     handlePayResult(result) {
       result = JSON.parse(result.data)
       if (result.data.status === '1') {
+        this.$store.dispatch('user/fetchUserVipInfo')
         this.$router.push({
           path: '/pay/success',
           query: this.redirectUrlQuery

+ 10 - 10
src/views/normal/vip/index.vue

@@ -50,33 +50,33 @@ export default {
         },
         {
           image: vipIcon2,
-          name: '机构授权认证',
+          name: '设备授权认证',
           subName: '享认证数量不限'
         },
         {
           image: vipIcon3,
-          name: '机构授权认证',
+          name: '医师资格认证',
           subName: '享认证数量不限'
         },
         {
           image: vipIcon4,
-          name: '机构授权认证',
-          subName: '享认证数量不限'
+          name: '采美品牌背书',
+          subName: '采美平台专属认证'
         },
         {
           image: vipIcon5,
-          name: '机构授权认证',
-          subName: '享认证数量不限'
+          name: '专属服务',
+          subName: '一对一'
         },
         {
           image: vipIcon6,
-          name: '机构授权认证',
-          subName: '享认证数量不限'
+          name: '免费升级迭代',
+          subName: '定期更新维护'
         },
         {
           image: vipIcon7,
-          name: '机构授权认证',
-          subName: '享认证数量不限'
+          name: '更多订制服务',
+          subName: '平台订制化需求'
         }
       ]
     }