zhangdan преди 4 години
родител
ревизия
1d7742c9c4
променени са 4 файла, в които са добавени 244 реда и са изтрити 140 реда
  1. 10 0
      src/api/userManage.js
  2. 149 94
      src/views/businessManage/userManage/userManage.vue
  3. 9 0
      src/views/userInfo/userDetails.vue
  4. 76 46
      src/views/userInfo/userManageList.vue

+ 10 - 0
src/api/userManage.js

@@ -74,3 +74,13 @@ export const slelerDetails = (params) => {
     method: 'get'
   })
 }
+
+// 获取用户二维码
+export const qRCode = (params) => {
+  const url = `customer/simpleEncodeUserInfo/${params.id}`
+  return axios({
+    url: url,
+    data: params,
+    method: 'get'
+  })
+}

+ 149 - 94
src/views/businessManage/userManage/userManage.vue

@@ -5,24 +5,12 @@
         <a-row :gutter="20">
           <a-col :span="5">
             <a-form-item label="用户名称" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-              <a-input
-                allowClear
-                v-model.trim="queryParam.name"
-                placeholder="请输入用户名称"
-                id="userList-name"
-                :maxLength="30"
-              />
+              <a-input allowClear v-model.trim="queryParam.name" placeholder="请输入用户名称" id="userList-name" :maxLength="30" />
             </a-form-item>
           </a-col>
           <a-col :span="5">
             <a-form-item label="手机号码" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-              <a-input
-                allowClear
-                v-model.trim="queryParam.phone"
-                placeholder="请输入手机号码"
-                :maxLength="11"
-                id="userList-phone"
-              />
+              <a-input allowClear v-model.trim="queryParam.phone" placeholder="请输入手机号码" :maxLength="11" id="userList-phone" />
             </a-form-item>
           </a-col>
           <a-col :span="5">
@@ -81,29 +69,37 @@
         <span v-if="!$hasPermissions('B_userManage_enable')">--</span>
       </span>
       <span slot="action" slot-scope="text, record">
+        <a-icon type="qrcode" title="查看小程序码" @click="getQrCode(record)" :style="{ fontSize: '20px', color: '#008000', padding: '0 10px' }" />
         <a-icon
           v-if="$hasPermissions('B_userManage_resetPwd') && record.loginFlag==1"
           type="unlock"
           title="重置密码"
           class="actionBtn icon-orange"
           @click="resetPassword(record)" />
-        <a-icon
-          v-if="$hasPermissions('B_userManage_edit')"
-          type="edit"
-          title="编辑"
-          class="actionBtn icon-blues"
-          @click="handleEdit(record)"
-        />
+        <a-icon v-if="$hasPermissions('B_userManage_edit')" type="edit" title="编辑" class="actionBtn icon-blues" @click="handleEdit(record)" />
         <a-icon
           v-if="$hasPermissions('B_userManage_del') && record.loginFlag==0"
           type="delete"
           title="删除"
           class="actionBtn icon-red"
-          @click="delect(record)"/>
+          @click="delect(record)" />
         <span v-if="!$hasPermissions('B_userManage_edit') && !($hasPermissions('B_userManage_resetPwd') && record.loginFlag==1) && !($hasPermissions('B_userManage_del') && record.loginFlag==0) ">--</span>
       </span>
     </s-table>
     <userModal :visible="showModal" @refresh="$refs.table.refresh(true)" :itemId="itemId" @close="cancel"></userModal>
+    <!-- 查看小程序码 -->
+    <a-modal
+      class="qrCodeModal"
+      title="查看二维码"
+      :width="500"
+      :footer="null"
+      :destroyOnClose="true"
+      @cancel="isQrCodeModal = false"
+      v-model="isQrCodeModal">
+      <img :src="qrCode" width="400" height="400" class="qrCode" />
+      <p class="info">邀请人:{{ this.name }}{{ this.phone }}</p>
+      <a-button type="primary" class="downQrCode" @click="downloadCode">下载二维码</a-button>
+    </a-modal>
   </a-card>
 </template>
 
@@ -113,7 +109,15 @@ import {
   VSelect
 } from '@/components'
 import userModal from './userModal.vue'
-import { sellerList, resetPSD, updateEnableStatus, getPowerUserList, delectUserPower } from '@/api/userManage.js'
+import {
+  sellerList,
+  resetPSD,
+  updateEnableStatus,
+  getPowerUserList,
+  delectUserPower,
+  qRCode
+} from '@/api/userManage.js'
+import QRCode from 'qrcode'
 export default {
   name: 'UserManage',
   components: {
@@ -124,12 +128,12 @@ export default {
   data () {
     return {
       formItemLayout: {
-		  labelCol: {
-		    span: 7
-		  },
-		  wrapperCol: {
-		    span: 17
-		  }
+        labelCol: {
+          span: 7
+        },
+        wrapperCol: {
+          span: 17
+        }
       },
       // 查询参数
       queryParam: {
@@ -140,7 +144,11 @@ export default {
       },
       showModal: false,
       itemId: null, // 编辑行id
-	  optionData: [],
+      qrCode: '', //  小程序码
+      isQrCodeModal: false, //  查看小程序码   弹框展示状态
+      optionData: [],
+      name: '', // 受邀人姓名
+      phone: '', // 受邀人电话
       // 表头
       columns: [{
         title: '序号',
@@ -166,26 +174,12 @@ export default {
         width: 100,
         align: 'center'
       },
-	  {
-	    title: '所属商户',
-	    dataIndex: 'org.name',
-	    width: 100,
-	    align: 'center'
-	  },
-	  // {
-	  //   title: '超级管理员',
-	  //   width: '100',
-	  //   align: 'center',
-	  //   scopedSlots: {
-	  //     customRender: 'status'
-	  //   }
-	  // },
-      // {
-      //   title: '角色',
-      //   width: '100',
-      //   align: 'center',
-      //   dataIndex: 'roleNames'
-      // },
+      {
+        title: '所属商户',
+        dataIndex: 'org.name',
+        width: 100,
+        align: 'center'
+      },
       {
         title: '状态',
         width: 100,
@@ -223,33 +217,32 @@ export default {
     })
   },
   methods: {
-	  handleChange (value) {
-	    console.log(`selected ${value}`)
-	  },
-	  handleBlur () {
-	    console.log('blur')
-	  },
-	  handleFocus () {
-	    console.log('focus')
-	  },
-	  filterOption (input, option) {
-	    return (
-	      option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
-	    )
-	  },
-	  cancel () {
-	    this.itemId = null
-	    this.showModal = false
-	  },
-	  // 获取合作商数据
-	  getSellerList () {
-		  sellerList().then(res => {
-			  console.log(res, '-----合作商')
-			  if (res.status == 200) {
-				  this.optionData = res.data || []
-			  }
-		  })
-	  },
+    handleChange (value) {
+      console.log(`selected ${value}`)
+    },
+    handleBlur () {
+      console.log('blur')
+    },
+    handleFocus () {
+      console.log('focus')
+    },
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      )
+    },
+    cancel () {
+      this.itemId = null
+      this.showModal = false
+    },
+    // 获取合作商数据
+    getSellerList () {
+      sellerList().then(res => {
+        if (res.status == 200) {
+          this.optionData = res.data || []
+        }
+      })
+    },
 
     // 刷新列表
     refreshTable () {
@@ -263,11 +256,65 @@ export default {
     // 重置
     reset () {
       this.queryParam.name = ''
-      this.queryParam.phone = '',
+      this.queryParam.phone = ''
       this.queryParam.loginFlag = ''
-	   this.queryParam.orgCode = undefined
+      this.queryParam.orgCode = undefined
       this.refreshTable()
     },
+    // 查看二维码
+    getQrCode (item) {
+      console.log(item)
+      const _this = this
+      _this.name = item.name
+      _this.phone = item.phone
+      const opts = {
+        errorCorrectionLevel: 'H',
+        type: 'image/jpeg',
+        quality: 0.3,
+        margin: 1.5,
+        width: 120,
+        color: {
+          dark: '#000000',
+          light: '#ffffff'
+        }
+      }
+      _this.shName = item.name + item.phone
+      console.log(item.encryptedPartnerNo)
+      qRCode({ id: item.id }).then(res => {
+        if (res.status == 200) {
+          const url = res.data
+          QRCode.toDataURL(url, opts, function (err, url) {
+            _this.qrCode = url
+            _this.isQrCodeModal = true
+          })
+        }
+      })
+      // if (url) {
+      //   QRCode.toDataURL(url, opts, function (err, url) {
+      //     _this.qrCode = url
+      //     _this.isQrCodeModal = true
+      //   })
+      // }
+    },
+    // 查看小程序码
+    // getQrCode (item) {
+    //   storeQrCode({ id: item.id, deviceNo: item.deviceNos.split(',')[0] }).then(res => {
+    //     if (res.status == 200) {
+    //       this.qrCode = 'data:image/png;base64,' + res.data
+    //       this.isQrCodeModal = true
+    //     } else {
+    //       this.qrCode = ''
+    //       this.$message.error(res.message)
+    //     }
+    //   })
+    // },
+    //  下载小程序码
+    downloadCode () {
+      const link = document.createElement('a')
+      link.href = this.qrCode
+      link.download = this.shName + '.jpg'
+      link.click()
+    },
     // 重置密码
     resetPassword (row) {
       resetPSD({
@@ -299,16 +346,9 @@ export default {
         }
       })
     },
-    // getBizStr (storeBizList) {
-    //   const str = []
-    //   storeBizList.forEach(item => {
-    //     str.push(item.bizTypeName)
-    //   })
-    //   return str.join(',')
-    // },
     handleEdit (row) {
       console.log(row, 'row')
-	  this.itemId = row.id
+      this.itemId = row.id
       this.showModal = true
     },
     // 修改状态
@@ -329,11 +369,26 @@ export default {
 }
 </script>
 <style lang="less">
-	.userManage-page-info{
-		.userManage-search{
-			.ant-form-inline .ant-form-item {
-				width: 100%;
-			}
-		}
-	}
+  .userManage-page-info {
+    .userManage-search {
+      .ant-form-inline .ant-form-item {
+        width: 100%;
+      }
+    }
+  }
+  .qrCodeModal {
+  	.qrCode {
+  		display: block;
+  		max-width: 100%;
+  		margin: 0 auto;
+  	}
+  	.downQrCode {
+  		display: block;
+  		margin: 40px auto 30px;
+  	}
+    .info{
+      text-align: center;
+      margin: 15px 0 0 0;
+    }
+  }
 </style>

+ 9 - 0
src/views/userInfo/userDetails.vue

@@ -52,6 +52,15 @@
         <p class="item-label">注册时间:</p>
         <p class="item-main">{{ page.registerTime ? page.registerTime : '--' }}</p>
       </a-col>
+      <a-col :span="24" class="item-cont">
+        <p class="item-label">用户注册方式:</p>
+        <p class="item-main">{{ page.introTypeDictValue ? page.introTypeDictValue : '--' }}</p>
+      </a-col>
+      <a-col :span="24" class="item-cont">
+        <p class="item-label">邀请人:</p>
+        <p class="item-main">{{ page.userName ? page.userName +'-': '' }}{{ page.userPhone ? page.userPhone : '' }}</p>
+        <p class="item-main" v-if="!page.userName && !page.userPhone">--</p>
+      </a-col>
       <a-col :span="24" class="item-cont">
         <p class="item-label">最后登录时间:</p>
         <p class="item-main">{{ page.lastLoginTime ? page.lastLoginTime : '--' }}</p>

+ 76 - 46
src/views/userInfo/userManageList.vue

@@ -37,18 +37,8 @@
                 <span style="margin:0 11%">-</span>
                 <a-input-number id="inputNumber" v-model="queryParam.currentGoldMax" :max="999999999" />
               </div>
-              <!-- <div class="input-number">
-                <a-input-number id="inputNumber" v-model="queryParam.currentGoldMax" :max="999999999" />
-              </div> -->
             </a-form-model-item>
           </a-col>
-          <!-- <a-col :span="2">
-            <a-form-model-item label=" " prop="currentGoldMax" :colon="false" :label-col="{span:1}" :wrapper-col="{span:23}">
-              <div class="input-number">
-                <a-input-number id="inputNumber" v-model="queryParam.currentGoldMax" :max="999999999" />
-              </div>
-            </a-form-model-item>
-          </a-col> -->
         </a-row>
         <a-row :gutter="20">
           <a-col :span="6">
@@ -104,7 +94,22 @@
             </a-form-item>
           </a-col>
         </a-row>
-        <a-row style="margin-bottom:15px">
+        <a-row :gutter="20">
+          <a-col :span="6">
+            <a-form-model-item label="用户注册方式" prop="introType" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
+              <v-select
+                v-model="queryParam.introType"
+                id="userManageList-introType"
+                code="INTRO_TYPE"
+                placeholder="请选择注册方式"
+                allowClear></v-select>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-model-item label="受邀人" prop="userPhone" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
+              <a-input v-model.trim="queryParam.userPhone" placeholder="请输入受邀人手机号或姓名" id="userManageList-userPhone" @pressEnter="$refs.table.refresh(true)" allowClear/>
+            </a-form-model-item>
+          </a-col>
           <a-col style="float: right">
             <a-button class="handle-btn serach-btn" id="userManageList-btn-serach" type="primary" @click="refresh">查询</a-button>
             <a-button class="handle-btn" type="" id="userManageList-btn-reset" @click="handleReset">重置</a-button>
@@ -124,6 +129,7 @@
       :rowKey="(record) => record.id"
       :columns="columns"
       :data="loadData"
+      :scroll="{ x: 1800}"
       bordered>
       <!--启用禁用 -->
       <template slot="state" slot-scope="text, record">
@@ -136,6 +142,12 @@
           @change="changeFlagHandle(text, record)" />
         <span v-if="!$hasPermissions('B_user_userManage_enable')">--</span>
       </template>
+      <!-- 受邀人 -->
+      <template slot="person" slot-scope="text,record">
+        <p>{{ record.userName }}</p>
+        <p>{{ record.userPhone }}</p>
+        <p v-if="!record.userName &&!record.userPhone">--</p>
+      </template>
       <!-- 操作 -->
       <template slot="action" slot-scope="text, record">
         <a-button id="userManageList-handleUser" type="link" @click="handleUser(record)" v-hasPermission="'B_user_userManage_userDetails'">用户详情</a-button>
@@ -192,12 +204,16 @@ export default {
         beginRegisterTime: null, //  注册时间最小值
         endRegisterTime: null, //  注册时间最大值
         labelNoList: [], // 网点标签
-        firstDeliveryStationNo: undefined // 首次投递
+        firstDeliveryStationNo: undefined, // 首次投递
+        introType: '', // 注册方式
+        userPhone: '' // 受邀人
       },
       loading: false, // 导出loading
       // 表头
-      columns: [{ title: '序号', dataIndex: 'no', width: 60, align: 'center' },
-        { title: '用户手机', dataIndex: 'mobile', width: 100, align: 'center' },
+      columns: [{ title: '序号', dataIndex: 'no', width: 80, align: 'center', fixed: 'left' },
+        { title: '用户手机', dataIndex: 'mobile', width: 150, align: 'center' },
+        { title: '用户注册方式', dataIndex: 'introTypeDictValue', width: 150, align: 'center', customRender: (text) => { return text || '--' } },
+        { title: '受邀人', dataIndex: 'person', width: 150, align: 'center', scopedSlots: { customRender: 'person' } },
         { title: '用户身份', dataIndex: 'customerRoleDictValue', width: 100, align: 'center' },
         { title: '乐豆余额', dataIndex: 'currentGold', width: 100, align: 'center', customRender: (text) => { return text || 0 } },
         { title: '累计乐豆', dataIndex: 'totalGold', width: 100, align: 'center', customRender: (text) => { return text || 0 } },
@@ -207,7 +223,7 @@ export default {
         { title: '状态', width: 100, dataIndex: 'state', align: 'center', scopedSlots: { customRender: 'state' } },
         { title: '首次投递网点', dataIndex: 'firstDeliveryStationName', width: 150, align: 'center', customRender: (text) => { return text || '--' } },
         { title: '网点标签', dataIndex: 'labelName', width: 150, align: 'center', customRender: (text) => { return text || '--' } },
-        { title: '操作', scopedSlots: { customRender: 'action' }, width: 100, align: 'center' }],
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: 120, align: 'center' }],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
         const searchData = Object.assign(parameter, this.queryParam)
@@ -365,43 +381,57 @@ export default {
     // 导出
     handleExport () {
       const params = this.queryParam
-      if (this.lastDeliverTime && this.lastDeliverTime.length) {
-        params.beginDate = moment(this.lastDeliverTime[0])
-        params.endDate = moment(this.lastDeliverTime[1])
-        if (!params.beginDate && !params.endDate) {
-          this.$message.error('请先选择需要导出的最后投递时间区间再进行导出!')
-          return
-        }
-        // 判断两个时间段是否相差m个月  第二个参数指相差单位,第三个参数指是否返回浮点形式(小数)
-        if (moment(params.endDate).diff(moment(params.beginDate), 'months', true) > 3) {
-          this.$message.error('单次最多只能导出3个月的数据,请缩小最后投递时间查询区间后再进行导出!')
-          return
-        }
-      } else {
-        params.beginDate = ''
-        params.endDate = ''
-      }
-
       if (this.registerTime && this.registerTime.length) {
         params.beginRegisterTime = moment(this.registerTime[0])
         params.endRegisterTime = moment(this.registerTime[1])
-        if (!params.beginRegisterTime && !params.endRegisterTime) {
-          this.$message.error('请先选择需要导出的注册时间区间再进行导出!')
-          return
-        }
-        // 判断两个时间段是否相差m个月  第二个参数指相差单位,第三个参数指是否返回浮点形式(小数)
-        if (moment(params.endRegisterTime).diff(moment(params.beginRegisterTime), 'months', true) > 3) {
-          this.$message.error('单次最多只能导出3个月的数据,请缩小注册时间查询区间后再进行导出!')
-          return
-        }
       } else {
-        params.beginRegisterTime = ''
-        params.endRegisterTime = ''
+        params.beginRegisterTime = null
+        params.endRegisterTime = null
       }
-      if (this.lastDeliverTime.length == 0 && this.registerTime.length == 0) {
-        this.$message.error('请先选择需要导出的注册时间区间或最后投递时间区间再进行导出(3个月以内)!')
-        return
+      if (this.lastDeliverTime && this.lastDeliverTime.length) {
+        params.beginDate = moment(this.lastDeliverTime[0])
+        params.endDate = moment(this.lastDeliverTime[1])
+      } else {
+        params.beginDate = null
+        params.endDate = null
       }
+      // if (this.lastDeliverTime && this.lastDeliverTime.length) {
+      //   params.beginDate = moment(this.lastDeliverTime[0])
+      //   params.endDate = moment(this.lastDeliverTime[1])
+      //   if (!params.beginDate && !params.endDate) {
+      //     this.$message.error('请先选择需要导出的最后投递时间区间再进行导出!')
+      //     return
+      //   }
+      //   // 判断两个时间段是否相差m个月  第二个参数指相差单位,第三个参数指是否返回浮点形式(小数)
+      //   if (moment(params.endDate).diff(moment(params.beginDate), 'months', true) > 3) {
+      //     this.$message.error('单次最多只能导出3个月的数据,请缩小最后投递时间查询区间后再进行导出!')
+      //     return
+      //   }
+      // } else {
+      //   params.beginDate = ''
+      //   params.endDate = ''
+      // }
+
+      // if (this.registerTime && this.registerTime.length) {
+      //   params.beginRegisterTime = moment(this.registerTime[0])
+      //   params.endRegisterTime = moment(this.registerTime[1])
+      //   if (!params.beginRegisterTime && !params.endRegisterTime) {
+      //     this.$message.error('请先选择需要导出的注册时间区间再进行导出!')
+      //     return
+      //   }
+      //   // 判断两个时间段是否相差m个月  第二个参数指相差单位,第三个参数指是否返回浮点形式(小数)
+      //   if (moment(params.endRegisterTime).diff(moment(params.beginRegisterTime), 'months', true) > 3) {
+      //     this.$message.error('单次最多只能导出3个月的数据,请缩小注册时间查询区间后再进行导出!')
+      //     return
+      //   }
+      // } else {
+      //   params.beginRegisterTime = ''
+      //   params.endRegisterTime = ''
+      // }
+      // if (this.lastDeliverTime.length == 0 && this.registerTime.length == 0) {
+      //   this.$message.error('请先选择需要导出的注册时间区间或最后投递时间区间再进行导出(3个月以内)!')
+      //   return
+      // }
 	  this.$confirm({
 	    title: '提示',
 	    content: '导出过程可能需要一段时间,且导出期间不可进行其他操作,确认要导出吗?',