automated_uniapp/pages/index/my.vue
2025-01-09 16:16:11 +08:00

299 lines
5.9 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>
<cl-page status-bar-background="#2b2e3d">
<view class="page-my">
<view class="bg"></view>
<view class="container">
<view class="info">
<!-- 头像 -->
<view class="avatar">
<cl-avatar :size="100" :src="user.info?.avatarUrl" />
</view>
<view class="det">
<!-- 昵称 -->
<cl-text :size="36" bold block color="#fff" @tap="toLogin">
{{ user.info?.nickName || "-" }}
</cl-text>
<!-- 手机号 -->
<button
class="phone"
:open-type="user.info?.phone ? '' : 'getPhoneNumber'"
@getphonenumber="toBindPhone"
>
<cl-text color="info">手机号</cl-text>
<cl-text color="info">
{{ user.info?.phone || "未绑定,点击获取" }}
</cl-text>
</button>
</view>
<!-- 设置 -->
<!-- #ifndef MP-WEIXIN -->
<text class="cl-icon-set" @tap="router.push('/pages/user/set')"></text>
<!-- #endif -->
</view>
<!-- 我的订单 -->
<view class="order">
<view class="label">
<cl-text :size="28" bold>我的订单</cl-text>
<view class="more" @tap="order.toList()">
<cl-text color="info" :size="24"> 全部 </cl-text>
<cl-icon color="info" name="arrow-right"></cl-icon>
</view>
</view>
<view class="status">
<view
class="item"
v-for="(item, index) in order.types"
:key="index"
@tap="order.toList(item.value)"
>
<cl-badge
:value="item.number"
:max="99"
:margin="14"
type="error"
plain
>
<cl-icon :class-name="item.icon" :size="70" color="primary" />
</cl-badge>
<cl-text color="info" :size="24" :margin="[10, 0, 0, 0]">
{{ item.label }}
</cl-text>
</view>
</view>
</view>
<!-- 菜单 -->
<cl-list :radius="24" :border="false">
<cl-list-item label="我的优惠券" @tap="router.push('/pages/market/coupon')">
<template #icon>
<cl-icon class-name="shop-icon-coupon" :size="50" />
</template>
</cl-list-item>
<cl-list-item
label="在线客服"
@tap="router.push('/uni_modules/cool-cs/pages/chat')"
>
<template #icon>
<cl-icon class-name="shop-icon-custom" :size="50" />
</template>
</cl-list-item>
<cl-list-item label="收货地址" @tap="router.push('/pages/user/address-list')">
<template #icon>
<cl-icon class-name="shop-icon-location" :size="50" />
</template>
</cl-list-item>
</cl-list>
<!-- 设置 -->
<cl-list :radius="24" :border="false">
<cl-list-item label="设置" @tap="router.push('/pages/user/set')">
<template #icon>
<cl-icon class-name="shop-icon-set" :size="50" />
</template>
</cl-list-item>
</cl-list>
</view>
</view>
<tabbar />
</cl-page>
</template>
<script lang="ts" setup>
import { reactive } from "vue";
import { useCool, useStore, useWx } from "/@/cool";
import { useUi } from "/$/cool-ui";
import { onShow } from "@dcloudio/uni-app";
import Tabbar from "./components/tabbar.vue";
const { service, router } = useCool();
const { user } = useStore();
const ui = useUi();
const wx = useWx();
// 订单
const order = reactive({
types: [
{
label: "待付款",
icon: "shop-icon-order-paid",
value: 0,
number: 0,
},
{
label: "待发货",
icon: "shop-icon-order-not-shipped",
value: 1,
number: 0,
},
{
label: "待收货",
icon: "shop-icon-order-received",
value: 2,
number: 0,
},
{
label: "待评价",
icon: "shop-icon-order-comment",
value: 3,
number: 0,
},
{
label: "退款/售后",
icon: "shop-icon-order-refund",
value: "5,6",
number: 0,
},
],
// 查看订单
toList(status?: string | number) {
router.push({
path: "/pages/order/list",
query: {
status,
},
});
},
// 获取订单统计
refresh() {
service.order.info.userCount().then((res) => {
order.types[0].number = res["待付款"];
order.types[1].number = res["待发货"];
order.types[2].number = res["待收货"];
order.types[3].number = res["待评价"];
order.types[4].number = Number(res["退款中"]) + Number(res["已退款"]);
});
},
});
// 去登录
function toLogin() {
if (!user.token) {
user.logout();
}
}
// 绑定手机号
function toBindPhone(e: { detail: any }) {
service.user.info
.miniPhone({
...e.detail,
code: wx.code.value,
})
.then((phone) => {
ui.showToast("手机号绑定成功");
user.update({
phone,
});
})
.catch((err) => {
ui.showToast(err.message);
});
}
onShow(() => {
order.refresh();
toLogin();
});
</script>
<style lang="scss" scoped>
.page-my {
position: relative;
overflow: hidden;
.bg {
position: absolute;
left: 0;
top: 0;
height: 700rpx;
width: 100%;
background: linear-gradient(to bottom, #2b2e3d, rgba(#2b2e3d, 0.8), #f6f7fa);
}
.container {
padding: 0 24rpx;
position: relative;
.info {
display: flex;
align-items: center;
position: relative;
padding: 40rpx 10rpx;
.avatar {
margin-right: 30rpx;
}
.phone {
display: inline-block;
border: 0;
padding: 0;
margin: 0;
line-height: normal;
font-size: 24rpx;
margin-top: 14rpx;
background-color: transparent;
&::after {
border: 0;
}
}
.cl-icon-set {
position: absolute;
right: 10rpx;
top: 34rpx;
font-size: 40rpx;
color: #fff;
}
}
.order {
padding: 24rpx;
margin-bottom: 24rpx;
border-radius: 24rpx;
background-color: #ffffff;
.label {
display: flex;
justify-content: space-between;
margin-bottom: 12rpx;
.more {
display: flex;
align-items: center;
}
}
.status {
display: flex;
padding: 24rpx 0;
.item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
position: relative;
}
}
}
}
}
</style>