Files
2026-06-29 10:54:33 +08:00

257 lines
6.1 KiB
Vue
Raw Permalink 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="container">
<view class="card profile">
<view class="row between">
<view class="row">
<image class="avatar" :src="avatarUrl" mode="aspectFill" />
<view class="uinfo">
<view class="u">微信用户</view>
<view class="muted s">会员档案 · {{ tag }}</view>
</view>
</view>
<view class="badge">VIP</view>
</view>
<view class="stats row">
<view class="st">
<view class="v">{{ points }}</view>
<view class="muted l">积分</view>
</view>
<view class="sep"></view>
<view class="st">
<view class="v">¥{{ balance }}</view>
<view class="muted l">储值</view>
</view>
<view class="sep"></view>
<view class="st">
<view class="v">{{ visitCount }}</view>
<view class="muted l">到店</view>
</view>
</view>
</view>
<view class="card menu">
<view class="cell row between" @tap="goAppointments">
<view class="c-l">
<view class="c-t">我的预约</view>
<view class="muted c-s">待到店 / 改约 / 取消</view>
</view>
<view class="arr"></view>
</view>
<view class="cell row between" @tap="goCoupons">
<view class="c-l">
<view class="c-t">我的卡券 / 次卡</view>
<view class="muted c-s">剩余次数 / 去使用</view>
</view>
<view class="arr"></view>
</view>
<view class="cell row between" @tap="goRecords">
<view class="c-l">
<view class="c-t">消费记录</view>
<view class="muted c-s"> 7 / 30 </view>
</view>
<view class="arr"></view>
</view>
<view class="cell row between" @tap="goSkin">
<view class="c-l">
<view class="c-t">我的肤质档案</view>
<view class="muted c-s">肤质 / 需求 / 建议</view>
</view>
<view class="arr"></view>
</view>
<view class="cell row between" @tap="goMsg">
<view class="c-l">
<view class="c-t">消息提醒</view>
<view class="muted c-s">预约成功 / 到店提醒</view>
</view>
<view class="arr"></view>
</view>
<view class="cell row between" @tap="goStore">
<view class="c-l">
<view class="c-t">门店设置</view>
<view class="muted c-s">地址 / 电话 / 技师团队</view>
</view>
<view class="arr"></view>
</view>
</view>
<view class="card block">
<view class="title">定位与附近流量</view>
<view class="muted line">用于附近门店匹配与推荐展示</view>
<view class="btn btn-ghost loc" @tap="getLoc">获取定位</view>
<view class="muted line" v-if="locText">{{ locText }}</view>
</view>
<view class="card foot">
<view class="row between">
<view class="muted">版本 {{ version }}</view>
<view class="kefu" @tap="call">联系客服</view>
</view>
</view>
<AiFloat />
</view>
</template>
<script>
import AiFloat from '@/components/AiFloat.vue'
import { storeProfile } from '@/common/mockData'
export default {
components: { AiFloat },
data() {
return {
avatarUrl:
'https://coresg-normal.trae.ai/api/ide/v1/text_to_image?prompt=photorealistic%20portrait%20avatar%2C%20friendly%20woman%2C%20clean%20background%2C%20soft%20studio%20lighting%2C%20high-end%20beauty%20brand%20style%2C%2035mm%2C%20ultra%20detail&image_size=square',
points: 1260,
balance: 200,
visitCount: 12,
tag: '敏感肌 · 高复购',
locText: '',
version: '1.0.0',
store: storeProfile
}
},
methods: {
goAppointments() {
uni.navigateTo({ url: '/pages/appointments/list' })
},
goCoupons() {
uni.navigateTo({ url: '/pages/coupons/list' })
},
goRecords() {
uni.navigateTo({ url: '/pages/records/list' })
},
goSkin() {
uni.navigateTo({ url: '/pages/profile/skin' })
},
goMsg() {
uni.navigateTo({ url: '/pages/messages/settings' })
},
goStore() {
uni.navigateTo({ url: '/pages/store/detail' })
},
getLoc() {
uni.getLocation({
type: 'gcj02',
success: (res) => {
this.locText = `已获取:${res.latitude.toFixed(6)}, ${res.longitude.toFixed(6)}`
},
fail: () => {
uni.showToast({ title: '未授权定位', icon: 'none' })
}
})
},
call() {
uni.makePhoneCall({ phoneNumber: this.store.phone })
}
}
}
</script>
<style lang="scss" scoped>
.profile {
padding: 26rpx;
}
.avatar {
width: 88rpx;
height: 88rpx;
border-radius: 999rpx;
background: rgba(17, 24, 39, 0.06);
border: 1rpx solid rgba(17, 24, 39, 0.08);
}
.uinfo {
margin-left: 18rpx;
}
.u {
font-size: 38rpx;
font-weight: 950;
}
.s {
margin-top: 10rpx;
font-size: 26rpx;
}
.badge {
padding: 12rpx 16rpx;
border-radius: 999rpx;
background: rgba(59, 130, 246, 0.14);
color: #1d4ed8;
font-size: 24rpx;
font-weight: 950;
}
.stats {
margin-top: 22rpx;
padding: 18rpx;
border-radius: 18rpx;
background: rgba(17, 24, 39, 0.04);
}
.st {
flex: 1;
}
.v {
font-size: 32rpx;
font-weight: 950;
}
.l {
margin-top: 6rpx;
font-size: 24rpx;
}
.sep {
width: 1rpx;
height: 48rpx;
background: rgba(17, 24, 39, 0.08);
}
.menu {
margin-top: 18rpx;
padding: 10rpx 22rpx;
}
.cell {
padding: 18rpx 0;
border-top: 1rpx solid rgba(17, 24, 39, 0.08);
}
.cell:first-of-type {
border-top: 0;
}
.c-t {
font-size: 30rpx;
font-weight: 950;
}
.c-s {
margin-top: 8rpx;
font-size: 24rpx;
}
.arr {
font-size: 40rpx;
color: rgba(17, 24, 39, 0.4);
margin-left: 16rpx;
}
.block {
padding: 22rpx;
margin-top: 18rpx;
}
.title {
font-weight: 950;
font-size: 30rpx;
margin-bottom: 10rpx;
}
.line {
padding: 8rpx 0;
font-size: 26rpx;
}
.loc {
margin-top: 10rpx;
}
.foot {
margin-top: 18rpx;
padding: 18rpx 22rpx;
}
.kefu {
padding: 12rpx 16rpx;
border-radius: 999rpx;
background: rgba(17, 24, 39, 0.06);
font-size: 26rpx;
font-weight: 900;
}
</style>