|
|
@@ -1,191 +1,241 @@
|
|
|
<template>
|
|
|
- <view class="pl-30 pr-30">
|
|
|
- <view class="wallet">
|
|
|
- <image
|
|
|
- src="/static/images/wallet-logo.png"
|
|
|
- mode="widthFix"
|
|
|
- class="image"
|
|
|
- />
|
|
|
- <view class="tag flex-center" @click="detail">
|
|
|
- <view class="fs-26" style="color: #fff; line-height: 58rpx"
|
|
|
- >钱包明细</view
|
|
|
- >
|
|
|
- <view style="margin-top: -8rpx; margin-left: 6rpx">
|
|
|
- <uni-icons type="right" size="10" color="#FFFFFF"></uni-icons>
|
|
|
+ <view class="page flex-column">
|
|
|
+ <navigation-bar title="我的钱包" @ready="ready"></navigation-bar>
|
|
|
+ <view class="head flex-shrink">
|
|
|
+ <view>
|
|
|
+ <image class="bg" src="/pages-user/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="toRefund">退款</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 class="label">钱包余额</view>
|
|
|
- <view class="value mt-16">
|
|
|
- <text class="fs-40 lh-48 fw-500 mr-12">¥</text>
|
|
|
- <text class="fw-500" style="font-size: 60rpx; line-height: 72rpx">{{
|
|
|
- balance
|
|
|
- }}</text>
|
|
|
- </view>
|
|
|
</view>
|
|
|
- <view class="pay">
|
|
|
- <view class="title">充值金额</view>
|
|
|
- <view class="flex-wrap">
|
|
|
+ <view class="body flex-grow flex-column">
|
|
|
+ <view class="tabs flex-shrink flex-align-center">
|
|
|
<view
|
|
|
- :class="[
|
|
|
- 'option',
|
|
|
- 'flex-center',
|
|
|
- `option-${index === payOption && !payValue ? 'active' : ''}`,
|
|
|
- ]"
|
|
|
- v-for="(item, index) in payOptions"
|
|
|
+ v-for="(item, index) in tabs"
|
|
|
:key="index"
|
|
|
- @click="changeOption(index)"
|
|
|
+ class="flex-align-center fs-30 mr-60"
|
|
|
+ :style="{
|
|
|
+ color:
|
|
|
+ tab === item.value ? 'rgba(0, 0, 0, 1);' : 'rgba(0, 0, 0, 0.6);',
|
|
|
+ }"
|
|
|
+ @click="changeTab(index)"
|
|
|
+ >{{ item.label
|
|
|
+ }}<view
|
|
|
+ :style="{ opacity: tab === item.value ? '1' : '0' }"
|
|
|
+ class="active"
|
|
|
+ ></view
|
|
|
+ ></view>
|
|
|
+ </view>
|
|
|
+ <view class="list flex-grow">
|
|
|
+ <scroll-view
|
|
|
+ class="scroll-view"
|
|
|
+ :style="{
|
|
|
+ height: `${scrollViewHeight}px`,
|
|
|
+ }"
|
|
|
+ scroll-y="true"
|
|
|
+ v-if="scrollViewHeight"
|
|
|
>
|
|
|
- {{ item }}
|
|
|
- </view>
|
|
|
+ <view
|
|
|
+ class="item flex-align-center"
|
|
|
+ v-for="(item, index) in list"
|
|
|
+ :key="index"
|
|
|
+ @click="detail(index)"
|
|
|
+ >
|
|
|
+ <view>
|
|
|
+ <view class="fs-30 fw-500" key="title" duration="300">{{
|
|
|
+ typeMap[item.type - 1]
|
|
|
+ }}</view>
|
|
|
+ <view class="fs-24" style="color: rgba(0, 0, 0, 0.4)">余额</view>
|
|
|
+ </view>
|
|
|
+ <view class="ml-auto" style="text-align: right">
|
|
|
+ <view class="fs-30 fw-500">
|
|
|
+ <text>{{ item.type > 1 ? "- " : "" }}{{ item.amount }}</text>
|
|
|
+ <text class="fs-24 ml-6">元</text>
|
|
|
+ </view>
|
|
|
+ <view class="fs-24" style="color: rgba(0, 0, 0, 0.4)">{{
|
|
|
+ item.transactionTime
|
|
|
+ }}</view>
|
|
|
+ </view>
|
|
|
+ <view class="ml-32" v-if="item.type === 3">
|
|
|
+ <uni-icons
|
|
|
+ type="right"
|
|
|
+ size="12"
|
|
|
+ color="rgba(0,0,0,0.4)"
|
|
|
+ ></uni-icons>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view style="height: 200rpx"></view>
|
|
|
+ </scroll-view>
|
|
|
</view>
|
|
|
- <view class="title">自定义金额</view>
|
|
|
- <style-input
|
|
|
- :value="payValue > 0 ? payValue : ''"
|
|
|
- title="金额"
|
|
|
- type="digit"
|
|
|
- @input="input"
|
|
|
- />
|
|
|
</view>
|
|
|
</view>
|
|
|
-
|
|
|
- <style-bottom-view>
|
|
|
- <view class="pl-30 pr-30 pb-20">
|
|
|
- <style-button type="primary" @click="confirm">充值</style-button>
|
|
|
- </view>
|
|
|
- </style-bottom-view>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { ref } from "vue";
|
|
|
-import { fetchProfile, insertMoney } from "../../api/user";
|
|
|
import { onLoad } from "@dcloudio/uni-app";
|
|
|
-const balance = ref(0);
|
|
|
-const payOption = ref(1);
|
|
|
-const payOptions = ref([50, 100, 200, 500, 1000]);
|
|
|
-const payValue = ref(0);
|
|
|
-const input = (e: any) => {
|
|
|
- payValue.value = e.value;
|
|
|
-};
|
|
|
-const changeOption = (index: number) => {
|
|
|
- payValue.value = 0;
|
|
|
- payOption.value = index;
|
|
|
-};
|
|
|
-const detail = () => {
|
|
|
- uni.navigateTo({
|
|
|
- url: "/pages-user/wallet-detail/wallet-detail",
|
|
|
- });
|
|
|
-};
|
|
|
-const confirm = () => {
|
|
|
- if (payValue.value && !/^[0-9]*(\.\d{1,2})?$/.test(`${payValue.value}`)) {
|
|
|
- uni.showModal({
|
|
|
- title: "温馨提示",
|
|
|
- content: "请输入正确的金额",
|
|
|
- showCancel: false,
|
|
|
- confirmColor: "#347DFF",
|
|
|
- });
|
|
|
- return;
|
|
|
- }
|
|
|
- const params = payValue.value
|
|
|
- ? Number(payValue.value)
|
|
|
- : payOptions.value[payOption.value];
|
|
|
- if (params > 10000 || params <= 0) {
|
|
|
- uni.showModal({
|
|
|
- title: "温馨提示",
|
|
|
- content: "每次最大充值金额10000,请修改金额",
|
|
|
- showCancel: false,
|
|
|
- confirmColor: "#347DFF",
|
|
|
- });
|
|
|
- return;
|
|
|
- }
|
|
|
- insertMoney(params)
|
|
|
- .then(() => {
|
|
|
- uni.showToast({
|
|
|
- title: "已支付",
|
|
|
- icon: "success",
|
|
|
- });
|
|
|
- fetchProfile().then((res) => {
|
|
|
- payValue.value = 0;
|
|
|
- balance.value = Number((Number(res.balance) / 100).toFixed(2))
|
|
|
- });
|
|
|
- })
|
|
|
- .catch((err) => {
|
|
|
- if (/cancel/.test(err.errMsg)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- uni.showModal({
|
|
|
- content: `${err.errMsg},请重试`,
|
|
|
- });
|
|
|
- });
|
|
|
-};
|
|
|
+import { fetchWallet } from "../../api/user";
|
|
|
+import { ref } from "vue";
|
|
|
+import { rpxToPx } from "@/utils/device";
|
|
|
+
|
|
|
+const user = ref();
|
|
|
+
|
|
|
+const tab = ref(0);
|
|
|
+const tabs = ref([
|
|
|
+ {
|
|
|
+ label: "全部",
|
|
|
+ value: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "充值",
|
|
|
+ value: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "消费",
|
|
|
+ value: 3,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: "退款", // TODO
|
|
|
+ value: 2,
|
|
|
+ },
|
|
|
+]);
|
|
|
+
|
|
|
+const typeMap = ref(["充值", "提现", "消费"]);
|
|
|
+const list = ref<any[]>([]);
|
|
|
+const scrollViewHeight = ref(0);
|
|
|
+
|
|
|
onLoad(() => {
|
|
|
- const user = getApp<any>().globalData.user;
|
|
|
- if (user) {
|
|
|
- balance.value = user.balance;
|
|
|
+ refresh();
|
|
|
+
|
|
|
+ if (getApp<any>().globalData.user) {
|
|
|
+ user.value = getApp<any>().globalData.user;
|
|
|
}
|
|
|
});
|
|
|
-</script>
|
|
|
|
|
|
-<style lang="scss">
|
|
|
-.wallet {
|
|
|
- height: 220rpx;
|
|
|
- background: linear-gradient(180deg, #347dff 0%, #4faaff 100%);
|
|
|
- box-shadow: 0px 12rpx 22rpx rgba(13, 21, 62, 0.1);
|
|
|
- border-radius: 40rpx;
|
|
|
- position: relative;
|
|
|
- margin-top: 100rpx;
|
|
|
- padding: 44rpx 40rpx;
|
|
|
+const ready = (e: any) => {
|
|
|
+ scrollViewHeight.value =
|
|
|
+ getApp<any>().globalData.device.windowHeight -
|
|
|
+ (e.detail.navigationBarHeight + rpxToPx(380));
|
|
|
+};
|
|
|
|
|
|
- .image {
|
|
|
- position: absolute;
|
|
|
- width: 148rpx;
|
|
|
- right: 40rpx;
|
|
|
- top: -60rpx;
|
|
|
- }
|
|
|
+const changeTab = (index: number) => {
|
|
|
+ tab.value = tabs.value[index].value;
|
|
|
+ refresh();
|
|
|
+};
|
|
|
|
|
|
- .label {
|
|
|
- font-size: 26rpx;
|
|
|
- color: rgba(255, 255, 255, 0.8);
|
|
|
- }
|
|
|
+const refresh = () => {
|
|
|
+ fetchWallet(tab.value, 1, 10).then((res: any) => {
|
|
|
+ if (res && res.length) {
|
|
|
+ res.forEach((item: any) => {
|
|
|
+ item.amount = (Number(item.amount) / 100).toFixed(2);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ list.value = res;
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
- .value {
|
|
|
- color: #fff;
|
|
|
+const detail = (index: number) => {
|
|
|
+ if (list.value[index].type === 3) {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages-charge/order/order?id=${list.value[index].orderNo}`,
|
|
|
+ });
|
|
|
}
|
|
|
+};
|
|
|
|
|
|
- .tag {
|
|
|
- position: absolute;
|
|
|
- width: 170rpx;
|
|
|
- height: 58rpx;
|
|
|
- right: 0;
|
|
|
- bottom: 0;
|
|
|
- background: var(--color-primary);
|
|
|
- border-radius: 29rpx 0 29rpx 0;
|
|
|
- }
|
|
|
+const toRefund = () => {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `/pages-user/wallet-refund/wallet-refund`,
|
|
|
+ });
|
|
|
}
|
|
|
+</script>
|
|
|
|
|
|
-.pay {
|
|
|
- padding-top: 20rpx;
|
|
|
- .title {
|
|
|
- font-weight: 500;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #000;
|
|
|
- padding-bottom: 30rpx;
|
|
|
- padding-top: 40rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .option {
|
|
|
- width: 214rpx;
|
|
|
- height: 82rpx;
|
|
|
- background: var(--color-sec);
|
|
|
- border-radius: 10rpx;
|
|
|
- margin-left: 20rpx;
|
|
|
- margin-bottom: 20rpx;
|
|
|
- &:nth-child(3n + 1) {
|
|
|
- margin-left: 0;
|
|
|
+<style lang="scss">
|
|
|
+.page {
|
|
|
+ height: 100vh;
|
|
|
+ width: 100vw;
|
|
|
+ background: linear-gradient(
|
|
|
+ 180deg,
|
|
|
+ #e0ebff 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: #076370;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- .option-active {
|
|
|
- background-color: var(--color-primary);
|
|
|
- color: #fff;
|
|
|
+ .body {
|
|
|
+ .tabs {
|
|
|
+ padding: 0 40rpx;
|
|
|
+ & > view {
|
|
|
+ position: relative;
|
|
|
+ height: 72rpx;
|
|
|
+ .active {
|
|
|
+ position: absolute;
|
|
|
+ left: 50%;
|
|
|
+ bottom: 0px;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ width: 40rpx;
|
|
|
+ height: 4rpx;
|
|
|
+ border-radius: 4rpx;
|
|
|
+ background-color: var(--color-primary);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .list {
|
|
|
+ height: 100%;
|
|
|
+ .scroll-view {
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 0rpx 30rpx;
|
|
|
+ }
|
|
|
+ .item {
|
|
|
+ height: 170rpx;
|
|
|
+ border-bottom: 1rpx solid rgba(0, 0, 0, 0.1);
|
|
|
+ &:last-child {
|
|
|
+ border-bottom: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
</style>
|