| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- <template>
- <view class="page flex-column">
- <navigation-bar
- autoFixedStyle="background-color:#fff;"
- title="我的钱包"
- @ready="ready"
- ></navigation-bar>
- <view class="head flex-shrink">
- <view>
- <image class="bg" src="../static/wallet-banner.png"></image>
- <view class="fg pt-48 pl-48 pr-48">
- <view class="flex-align-center">
- <uni-icons
- type="wallet-filled"
- size="24"
- color="#ffffff"
- ></uni-icons>
- <view class="fs-36 color-fff fw-500 ml-16">我的钱包</view>
- <view
- class="btn flex-center fs-28 ml-auto"
- @click="to(`/pages-user/wallet-refund/wallet-refund`)"
- >退款
- </view
- >
- </view>
- <view class="price mt-50" v-if="user">
- <text class="color-fff fw-600 fs-48" style="vertical-align: top"
- >¥
- </text
- >
- <text
- class="color-fff fw-600 ml-12"
- style="font-size: 46px; line-height: 46px"
- >{{ user.balance }}
- </text
- >
- </view>
- </view>
- </view>
- </view>
- <view class="body flex-grow flex-column">
- <view class="tabs flex-shrink flex-align-center">
- <view
- v-for="(item, index) in tabs"
- :key="index"
- class="flex-align-center fs-30 mr-60"
- :style="{
- color:
- tab === item.value ? '#1c2b29;' : '#5c6b69;',
- fontWeight: tab === item.value ? '600' : '400',
- }"
- @click="changeTab(index)"
- >{{
- item.label
- }}
- <view
- :style="{ opacity: tab === item.value ? '1' : '0' }"
- class="active"
- ></view
- >
- </view>
- </view>
- <view class="list pl-30 pr-30">
- <view
- class="item flex-align-center pressable"
- hover-class="pressed"
- hover-stay-time="80"
- v-for="(item, index) in dataList"
- :key="index"
- @click="detail(index)"
- >
- <view>
- <view class="fs-30 fw-500" key="title" duration="300">{{
- typeMap[item.type - 1]
- }}
- </view>
- <view v-if="item.type!==2">
- <view class="fs-24" style="color: #8c9997">余额</view>
- </view>
- <view v-else>
- <text class="refund-status" :style="refundStyle(item.status)">{{ refundLabel(item.status) }}</text>
- </view>
- </view>
- <view class="ml-auto" style="text-align: right">
- <view class="fs-30 fw-500">
- <text>{{ item.type == 3 ? "- " : "" }}{{ item.amount }}</text>
- <text class="fs-24 ml-6">元</text>
- </view>
- <view class="fs-24" style="color: #8c9997">{{
- item.transactionTime
- }}
- </view>
- </view>
- <view class="ml-32" v-if="item.type === 3">
- <uni-icons
- type="right"
- size="12"
- color="rgba(28,43,41,0.4)"
- ></uni-icons>
- </view>
- <view class="ml-32" v-else> </view>
- </view>
- </view>
- <view style="height: 170rpx"></view>
- </view>
- <style-bottom-view background="#ffffff">
- <view class="pl-40 pr-40 pb-30 pt-30">
- <style-button
- type="primary"
- @click="to(`/pages-user/wallet-recharge/wallet-recharge`)"
- >充值
- </style-button
- >
- </view>
- </style-bottom-view>
- </view>
- </template>
- <script setup lang="ts">
- import {useInfiniteScroll} from "../../utils/infinite-scroll";
- import {onReachBottom, onPullDownRefresh, onShow} from "@dcloudio/uni-app";
- import {fetchWallet, listRefund} from "../../api/user";
- import {to} from "../../utils/navigate";
- import {ref} from "vue";
- import {rpxToPx} from "@/utils/device";
- import { requireAuth } from "@/utils/auth";
- const user = ref();
- const dataList = ref([])
- const tab = ref(0);
- const tabs = ref([
- {
- label: "全部",
- value: 0,
- },
- {
- label: "充值",
- value: 1,
- },
- {
- label: "消费",
- value: 3,
- },
- {
- label: "退款",
- value: 2,
- },
- ]);
- const refundStatusMap = ref([
- {label: '退款成功 ', value: 'SUCCESS', color: '#4cd964'},
- {label: '退款关闭 ', value: 'CLOSED', color: '#000000'},
- {label: '退款处理中 ', value: 'PROCESSING', color: '#007aff'},
- {label: '退款异常 ', value: 'ABNORMAL', color: '#dd524d'},
- {label: '退款已申请 ', value: 'NEW', color: '#f0ad4e'},
- ])
- const typeMap = ref(["充值", "退款", "消费"]);
- /*const infiniteScroller = useInfiniteScroll(10, (page) => {
- return fetchWallet(tab.value, page, 10).then((res: any) => {
- if (res && res.length) {
- res.forEach((item: any) => {
- item.amount = (Number(item.amount) / 100).toFixed(2);
- });
- }
- return res;
- });
- });*/
- const scrollViewHeight = ref(0);
- onShow(() => {
- if (!requireAuth()) {
- return;
- }
- loadData();
- if (getApp<any>().globalData.user) {
- user.value = getApp<any>().globalData.user;
- }
- })
- onReachBottom(() => {
- // if(tab.value!==2){
- // infiniteScroller.next();
- // }
- loadData();
- });
- onPullDownRefresh(() => {
- // if(tab.value!==2){
- // infiniteScroller.refresh();
- // }
- loadData();
- });
- const ready = (e: any) => {
- scrollViewHeight.value =
- getApp<any>().globalData.device.windowHeight -
- (e.detail.navigationBarHeight + rpxToPx(380));
- };
- const refundLabel = (value: string) => {
- return refundStatusMap.value.find((item: any) => item.value === value)?.label
- }
- const refundStyle = (value: string) => {
- let rf = refundStatusMap.value.find((item: any) => item.value === value);
- return setupLabelColorStyle(rf?.color)
- }
- const setupLabelColorStyle = (hex: string = "#000000", opacity = 0.2) => {
- if (!hex) {
- hex = "#000000"
- }
- hex = hex.replace("#", "");
- // Convert the hex value to RGB values
- const r = parseInt(hex.substring(0, 2), 16);
- const g = parseInt(hex.substring(2, 4), 16);
- const b = parseInt(hex.substring(4, 6), 16);
- return {
- /* 'text-shadow': `2px 2px 3px rgba(${r},${g},${b},${opacity})`,
- 'background-color': `rgba(${r},${g},${b},${opacity})`,*/
- 'color': `rgb(${r},${g},${b})`
- }
- }
- const changeTab = (index: number) => {
- tab.value = tabs.value[index].value;
- loadData();
- /* if (tab.value === 2) {
- let user = getApp<any>().globalData.user;
- if (user) {
- listRefund({userId: user.id,pageSize:1000}).then((res: any) => {
- console.log(res)
- let dataList = (res.list || []).map(item => {
- item.amount = (Number(item.refund) / 100).toFixed(2);
- item.type = 2;
- if (item.successTime) {
- item.transactionTime = item.successTime.slice(0, 3).join("-") + " " + item.successTime.slice(3, 6).join(":")
- }
- return item;
- })
- infiniteScroller.setList(dataList);
- })
- } else {
- infiniteScroller.refresh();
- }
- }*/
- }
- const loadData = () => {
- if (!user) return;
- if (tab.value !== 2) {
- fetchWallet(tab.value, 1, 1000).then((res: any) => {
- if (res && res.length) {
- res.forEach((item: any) => {
- item.amount = (Number(item.amount) / 100).toFixed(2);
- });
- }
- dataList.value = res;
- });
- } else {
- listRefund({userId: user.value.id, pageSize: 1000}).then((res: any) => {
- console.log(res)
- let list = (res.list || []).map(item => {
- item.amount = (Number(item.refund) / 100).toFixed(2);
- item.type = 2;
- if (item.successTime) {
- item.transactionTime = item.successTime.slice(0, 3).join("-") + " " + item.successTime.slice(3, 6).join(":")
- }
- return item;
- })
- dataList.value = list;
- })
- }
- }
- const detail = (index: number) => {
- if (!dataList.value) {
- return;
- }
- if (dataList.value[index].type === 3) {
- uni.navigateTo({
- url: `/pages-charge/order/order?id=${dataList.value[index]?.orderNo}`,
- });
- }
- };
- </script>
- <style lang="scss">
- .page {
- height: 100vh;
- width: 100vw;
- background: linear-gradient(
- 180deg,
- #d9efec 0%,
- rgba(255, 255, 255, 0) 60.13%
- );
- .head {
- padding: 30rpx 40rpx;
- & > view {
- position: relative;
- height: 320rpx;
- border-radius: 40rpx;
- overflow: hidden;
- .bg {
- height: 100%;
- width: 100%;
- }
- .fg {
- position: absolute;
- left: 0px;
- top: 0px;
- height: 100%;
- width: 100%;
- .btn {
- width: 120rpx;
- height: 64rpx;
- border-radius: 40rpx;
- background: rgba(255, 255, 255, 0.3);
- color: var(--color-primary-deep);
- }
- }
- }
- }
- .body {
- .tabs {
- padding: 0 40rpx;
- & > view {
- position: relative;
- height: 72rpx;
- transition: opacity 0.22s cubic-bezier(0.22, 1, 0.36, 1);
- .active {
- position: absolute;
- left: 50%;
- bottom: 0px;
- transform: translateX(-50%);
- width: 40rpx;
- height: 6rpx;
- border-radius: 6rpx;
- background-color: var(--color-primary);
- transition: opacity 0.22s cubic-bezier(0.22, 1, 0.36, 1);
- }
- }
- }
- .list {
- .item {
- height: 130rpx;
- border-bottom: 1rpx solid var(--divider);
- &:last-child {
- border-bottom: none;
- }
- }
- }
- }
- }
- .refund-status {
- display: inline-block;
- //padding: 8rpx;
- font-size: 22rpx;
- font-weight: 500;
- }
- </style>
|