|
|
@@ -1,15 +1,16 @@
|
|
|
<script lang="ts" setup>
|
|
|
-import type { AccountDetailItem } from '@/api/income'
|
|
|
-import { useRequest } from 'alova/client'
|
|
|
+import { usePagination, useRequest } from 'alova/client'
|
|
|
+import MescrollEmpty from 'mescroll-uni/components/mescroll-empty.vue'
|
|
|
+import MescrollUni from 'mescroll-uni/mescroll-uni.vue'
|
|
|
import { storeToRefs } from 'pinia'
|
|
|
-import { computed, ref, watch } from 'vue'
|
|
|
+import { computed, ref } from 'vue'
|
|
|
import { getAccountCount } from '@/api/home'
|
|
|
-import { getAccountDetailTotalAmount, getCouponIssuerAccountByPageMap } from '@/api/income'
|
|
|
-import { useScroll } from '@/hooks/useScroll'
|
|
|
+import { getCouponIssuerAccountByPageMap } from '@/api/income'
|
|
|
+import IncomeItem from '@/components/IncomeItem.vue'
|
|
|
import { useShare } from '@/hooks/useShare'
|
|
|
import { useUserStore } from '@/store'
|
|
|
import { useTokenStore } from '@/store/token'
|
|
|
-import { changtime, menuButtonInfo, safeAreaInsets, systemInfo } from '@/utils'
|
|
|
+import { changtime, menuButtonInfo, rpxToPx, safeAreaInsets, systemInfo } from '@/utils'
|
|
|
import { getImageUrl } from '@/utils/imageUtil'
|
|
|
|
|
|
definePage({
|
|
|
@@ -25,113 +26,164 @@ const tokenStore = useTokenStore()
|
|
|
const { userInfo } = storeToRefs(userStore)
|
|
|
const { hasLogin } = storeToRefs(tokenStore)
|
|
|
|
|
|
-const show = ref(false)
|
|
|
-const filterValue = ref(Date.now())
|
|
|
// 发券人账户表-通过userId查询账户信息
|
|
|
const { send: getAccountCountRequest, data: accountCountData } = useRequest(getAccountCount, {
|
|
|
immediate: false,
|
|
|
})
|
|
|
|
|
|
-const refreshing = ref(false)
|
|
|
-const status = ref(0) // 0-待结算, 1-已结算/成功
|
|
|
-const type = ref(1) // 明细类型: 1-佣金收入, 2-提现支出, 3-退款扣减, 4-系统调整
|
|
|
+const activeIndex = ref(0)
|
|
|
+const showLoading = ref(false)
|
|
|
+const pickerDate = ref(Date.now())
|
|
|
+const pickerShow = ref(false)
|
|
|
+const totalAmount = ref(0)
|
|
|
+let mescroll = null
|
|
|
+
|
|
|
+// 新增:滚动距离和透明度
|
|
|
+const scrollTop = ref(0)
|
|
|
+const headerOverlayOpacity = computed(() => {
|
|
|
+ // 当滚动距离超过150px时,完全显示纯色背景
|
|
|
+ const headerHeightForRPX = 526
|
|
|
+ const headerHeightForPx = rpxToPx(headerHeightForRPX)
|
|
|
+ const maxScroll = menuButtonInfo.height + safeAreaInsets.top + 64 + (headerHeightForPx - (menuButtonInfo.height + safeAreaInsets.top + 64)) / 2
|
|
|
+ return Math.min(scrollTop.value / maxScroll, 1)
|
|
|
+})
|
|
|
+
|
|
|
+// 新增:监听页面滚动
|
|
|
+onPageScroll((e) => {
|
|
|
+ scrollTop.value = e.scrollTop
|
|
|
+})
|
|
|
|
|
|
-const { send: getAccountDetailTotalAmountRequest, data: accountDetailTotalAmountData } = useRequest(() => getAccountDetailTotalAmount({ status: status.value, year: changtime(filterValue.value, 'YYYY'), month: changtime(filterValue.value, 'MM'), type: type.value }), {
|
|
|
+const { send, data: incomeData, pageCount, loading, page, pageSize, isLastPage, refresh, reload, onSuccess, onError } = usePagination((page, pageSize) => getCouponIssuerAccountByPageMap({
|
|
|
+ pageNo: page,
|
|
|
+ pageSize,
|
|
|
+ type: 1,
|
|
|
+ status: activeIndex.value,
|
|
|
+ year: changtime(pickerDate.value, 'YYYY'),
|
|
|
+ month: changtime(pickerDate.value, 'MM'),
|
|
|
+}), {
|
|
|
+ initialPage: 1,
|
|
|
+ initialPageSize: 10,
|
|
|
+ append: true,
|
|
|
+ preloadNextPage: false,
|
|
|
+ preloadPreviousPage: false,
|
|
|
+ total: response => response.total,
|
|
|
+ data: response => response.detailList,
|
|
|
immediate: false,
|
|
|
})
|
|
|
|
|
|
-// 获取账户明细分页数据(Map格式)---待结算
|
|
|
-const {
|
|
|
- list: pendingSettlementData,
|
|
|
- loading: pendingSettlementLoading,
|
|
|
- finished: pendingSettlementFinished,
|
|
|
- refresh: pendingSettlementRefresh,
|
|
|
- loadMore: pendingSettlementLoadMore,
|
|
|
-} = useScroll<AccountDetailItem>({
|
|
|
- fetchData: async (page, pageSize) => {
|
|
|
- const response = await getCouponIssuerAccountByPageMap({
|
|
|
- pageNo: page,
|
|
|
- pageSize,
|
|
|
- status: 0,
|
|
|
- year: changtime(filterValue.value, 'YYYY'),
|
|
|
- month: changtime(filterValue.value, 'MM'),
|
|
|
- type: type.value,
|
|
|
- })
|
|
|
- return response.detailList || []
|
|
|
- },
|
|
|
- pageSize: 7,
|
|
|
+// ============ mescroll 配置 ============
|
|
|
+const downOption = reactive({
|
|
|
+ use: false,
|
|
|
+ auto: false,
|
|
|
+ bgColor: '#f8f8fa',
|
|
|
+ textColor: '#666',
|
|
|
+ textInOffset: '下拉刷新',
|
|
|
+ textOutOffset: '释放刷新',
|
|
|
+ textLoading: '刷新中...',
|
|
|
+ offset: 80,
|
|
|
})
|
|
|
|
|
|
-// 获取账户明细分页数据(Map格式)---已结算
|
|
|
-const {
|
|
|
- list: settledData,
|
|
|
- loading: settledLoading,
|
|
|
- finished: settledFinished,
|
|
|
- refresh: settledRefresh,
|
|
|
- loadMore: settledLoadMore,
|
|
|
-} = useScroll<AccountDetailItem>({
|
|
|
- fetchData: async (page, pageSize) => {
|
|
|
- const response = await getCouponIssuerAccountByPageMap({
|
|
|
- pageNo: page,
|
|
|
- pageSize,
|
|
|
- status: 1,
|
|
|
- year: changtime(filterValue.value, 'YYYY'),
|
|
|
- month: changtime(filterValue.value, 'MM'),
|
|
|
- type: type.value,
|
|
|
- })
|
|
|
- return response.detailList || []
|
|
|
+const upOption = reactive({
|
|
|
+ use: true,
|
|
|
+ auto: false,
|
|
|
+ noMoreSize: 7,
|
|
|
+ isBounce: true,
|
|
|
+ page: {
|
|
|
+ num: page.value,
|
|
|
+ size: pageSize.value,
|
|
|
+ },
|
|
|
+ empty: {
|
|
|
+ use: false,
|
|
|
},
|
|
|
- pageSize: 7,
|
|
|
+ textNoMore: '--- 已经到底了 ---',
|
|
|
+ toTop: {
|
|
|
+ src: '/static/images/mescroll-totop.png',
|
|
|
+ offset: 1000,
|
|
|
+ bottom: 120,
|
|
|
+ },
|
|
|
+ // 开启虚拟列表优化(大数据量时)
|
|
|
+ virtual: {
|
|
|
+ use: false,
|
|
|
+ rowHeight: 300,
|
|
|
+ }
|
|
|
})
|
|
|
|
|
|
-async function confirm() {
|
|
|
- // 函数实现
|
|
|
- show.value = false
|
|
|
- if (status.value === 0) {
|
|
|
- await pendingSettlementRefresh()
|
|
|
- }
|
|
|
- else {
|
|
|
- await settledRefresh()
|
|
|
- }
|
|
|
-}
|
|
|
-function cancel() {
|
|
|
- show.value = false
|
|
|
+const emptyOption = reactive({
|
|
|
+ use: true,
|
|
|
+ tip: '暂无数据',
|
|
|
+ btnText: '刷新试试',
|
|
|
+ icon: '/static/images/mescroll-empty.png',
|
|
|
+ fixed: false,
|
|
|
+ top: '200rpx',
|
|
|
+})
|
|
|
+
|
|
|
+function mescrollInit(ref) {
|
|
|
+ mescroll = ref
|
|
|
}
|
|
|
-function close() {
|
|
|
- show.value = false
|
|
|
+
|
|
|
+async function downCallback() {
|
|
|
+ console.log('下拉刷新触发')
|
|
|
+
|
|
|
+ // await refresh()
|
|
|
}
|
|
|
|
|
|
-// 下拉刷新
|
|
|
-async function onRefresh() {
|
|
|
- refreshing.value = true
|
|
|
- // 重置列表并重新加载数据
|
|
|
- if (status.value === 0) {
|
|
|
- await pendingSettlementRefresh()
|
|
|
- }
|
|
|
- else {
|
|
|
- await settledRefresh()
|
|
|
+async function upCallback() {
|
|
|
+ console.log('上拉加载触发')
|
|
|
+ if (isLastPage.value) {
|
|
|
+ console.log(mescroll)
|
|
|
+ mescroll.endSuccess(0, false)
|
|
|
+ return
|
|
|
}
|
|
|
- refreshing.value = false
|
|
|
+
|
|
|
+ page.value++
|
|
|
}
|
|
|
|
|
|
-// 上拉加载更多
|
|
|
-function onLoadMore() {
|
|
|
- console.log(status.value, '执行了')
|
|
|
- if (status.value === 0) {
|
|
|
- pendingSettlementLoadMore()
|
|
|
- }
|
|
|
- else {
|
|
|
- settledLoadMore()
|
|
|
+onSuccess((response) => {
|
|
|
+ let isNextPage = isLastPage.value
|
|
|
+ // 此处处理alova isLastPage默认值为true,首次请求出现的无法加载下一页问题
|
|
|
+ if (pageCount.value > page.value && isLastPage.value) {
|
|
|
+ isNextPage = false
|
|
|
}
|
|
|
+ totalAmount.value = response.data?.totalAmount || 0
|
|
|
+ // mescroll.setPageNum(page.value - 1)
|
|
|
+ mescroll.endSuccess(incomeData.value.length, !isNextPage)
|
|
|
+})
|
|
|
+
|
|
|
+onError(() => {
|
|
|
+ console.log('请求失败')
|
|
|
+ mescroll.endErr()
|
|
|
+})
|
|
|
+
|
|
|
+onShow(async () => {
|
|
|
+ await send()
|
|
|
+})
|
|
|
+
|
|
|
+async function tabChange(index) {
|
|
|
+ // 切换tab时,重置上拉加载
|
|
|
+ // mescroll.resetUpScroll(true)
|
|
|
+ // mescroll.showDownScroll()
|
|
|
+ activeIndex.value = index
|
|
|
+ mescroll.hideUpScroll()
|
|
|
+ mescroll.scrollTo(0, 0)
|
|
|
+ showLoading.value = true
|
|
|
+ await reload()
|
|
|
+ showLoading.value = false
|
|
|
}
|
|
|
|
|
|
-const list = ref<AccountDetailItem[]>([])
|
|
|
+async function pickerConfirm() {
|
|
|
+ pickerShow.value = false
|
|
|
+ mescroll.scrollTo(0, 0)
|
|
|
+ mescroll.hideUpScroll()
|
|
|
+ showLoading.value = true
|
|
|
+ await reload()
|
|
|
+ showLoading.value = false
|
|
|
+}
|
|
|
|
|
|
onShow(async () => {
|
|
|
// 登录后查询收益数据
|
|
|
if (hasLogin) {
|
|
|
await getAccountCountRequest()
|
|
|
- await getAccountDetailTotalAmountRequest()
|
|
|
+ await send()
|
|
|
// 数据会在useScroll的onMounted中自动加载,这里不需要额外调用
|
|
|
}
|
|
|
})
|
|
|
@@ -153,31 +205,6 @@ onShareTimeline(async () => {
|
|
|
|
|
|
const isUnlock = computed(() => accountCountData && accountCountData?.status === 0)
|
|
|
|
|
|
-watch(() => accountCountData, (newVal) => {
|
|
|
- console.log(newVal)
|
|
|
-})
|
|
|
-
|
|
|
-function showTimeFilter() {
|
|
|
- show.value = true
|
|
|
-}
|
|
|
-const wjsList = ref<AccountDetailItem[]>([])
|
|
|
-const yjsList = ref<AccountDetailItem[]>([])
|
|
|
-const activeTab = ref('pending')
|
|
|
-async function changeTab(tab: string) {
|
|
|
- if (activeTab.value === tab)
|
|
|
- return
|
|
|
- activeTab.value = tab
|
|
|
- status.value = tab === 'pending' ? 0 : 1
|
|
|
- await getAccountDetailTotalAmountRequest()
|
|
|
- // 切换标签时刷新对应列表数据
|
|
|
- if (tab === 'pending') {
|
|
|
- await pendingSettlementRefresh()
|
|
|
- }
|
|
|
- else {
|
|
|
- await settledRefresh()
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
function goPage(page: string) {
|
|
|
uni.navigateTo({
|
|
|
url: `/pages-A/${page}/index`,
|
|
|
@@ -187,7 +214,7 @@ function goPage(page: string) {
|
|
|
|
|
|
<template>
|
|
|
<view class="profile-container"
|
|
|
- :style="{ height: `calc(100vh - ${safeAreaInsets.top}px - ${safeAreaInsets.bottom}px)` }">
|
|
|
+ :style="{ minHeight: `calc(100vh - ${safeAreaInsets.top}px - ${safeAreaInsets.bottom}px - 100rpx)` }">
|
|
|
<!-- 顶部区域 -->
|
|
|
<view class="income-header"
|
|
|
:style="{ background: `url(${getImageUrl('@img/income/income-bg.png')})`, backgroundSize: '100% 110%', backgroundPosition: 'left bottom', backgroundRepeat: 'no-repeat' }">
|
|
|
@@ -245,72 +272,46 @@ function goPage(page: string) {
|
|
|
</view>
|
|
|
<!-- 菜单 -->
|
|
|
<view class="income-header-menu" :style="{ marginTop: isUnlock ? '24rpx' : '-50rpx' }">
|
|
|
+ <view class="income-header-overlay"
|
|
|
+ :style="{ opacity: headerOverlayOpacity, height: `calc(${menuButtonInfo.bottom + 4}px + 50rpx)` }" />
|
|
|
<!-- 结算筛选 -->
|
|
|
- <view class="income-header-menu-filter">
|
|
|
- <view class="income-header-menu-filter-item" :class="[activeTab === 'pending' ? 'active' : '']"
|
|
|
- @click="changeTab('pending')">
|
|
|
+ <view class="income-header-menu-filter" :style="{ top: `${menuButtonInfo.bottom + 4}px` }">
|
|
|
+ <view class="income-header-menu-filter-item" :class="[activeIndex === 0 ? 'active' : '']"
|
|
|
+ @click="tabChange(0)">
|
|
|
待结算
|
|
|
</view>
|
|
|
- <view class="income-header-menu-filter-item" :class="[activeTab === 'settled' ? 'active' : '']"
|
|
|
- @click="changeTab('settled')">
|
|
|
+ <view class="income-header-menu-filter-item" :class="[activeIndex === 1 ? 'active' : '']"
|
|
|
+ @click="tabChange(1)">
|
|
|
已结算
|
|
|
</view>
|
|
|
</view>
|
|
|
<!-- 时间筛选 -->
|
|
|
- <view class="income-menu-time-filter">
|
|
|
- <view class="income-menu-time-filter-text" @click="showTimeFilter">
|
|
|
- <text>{{ changtime(filterValue) }}</text>
|
|
|
+ <view class="income-menu-time-filter" :style="{ top: `calc(${menuButtonInfo.bottom + 4}px + 90rpx)` }">
|
|
|
+ <view class="income-menu-time-filter-text" @click="pickerShow = true">
|
|
|
+ <text>{{ changtime(pickerDate) }}</text>
|
|
|
<up-icon name="arrow-down" color="#666666" size="14" />
|
|
|
- <up-datetime-picker v-model="filterValue" :show="show" mode="year-month" close-on-click-overlay
|
|
|
- @confirm="confirm" @cancel="cancel" />
|
|
|
+ <up-datetime-picker v-model="pickerDate" :show="pickerShow" mode="year-month" close-on-click-overlay
|
|
|
+ @confirm="pickerConfirm" @cancel="pickerShow = false" />
|
|
|
</view>
|
|
|
<view>
|
|
|
- 合计:¥{{ accountDetailTotalAmountData?.totalAmount || 0 }}
|
|
|
+ 合计:¥{{ totalAmount }}
|
|
|
</view>
|
|
|
</view>
|
|
|
- <!-- 优惠券列表 -->
|
|
|
- <scroll-view class="income-header-menu-list" :scroll-y="true" :refresher-enabled="true"
|
|
|
- :refresher-triggered="refreshing" @refresherrefresh="onRefresh" @scrolltolower="onLoadMore">
|
|
|
- <template v-for="item in activeTab === 'pending' ? pendingSettlementData || [] : settledData || []"
|
|
|
- :key="item.id">
|
|
|
- <view class="income-header-menu-item">
|
|
|
- <view class="income-header-menu-icon">
|
|
|
- <image v-if="activeTab === 'settled'" :src="getImageUrl('@img/income/hb.png')"
|
|
|
- mode="aspectFit" />
|
|
|
- <image v-else :src="getImageUrl('@img/income/djs.png')" mode="aspectFit" />
|
|
|
- <view class="income-header-menu-text">
|
|
|
- <view class="income-header-menu-text-nickname">
|
|
|
- {{ item.receiveUserName }}
|
|
|
- </view>
|
|
|
- <view>{{ item.couponName }}</view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="income-header-menu-left">
|
|
|
- <view class="income-header-menu-left-amount">
|
|
|
- ¥{{ item.changeAmount }}
|
|
|
- </view>
|
|
|
- <view class="income-header-menu-left-time">
|
|
|
- {{ item.settleTime }}
|
|
|
- </view>
|
|
|
- </view>
|
|
|
+ <view class="income-menu-list">
|
|
|
+ <mescroll-uni id="mescrollContainer" :down="downOption" :up="upOption" :fixed="false"
|
|
|
+ @init="mescrollInit" @down="downCallback" @up="upCallback">
|
|
|
+ <view v-for="item in incomeData" :key="item.userId" class="income-content-item">
|
|
|
+ <income-item :data="item" :type="activeIndex" />
|
|
|
</view>
|
|
|
- </template>
|
|
|
-
|
|
|
- <!-- 加载状态提示 -->
|
|
|
- <view v-if="(activeTab === 'pending' ? pendingSettlementLoading : settledLoading)" class="loading-tip">
|
|
|
- 加载中...
|
|
|
- </view>
|
|
|
- <view
|
|
|
- v-else-if="(activeTab === 'pending' ? pendingSettlementFinished : settledFinished) && (activeTab === 'pending' ? pendingSettlementData.length : settledData.length) > 0"
|
|
|
- class="finished-tip">
|
|
|
- 没有更多数据了
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 空状态 -->
|
|
|
- <u-empty
|
|
|
- v-if="(activeTab === 'pending' ? pendingSettlementData.length === 0 : settledData.length === 0)"
|
|
|
- class="p-b-12 pt-12" mode="list" />
|
|
|
- </scroll-view>
|
|
|
+ <mescroll-empty v-if="incomeData.length === 0 && !loading" icon="'none'" tip="暂无数据"
|
|
|
+ :option="emptyOption" @emptyclick="reload" />
|
|
|
+ <!-- 滚动区域内的loading遮罩 -->
|
|
|
+ <view v-if="showLoading && loading" class="loading-mask">
|
|
|
+ <view class="loading-spinner" />
|
|
|
+ <text class="loading-text">加载中...</text>
|
|
|
+ </view>
|
|
|
+ </mescroll-uni>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</template>
|
|
|
@@ -452,13 +453,24 @@ function goPage(page: string) {
|
|
|
// background: #ffffff;
|
|
|
border-radius: 10rpx 10rpx 0rpx 0rpx;
|
|
|
margin-left: 24rpx;
|
|
|
- margin-bottom: 24rpx;
|
|
|
margin-right: 23rpx;
|
|
|
flex: 1;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
min-height: 0;
|
|
|
|
|
|
+ // 新增:吸顶区域上方的覆盖元素
|
|
|
+ .income-header-overlay {
|
|
|
+ position: fixed;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ background-color: #ed6b66;
|
|
|
+ border-radius: 10rpx 10rpx 0rpx 0rpx;
|
|
|
+ z-index: 99;
|
|
|
+ pointer-events: none; // 确保不影响点击事件
|
|
|
+ }
|
|
|
+
|
|
|
.income-header-menu-filter {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
@@ -470,6 +482,9 @@ function goPage(page: string) {
|
|
|
background: #ffffff;
|
|
|
box-shadow: 0rpx 3rpx 7rpx 0rpx rgba(213, 213, 213, 0.29);
|
|
|
border-radius: 10rpx 10rpx 0rpx 0rpx;
|
|
|
+ position: sticky;
|
|
|
+ top: 0;
|
|
|
+ z-index: 100;
|
|
|
|
|
|
.income-header-menu-filter-item {
|
|
|
flex: 1;
|
|
|
@@ -507,6 +522,8 @@ function goPage(page: string) {
|
|
|
padding: 30rpx 20rpx 14rpx;
|
|
|
background: #ffffff;
|
|
|
margin-top: 4rpx;
|
|
|
+ position: sticky;
|
|
|
+ z-index: 100;
|
|
|
|
|
|
.income-menu-time-filter-text {
|
|
|
font-weight: 400;
|
|
|
@@ -518,70 +535,55 @@ function goPage(page: string) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- .income-header-menu-list {
|
|
|
+ .income-menu-list {
|
|
|
background: #ffffff;
|
|
|
flex: 1;
|
|
|
- min-height: calc(30vh - 100rpx);
|
|
|
- overflow-y: auto;
|
|
|
- /* 确保内容超出时可滚动 */
|
|
|
-
|
|
|
- .income-header-menu-item {
|
|
|
- height: 88rpx;
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- border-bottom: 1px solid #eeeeee;
|
|
|
- padding: 32rpx 0 29rpx;
|
|
|
- margin: 0 20rpx;
|
|
|
-
|
|
|
- &:last-child {
|
|
|
- border-bottom: none;
|
|
|
- }
|
|
|
-
|
|
|
- .income-header-menu-icon {
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- gap: 19rpx;
|
|
|
-
|
|
|
- image {
|
|
|
- width: 60rpx;
|
|
|
- height: 60rpx;
|
|
|
- }
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ position: relative;
|
|
|
|
|
|
- .income-header-menu-text {
|
|
|
- font-weight: 400;
|
|
|
- font-size: 24rpx;
|
|
|
- color: #888888;
|
|
|
+ #mescrollContainer {
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
|
|
|
- .income-header-menu-text-nickname {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #222222;
|
|
|
- margin-bottom: 18rpx;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ .income-content-item {
|
|
|
+ margin-top: 20rpx;
|
|
|
+ }
|
|
|
|
|
|
- .income-header-menu-left {
|
|
|
- font-weight: 400;
|
|
|
- font-size: 24rpx;
|
|
|
- color: #888888;
|
|
|
+ // loading遮罩样式
|
|
|
+ .loading-mask {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background-color: rgba(255, 255, 255, 0.8);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ z-index: 999;
|
|
|
+ }
|
|
|
|
|
|
- .income-header-menu-left-amount {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #222222;
|
|
|
- margin-bottom: 18rpx;
|
|
|
- text-align: right;
|
|
|
- }
|
|
|
- }
|
|
|
+ .loading-spinner {
|
|
|
+ width: 40rpx;
|
|
|
+ height: 40rpx;
|
|
|
+ border: 4rpx solid #e0e0e0;
|
|
|
+ border-top-color: #ed6b66;
|
|
|
+ border-radius: 50%;
|
|
|
+ animation: spin 1s linear infinite;
|
|
|
}
|
|
|
|
|
|
- .loading-tip,
|
|
|
- .finished-tip {
|
|
|
- text-align: center;
|
|
|
- padding: 20rpx 0;
|
|
|
- color: #999;
|
|
|
+ .loading-text {
|
|
|
+ margin-top: 16rpx;
|
|
|
font-size: 24rpx;
|
|
|
+ color: #666;
|
|
|
+ }
|
|
|
+
|
|
|
+ @keyframes spin {
|
|
|
+ to {
|
|
|
+ transform: rotate(360deg);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|