admin/addon/cashier/source/os/components/nc-select-member/nc-select-member.vue

581 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<uni-popup ref="memberInquirePopup" type="center">
<view class="member-inquire-wrap">
<view class="member-header">
<text class="title">会员列表</text>
<text class="iconfont iconguanbi1" @click="$refs.memberInquirePopup.close()"></text>
</view>
<view class="member-content">
<view class="search-warp">
<view class="search-input">
<input
focus
placeholder="可查询会员账号、手机号、昵称、会员码(可使用扫码枪)、会员动态码"
placeholder-style="font-size:0.14rem"
v-model="searchText"
@confirm="searchMember()"
/>
<button class="switch primary-btn" @click="searchMember()">查询</button>
<button class="default-btn" plain="true" @click="$refs.memberEnteringPopup.open()">添加会员</button>
</view>
</view>
<scroll-view @scrolltolower="getMemberList()" scroll-y="true" class="member-list">
<view
:class="['member-item', { active: item.member_id == memberId }]"
v-for="(item, index) in memberList"
:key="index"
@click="getMemberInfo(item.member_id)"
>
<image class="item-img" mode="aspectFill" v-if="item.headimg" :src="$util.img(item.headimg)" @error="headError(item)"></image>
<image class="item-img" mode="aspectFill" v-else :src="$util.img('public/uniapp/default_img/head.png')"></image>
<view class="item-content">
<view class="name">
<text>{{ item.nickname }}</text>
<!-- <text>(id:1568)</text> -->
</view>
<view class="phone">手机号:{{ item.mobile ? item.mobile : '--' }}</view>
<view class="other">
<!-- <view>类型:小程序</view> -->
<view>消费券:{{ parseFloat(parseFloat(item.balance) + parseFloat(item.balance_money)).toFixed(2) }}</view>
</view>
</view>
</view>
<view v-if="memberList.length == 0" class="empty">
<image :src="$util.img('public/uniapp/cashier/member-empty.png')" mode="widthFix"></image>
<view class="tips">暂无会员</view>
</view>
</scroll-view>
</view>
</view>
</uni-popup>
<uni-popup ref="memberEnteringPopup" type="center">
<view class="member-entering-wrap">
<view class="header">
<text class="title">录入会员</text>
<text class="iconfont iconguanbi1" @click="memberEnteringClose()"></text>
</view>
<view class="form-content">
<view>
<view class="form-item">
<view class="form-label">
<text class="required">*</text>
手机号:
</view>
<view class="form-inline search-wrap"><input type="number" class="form-input" v-model="memberData.mobile" placeholder="请输入会员手机号" /></view>
</view>
<view class="form-item">
<view class="form-label">
<text class="required"></text>
会员名称:
</view>
<view class="form-inline search-wrap"><input type="text" class="form-input" v-model="memberData.nickname" placeholder="请输入会员昵称" /></view>
</view>
<view class="form-item">
<view class="form-label">
<text class="required"></text>
性别:
</view>
<view class="form-inline search-wrap"><uni-data-checkbox v-model="memberData.sex" selectedColor="#8558FA" :localdata="sex"></uni-data-checkbox></view>
</view>
<view class="form-item">
<view class="form-label">
<text class="required"></text>
生日
</view>
<view class="form-inline">
<uni-datetime-picker :start="startDate" v-model="memberData.birthday" type="date" :clearIcon="false" @change="changeTime" />
</view>
</view>
<view class="form-item" v-if="memberLevelList.length">
<view class="form-label">
<text class="required"></text>
会员等级:
</view>
<view class="form-inline">
<select-lay
:zindex="10"
:value="memberData.member_level"
name="names"
placeholder="请选择会员等级"
:options="memberLevelList"
@selectitem="selectMemberLevel"
></select-lay>
</view>
</view>
</view>
<view class="btn-wrap"><button type="primary" class="primary-btn" @click="addMember">确定录入</button></view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
data() {
return {
memberList: [],
searchText: '',
page: 1,
one_judge: true, // 第一次请求列表、详情渲染判断
memberId: '',
startDate: '1900-1-1',
memberData: {
sex: 0,
mobile: '',
nickname: '',
birthday: '',
headimg: '',
member_level: '',
member_level_name: ''
},
memberLevelList: [], //会员等级
sex: [
{
text: '未知',
value: 0
},
{
text: '男',
value: 1
},
{
text: '女',
value: 2
}
],
flag: false
};
},
created() {
this.getMemberList();
this.getMemberLevel();
},
methods: {
open() {
this.$refs.memberInquirePopup.open();
},
searchMember() {
this.page = 1;
this.getMemberList();
},
// 查询会员列表
getMemberList() {
let data = {
page: this.page,
page_size: 12,
search_text: this.searchText
};
this.$api.sendRequest({
url: '/cashier/storeapi/member/lists',
data: data,
success: res => {
if (res.code >= 0) {
if (this.page == 1) this.memberList = [];
this.memberList = this.memberList.concat(res.data.list);
if (res.data.page_count >= this.page) this.page++;
}
}
});
},
getMemberInfo(memberId) {
this.memberId = memberId;
this.$api.sendRequest({
url: '/cashier/storeapi/member/info',
data: {
member_id: memberId
},
success: res => {
if (res.code == 0 && res.data) {
this.$store.commit('setMemberInfo', res.data);
this.$refs.memberInquirePopup.close();
} else {
this.$util.showToast({
title: '未获取到会员信息'
});
}
}
});
},
/******************************** 录入会员 ********************************/
getMemberLevel() {
this.memberLevelList = [];
this.$api.sendRequest({
url: '/cashier/storeapi/memberlevel/lists',
success: res => {
if (res.code == 0 && res.data) {
for (let i in res.data) {
this.memberLevelList.push({
label: res.data[i]['level_name'],
value: res.data[i]['level_id'].toString(),
disabled: false
});
}
}
}
});
},
// 选择会员等级
selectMemberLevel(index, item) {
if (index >= 0) {
this.memberData.member_level = item.value;
this.memberData.member_level_name = item.label;
} else {
this.memberData.member_level = '';
this.memberData.member_level_name = '';
}
this.$forceUpdate();
},
// 选择时间
changeTime(e) {
this.memberData.birthday = e;
},
verify() {
if (!this.memberData.mobile) {
this.$util.showToast({
title: '请输入会员手机号'
});
return false;
}
if (!/^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/.test(this.memberData.mobile)) {
this.$util.showToast({
title: '请输入正确的手机号码'
});
return false;
}
return true;
},
// 确定录入
addMember() {
if (this.verify()) {
if (this.flag) return;
this.flag = true;
let data = this.memberData;
this.$api.sendRequest({
url: '/cashier/storeapi/member/addMember',
data: this.memberData,
success: res => {
if (res.code == 0 && res.data) {
this.memberEnteringClose();
} else {
this.$util.showToast({
title: res.message
});
}
this.flag = false;
}
});
}
},
memberEnteringClose() {
this.$refs.memberEnteringPopup.close();
this.page = 1;
this.searchText = '';
this.getMemberList();
}
}
};
</script>
<style lang="scss">
.member-inquire-wrap {
overflow: hidden;
width: 9.55rem;
height: 5.37rem;
background-color: #fff;
border-radius: 0.05rem;
.member-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 0.15rem;
height: 0.45rem;
line-height: 0.45rem;
border-bottom: 0.01rem solid #e8eaec;
.iconfont {
font-size: $uni-font-size-lg;
}
}
.member-content {
padding: 0.1rem;
.search-warp {
margin-left: 0.1rem;
.search-input {
display: flex;
align-items: center;
margin-bottom: 0.05rem;
input {
flex: 1;
padding-left: 0.1rem;
width: 2.5rem;
height: 0.4rem;
line-height: 0.4rem;
border: 0.01rem solid #dcdee2;
border-right: none;
}
button {
width: 2rem;
height: 0.42rem;
line-height: 0.42rem;
color: #fff;
font-size: $uni-font-size-base;
margin: 0;
&:last-of-type {
margin-left: 0.15rem;
margin-right: 0.1rem;
}
}
}
}
/deep/ .uni-scroll-view-content {
display: flex;
flex-wrap: wrap;
align-content: baseline;
height: 430px;
}
.member-list {
.member-item {
display: flex;
padding: 0.13rem 0.15rem;
margin: 0.1rem;
width: 2.9rem;
height: 1rem;
background-color: #f5f5f5;
box-sizing: border-box;
border-radius: 0.05rem;
&.active {
background-color: $primary-color;
.name,
.phone,
.other > view {
color: #fff;
}
}
&:nth-child(3n + 3) {
margin-right: 0;
}
image {
width: 0.45rem;
height: 0.45rem;
border-radius: 50%;
margin-right: 0.1rem;
flex-shrink: 0;
}
.item-content {
display: flex;
flex-direction: column;
justify-content: space-between;
flex: 1;
}
.name {
text:nth-child(1) {
font-size: $uni-font-size-lg;
font-weight: bold;
}
}
.phone {
font-size: $uni-font-size-sm;
color: #666;
}
.other {
display: flex;
justify-content: space-between;
font-size: $uni-font-size-sm;
view {
font-size: $uni-font-size-sm;
color: #666;
}
}
}
}
}
}
// 录入会员
.member-entering-wrap {
width: 6.5rem;
height: 3.66rem;
background-color: #fff;
border-radius: 0.05rem;
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 0.15rem;
height: 0.45rem;
line-height: 0.45rem;
border-bottom: 0.01rem solid #e8eaec;
.iconfont {
font-size: $uni-font-size-lg;
}
}
.form-content {
margin-top: 0.2rem;
display: flex;
flex-direction: column;
align-items: center;
.form-item {
margin-bottom: 0.1rem;
display: flex;
.form-label {
width: 0.9rem;
text-align: right;
padding-right: 0.1rem;
box-sizing: border-box;
height: 0.32rem;
line-height: 0.32rem;
.required {
color: red;
margin-right: 0.03rem;
}
}
.form-inline {
width: 2.4rem;
line-height: 0.32rem;
margin-right: 0.1rem;
box-sizing: border-box;
.form-input {
border-width: 0.01rem;
border-style: solid;
background-color: #fff;
color: rgba(0, 0, 0, 0.85);
border-radius: 0.02rem;
padding-left: 0.1rem;
height: 0.32rem;
line-height: 0.32rem;
font-size: 0.14rem;
border-color: #e6e6e6;
border-radius: 0.02rem;
}
.form-textarea {
border-width: 0.01rem;
border-style: solid;
background-color: #fff;
color: rgba(0, 0, 0, 0.85);
border-radius: 0.02rem;
padding-left: 0.1rem;
line-height: 0.32rem;
font-size: 0.14rem;
border-color: #e6e6e6;
height: 1rem;
}
button {
width: calc(50% - 0.05rem);
display: inline-block;
margin-right: 0.1rem;
&:nth-child(2) {
margin-right: 0;
}
}
.upload-box {
width: 0.7rem;
height: 0.7rem;
cursor: pointer;
.upload-img {
width: 100%;
height: 100%;
border: 0.01rem solid #e6e6e6;
image {
width: 100%;
height: 100%;
}
}
.upload-icon {
width: 100%;
height: 100%;
border: 0.01rem solid #e6e6e6;
align-items: center;
text-align: center;
line-height: 1.2;
display: flex;
flex-direction: column;
justify-content: center;
color: #999;
.iconfont {
font-size: 0.3rem;
}
view {
font-size: 0.12rem;
}
}
}
}
.search-wrap {
position: relative;
i {
position: absolute;
top: 50%;
right: 0.1rem;
transform: translateY(-50%);
border-left: 0.01rem solid #e6e6e6;
line-height: 0.3rem;
padding-left: 0.1rem;
cursor: pointer;
}
}
.label-list {
width: calc(100% - 1.35rem);
display: flex;
align-items: center;
flex-wrap: wrap;
.label-item {
border: 0.01rem solid #e6e6e6;
padding: 0.07rem 0.1rem;
line-height: 1;
margin-right: 0.1rem;
border-radius: 0.03rem;
cursor: pointer;
position: relative;
margin-bottom: 0.1rem;
i {
position: absolute;
right: -0.01rem;
bottom: -0.01rem;
color: $primary-color;
display: none;
}
&.active {
border-color: $primary-color;
i {
display: block;
}
}
}
}
}
.btn-wrap {
position: absolute;
bottom: 0.15rem;
left: 0.25rem;
right: 0.25rem;
.primary-btn {
height: 0.4rem;
line-height: 0.4rem;
}
}
}
}
.empty {
text-align: center;
padding-top: 0.8rem;
width: 100%;
image {
width: 2rem;
}
.tips {
color: #999;
margin-top: 0.15rem;
}
}
</style>