|
|
@@ -1,775 +1,567 @@
|
|
|
<script lang="ts" setup>
|
|
|
-import { onReachBottom } from '@dcloudio/uni-app'
|
|
|
-import { usePagination, useRequest } from 'alova/client'
|
|
|
-import { storeToRefs } from 'pinia'
|
|
|
-import { computed, ref, watch } from 'vue'
|
|
|
-import dayjs from 'dayjs'
|
|
|
-import { getAccountCount } from '@/api/home'
|
|
|
-import { getBankSignRecord } from '@/api/pay'
|
|
|
-import { getCouponIssuerAccountByPageMap } from '@/api/income'
|
|
|
-import IncomeItem from '@/components/IncomeItem.vue'
|
|
|
-import MescrollBody from '@/custom-components/custom-mescroll/mescroll-body.vue'
|
|
|
-import FilterTime from '@/components/FilterTime.vue'
|
|
|
-import { useShare } from '@/hooks/useShare'
|
|
|
-import { useUserStore } from '@/store'
|
|
|
-import { useTokenStore } from '@/store/token'
|
|
|
-import { changtime, menuButtonInfo, rpxToPx, safeAreaInsets, systemInfo } from '@/utils'
|
|
|
-import { getImageUrl } from '@/utils/imageUtil'
|
|
|
-import IncomeShareInfo from '@/components/IncomeShareInfo.vue'
|
|
|
+import { ref, computed } from "vue";
|
|
|
+import { storeToRefs } from "pinia";
|
|
|
+import { useUserStore } from "@/store/user";
|
|
|
+import { useTokenStore } from "@/store/token";
|
|
|
+import { safeAreaInsets, menuButtonInfo } from "@/utils";
|
|
|
+import CustomNavigationBar from "@/components/CustomNavigationBar.vue";
|
|
|
+import { getImageUrl } from "@/utils/imageUtil";
|
|
|
+import Classification from "./classification.vue";
|
|
|
+import Upopup from "@/components/popup/index.vue";
|
|
|
+import DateRangePicker from "@/components/dateRangePicker/index.vue";
|
|
|
|
|
|
definePage({
|
|
|
- style: {
|
|
|
- navigationBarTitleText: '收益',
|
|
|
- navigationStyle: 'custom',
|
|
|
- onReachBottomDistance: 157,
|
|
|
- },
|
|
|
-})
|
|
|
-
|
|
|
-const userStore = useUserStore()
|
|
|
-const tokenStore = useTokenStore()
|
|
|
-// 使用storeToRefs解构userInfo
|
|
|
-const { userInfo } = storeToRefs(userStore)
|
|
|
-const { hasLogin } = storeToRefs(tokenStore)
|
|
|
-
|
|
|
-// 发券人账户表-通过userId查询账户信息
|
|
|
-const { send: getAccountCountRequest, data: accountCountData } = useRequest(getAccountCount, {
|
|
|
- immediate: false,
|
|
|
-})
|
|
|
-
|
|
|
-// 新增:刷新状态
|
|
|
-const refreshing = ref(false)
|
|
|
-const activeIndex = ref(0)
|
|
|
-const showLoading = ref(false)
|
|
|
-const pickerDate = ref(Date.now())
|
|
|
-const pickerShow = ref(false)
|
|
|
-const totalAmount = ref(0)
|
|
|
-const mescrollHeight = ref(0)
|
|
|
-const incomeShareInfoRef = ref(null)
|
|
|
-const filterTimeRef = ref()
|
|
|
-// 默认日期范围:本月第一天到今天
|
|
|
-const getDefaultDateRange = (): [string, string] => {
|
|
|
- const now = dayjs()
|
|
|
- const startOfMonth = now.startOf('month').format('YYYY/MM/DD')
|
|
|
- const today = now.format('YYYY/MM/DD')
|
|
|
- return [startOfMonth, today]
|
|
|
+ style: {
|
|
|
+ navigationStyle: "custom",
|
|
|
+ navigationBarTitleText: "收益",
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const userStore = useUserStore();
|
|
|
+const tokenStore = useTokenStore();
|
|
|
+const { hasLogin } = storeToRefs(tokenStore);
|
|
|
+
|
|
|
+const navigationBarHeight = ref(0);
|
|
|
+
|
|
|
+function getNavigationBarHeight() {
|
|
|
+ const menuButtonHeight = menuButtonInfo?.height || 32;
|
|
|
+ const statusBarHeight = safeAreaInsets?.top || 0;
|
|
|
+ navigationBarHeight.value = statusBarHeight + menuButtonHeight + 12;
|
|
|
}
|
|
|
-const dateRangeValue = ref<[string, string]>(getDefaultDateRange())
|
|
|
-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: getIncomeData, data: incomeData, pageCount, loading, page, pageSize, isLastPage, refresh, reload, onSuccess, onError } = usePagination((page, pageSize) => {
|
|
|
- const params: Record<string, any> = {
|
|
|
- pageNo: page,
|
|
|
- pageSize,
|
|
|
- type: 1,
|
|
|
- status: activeIndex.value,
|
|
|
- }
|
|
|
- // 根据tab类型选择日期参数
|
|
|
- if (activeIndex.value === 2) {
|
|
|
- // 已提现:使用日期范围
|
|
|
- if (dateRangeValue.value[0] && dateRangeValue.value[1]) {
|
|
|
- params.startDate = dateRangeValue.value[0]
|
|
|
- params.endDate = dateRangeValue.value[1]
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 待结算/已结算:使用年月
|
|
|
- params.year = changtime(pickerDate.value, 'YYYY')
|
|
|
- params.month = changtime(pickerDate.value, 'MM')
|
|
|
- }
|
|
|
- return getCouponIssuerAccountByPageMap(params)
|
|
|
-}, {
|
|
|
- initialPage: 1,
|
|
|
- initialPageSize: 10,
|
|
|
- append: true,
|
|
|
- preloadNextPage: false,
|
|
|
- preloadPreviousPage: false,
|
|
|
- total: response => response?.total || 0,
|
|
|
- data: response => response?.detailList || [],
|
|
|
- immediate: false,
|
|
|
-})
|
|
|
-
|
|
|
-watch(() => incomeData.value, (newVal) => {
|
|
|
- if (newVal.length === 0 && !loading.value) {
|
|
|
- mescroll.showEmpty()
|
|
|
- }
|
|
|
- else {
|
|
|
- mescroll.removeEmpty()
|
|
|
- }
|
|
|
-})
|
|
|
-
|
|
|
-watch(() => headerOverlayOpacity.value, (newVal) => {
|
|
|
- if (newVal > 0) {
|
|
|
- mescroll.lockDownScroll(true)
|
|
|
- }
|
|
|
- else {
|
|
|
- mescroll.lockDownScroll(false)
|
|
|
- }
|
|
|
-})
|
|
|
|
|
|
-watch(() => loading.value, (newVal) => {
|
|
|
- if (newVal && !showLoading.value) {
|
|
|
- mescroll.showUpScroll()
|
|
|
- }
|
|
|
-})
|
|
|
-
|
|
|
-// ============ mescroll 配置 ============
|
|
|
-const downOption = reactive({
|
|
|
- use: true,
|
|
|
- auto: false,
|
|
|
- bgColor: '#ed6b66',
|
|
|
- textColor: '#fff',
|
|
|
- textInOffset: '下拉刷新',
|
|
|
- textOutOffset: '释放刷新',
|
|
|
- textLoading: '刷新中...',
|
|
|
- offset: 80,
|
|
|
-})
|
|
|
-
|
|
|
-const upOption = reactive({
|
|
|
- use: true,
|
|
|
- auto: false,
|
|
|
- noMoreSize: 7,
|
|
|
- isBounce: true,
|
|
|
- page: {
|
|
|
- num: page.value,
|
|
|
- size: pageSize.value,
|
|
|
+onMounted(() => {
|
|
|
+ getNavigationBarHeight();
|
|
|
+});
|
|
|
+
|
|
|
+const incomeList = ref([
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ type: "share",
|
|
|
+ title: "分享奖励",
|
|
|
+ amount: "38.00",
|
|
|
+ createTime: "2026-05-20 19:00:00",
|
|
|
+ couponName: "某某某某某优惠券",
|
|
|
+ status: "pending",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ type: "share",
|
|
|
+ title: "分享奖励",
|
|
|
+ amount: "58.00",
|
|
|
+ createTime: "2026-05-20 19:00:00",
|
|
|
+ couponName: "某某某优惠券",
|
|
|
+ status: "settled",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 3,
|
|
|
+ type: "share",
|
|
|
+ title: "分享奖励",
|
|
|
+ amount: "58.00",
|
|
|
+ createTime: "2026-05-20 19:00:00",
|
|
|
+ couponName: "优惠券3",
|
|
|
+ status: "pending",
|
|
|
+ },
|
|
|
+]);
|
|
|
+
|
|
|
+function handleViewDetail(item) {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: "/pages-C/income/invitation",
|
|
|
+ });
|
|
|
+}
|
|
|
+const form = ref({});
|
|
|
+const visibleNoticeList = computed(() => {
|
|
|
+ const data = form.value || {};
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ title: "累计收益(元)",
|
|
|
+ content: data.totalIncome || 0,
|
|
|
+ page: "/pages-C/income/incomeCumulative",
|
|
|
},
|
|
|
- empty: {
|
|
|
- use: true,
|
|
|
- tip: '暂无数据',
|
|
|
- btnText: '刷新试试',
|
|
|
- icon: '/static/images/mescroll-empty.png',
|
|
|
- fixed: false,
|
|
|
+ {
|
|
|
+ title: "累计提现(元)",
|
|
|
+ content: data.totalWithdraw || 0,
|
|
|
+ percentage: data.totalWithdrawPercent || "76.76%",
|
|
|
+ page: "/pages-C/income/incomeMoney",
|
|
|
},
|
|
|
- textNoMore: '已经到底了',
|
|
|
- iconLoadingColor: '#ed6b66',
|
|
|
- toTop: {
|
|
|
- src: '/static/images/mescroll-totop.png',
|
|
|
- offset: 1000,
|
|
|
- bottom: 120,
|
|
|
+ {
|
|
|
+ title: "银行卡(张)",
|
|
|
+ content: data.bankCards || 0,
|
|
|
+ page: "/pages-C/my/cumulativeGroup",
|
|
|
},
|
|
|
- isBoth: false,
|
|
|
- // 开启虚拟列表优化(大数据量时)
|
|
|
- virtual: {
|
|
|
- use: false,
|
|
|
- rowHeight: 300,
|
|
|
- }
|
|
|
-})
|
|
|
-
|
|
|
-function mescrollInit(ref) {
|
|
|
- mescroll = ref
|
|
|
-}
|
|
|
-
|
|
|
-async function downCallback() {
|
|
|
- // await refresh()
|
|
|
- await getAccountCountRequest()
|
|
|
- await refresh()
|
|
|
- await userStore.fetchUserInfo()
|
|
|
-}
|
|
|
-
|
|
|
-async function onRefresh() {
|
|
|
- refreshing.value = true
|
|
|
- await getAccountCountRequest()
|
|
|
- await refresh()
|
|
|
- await userStore.fetchUserInfo()
|
|
|
- refreshing.value = false
|
|
|
-}
|
|
|
-
|
|
|
-async function upCallback() {
|
|
|
- // console.log('上拉加载触发')
|
|
|
- if (isLastPage.value) {
|
|
|
- console.log(mescroll)
|
|
|
- mescroll.endSuccess(0, false)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- page.value++
|
|
|
-}
|
|
|
-
|
|
|
-onReachBottom(() => {
|
|
|
- // console.log('上拉加载触发')
|
|
|
- if (isLastPage.value) {
|
|
|
- // console.log(mescroll)
|
|
|
- // mescroll.endSuccess(0, false)
|
|
|
- return
|
|
|
- }
|
|
|
- mescroll.showUpScroll()
|
|
|
- page.value++
|
|
|
-})
|
|
|
-
|
|
|
-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()
|
|
|
- console.log(mescroll)
|
|
|
- mescroll.hideUpScroll()
|
|
|
- mescroll.showEmpty()
|
|
|
-})
|
|
|
-
|
|
|
-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
|
|
|
- console.log(activeIndex.value, '切换tab');
|
|
|
-
|
|
|
-}
|
|
|
+ {
|
|
|
+ title: "邀新收益(元)",
|
|
|
+ content: data.inviteIncome || 0,
|
|
|
+ percentage: data.inviteIncomePercent || "45.38%",
|
|
|
+ page: "/pages-C/income/incomeInvitation",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "发券收益(元)",
|
|
|
+ content: data.shareIncome || 0,
|
|
|
+ page: "/pages-C/income/incomeSend",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "核销收益(元)",
|
|
|
+ content: data.writeOffIncome || 0,
|
|
|
+ page: "/pages-C/income/incomeCancel",
|
|
|
+ },
|
|
|
+ ];
|
|
|
+});
|
|
|
|
|
|
-async function pickerConfirm() {
|
|
|
- pickerShow.value = false
|
|
|
- mescroll.scrollTo(0, 0)
|
|
|
- mescroll.hideUpScroll()
|
|
|
- showLoading.value = true
|
|
|
- await reload()
|
|
|
- showLoading.value = false
|
|
|
+function listInfo(item) {
|
|
|
+ if (item.page) {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: item.page,
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-async function handleDateRangeChange(value: [string, string]) {
|
|
|
- dateRangeValue.value = value
|
|
|
- mescroll.scrollTo(0, 0)
|
|
|
- mescroll.hideUpScroll()
|
|
|
- showLoading.value = true
|
|
|
- await reload()
|
|
|
- showLoading.value = false
|
|
|
+const classShow = ref(false);
|
|
|
+const rewardTabs = ref([
|
|
|
+ { label: "全部", type: "0" },
|
|
|
+ { label: "分享奖励", type: "1" },
|
|
|
+ { label: "核销奖励", type: "2" },
|
|
|
+ { label: "邀新奖励", type: "3" },
|
|
|
+]);
|
|
|
+const classIndex = ref(-1);
|
|
|
+const classItem = ref({
|
|
|
+ label: "",
|
|
|
+ type: "",
|
|
|
+});
|
|
|
+function classClick(index, item) {
|
|
|
+ classIndex.value = index;
|
|
|
+ classShow.value = false;
|
|
|
+ classItem.value = item;
|
|
|
}
|
|
|
|
|
|
-function formatDateRangeDisplay() {
|
|
|
- if (!dateRangeValue.value[0] || !dateRangeValue.value[1]) {
|
|
|
- return '选择日期范围'
|
|
|
- }
|
|
|
- return `${dateRangeValue.value[0]} - ${dateRangeValue.value[1]}`
|
|
|
+//滚动
|
|
|
+const scrollTop = ref(0);
|
|
|
+onPageScroll((e) => {
|
|
|
+ scrollTop.value = e.scrollTop;
|
|
|
+});
|
|
|
+
|
|
|
+const filterValue = ref<string[] | string>([]);
|
|
|
+// 处理时间选择变化
|
|
|
+function handleTimeChange(value: string | string[]) {
|
|
|
+ console.log("时间选择变化", value);
|
|
|
+ filterValue.value = value;
|
|
|
}
|
|
|
|
|
|
-onShow(async () => {
|
|
|
- // 登录后查询收益数据
|
|
|
- if (hasLogin) {
|
|
|
- // await getAccountCountRequest()
|
|
|
- // await reload()
|
|
|
- // 数据会在useScroll的onMounted中自动加载,这里不需要额外调用
|
|
|
- }
|
|
|
-})
|
|
|
-
|
|
|
-onLoad(async () => {
|
|
|
- // 计算mescroll最小高度
|
|
|
- const systemInfo = uni.getSystemInfoSync()
|
|
|
- const vh100 = systemInfo.screenHeight - systemInfo.safeAreaInsets.bottom
|
|
|
- const tabbarHeight = (systemInfo.screenWidth / 750) * 100
|
|
|
- mescrollHeight.value = vh100 - tabbarHeight
|
|
|
-
|
|
|
- if (hasLogin) {
|
|
|
- await getAccountCountRequest()
|
|
|
- await getIncomeData()
|
|
|
- // 数据会在useScroll的onMounted中自动加载,这里不需要额外调用
|
|
|
- }
|
|
|
-})
|
|
|
-
|
|
|
-// 创建分享hook实例
|
|
|
-const { getShareConfig, getTimelineShareConfig } = useShare()
|
|
|
+// 手动打开选择器
|
|
|
+const pickerRef = ref();
|
|
|
+const openPicker = () => {
|
|
|
+ pickerRef.value?.openPopup();
|
|
|
+};
|
|
|
|
|
|
-// #ifdef MP-WEIXIN
|
|
|
-// 分享给好友生命周期函数
|
|
|
-onShareAppMessage(async (options) => {
|
|
|
- return await getShareConfig()
|
|
|
-})
|
|
|
+const showPicker = ref(false);
|
|
|
+const defaultStart = "";
|
|
|
+const defaultEnd = "";
|
|
|
|
|
|
-// 分享到朋友圈生命周期函数
|
|
|
-onShareTimeline(async () => {
|
|
|
- return await getTimelineShareConfig()
|
|
|
-})
|
|
|
-// #endif
|
|
|
+const handleConfirm = (value: { startDate: string; endDate: string }) => {
|
|
|
+ console.log("选中的日期范围:", value);
|
|
|
+ // 处理业务逻辑
|
|
|
+};
|
|
|
|
|
|
-const isUnlock = computed(() => accountCountData && accountCountData?.status === 0)
|
|
|
-
|
|
|
-function goPage(page: string) {
|
|
|
- uni.navigateTo({
|
|
|
- url: `/pages-A/${page}/index`,
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-function goToWithdrawal() {
|
|
|
- // 获取可提现余额
|
|
|
- const money = accountCountData.value?.withdrawableAmount || 0
|
|
|
- const bankNumber = accountCountData.value?.bankNumber || 0
|
|
|
- uni.navigateTo({
|
|
|
- url: `/pages-B/payment/withdrawal?m=${money}&bankNumber=${bankNumber}`,
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-function handleItemClick(item: any) {
|
|
|
- if (activeIndex.value == 2) {
|
|
|
- // 跳转提现详情页
|
|
|
- uni.navigateTo({
|
|
|
- url: `/pages-B/payment/detail-withdraw?id=${item.payoutNo}`,
|
|
|
- })
|
|
|
- } else {
|
|
|
- uni.navigateTo({
|
|
|
- url: `/pages-A/incomeShareInfo/index?batchId=${item.batchId}&commissionType=${item.commissionType}&type=${activeIndex.value}`,
|
|
|
- })
|
|
|
- // incomeShareInfoRef.value.show(item)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function onAClick() {
|
|
|
- // 判断是否有会员进件记录
|
|
|
- getBankSignRecord().then((res: any) => {
|
|
|
- if (res.data.code === 200) {
|
|
|
- if (!res.data.result) {
|
|
|
- // 没有签约记录,跳转银行卡列表
|
|
|
- uni.navigateTo({ url: '/pages-B/payment/bankCard-list' });
|
|
|
- } else {
|
|
|
- const { state } = res.data.result;
|
|
|
- if (state === '01') {
|
|
|
- // 签约成功,直接跳转银行卡列表
|
|
|
- uni.navigateTo({ url: '/pages-B/payment/bankCard-list' });
|
|
|
- } else {
|
|
|
- // 其他状态,跳转银行卡编辑页
|
|
|
- uni.navigateTo({ url: '/pages-B/payment/bankCard-edit' });
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- uni.$u.toast(res.data.message);
|
|
|
- }
|
|
|
- })
|
|
|
- .catch((err: any) => {
|
|
|
- console.log('接口调用失败:', err);
|
|
|
- uni.$u.toast('网络异常,请稍后重试');
|
|
|
- });
|
|
|
-}
|
|
|
+const handleCancel = () => {
|
|
|
+ console.log("取消选择");
|
|
|
+};
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
- <view class="profile-container">
|
|
|
- <view class="income-header-overlay"
|
|
|
- :style="{ opacity: headerOverlayOpacity, height: `calc(${menuButtonInfo.bottom + 4}px + 50rpx)` }" />
|
|
|
- <mescroll-body id="mescrollContainer" :height="`${mescrollHeight}px`" :sticky="true" :down="downOption"
|
|
|
- :up="upOption" :fixed="false" :is-show-empty="true" @init="mescrollInit" @down="downCallback"
|
|
|
- @up="upCallback" @emptyclick="reload">
|
|
|
- <!-- 顶部区域 -->
|
|
|
- <view class="income-header"
|
|
|
- :style="{ background: `url(${getImageUrl('@img/income/income-bg.png')})`, backgroundSize: '100% 110%', backgroundPosition: 'left bottom', backgroundRepeat: 'no-repeat' }">
|
|
|
- <view class="income-header-avatar-info"
|
|
|
- :style="{ paddingTop: `calc(${safeAreaInsets.top}px + ${menuButtonInfo.height}px)` }">
|
|
|
- <view class="income-header-balance">
|
|
|
- 当前账户余额(元)
|
|
|
- </view>
|
|
|
- <view class="income-header-balance-num">
|
|
|
- <view class="income-header-balance-num-amount">
|
|
|
- {{ accountCountData?.balance || 0 }}
|
|
|
- </view>
|
|
|
- <view class="income-header-balance-num-btns">
|
|
|
- <!-- <view v-if="isUnlock" class="income-header-balance-num-btn js"
|
|
|
- @click="goPage('unlockRewards')">
|
|
|
- 解锁
|
|
|
- </view> -->
|
|
|
- <view class="income-header-balance-num-btn tx"
|
|
|
- @click="goToWithdrawal">
|
|
|
- 申请提现
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="income-header-tips">
|
|
|
- <view class="income-header-tips-item">
|
|
|
- <view class="income-header-tips-item-num">
|
|
|
- {{ accountCountData?.totalCommission || 0 }}
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item-des">
|
|
|
- 累计收益
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item">
|
|
|
- <view class="income-header-tips-item-num">
|
|
|
- {{ accountCountData?.unsettledAmount || 0 }}
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item-des">
|
|
|
- 待结算
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item">
|
|
|
- <view class="income-header-tips-item-num">
|
|
|
- {{ accountCountData?.withdrawableAmount || 0 }}
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item-des">
|
|
|
- 可提现金额
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item" @click="onAClick">
|
|
|
- <view class="income-header-tips-item-num">
|
|
|
- {{ accountCountData?.bankNumber || 0 }}
|
|
|
- </view>
|
|
|
- <view class="income-header-tips-item-des">
|
|
|
- 银行卡
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <!-- 公告 -->
|
|
|
- <view v-if="isUnlock" class="income-header-notice">
|
|
|
- <view class="income-header-notice-icon">
|
|
|
- <image :src="getImageUrl('@img/income/notice.png')" mode="aspectFit" />
|
|
|
- </view>
|
|
|
- <view class="income-header-notice-content">
|
|
|
- 在考核周期内未达标已锁定收益,<text>前往查看~</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <!-- 结算筛选 -->
|
|
|
- <view class="income-header-menu-filter"
|
|
|
- :style="{ marginTop: isUnlock ? '24rpx' : '-50rpx', 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="[activeIndex === 1 ? 'active' : '']"
|
|
|
- @click="tabChange(1)">
|
|
|
- 已结算
|
|
|
- </view>
|
|
|
- <view class="income-header-menu-filter-item" :class="[activeIndex === 2 ? 'active' : '']"
|
|
|
- @click="tabChange(2)">
|
|
|
- 已提现
|
|
|
- </view>
|
|
|
+ <view class="page-container">
|
|
|
+ <!-- 顶部蓝色渐变背景 -->
|
|
|
+ <view class="page-header-bg" :style="{
|
|
|
+ backgroundImage: `url(${getImageUrl('@img/income/bg.png')})`,
|
|
|
+ backgroundSize: 'cover',
|
|
|
+ backgroundRepeat: 'no-repeat',
|
|
|
+ backgroundPosition: 'center'
|
|
|
+ }">
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <u-navbar title="收益" :autoBack="true" :placeholder="true" :border-bottom="false"
|
|
|
+ :title-style="{ fontWeight: 'bold', color: scrollTop > 1 ? '#000' : '#fff' }"
|
|
|
+ :bgColor="scrollTop>1?'#fff':'transparent'" :leftIconColor="scrollTop>1?'#000':'#fff'"></u-navbar>
|
|
|
+
|
|
|
+ <!-- 页面主内容 -->
|
|
|
+ <view class="main-content">
|
|
|
+ <view class="income-card" :style="{
|
|
|
+ backgroundImage: `url(${getImageUrl('@img/income/bg2.png')})`,
|
|
|
+ backgroundSize: 'cover',
|
|
|
+ backgroundRepeat: 'no-repeat',
|
|
|
+ backgroundPosition: 'center'
|
|
|
+ }">
|
|
|
+ <view class="income-card__header">
|
|
|
+ <view class="income-card__balance">
|
|
|
+ <view class="income-card__balance-label">当前账户余额(元)</view>
|
|
|
+ <view class="income-card__balance-value">3859.00</view>
|
|
|
+ </view>
|
|
|
+ <button class="income-card__withdraw-btn">申请提现</button>
|
|
|
+ </view>
|
|
|
+ <view class="notice-container">
|
|
|
+ <view v-for="(item, index) in visibleNoticeList" :key="index" class="notice-item" @click='listInfo(item)'>
|
|
|
+ <view class="notice-title">{{ item.title }}</view>
|
|
|
+ <view class="notice-content">{{ item.content }}</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <!-- <u--image class='notice-img' :src="getImageUrl('@img/income/bg2.png')" mode="aspectFit" width="334rpx"
|
|
|
+ height="247rpx">
|
|
|
+ </u--image> -->
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class='income-select'>
|
|
|
+ <view class='income-time' @click='showPicker=true'>
|
|
|
+ <view class='income-time-name'>2026 05.10-2026 05.12 </view>
|
|
|
+ <u--image class='income-down' :src="getImageUrl('@img/income/down.png')" mode="aspectFit" width="18rpx"
|
|
|
+ height="18rpx">
|
|
|
+ </u--image>
|
|
|
+ </view>
|
|
|
+ <view class='income-time' @click='classShow=true'>
|
|
|
+ <view class='income-time-name'>{{classItem.label?classItem.label:'选择分类'}} </view>
|
|
|
+ <u--image class='income-down' :src="getImageUrl('@img/income/down.png')" mode="aspectFit" width="18rpx"
|
|
|
+ height="18rpx">
|
|
|
+ </u--image>
|
|
|
+ </view>
|
|
|
+ <view class='income-time'>
|
|
|
+ <view class='income-time-name'>结算状态</view>
|
|
|
+ <u--image class='income-down' :src="getImageUrl('@img/income/down.png')" mode="aspectFit" width="18rpx"
|
|
|
+ height="18rpx">
|
|
|
+ </u--image>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <!-- 列表 -->
|
|
|
+ <view class="income-detail-content">
|
|
|
+ <view v-for="item in incomeList" :key="item.id" class="income-card">
|
|
|
+ <view class="card-header">
|
|
|
+ <view class="title-tag">
|
|
|
+ <view class="tag-line"></view>
|
|
|
+ <text class="tag-text">{{ item.title }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="view-detail" @click="handleViewDetail(item)">
|
|
|
+ <text class="detail-text">查看详情</text>
|
|
|
+ <u--image class='income-right' :src="getImageUrl('@img/income/arrow-right.png')" mode="aspectFit"
|
|
|
+ width="32rpx" height="32rpx">
|
|
|
+ </u--image>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <view class="card-divider"></view>
|
|
|
+
|
|
|
+ <view class="card-body">
|
|
|
+ <view class="amount-info">
|
|
|
+ <view class="amount-row">
|
|
|
+ <text class="amount-label">总收益</text>
|
|
|
+ <view class="amount-value">
|
|
|
+ <text class="currency-symbol">¥</text>
|
|
|
+ <text class="amount-number">{{ item.amount }}</text>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
- <!-- 时间筛选 -->
|
|
|
- <view class="income-menu-time-filter" :style="{ top: `calc(${menuButtonInfo.bottom + 4}px + 90rpx)` }">
|
|
|
- <!-- 已提现使用日期范围选择 -->
|
|
|
- <template v-if="activeIndex === 2">
|
|
|
- <view class="income-menu-time-filter-text" @click="filterTimeRef?.openPopup()">
|
|
|
- <text>{{ formatDateRangeDisplay() }}</text>
|
|
|
- <up-icon name="arrow-down" color="#666666" size="14" />
|
|
|
- </view>
|
|
|
- </template>
|
|
|
- <!-- 待结算/已结算使用年月选择 -->
|
|
|
- <template v-else>
|
|
|
- <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="pickerDate" :show="pickerShow" mode="year-month" close-on-click-overlay
|
|
|
- @confirm="pickerConfirm" @cancel="pickerShow = false" />
|
|
|
- </view>
|
|
|
- </template>
|
|
|
- <view>
|
|
|
- 合计:¥{{ totalAmount }}
|
|
|
- </view>
|
|
|
+ <view :class="['status-tag', `status-${item.status}`]">
|
|
|
+ {{ item.status === 'pending' ? '待结算' : '已结算' }}
|
|
|
</view>
|
|
|
- <view class="income-menu-list">
|
|
|
- <view v-for="item in incomeData" :key="item.userId" class="income-content-item">
|
|
|
- <income-item :data="item" :type="activeIndex" @itemClick="handleItemClick" />
|
|
|
- </view>
|
|
|
- <!-- 滚动区域内的loading遮罩 -->
|
|
|
- <view v-if="showLoading && loading" class="loading-mask">
|
|
|
- <up-loading-icon color="#ed6b66" text="加载中" />
|
|
|
- </view>
|
|
|
+ </view>
|
|
|
+ <view class="coupon-info">
|
|
|
+ <text class="coupon-name">{{ item.couponName }}</text>
|
|
|
+ <view class="time-row">
|
|
|
+ <text class="time-label">创建时间</text>
|
|
|
+ <text class="time-value">{{ item.createTime }}</text>
|
|
|
</view>
|
|
|
- </mescroll-body>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <!-- 选择分类 -->
|
|
|
+ <Upopup :isShow="classShow" title='选择分类' @close='classShow=false' :isFooter='false'>
|
|
|
+ <view class="classification-cont">
|
|
|
+ <view class='classification-list' v-for='(item,index) in rewardTabs' :key='index' @click='classClick(index,item)'>
|
|
|
+ <view class='classification-label'>{{ item.label }}</view>
|
|
|
+ <u--image class='selected-icon' v-show='classIndex==index' :src="getImageUrl('@img/income/selected.png')"
|
|
|
+ mode="aspectFit" width="32rpx" height="32rpx">
|
|
|
+ </u--image>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
- <FilterTime ref="filterTimeRef" v-model="dateRangeValue" @confirm="handleDateRangeChange" />
|
|
|
- <!-- <IncomeShareInfo ref="incomeShareInfoRef" :type="activeIndex" /> -->
|
|
|
+ </Upopup>
|
|
|
+
|
|
|
+ <!-- 日期 -->
|
|
|
+ <DateRangePicker v-model:show="showPicker" :startDate="defaultStart" :endDate="defaultEnd" @confirm="handleConfirm"
|
|
|
+ @cancel="handleCancel" />
|
|
|
</template>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
-.profile-container {
|
|
|
- background-color: #f5f5f5;
|
|
|
- line-height: 1;
|
|
|
+.page-container {
|
|
|
+ min-height: 100vh;
|
|
|
+ background-color: #f8f8fa;
|
|
|
+
|
|
|
+ // 顶部渐变背景
|
|
|
+ .page-header-bg {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ height: 460rpx;
|
|
|
+ background: linear-gradient(to bottom, #0879ff, #f8f8fa);
|
|
|
+
|
|
|
+ z-index: 1;
|
|
|
+ }
|
|
|
+ ::v-deep .top-nav {
|
|
|
+ box-shadow: none !important;
|
|
|
+ }
|
|
|
+ .main-content {
|
|
|
+ position: relative;
|
|
|
+ z-index: 2;
|
|
|
+ margin: 0 20rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
+.income-card {
|
|
|
+ background: #fff;
|
|
|
+ position: relative;
|
|
|
+ border-radius: 32rpx;
|
|
|
+ padding: 40rpx;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ &__header {
|
|
|
+ width: 100%;
|
|
|
display: flex;
|
|
|
- flex-direction: column;
|
|
|
-
|
|
|
- /* 添加这行,设置容器高度为视口高度 */
|
|
|
-
|
|
|
- .income-header {
|
|
|
- height: 526rpx;
|
|
|
-
|
|
|
- .income-header-avatar-info {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 30rpx;
|
|
|
- padding: 0 24rpx;
|
|
|
-
|
|
|
- .income-header-balance {
|
|
|
- font-weight: 400;
|
|
|
- font-size: 26rpx;
|
|
|
- color: #ffffff;
|
|
|
- }
|
|
|
-
|
|
|
- .income-header-balance-num {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
-
|
|
|
- .income-header-balance-num-amount {
|
|
|
- font-weight: 500;
|
|
|
- font-size: 65rpx;
|
|
|
- color: #ffffff;
|
|
|
- }
|
|
|
-
|
|
|
- .income-header-balance-num-btns {
|
|
|
- display: flex;
|
|
|
- gap: 15rpx;
|
|
|
-
|
|
|
- .income-header-balance-num-btn {
|
|
|
- padding: 20rpx 40rpx 15rpx;
|
|
|
- border-radius: 33rpx;
|
|
|
- font-weight: 400;
|
|
|
- font-size: 26rpx;
|
|
|
-
|
|
|
- &.js {
|
|
|
- background: #da4c47;
|
|
|
- color: #ffffff;
|
|
|
- }
|
|
|
-
|
|
|
- &.tx {
|
|
|
- background: radial-gradient( 0% 0% at 0% 0%, #F8E1B4 0%, #F9EFC7 100%), #DA4C47;
|
|
|
- color: #ED6B66;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .income-header-tips {
|
|
|
- height: 124rpx;
|
|
|
- display: flex;
|
|
|
- background: linear-gradient(114deg, #f67873, #fb847f, #f67873);
|
|
|
- border-radius: 10rpx;
|
|
|
- margin: 47rpx 24rpx 0 24rpx;
|
|
|
-
|
|
|
- .income-header-tips-item {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- gap: 15rpx;
|
|
|
- font-weight: 500;
|
|
|
- font-size: 34rpx;
|
|
|
- color: #ffffff;
|
|
|
- line-height: 1;
|
|
|
- // position: relative;
|
|
|
-
|
|
|
- // &:not(:last-child):after {
|
|
|
- // content: '';
|
|
|
- // position: absolute;
|
|
|
- // top: 50%;
|
|
|
- // right: 0;
|
|
|
- // transform: translateY(-50%);
|
|
|
- // width: 2px;
|
|
|
- // height: 40rpx;
|
|
|
- // background: #ffffff;
|
|
|
- // }
|
|
|
-
|
|
|
- .income-header-tips-item-num {
|
|
|
- font-weight: bold;
|
|
|
- }
|
|
|
-
|
|
|
- .income-header-tips-item-des {
|
|
|
- font-weight: 400;
|
|
|
- font-size: 24rpx;
|
|
|
- color: #ffffff;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__balance {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__balance-label {
|
|
|
+ color: rgba(0, 0, 0, 0.45);
|
|
|
+ font-size: 24rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__balance-value {
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 60rpx;
|
|
|
+ color: #333;
|
|
|
+ margin-top: 12rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__withdraw-btn {
|
|
|
+ background: linear-gradient(90deg, #ff9688 0%, #ff505f 58.96%);
|
|
|
+ border-radius: 44rpx;
|
|
|
+ width: 156rpx;
|
|
|
+ height: 66rpx;
|
|
|
+ line-height: 66rpx;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #fff;
|
|
|
+ margin: 0;
|
|
|
+ padding: 0;
|
|
|
+ border: none;
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ border: none;
|
|
|
}
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- .income-header-notice {
|
|
|
- margin: -50rpx 24rpx 24rpx 24rpx;
|
|
|
- background: #ffffff;
|
|
|
- border-radius: 10rpx;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- gap: 20rpx;
|
|
|
- padding: 28rpx 20rpx;
|
|
|
-
|
|
|
- .income-header-notice-icon {
|
|
|
- width: 52rpx;
|
|
|
- height: 35rpx;
|
|
|
+.notice-container {
|
|
|
+ margin-top: 46rpx;
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(3, 1fr); // 两列布局
|
|
|
+ gap: 20rpx; // 图片间距
|
|
|
+ .notice-title {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: rgba(0, 0, 0, 0.45);
|
|
|
+ }
|
|
|
+ .notice-conten {
|
|
|
+ font-size: 36rpx;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+}
|
|
|
+.notice-img {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ right: 0;
|
|
|
+}
|
|
|
+.income-select {
|
|
|
+ margin: 40rpx 0 24rpx 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ .income-time-name {
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+ .income-time {
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ .income-down {
|
|
|
+ margin-top: -4rpx;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- image {
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- }
|
|
|
- }
|
|
|
+.income-detail-content {
|
|
|
+ padding: 20rpx;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 20rpx;
|
|
|
+}
|
|
|
|
|
|
- .income-header-notice-content {
|
|
|
- font-weight: 400;
|
|
|
- font-size: 24rpx;
|
|
|
- color: #333333;
|
|
|
+.income-card {
|
|
|
+ background: #ffffff;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ padding: 32rpx;
|
|
|
|
|
|
- text {
|
|
|
- color: #c52d27;
|
|
|
- }
|
|
|
- }
|
|
|
+ .card-header {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .title-tag {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 18rpx;
|
|
|
+
|
|
|
+ .tag-line {
|
|
|
+ width: 6rpx;
|
|
|
+ height: 32rpx;
|
|
|
+ background: #ff5365;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tag-text {
|
|
|
+ font-family: PingFang SC;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #2c2c2c;
|
|
|
+ line-height: 32rpx;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- // 新增:吸顶区域上方的覆盖元素
|
|
|
- .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; // 确保不影响点击事件
|
|
|
+ .view-detail {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8rpx;
|
|
|
+
|
|
|
+ .detail-text {
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #999999;
|
|
|
+ line-height: 26rpx;
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
+ .income-right {
|
|
|
+ margin-top: -4rpx;
|
|
|
+ }
|
|
|
+ .card-divider {
|
|
|
+ width: 100%;
|
|
|
+ height: 1rpx;
|
|
|
+ background: #eaeaea;
|
|
|
+ margin: 32rpx 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .card-body {
|
|
|
+ .coupon-info {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 20rpx;
|
|
|
+ margin-top: 18rpx;
|
|
|
+
|
|
|
+ .coupon-name {
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #2c2c2c;
|
|
|
+ line-height: 28rpx;
|
|
|
+ }
|
|
|
|
|
|
- .income-header-menu-filter {
|
|
|
+ .time-row {
|
|
|
display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- font-weight: 500;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #333333;
|
|
|
- height: 90rpx;
|
|
|
- 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;
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- position: relative;
|
|
|
- height: 100%;
|
|
|
-
|
|
|
- &.active {
|
|
|
- color: #ed6b66;
|
|
|
-
|
|
|
- &:after {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- bottom: 0;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 67rpx;
|
|
|
- height: 6rpx;
|
|
|
- background: #ed6b66;
|
|
|
- border-radius: 3rpx;
|
|
|
- }
|
|
|
- }
|
|
|
+ gap: 10rpx;
|
|
|
+
|
|
|
+ .time-label {
|
|
|
+ font-family: PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: rgba(0, 0, 0, 0.25);
|
|
|
+ line-height: 24rpx;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- .income-menu-time-filter {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- font-weight: 400;
|
|
|
- font-size: 24rpx;
|
|
|
- color: #333333;
|
|
|
- padding: 30rpx 20rpx 14rpx;
|
|
|
- background: #ffffff;
|
|
|
- margin-top: 4rpx;
|
|
|
- position: sticky;
|
|
|
- z-index: 100;
|
|
|
-
|
|
|
- .income-menu-time-filter-text {
|
|
|
- font-weight: 400;
|
|
|
- font-size: 26rpx;
|
|
|
- color: #000000;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- gap: 12rpx;
|
|
|
+ .time-value {
|
|
|
+ font-family: PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #bfbfbf;
|
|
|
+ line-height: 24rpx;
|
|
|
}
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- .income-menu-list {
|
|
|
- background: #ffffff;
|
|
|
- // flex: 1;
|
|
|
+ .amount-info {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ .amount-row {
|
|
|
display: flex;
|
|
|
- flex-direction: column;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- #mescrollContainer {
|
|
|
- height: 100%;
|
|
|
- flex: 1;
|
|
|
+ align-items: center;
|
|
|
+ .amount-label {
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #2c2c2c;
|
|
|
+ line-height: 26rpx;
|
|
|
}
|
|
|
|
|
|
- .income-content-item {
|
|
|
- margin-top: 20rpx;
|
|
|
- }
|
|
|
+ .amount-value {
|
|
|
+ display: flex;
|
|
|
+ align-items: baseline;
|
|
|
+ gap: 4rpx;
|
|
|
+ margin: 0 28rpx 0 12rpx;
|
|
|
|
|
|
- // 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: row;
|
|
|
- flex-wrap: nowrap;
|
|
|
- justify-content: center;
|
|
|
- align-items: end;
|
|
|
- z-index: 999;
|
|
|
+ .currency-symbol {
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 26rpx;
|
|
|
+ color: #ff5365;
|
|
|
+ line-height: 26rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .amount-number {
|
|
|
+ font-family: PingFang SC;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 36rpx;
|
|
|
+ color: #ff5365;
|
|
|
+ line-height: 40rpx;
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- .loading-spinner {
|
|
|
- width: 40rpx;
|
|
|
- height: 40rpx;
|
|
|
- border: 4rpx solid #e0e0e0;
|
|
|
- border-top-color: #ed6b66;
|
|
|
- border-radius: 50%;
|
|
|
- animation: spin 1s linear infinite;
|
|
|
- }
|
|
|
+ .status-tag {
|
|
|
+ padding: 7rpx 12rpx;
|
|
|
+ border-radius: 4rpx;
|
|
|
+ font-family: PingFang SC;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 24rpx;
|
|
|
+ line-height: 140%;
|
|
|
|
|
|
- .loading-text {
|
|
|
- margin-left: 16rpx;
|
|
|
- font-size: 24rpx;
|
|
|
- color: #666;
|
|
|
+ &.status-pending {
|
|
|
+ background: #fff7e8;
|
|
|
+ color: #ec790a;
|
|
|
}
|
|
|
|
|
|
- @keyframes spin {
|
|
|
- to {
|
|
|
- transform: rotate(360deg);
|
|
|
- }
|
|
|
+ &.status-settled {
|
|
|
+ background: #e8ffea;
|
|
|
+ color: #00b42a;
|
|
|
}
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- .income-header-menu-filter,
|
|
|
- .income-menu-time-filter,
|
|
|
- .income-menu-list {
|
|
|
- margin-left: 24rpx;
|
|
|
- margin-right: 23rpx;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.mescroll-empty) {
|
|
|
- width: auto;
|
|
|
- margin-left: 23rpx;
|
|
|
- margin-left: 24rpx;
|
|
|
- background-color: #fff;
|
|
|
- border-bottom-left-radius: 10rpx;
|
|
|
- border-bottom-right-radius: 10rpx;
|
|
|
- }
|
|
|
+.classification-cont {
|
|
|
+ .classification-list {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ }
|
|
|
+ .classification-label {
|
|
|
+ color: #2c2c2c;
|
|
|
+ font-size: 26rpx;
|
|
|
+ padding-bottom: 32rpx;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|