shop_app/pages/user/index.vue

580 lines
14 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 class="whole">
<view class="usertop" :style="{'padding': statusBarHeight + 'px 24rpx 0'}">
<image :src="user_bg + '?x-oss-process=image/format,webp'" :webp="true" class="bgImg" mode="aspectFill"></image>
<view class="title"></view>
<view class="user-top">
<view class="user-top-info" @click="toPage('/pages/user/info')">
<view class="img">
<image class="avatar" :src="avatar" mode="aspectFill"></image>
<view class="icon" mode="widthFix" :style="{backgroundImage: 'url(' + sp2 + ')'}"></view>
</view>
<view class="user-top-info-text">
<text>{{nickname}}</text>
<text class="tag">更新昵称和头像</text>
</view>
</view>
</view>
</view>
<view class="vipBox" v-if="vip_on == 1">
<view class="cont">
<view class="item item1" v-if="!userNum.is_vip">
<text>非会员</text>
<text class="btn" @click="toVip">加入会员</text>
</view>
<view class="item item2" v-else>
<view class="left">
<view class="img" :style="{backgroundImage: 'url(' + sp2 + ')'}"></view>
<view class="right">
<view class="top">
<text class="name">{{vip_name}}会员</text>
<view class="day">
<text>剩余{{days}}</text>
<view class="progress">
<view class="percentage" :style="{'width': + progress + '%'}"></view>
</view>
</view>
</view>
<view class="time">会员有效期至{{userNum.vip_end_time}}</view>
</view>
</view>
<text class="btn" @click="toVip">会员详情</text>
</view>
</view>
</view>
<view class="vipBanner" v-if="vip_on === 1 && share_on === 1" @click="toPage('/pages/vip/share/index')">
<image src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2022/07/01/T4PdI0rR7Dkt8YTy67RKMLFby1fitbGITWe58ear.png" mode="widthFix" />
</view>
<view class="contBox">
<!-- 用户订单 -->
<view class="userOrder">
<view class="title flex1" @click="toOrder('')">
<view class="tit">我的订单</view>
<view class="more flex">
<text>查看全部</text>
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="itemBox">
<view class="item" v-for="(item, index) in myOrder" :key="index" @click="toOrder(item.id)">
<view class="img">
<text class="iconfont" :class="'icon-' + item.icon"></text>
</view>
<text>{{item.text}}</text>
<view class="tag" v-if="item.id === 0 && userNum.un_pay_count > 0">{{userNum.un_pay_count}}</view>
<view class="tag" v-if="item.id === 1 && userNum.un_ship_count > 0">{{userNum.un_ship_count}}</view>
<view class="tag" v-if="item.id === 3 && userNum.shiped_count > 0">{{userNum.shiped_count}}</view>
<view class="tag" v-if="item.id === 4 && userNum.un_comment_count > 0">{{userNum.un_comment_count}}</view>
<view class="tag" v-if="item.id === 11 && userNum.after_in_count > 0">{{userNum.after_in_count}}</view>
</view>
</view>
</view>
<view class="rowBox">
<view class="row flex1" @click="toPage('/pages/mine/coupon/index')">
<view class="left">
<text class="iconfont icon-youhuiquan"></text>
<text>优惠券</text>
</view>
<view class="num">
<up-badge :bgColor="tagColor" color="#fff" :value="userNum.couponCount" v-if="userNum.couponCount > 0"></up-badge>
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="row flex1" @click="toPage('/pages/mine/scoreShop/index')" v-if="score_on === 1">
<view class="left">
<text class="iconfont icon-score"></text>
<text>积分中心</text>
</view>
<view class="num">
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="row flex1" @click="toPage('/pages/mine/collection/index')">
<view class="left">
<text class="iconfont icon-shoucang"></text>
<text>收藏与浏览</text>
</view>
<view class="num">
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="row flex1" @click="toPage('/pages/address/list/index')">
<view class="left">
<text class="iconfont icon-dizhi"></text>
<text>收货地址</text>
</view>
<view class="num">
<text v-if="userNum.address_count > 0">{{userNum.address_count}}</text>
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="row flex1" @click="toPage('/pages/user/setpwd')">
<view class="left">
<up-icon name="lock" color="#444" size="17"></up-icon>
<text>设置密码</text>
</view>
<view class="num">
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="row flex1" @click="toPage('/pages/mine/realName/list')" v-if="show_identity === 1">
<view class="left">
<text class="iconfont icon-realname"></text>
<text>实名认证</text>
</view>
<view class="num">
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
<view class="row flex1" @click="toPage('/pages/mine/aboutUs/index')">
<view class="left">
<text class="iconfont icon-about"></text>
<text>关于我们</text>
</view>
<view class="num">
<up-icon name="arrow-right" color="#999" size="14"></up-icon>
</view>
</view>
</view>
</view>
<cf-cloud></cf-cloud>
<tabbar :chooseIndex="4" :num="cartNum" :msgNum="msgNum" />
</view>
</template>
<script>
import { ref, reactive, toRefs } from 'vue'
import tabbar from '@/components/tabbar/index.vue'
import { sp2 } from '@/components/img.js'
import { get } from '@/api/request.js'
import { showToast, getShopInfo, getOldDay, getWeekStartDate, getMonthStartDate, dateTimeStr } from '@/components/common.js'
import { Style } from '@/utils/list.js'
import cfCloud from '@/components/cfCloud/index.vue'
export default {
components: { tabbar, cfCloud },
setup() {
const data = reactive({
Color: '',
priceColor: '',
tagColor: '',
cartNum: 0,
msgNum: 0,
user_bg: uni.getStorageSync('user_bg'),
sp2: sp2,
myOrder: [
{ id: 0, text: '待付款', icon: 'daifukuan' },
{ id: 1, text: '待发货', icon: 'daifahuo' },
{ id: 3, text: '待收货', icon: 'daishouhuo' },
{ id: 4, text: '待评论', icon: 'daipingjia' },
{ id: 11, text: '售后中', icon: 'shouhou' }
],
userNum: {},
show_identity: uni.getStorageSync('show_identity'),
share_on: 0,
vip_on: 0,
vip_name: '',
days: 0,
progress: 100,
count: {},
showFill: false,
score_on: 0,
statusBarHeight: 0
})
const user = reactive({
nickname: '',
avatar: ''
})
const toPage = (url) => {
uni.navigateTo({ url })
}
async function getUserNum() {
let res = await get('/api/v1/user/home')
data.userNum = res.data
data.cartNum = Number(res.data.cart_count)
uni.setStorageSync('is_vip', res.data.is_vip)
uni.setStorageSync('vip_end_time', res.data.vip_end_time)
if (res.data.is_vip && res.data.vip_end_time && res.data.vip_start_time) {
let nowTime = Date.parse(new Date())
let etTime = Date.parse(new Date(res.data.vip_end_time.replace(/-/g, '/')))
let usedTime = etTime - nowTime
data.days = Math.floor(usedTime / (24 * 3600 * 1000)) + 1 // 剩余时间
let stTime = Date.parse(
new Date(res.data.vip_start_time.replace(/-/g, '/'))
)
let allTime = etTime - stTime
let days1 = Math.floor(allTime / (24 * 3600 * 1000)) // 总时间
data.progress = (data.days / days1) * 100 // 剩余进度
}
}
const toOrder = (type) => {
uni.navigateTo({ url: '/pages/order/list/index?type=' + type })
}
// 会员充值
const toVip = () => {
if(uni.getStorageSync('vip_detail_on') === 1) {
uni.navigateTo({ url: '/pages/vip/intro/index' })
} else {
uni.navigateTo({ url: '/pages/vip/mine/index' })
}
}
// 店铺详情
const getStoreInfo = async () => {
let res = await getShopInfo()
data.vip_on = res.vip_on
data.share_on = res.share_on
data.vip_name = res.vip_name
data.score_on = Number(res.score_on)
data.user_bg = res.user_background_img
}
return {
...toRefs(data),
...toRefs(user),
toPage,
toOrder,
getUserNum,
toVip,
getStoreInfo
}
},
async onLoad(options) {
// await this.$onLaunched
uni.getSystemInfo({
success: (res) => {
this.statusBarHeight = res.statusBarHeight
}
})
this.getStoreInfo()
},
onShow() {
this.cartNum = Number(uni.getStorageSync('cartNum')) || 0
this.nickname = uni.getStorageSync('nickname')
this.avatar = uni.getStorageSync('avatar')
this.getUserNum()
if(uni.getStorageSync('is_default_avatar')) {
this.getShowPrivacy()
this.showFill = true
} else {
this.showFill = false
}
this.msgNum = uni.getStorageSync('msgNum') || 0
this.Color = uni.getStorageSync('theme_color')
this.priceColor = Style[uni.getStorageSync('theme_index') * 1].priceColor
this.tagColor = Style[uni.getStorageSync('theme_index') * 1].tagColor
}
}
</script>
<style lang="scss">
.flex{
display: flex;
align-items: center;
justify-content: center;
}
.flex1{
display: flex;
align-items: center;
justify-content: space-between;
}
.whole{
width: 100%;
background-color: #f5f5f5;
min-height: 100vh;
padding-bottom: 70px;
overflow: auto;
position: relative;
}
.usertop {
position: relative;
height: 350rpx;
box-sizing: border-box;
.bgImg{
position: absolute;
height: 100%;
width: 100%;
left: 0;
top: 0;
}
.title {
height: 40px;
}
.user-top {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
z-index: 1;
&-info {
display: flex;
margin: 10rpx 0 30rpx;
color: #fff;
.img {
position: relative;
width: 104rpx;
height: 104rpx;
margin-right: 40rpx;
.avatar {
border-radius: 50%;
background: #999999;
width: 100%;
height: 100%;
border: 4rpx solid #ffffff;
}
.icon {
position: absolute;
top: -20rpx;
right: -26rpx;
background-repeat: no-repeat;
background-size: 339px 306px;
background-position: -286.75px -134.75px;
height: 28px;
width: 32.5px;
}
}
&-text {
text {
display: block;
font-size: 36rpx;
}
.tag {
font-size: 28rpx;
background: rgba($color: #000000, $alpha: 0.07);
border-radius: 22px;
margin-top: 10rpx;
padding: 2rpx 15rpx;
display: inline-block;
}
}
}
}
}
.vipBox{
padding: 0 24rpx;
box-sizing: border-box;
margin-top: -62rpx;
position: relative;
z-index: 1;
.cont{
height: 124rpx;
background: url('http://ct-upimg.yx090.com/22-02-14_19_pwkznnlf.png') no-repeat;
background-size: 100% 100%;
box-sizing: border-box;
.item{
display: flex;
align-items: center;
justify-content: space-between;
height: 100%;
font-size: 28rpx;
.btn {
color: #fff;
width: 160rpx;
height: 56rpx;
text-align: center;
line-height: 56rpx;
background: #333333;
border-radius: 28rpx;
}
}
.item1 {
padding: 0 24rpx;
color: #553504;
}
.item2 {
width: 100%;
padding: 0 24rpx;
box-sizing: border-box;
image {
width: 40rpx;
height: 40rpx;
background-color: #fff;
border-radius: 50%;
margin-right: 10rpx;
}
.left{
display: flex;
align-items: center;
flex: 1;
.img{
width: 24px;
height: 24px;
background-color: #fff;
background-repeat: no-repeat;
background-size: 452px 408px;
background-position: -161.33px -133px;
border-radius: 50%;
margin-right: 10rpx;
}
}
.right {
flex: 1;
.top {
display: flex;
align-items: center;
.name {
font-size: 30rpx;
font-weight: bold;
color: #553504;
}
.day {
font-size: 24rpx;
color: #555;
margin: 0 auto;
text-align: center;
position: relative;
text {
position: absolute;
top: 0;
transform: translate(-50%, -50%);
white-space: nowrap;
}
.progress {
height: 10rpx;
width: 200rpx;
background-color: #747682;
border-radius: 50rpx;
margin-top: 20rpx;
overflow: hidden;
.percentage {
height: 100%;
background-color: #333333;
}
}
}
}
.time {
font-size: 22rpx;
color: #555555;
}
}
}
}
}
.vipBanner{
margin-top: 24rpx;
padding: 0 24rpx;
box-sizing: border-box;
image {
width: 100%;
}
}
.contBox{
padding: 0 24rpx;
box-sizing: border-box;
}
.userOrder {
background-color: #fff;
margin-top: 24rpx;
border-radius: 10rpx;
padding: 24rpx;
box-sizing: border-box;
.title{
.tit{
font-size: 30rpx;
font-weight: bold;
}
.more {
font-size: 26rpx;
color: #999;
text {
margin-right: 5rpx;
}
}
}
.itemBox{
display: flex;
text-align: center;
.item{
display: flex;
flex-direction: column;
align-items: center;
padding-top: 40rpx;
font-size: 24rpx;
color: #666;
position: relative;
width: 20%;
.img{
text-align: center;
margin-bottom: 16rpx;
.iconfont{
font-size: 28px;
color: #444;
}
}
.tag{
position: absolute;
top: 20rpx;
left: 60%;
background-color: v-bind('tagColor');
color: #fff;
font-size: 22rpx;
padding: 2px 5px;
line-height: 1;
border-radius: 8px;
}
}
&.sale{
flex-wrap: wrap;
.item{
width: 25%;
}
}
}
}
.rowBox{
background-color: #fff;
margin-top: 24rpx;
border-radius: 10rpx;
padding: 0 24rpx;
box-sizing: border-box;
.row{
height: 88rpx;
.left {
display: flex;
align-items: center;
text {
font-size: 30rpx;
margin-left: 15rpx;
}
.iconfont{
color: #444;
font-size: 17px;
}
}
.num {
font-size: 24rpx;
display: flex;
text {
color: v-bind('tagColor');
margin-right: 15rpx;
}
}
}
.row:not(:last-child) {
border-bottom: 1rpx solid #f2f2f2;
}
}
</style>