| @ -1,521 +0,0 @@ | |||||
| <template> | |||||
| <view class="page"> | |||||
| <!-- 导航栏 --> | |||||
| <navbar title="个人中心" | |||||
| leftClick | |||||
| @leftClick="$utils.navigateBack" | |||||
| bgColor="#E3441A" color="#fff" /> | |||||
| <!-- 头部 --> | |||||
| <view class="head"> | |||||
| <view class="headImage"> | |||||
| <image :src="userInfo.headImage" mode="aspectFill"></image> | |||||
| </view> | |||||
| <view class="user-info"> | |||||
| <view class="user-base-info"> | |||||
| <view class="user-base-top"> | |||||
| <view class="user-name">{{ userInfo.nickName}}</view> | |||||
| <view class="member-level"> | |||||
| <image v-if="userInfo.role == 1" :src="configList.vip_user" mode="aspectFill" class="level"> | |||||
| </image> | |||||
| <image v-if="userInfo.role == 2" src="@/static/image/center/gold-min.png" mode="aspectFill" | |||||
| class="level"> | |||||
| </image> | |||||
| <image v-if="userInfo.role == 3" src="@/static/image/center/sliver-min.png" | |||||
| mode="aspectFill" class="level"> | |||||
| </image> | |||||
| </view> | |||||
| <view class="user-tag"> | |||||
| {{ userRole[userInfo.isPay] }} | |||||
| </view> | |||||
| </view> | |||||
| <view class="edit-user" | |||||
| @click="$utils.navigateTo('/pages_order/mine/updateUser?back=true')"> | |||||
| <image src="@/static/image/center/edit-icon.png" mode="aspectFill" class="edit-icon"></image> | |||||
| <view class="edit-btn"> | |||||
| 修改资料 | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| <view class="user-phone"> | |||||
| 手机号:{{ userInfo.phone }} | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| <!-- 会员卡片 --> | |||||
| <view @click="$utils.navigateTo({url : '/pages_order/mine/memberCenter' })" | |||||
| v-if="userInfo.role" | |||||
| class="earnings"> | |||||
| <view v-if="index + 1 == userInfo.role" v-for="(item,index) in vipList" :key="item.id" class="member-item"> | |||||
| <image :src="item.headImage" mode="aspectFill" class="member-image"></image> | |||||
| <view class="member-info"> | |||||
| <view class="profile-photo"> | |||||
| <image :src="userInfo.headImage" mode="aspectFill" class="pro-img"></image> | |||||
| <view class="open-status"> | |||||
| 开通时间:{{ riceInfo.openTime }} | |||||
| </view> | |||||
| </view> | |||||
| <view class="open"> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| <!-- 佣金数据 --> | |||||
| <view @click="$utils.navigateTo('/pages_order/mine/withdraw')" class="brokerage-data" | |||||
| :class="{'brokerage-data-mt' : !userInfo.role}"> | |||||
| <view class="brokerage"> | |||||
| <image :src="configList.money_image" mode="aspectFill" class="brokerage-img"></image> | |||||
| <div class="main"> | |||||
| <div class="title">我的佣金</div> | |||||
| <div class="money">¥{{ riceInfo.canWithdraw || 0 }}</div> | |||||
| </div> | |||||
| </view> | |||||
| <view class="balance"> | |||||
| <image :src="configList.price_image" mode="aspectFill" class="balance-img"></image> | |||||
| <div class="main"> | |||||
| <div class="title">我的余额</div> | |||||
| <div class="money">¥{{ riceInfo.balance || 0 }}</div> | |||||
| </div> | |||||
| </view> | |||||
| </view> | |||||
| <!-- 我的服务 --> | |||||
| <view class="myServer"> | |||||
| <view class="server-title"> | |||||
| 我的服务 | |||||
| </view> | |||||
| <view class="box"> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages/index/order?type=0')"> | |||||
| <image src="@/static/image/center/1.png" mode="widthFix" /> | |||||
| <view class="title">我的订单</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/partner')"> | |||||
| <image src="@/static/image/center/2.png" mode="widthFix" /> | |||||
| <view class="title">我的团队</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/home/contact')"> | |||||
| <image src="@/static/image/center/3.png" mode="widthFix" /> | |||||
| <view class="title">联系客服</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/promotion')"> | |||||
| <image src="@/static/image/center/4.png" mode="widthFix" /> | |||||
| <view class="title">邀请好友</view> | |||||
| </view> | |||||
| </view> | |||||
| <view class="box"> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/recruit')"> | |||||
| <image src="@/static/image/center/5.png" mode="widthFix" /> | |||||
| <view class="title">合伙人招募</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/memberCenter')"> | |||||
| <image src="@/static/image/center/6.png" mode="widthFix" /> | |||||
| <view class="title">会员权益</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/coupon')"> | |||||
| <image src="@/static/image/center/7.png" mode="widthFix" /> | |||||
| <view class="title">优惠券</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/help')"> | |||||
| <image src="@/static/image/center/8.png" mode="widthFix" /> | |||||
| <view class="title">帮助与反馈</view> | |||||
| </view> | |||||
| </view> | |||||
| <view class="box"> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/mine/address')"> | |||||
| <image src="@/static/image/center/5.png" mode="widthFix" /> | |||||
| <view class="title">我的地址</view> | |||||
| </view> | |||||
| <view class="boxs" @click="$utils.navigateTo('/pages_order/order/giftList')"> | |||||
| <image src="@/static/image/center/6.png" mode="widthFix" /> | |||||
| <view class="title">礼包列表</view> | |||||
| </view> | |||||
| <view class="boxs" @click="logout"> | |||||
| <image src="@/static/image/center/6.png" mode="widthFix" /> | |||||
| <view class="title">退出登录</view> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| <!-- 广告 --> | |||||
| <div v-if="showAdvertising" class="ad" | |||||
| @click="$utils.navigateTo('/pages_order/mine/recruit')"> | |||||
| <swiper class="swiper" circular :indicator-dots="indicatorDots" :autoplay="true" :interval="2000" | |||||
| :duration="duration"> | |||||
| <swiper-item v-for="(item, index) in adList" :key="index"> | |||||
| <view class="swiper-main"> | |||||
| <view @click="closeAdvertising" class="close"> | |||||
| <image src="@/static/image/center/close.png" mode="aspectFill" class="close-img"></image> | |||||
| </view> | |||||
| <image :src="item" mode="aspectFill" class="swiper-main-img"></image> | |||||
| <div class="ad-tag"> | |||||
| <image src="@/static/image/center/ad-tag.png" mode="aspectFill" class="ad-tag-img"></image> | |||||
| </div> | |||||
| </view> | |||||
| </swiper-item> | |||||
| </swiper> | |||||
| </div> | |||||
| <customerServicePopup ref="customerServicePopup" /> | |||||
| <tabber select="center" /> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| import tabber from '@/components/base/tabbar.vue' | |||||
| import { | |||||
| mapState | |||||
| } from 'vuex' | |||||
| import customerServicePopup from '@/components/config/customerServicePopup.vue' | |||||
| export default { | |||||
| components: { | |||||
| tabber, | |||||
| customerServicePopup, | |||||
| }, | |||||
| computed: { | |||||
| ...mapState(['riceInfo']), | |||||
| adList() { | |||||
| let arr = []; | |||||
| if (this.configList?.shop_get_image) { | |||||
| arr = this.configList?.shop_get_image?.split(',') | |||||
| } | |||||
| return arr | |||||
| } | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| vipType: ['普通会员', '黄金会员', '渠道商'], | |||||
| vipImage: ['vip_vip', 'vip_user', 'vip_shop'], | |||||
| vipList: [], | |||||
| showAdvertising: true, | |||||
| userRole: ['会员', '用户', '渠道'] | |||||
| } | |||||
| }, | |||||
| onShow() { | |||||
| this.$store.commit('getUserInfo') | |||||
| this.$store.commit('getRiceInfo') | |||||
| this.getMemberCardData(); | |||||
| }, | |||||
| methods: { | |||||
| clickNo() { | |||||
| uni.showModal({ | |||||
| title: '暂未开放', | |||||
| }) | |||||
| }, | |||||
| logout(){ | |||||
| uni.showModal({ | |||||
| title: '确认退出登录吗', | |||||
| success : (r) => { | |||||
| if (r.confirm) { | |||||
| this.$store.commit('logout', true) | |||||
| } | |||||
| } | |||||
| }) | |||||
| }, | |||||
| //关闭广告 | |||||
| closeAdvertising() { | |||||
| this.showAdvertising = false; | |||||
| }, | |||||
| //获取会员卡片数据 | |||||
| getMemberCardData() { | |||||
| this.$api('getRiceVipList', res => { | |||||
| if (res.code == 200) { | |||||
| this.vipList = res.result | |||||
| } | |||||
| }) | |||||
| } | |||||
| } | |||||
| } | |||||
| </script> | |||||
| <style scoped lang="scss"> | |||||
| .page { | |||||
| // 头部 | |||||
| .head { | |||||
| display: flex; | |||||
| align-items: center; | |||||
| padding: 60rpx 20rpx 120rpx 20rpx; | |||||
| background: $uni-color; | |||||
| .headImage { | |||||
| width: 130rpx; | |||||
| height: 130rpx; | |||||
| background-image: url(/static/image/center/head-img.png); | |||||
| background-repeat: no-repeat; | |||||
| background-position: 50%, 50%; | |||||
| background-size: 100%; | |||||
| overflow: hidden; | |||||
| border-radius: 50%; | |||||
| margin-right: 20rpx; | |||||
| image { | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| } | |||||
| } | |||||
| .user-info { | |||||
| width: calc(100% - 130rpx); | |||||
| .user-base-info { | |||||
| display: flex; | |||||
| flex-wrap: wrap; | |||||
| justify-content: space-between; | |||||
| .user-base-top { | |||||
| width: 65%; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| flex-wrap: wrap; | |||||
| color: white; | |||||
| .user-name { | |||||
| max-width: calc(100% - 240rpx); | |||||
| white-space: nowrap; | |||||
| text-overflow: ellipsis; | |||||
| overflow: hidden; | |||||
| font-size: 34rpx; | |||||
| } | |||||
| .member-level { | |||||
| margin-left: 10rpx; | |||||
| .level { | |||||
| width: 120rpx; | |||||
| height: 60rpx; | |||||
| } | |||||
| } | |||||
| .user-tag { | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| background: #000; | |||||
| width: 100rpx; | |||||
| height: 40rpx; | |||||
| border-radius: 20rpx; | |||||
| font-size: 24rpx; | |||||
| margin-left: 10rpx; | |||||
| } | |||||
| } | |||||
| .edit-user { | |||||
| width: 35%; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: flex-end; | |||||
| .edit-icon { | |||||
| width: 30rpx; | |||||
| height: 30rpx; | |||||
| } | |||||
| .edit-btn { | |||||
| color: white; | |||||
| margin-left: 10rpx; | |||||
| } | |||||
| } | |||||
| } | |||||
| .user-phone { | |||||
| color: white; | |||||
| font-size: 24rpx; | |||||
| } | |||||
| } | |||||
| } | |||||
| // 会员卡片 | |||||
| .earnings { | |||||
| padding: 0rpx 20rpx; | |||||
| box-sizing: border-box; | |||||
| margin-top: -18%; | |||||
| .member-item { | |||||
| position: relative; | |||||
| .member-image { | |||||
| width: 100%; | |||||
| height: 300rpx; | |||||
| border-radius: 20rpx; | |||||
| } | |||||
| .member-info { | |||||
| position: absolute; | |||||
| bottom: 30rpx; | |||||
| left: 0rpx; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| padding: 0rpx 40rpx; | |||||
| box-sizing: border-box; | |||||
| width: 100%; | |||||
| .profile-photo { | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| .pro-img { | |||||
| width: 60rpx; | |||||
| height: 60rpx; | |||||
| border-radius: 50%; | |||||
| } | |||||
| .open-status { | |||||
| color: #F8A95F; | |||||
| border: 1px solid #F8A95F; | |||||
| border-radius: 30rpx; | |||||
| padding: 7rpx 20rpx; | |||||
| margin-left: 10rpx; | |||||
| } | |||||
| } | |||||
| .open { | |||||
| font-size: 26rpx; | |||||
| margin-left: 20rpx; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| // 佣金数据 | |||||
| .brokerage-data { | |||||
| padding: 20rpx; | |||||
| background: white; | |||||
| border-radius: 20rpx; | |||||
| display: flex; | |||||
| flex-wrap: wrap; | |||||
| box-sizing: border-box; | |||||
| margin: 20rpx 20rpx 20rpx 20rpx; | |||||
| .brokerage, | |||||
| .balance { | |||||
| display: flex; | |||||
| flex-wrap: wrap; | |||||
| width: 50%; | |||||
| .brokerage-img, | |||||
| .balance-img { | |||||
| width: 50%; | |||||
| height: auto; | |||||
| } | |||||
| .main { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: space-around; | |||||
| width: 50%; | |||||
| box-sizing: border-box; | |||||
| padding: 30rpx 0rpx; | |||||
| .title { | |||||
| font-size: 34rpx; | |||||
| } | |||||
| .money { | |||||
| font-size: 40rpx; | |||||
| color: $uni-color; | |||||
| font-weight: bold; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| .brokerage-data-mt { | |||||
| margin-top: 50rpx; | |||||
| } | |||||
| // 我的服务 | |||||
| .myServer { | |||||
| margin: 0rpx 20rpx 20rpx 20rpx; | |||||
| background: white; | |||||
| border-radius: 20rpx; | |||||
| padding: 20rpx; | |||||
| box-sizing: border-box; | |||||
| .server-title { | |||||
| margin-bottom: 20rpx; | |||||
| font-size: 34rpx; | |||||
| } | |||||
| .box { | |||||
| display: flex; | |||||
| width: 100%; | |||||
| margin-bottom: 20rpx; | |||||
| .boxs { | |||||
| width: 25%; | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| image { | |||||
| width: 60rpx; | |||||
| height: 60rpx; | |||||
| display: block; | |||||
| margin: 0rpx auto 10rpx auto; | |||||
| } | |||||
| } | |||||
| &:last-child { | |||||
| margin-bottom: 0rpx; | |||||
| } | |||||
| } | |||||
| } | |||||
| // 广告 | |||||
| .ad { | |||||
| margin: 0rpx 20rpx; | |||||
| .swiper { | |||||
| .swiper-main { | |||||
| position: relative; | |||||
| .close { | |||||
| position: absolute; | |||||
| top: 20rpx; | |||||
| right: 20rpx; | |||||
| .close-img { | |||||
| width: 40rpx; | |||||
| height: 40rpx; | |||||
| } | |||||
| } | |||||
| .swiper-main-img { | |||||
| width: 100%; | |||||
| height: 200rpx; | |||||
| border-radius: 20rpx; | |||||
| } | |||||
| .ad-tag { | |||||
| position: absolute; | |||||
| left: 20rpx; | |||||
| bottom: 20rpx; | |||||
| .ad-tag-img { | |||||
| width: 120rpx; | |||||
| height: auto; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| </style> | |||||
| @ -0,0 +1,38 @@ | |||||
| <template> | |||||
| <uv-input | |||||
| :value="value" | |||||
| @input="$emit('input', value)" | |||||
| :placeholder="placeholder" | |||||
| :placeholderStyle="{ | |||||
| color: '#999999', | |||||
| fontSize: '28rpx', | |||||
| }" | |||||
| :customStyle="{ | |||||
| backgroundColor: 'transparent', | |||||
| padding: '0 20rpx 0 0', | |||||
| boxSizing: 'border-box', | |||||
| fontSize: '28rpx', | |||||
| border: 'none', | |||||
| }" | |||||
| inputAlign="right" | |||||
| ></uv-input> | |||||
| </template> | |||||
| <script> | |||||
| export default { | |||||
| props: { | |||||
| value: { | |||||
| default: null | |||||
| }, | |||||
| placeholder: { | |||||
| type: String, | |||||
| default: '请输入' | |||||
| }, | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| } | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| @ -0,0 +1,41 @@ | |||||
| <template> | |||||
| <uv-textarea | |||||
| :value="value" | |||||
| @input="$emit('input', value)" | |||||
| :placeholder="placeholder" | |||||
| height="175rpx" | |||||
| border="none" | |||||
| :customStyle="{ | |||||
| backgroundColor: '#F5F5F5', | |||||
| borderRadius: '6rpx', | |||||
| }" | |||||
| :placeholderStyle="{ | |||||
| color: '#999999', | |||||
| fontSize: '28rpx', | |||||
| }" | |||||
| ></uv-textarea> | |||||
| </template> | |||||
| <script> | |||||
| export default { | |||||
| props: { | |||||
| value: { | |||||
| default: null | |||||
| }, | |||||
| placeholder: { | |||||
| type: String, | |||||
| default: '请输入' | |||||
| }, | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| } | |||||
| }, | |||||
| methods: { | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped lang="scss"> | |||||
| </style> | |||||
| @ -0,0 +1,66 @@ | |||||
| <template> | |||||
| <view> | |||||
| <uv-upload | |||||
| :fileList="fileList" | |||||
| :multiple="multiple" | |||||
| :maxCount="maxCount" | |||||
| :width="width" | |||||
| :height="height" | |||||
| @afterRead="afterRead" | |||||
| @delete="deleteFile" | |||||
| > | |||||
| <slot :value="value"></slot> | |||||
| </uv-upload> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| export default { | |||||
| props: { | |||||
| value: { | |||||
| default: null | |||||
| }, | |||||
| multiple: { | |||||
| type: Boolean, | |||||
| default: false, | |||||
| }, | |||||
| maxCount: { | |||||
| type: Number, | |||||
| default: 1, | |||||
| }, | |||||
| width: { | |||||
| type: Number | String, | |||||
| default: null, | |||||
| }, | |||||
| height: { | |||||
| type: Number | String, | |||||
| default: null, | |||||
| }, | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| fileList: [], | |||||
| } | |||||
| }, | |||||
| methods: { | |||||
| deleteFile(){ | |||||
| this.fileList = [] | |||||
| this.$emit('input', null) | |||||
| }, | |||||
| afterRead(e){ | |||||
| let self = this | |||||
| e.file.forEach(file => { | |||||
| self.$Oss.ossUpload(file.url).then(url => { | |||||
| self.fileList = [url] | |||||
| self.$emit('input', url) | |||||
| }) | |||||
| }) | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped lang="scss"> | |||||
| </style> | |||||
| @ -0,0 +1,76 @@ | |||||
| <template> | |||||
| <view class="card flex voucher"> | |||||
| <image class="voucher-img" :src="data.imgUrl"></image> | |||||
| <view class="voucher-info"> | |||||
| <view class="voucher-name">{{ data.userName }}</view> | |||||
| <view class="voucher-desc">{{ `核销时间:${data.createTime}` }}</view> | |||||
| </view> | |||||
| <view class="voucher-count"> | |||||
| <text>代金券:</text> | |||||
| <text class="voucher-value">{{ `${data.count}元` }}</text> | |||||
| </view> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| const TEST_DATA = { | |||||
| id: '001', | |||||
| imgUrl: 'http://gips3.baidu.com/it/u=70459541,3412285454&fm=3028&app=3028&f=JPEG&fmt=auto?w=960&h=1280', | |||||
| userName: '用户136xxxxxxxxx', | |||||
| createTime: '2025/03/05 14:45:36', | |||||
| count: '100', | |||||
| } | |||||
| export default { | |||||
| props: { | |||||
| data: { | |||||
| type: Object, | |||||
| default() { | |||||
| return TEST_DATA | |||||
| } | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style scoped lang="scss"> | |||||
| .voucher { | |||||
| padding: 33rpx 25rpx 33rpx 31rpx; | |||||
| &-img { | |||||
| width: 90rpx; | |||||
| height: 90rpx; | |||||
| border-radius: 50%; | |||||
| margin-right: 7rpx; | |||||
| } | |||||
| &-info { | |||||
| flex: 1; | |||||
| } | |||||
| &-name { | |||||
| color: #333333; | |||||
| font-size: 28rpx; | |||||
| line-height: 40rpx; | |||||
| } | |||||
| &-desc { | |||||
| color: #333333; | |||||
| font-size: 22rpx; | |||||
| line-height: 30rpx; | |||||
| margin-top: 5rpx; | |||||
| } | |||||
| &-count { | |||||
| color: #000000; | |||||
| font-size: 22rpx; | |||||
| } | |||||
| &-value { | |||||
| color: #FF2A2A; | |||||
| } | |||||
| } | |||||
| </style> | |||||
| @ -0,0 +1,245 @@ | |||||
| <template> | |||||
| <view class="page"> | |||||
| <!-- 导航栏 --> | |||||
| <navbar title="商家合作" leftClick @leftClick="$utils.navigateBack" color="#fff" /> | |||||
| <view class="content"> | |||||
| <view class="form"> | |||||
| <view class="form-title">门头照片</view> | |||||
| <view class="card upload"> | |||||
| <formUpload v-model="form.imageUrl"> | |||||
| <template v-slot="{ value }"> | |||||
| <view class="flex"> | |||||
| <image v-if="value" | |||||
| class="upload-img" | |||||
| :src="value" | |||||
| mode="aspectFill" | |||||
| /> | |||||
| <image v-else | |||||
| class="upload-img" | |||||
| src="../static/cooperation/icon-upload.png" | |||||
| mode="aspectFill" | |||||
| /> | |||||
| </view> | |||||
| </template> | |||||
| </formUpload> | |||||
| </view> | |||||
| </view> | |||||
| <view class="form"> | |||||
| <view class="form-title">店铺信息</view> | |||||
| <view class="card info"> | |||||
| <uv-form | |||||
| ref="form" | |||||
| :model="form" | |||||
| :rules="rules" | |||||
| labelPosition="left" | |||||
| labelWidth="150rpx" | |||||
| :labelStyle="{ | |||||
| color: '#000000', | |||||
| fontSize: '28rpx', | |||||
| }" | |||||
| > | |||||
| <view class="form-item"> | |||||
| <uv-form-item label="店铺名称" prop="storeName"> | |||||
| <view class="form-item-content"> | |||||
| <formInput v-model="form.storeName" placeholder="请输入店铺名称"></formInput> | |||||
| </view> | |||||
| </uv-form-item> | |||||
| </view> | |||||
| <view class="form-item"> | |||||
| <uv-form-item label="您的姓名" prop="name"> | |||||
| <view class="form-item-content"> | |||||
| <formInput v-model="form.name" placeholder="请输入您的姓名"></formInput> | |||||
| </view> | |||||
| </uv-form-item> | |||||
| </view> | |||||
| <view class="form-item"> | |||||
| <uv-form-item label="联系手机号" prop="phone"> | |||||
| <view class="form-item-content"> | |||||
| <formInput v-model="form.phone" placeholder="请输入您的手机号"></formInput> | |||||
| </view> | |||||
| </uv-form-item> | |||||
| </view> | |||||
| <view class="form-item"> | |||||
| <uv-form-item label="所在地区" prop="address"> | |||||
| <view class="form-item-content flex address"> | |||||
| <text>{{ form.address ? form.address : '请选择' }}</text> | |||||
| <button plain class="btn address-btn" @click="selectAddr"> | |||||
| <image class="address-btn-icon" src="../static/cooperation/icon-arrow.png" mode="widthFix"></image> | |||||
| </button> | |||||
| </view> | |||||
| </uv-form-item> | |||||
| </view> | |||||
| <view class="form-item address-details"> | |||||
| <uv-form-item label="详细地址" prop="addressDetails" labelPosition="top" > | |||||
| <view style="margin-top: 22rpx;"> | |||||
| <formTextarea | |||||
| v-model="form.addressDetails" | |||||
| placeholder="请输入详细地址" | |||||
| ></formTextarea> | |||||
| </view> | |||||
| </uv-form-item> | |||||
| </view> | |||||
| </uv-form> | |||||
| </view> | |||||
| </view> | |||||
| <view class="tools"> | |||||
| <button plain class="btn btn-submit">提交</button> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| import Position from '@/utils/position.js' | |||||
| import formInput from '../components/formInput.vue' | |||||
| import formUpload from '../components/formUpload.vue' | |||||
| import formTextarea from '../components/formTextarea.vue' | |||||
| export default { | |||||
| components: { | |||||
| formInput, | |||||
| formUpload, | |||||
| formTextarea, | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| form: { | |||||
| storeName: null, | |||||
| name: null, | |||||
| phone: null, | |||||
| address: null, | |||||
| latitude: null, | |||||
| longitude: null, | |||||
| addressDetails: null, | |||||
| }, | |||||
| rules: { | |||||
| // todo | |||||
| } | |||||
| } | |||||
| }, | |||||
| methods: { | |||||
| //地图上选择地址 | |||||
| selectAddr() { | |||||
| // Position.getLocation(res => { | |||||
| Position.selectAddress(0, 0, success => { | |||||
| this.setAddress(success) | |||||
| }) | |||||
| // }) | |||||
| }, | |||||
| //提取用户选择的地址信息复制给表单数据 | |||||
| setAddress(res) { | |||||
| //经纬度信息 | |||||
| this.form.latitude = res.latitude | |||||
| this.form.longitude = res.longitude | |||||
| if (!res.address && res.name) { //用户直接选择城市的逻辑 | |||||
| return this.form.address = res.name | |||||
| } | |||||
| if (res.address || res.name) { | |||||
| return this.form.address = res.address + res.name | |||||
| } | |||||
| this.form.address = '' //用户啥都没选就点击勾选 | |||||
| }, | |||||
| }, | |||||
| } | |||||
| </script> | |||||
| <style lang="scss" scoped> | |||||
| .page { | |||||
| background-color: $uni-bg-color; | |||||
| min-height: 100vh; | |||||
| /deep/ .nav-bar__view { | |||||
| background-image: linear-gradient(#84A73F, #D8FF8F); | |||||
| } | |||||
| } | |||||
| .content { | |||||
| padding: 28rpx 30rpx; | |||||
| } | |||||
| .form { | |||||
| & + & { | |||||
| margin-top: 44rpx; | |||||
| } | |||||
| &-title { | |||||
| color: #000000; | |||||
| font-size: 28rpx; | |||||
| margin-bottom: 15rpx; | |||||
| } | |||||
| &-item { | |||||
| padding-left: 8rpx; | |||||
| & + & { | |||||
| // margin-top: 20rpx; | |||||
| border-top: 1rpx solid rgba($color: #C7C7C7, $alpha: 0.69); | |||||
| } | |||||
| &-content { | |||||
| min-height: 60rpx; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: flex-end; | |||||
| font-size: 28rpx;; | |||||
| color: #999999; | |||||
| } | |||||
| } | |||||
| } | |||||
| .upload { | |||||
| padding: 37rpx 22rpx; | |||||
| &-img { | |||||
| width: 131rpx; height: 131rpx; | |||||
| } | |||||
| } | |||||
| .address { | |||||
| color: #000000; | |||||
| font-size: 28rpx; | |||||
| line-height: 40rpx; | |||||
| justify-content: flex-end; | |||||
| &-btn { | |||||
| border: none; | |||||
| padding: 7rpx 20rpx 7rpx 7rpx; | |||||
| &-icon { | |||||
| width: 30rpx; | |||||
| height: auto; | |||||
| } | |||||
| } | |||||
| } | |||||
| .address-details { | |||||
| padding: 0; | |||||
| /deep/ .uv-form-item__body__left__content { | |||||
| margin-top: 10rpx; | |||||
| padding-left: 8rpx; | |||||
| } | |||||
| } | |||||
| .tools { | |||||
| padding: 0 56rpx; | |||||
| margin-top: 126rpx; | |||||
| } | |||||
| .btn-submit { | |||||
| padding: 29rpx 0; | |||||
| border: none; | |||||
| font-size: 36rpx; | |||||
| border-radius: 45rpx; | |||||
| color: $uni-text-color-inverse; | |||||
| background-image: linear-gradient(to right, #84A73F, #D8FF8F); | |||||
| } | |||||
| </style> | |||||
| @ -0,0 +1,128 @@ | |||||
| <template> | |||||
| <view class="page"> | |||||
| <!-- 导航栏 --> | |||||
| <navbar title="积分明细" leftClick @leftClick="$utils.navigateBack" color="#fff" /> | |||||
| <view class="tools"> | |||||
| <uv-datetime-picker | |||||
| ref="datetimePicker" | |||||
| v-model="selectedTime" | |||||
| mode="year-month" | |||||
| confirmColor="#84A73F" | |||||
| @confirm="onTimeChange" | |||||
| ></uv-datetime-picker> | |||||
| <button plain class="flex btn" @click="openTimePicker"> | |||||
| <text>{{ displaySelectedTime }}</text> | |||||
| <image class="btn-icon" src="../static/runningWater/icon-arrow.png" mode="widthFix"></image> | |||||
| </button> | |||||
| </view> | |||||
| <view class="card list"> | |||||
| <template v-if="list.length"> | |||||
| <view class="flex list-item" | |||||
| v-for="(item, index) in list" | |||||
| :key="index" | |||||
| > | |||||
| <image class="list-item-icon" src="../static/pointsRecord/icon-points.png" mode="widthFix"></image> | |||||
| <view class="list-item-info"> | |||||
| <view class="highlight">{{ item.projectName }}</view> | |||||
| <view>{{ item.createTime }}</view> | |||||
| </view> | |||||
| <view class="list-item-value">{{ `+${item.money}` }}</view> | |||||
| </view> | |||||
| </template> | |||||
| <template v-else> | |||||
| <uv-empty mode="history" textSize="28rpx" iconSize="100rpx" /> | |||||
| </template> | |||||
| </view> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| import mixinsList from "@/mixins/list.js" | |||||
| export default { | |||||
| mixins: [mixinsList], | |||||
| data() { | |||||
| return { | |||||
| selectedTime: new Date(), | |||||
| } | |||||
| }, | |||||
| computed: { | |||||
| displaySelectedTime() { | |||||
| return this.$dayjs(this.selectedTime).format("YYYY年M月") | |||||
| } | |||||
| }, | |||||
| methods: { | |||||
| openTimePicker() { | |||||
| this.$refs.datetimePicker.open(); | |||||
| }, | |||||
| onTimeChange(e) { | |||||
| // todo | |||||
| console.log('--onTimeChange', e) | |||||
| }, | |||||
| } | |||||
| } | |||||
| </script> | |||||
| <style lang="scss" scoped> | |||||
| .page { | |||||
| background-color: $uni-bg-color; | |||||
| min-height: 100vh; | |||||
| /deep/ .nav-bar__view { | |||||
| background-image: linear-gradient(#84A73F, #D8FF8F); | |||||
| } | |||||
| } | |||||
| .tools { | |||||
| background-color: $uni-fg-color; | |||||
| padding: 25rpx 42rpx; | |||||
| .btn { | |||||
| display: inline-block; | |||||
| border: none; | |||||
| color: #000000; | |||||
| font-size: 28rpx; | |||||
| line-height: 40rpx; | |||||
| &-icon { | |||||
| width: 28rpx; | |||||
| height: 28rpx; | |||||
| margin-left: 12rpx; | |||||
| } | |||||
| } | |||||
| } | |||||
| .list { | |||||
| margin: 9rpx 13rpx; | |||||
| padding: 31rpx 20rpx; | |||||
| &-item { | |||||
| padding-bottom: 19rpx; | |||||
| border-bottom: 1rpx solid #E0E0E0; | |||||
| margin-bottom: 20rpx; | |||||
| font-size: 28rpx; | |||||
| &-icon { | |||||
| width: 56rpx; | |||||
| height: auto; | |||||
| margin-right: 10rpx; | |||||
| } | |||||
| &-info { | |||||
| flex: 1; | |||||
| color: #949494; | |||||
| .highlight { | |||||
| color: #333333; | |||||
| } | |||||
| } | |||||
| &-value { | |||||
| color: #FF2A2A; | |||||
| } | |||||
| } | |||||
| } | |||||
| </style> | |||||
| @ -1,25 +1,203 @@ | |||||
| <template> | <template> | ||||
| <view class="page"> | <view class="page"> | ||||
| <navbar title="核销明细" leftClick @leftClick="$utils.navigateBack" color="#fff" /> | <navbar title="核销明细" leftClick @leftClick="$utils.navigateBack" color="#fff" /> | ||||
| <!-- todo --> | |||||
| <view class="tabs"> | |||||
| <uv-tabs | |||||
| :list="tabs" | |||||
| @click="onTabChange" | |||||
| :customStyle="{ | |||||
| backgroundColor: '#FFFFFF', | |||||
| }" | |||||
| :activeStyle="{ | |||||
| color: '#84A73F', | |||||
| fontSize: '28rpx', | |||||
| whiteSpace: 'nowrap', | |||||
| paddingTop: '29rpx', | |||||
| paddingBottom: '21rpx', | |||||
| }" | |||||
| :inactiveStyle="{ | |||||
| color: '#000000', | |||||
| fontSize: '28rpx', | |||||
| whiteSpace: 'nowrap', | |||||
| paddingTop: '29rpx', | |||||
| paddingBottom: '21rpx', | |||||
| }" | |||||
| lineHeight="5rpx" | |||||
| lineWidth="92rpx" | |||||
| lineColor="linear-gradient(to right, #84A73F, #D8FF8F)" | |||||
| :scrollable="false" | |||||
| ></uv-tabs> | |||||
| </view> | |||||
| <view class="flex bar"> | |||||
| <view class="left"> | |||||
| <uv-datetime-picker | |||||
| ref="datetimePicker" | |||||
| v-model="selectedTime" | |||||
| mode="year-month" | |||||
| confirmColor="#84A73F" | |||||
| @confirm="onTimeChange" | |||||
| ></uv-datetime-picker> | |||||
| <button plain class="flex btn" @click="openTimePicker"> | |||||
| <text>{{ displaySelectedTime }}</text> | |||||
| <image class="btn-icon" src="../static/runningWater/icon-arrow.png" mode="widthFix"></image> | |||||
| </button> | |||||
| </view> | |||||
| <view class="right"> | |||||
| <text>{{ `${displaySelectedMonth}总核销:` }}</text> | |||||
| <!-- todo: 对接接口字段 --> | |||||
| <text class="highlight">{{ 12 }}</text> | |||||
| </view> | |||||
| </view> | |||||
| <template v-if="current == 0" > | |||||
| <view class="list order"> | |||||
| <orderCard class="list-item" | |||||
| v-for="item in list" | |||||
| :key="item.id" | |||||
| :data="data" | |||||
| ></orderCard> | |||||
| </view> | |||||
| </template> | |||||
| <template v-else-if="current == 1" > | |||||
| <view class="list voucher"> | |||||
| <voucherCard class="list-item" | |||||
| v-for="item in list" | |||||
| :key="item.id" | |||||
| :data="data" | |||||
| ></voucherCard> | |||||
| <!-- todo: delete --> | |||||
| <voucherCard class="list-item"></voucherCard> | |||||
| <voucherCard class="list-item"></voucherCard> | |||||
| </view> | |||||
| </template> | |||||
| </view> | </view> | ||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| export default { | |||||
| data() { | |||||
| return { | |||||
| } | |||||
| } | |||||
| import mixinsList from '@/mixins/list.js' | |||||
| import orderCard from '@/components/order/orderCard.vue' | |||||
| import voucherCard from '../components/verifyRecord/voucherCard.vue' | |||||
| const TAB_AND_API_FIELDS_MAPPING = { | |||||
| // todo: 接口对接 | |||||
| 0: 'fetchVoucher', | |||||
| 1: 'fetchStore', | |||||
| } | |||||
| export default { | |||||
| mixins : [mixinsList], | |||||
| components: { | |||||
| orderCard, | |||||
| voucherCard, | |||||
| }, | |||||
| data() { | |||||
| return { | |||||
| tabs: [{ | |||||
| name: "核销商品" | |||||
| }, { | |||||
| name: "核销代金券" | |||||
| }], | |||||
| current: 0, | |||||
| selectedTime: new Date(), | |||||
| }; | |||||
| }, | |||||
| computed: { | |||||
| mixinsListApi() { | |||||
| // todo | |||||
| return TAB_AND_API_FIELDS_MAPPING[this.current] | |||||
| }, | |||||
| displaySelectedTime() { | |||||
| return this.$dayjs(this.selectedTime).format("YYYY年M月") | |||||
| }, | |||||
| displaySelectedMonth() { | |||||
| return this.$dayjs(this.selectedTime).format("M月") | |||||
| }, | |||||
| }, | |||||
| methods: { | |||||
| onTabChange(e) { | |||||
| this.current = e.index | |||||
| }, | |||||
| openTimePicker() { | |||||
| this.$refs.datetimePicker.open(); | |||||
| }, | |||||
| onTimeChange(e) { | |||||
| // todo | |||||
| console.log('--onTimeChange', e) | |||||
| }, | |||||
| }, | |||||
| } | } | ||||
| </script> | </script> | ||||
| <style scoped lang="scss"> | <style scoped lang="scss"> | ||||
| .page { | |||||
| .page { | |||||
| background-color: $uni-bg-color; | |||||
| min-height: 100vh; | |||||
| /deep/ .nav-bar__view { | /deep/ .nav-bar__view { | ||||
| background-image: linear-gradient(#84A73F, #D8FF8F); | background-image: linear-gradient(#84A73F, #D8FF8F); | ||||
| } | } | ||||
| } | |||||
| .tabs { | |||||
| /deep/ .uv-tabs__wrapper__nav__line { | |||||
| bottom: 0; | |||||
| } | |||||
| } | |||||
| .bar { | |||||
| padding: 0 58rpx 0 25rpx; | |||||
| margin-top: 32rpx; | |||||
| justify-content: space-between; | |||||
| .left { | |||||
| .btn { | |||||
| border: none; | |||||
| color: #000000; | |||||
| font-size: 28rpx; | |||||
| line-height: 40rpx; | |||||
| &-icon { | |||||
| width: 28rpx; | |||||
| height: auto; | |||||
| margin-left: 12rpx; | |||||
| } | |||||
| } | |||||
| } | |||||
| .right { | |||||
| color: #333333; | |||||
| font-size: 28rpx; | |||||
| .highlight { | |||||
| margin-left: 10rpx; | |||||
| color: $uni-color-light; | |||||
| } | |||||
| } | |||||
| } | |||||
| .list { | |||||
| margin-top: 26rpx; | |||||
| &-item { | |||||
| display: block; | |||||
| & + & { | |||||
| margin-top: 20rpx; | |||||
| } | |||||
| } | |||||
| &.order { | |||||
| padding: 0 17rpx; | |||||
| } | |||||
| &.voucher { | |||||
| padding: 0 13rpx; | |||||
| } | |||||
| } | } | ||||
| </style> | </style> | ||||