|
|
<template> <view class="expense-container"> <view class="top-bar"> <view class="title">支出记录</view> </view>
<view class="filter-bar"> <view class="filter-item" :class="{ active: filterType === 'all' }" @click="filterType = 'all'"> 全部 </view> <view class="filter-item" :class="{ active: filterType === 'water' }" @click="filterType = 'water'"> 水费 </view> <view class="filter-item" :class="{ active: filterType === 'electric' }" @click="filterType = 'electric'"> 电费 </view> <view class="filter-item" :class="{ active: filterType === 'public' }" @click="filterType = 'public'"> 公共支出 </view> </view>
<view class="list"> <view class="expense-item" v-for="(item, index) in expenses" :key="index"> <view class="item-header"> <view class="expense-type"> <text>{{ item.room }}</text> </view> <view class="expense-amount">¥{{ item.exp_amount }}</view> </view>
<view class="item-body"> <view class="detail-item"> <view class="detail-label">支付方式</view> <view>{{ item.exp_method }}</view> </view>
<view class="detail-item"> <view class="detail-label">支出日期</view> <view>{{ item.exp_date }}</view> </view>
<view class="detail-item"> <view class="detail-label">支付人</view> <view>{{ item.username }}</view> </view>
<view class="detail-item" v-if="item.remark"> <view class="detail-label">备注</view> <view>{{ item.remark }}</view> </view> </view> </view> </view> </view> </template>
<script setup> import { ref, computed } from 'vue' import { onShow } from '@dcloudio/uni-app'
const filterType = ref('all') const expenses = ref([{ id: 1, room:'706', exp_amount: 39.00, exp_date: '2025-09-08 14:27:21', username:'李慧琳', exp_method: '微信支付', exp_type: 1, remark: '电卡充值' }, { id: 2, room:'706', exp_amount: 11.00, exp_date: '2025-09-08 14:28:40', username:'李慧琳', exp_method: '微信支付', exp_type: 1, remark: '电卡充值' }, { id: 3, room:'706', exp_amount: 50.00, exp_date: '2025-08-15 09:20:30', username:'李慧琳', exp_method: '支付宝', exp_type: 0, remark: '8月水费' }, { id: 4, room:'706', exp_amount: 120.00, exp_date: '2025-09-01 16:45:12', username:'李慧琳', exp_method: '微信支付', exp_type: 2, remark: '购买扫帚、拖把等清洁用品' }, { id: 5, room:'706', exp_amount: 35.00, exp_date: '2025-08-22 11:10:25', username:'李慧琳', exp_method: '现金', exp_type: 2, remark: '购买垃圾桶2个' } ])
onShow(() => { const isLogin = uni.getStorageSync('isLogin') console.log(isLogin) if (!isLogin) { uni.redirectTo({ url: '/pages/login/login' }) } }) const res = computed(() => { switch (filterType.value) { case 'water': return expenses.value.filter(item => item.exp_type === '0') case 'electric': return expenses.value.filter(item => item.exp_type === '1') case 'public': return expenses.value.filter(item => item.exp_type === '1') default: return expenses.value } })
const getTypeName = function(type) { switch (type) { case 0: return '水费'; case 1: return '电费'; case 2: return '公共支出'; default: return '其他支出'; } }
const getIconClass = function(type) { switch (type) { case 0: return 'icon-water'; case 1: return 'icon-electric'; case 2: return 'icon-public'; default: return 'icon-expense'; } }
</script>
<style scoped> .expense-container { background-color: #f5f5f5; height: 100vh; }
.top-bar { display: flex; align-items: center; padding: 30rpx 20rpx; background-color: #fff; border-bottom: 1px solid #eee; }
.title { flex: 1; text-align: center; font-size: 34rpx; font-weight: bold; }
.filter-bar { display: flex; background-color: #fff; padding: 15rpx 10rpx; border-bottom: 1px solid #eee; }
.filter-item { display: inline-block; padding: 15rpx 25rpx; font-size: 26rpx; border-radius: 30rpx; margin: 0 5rpx; }
.filter-item.active { background-color: #e6f7ff; color: #36bffa; }
.list { padding: 20rpx; }
.expense-item { background-color: #fff; border-radius: 16rpx; padding: 25rpx; margin-bottom: 20rpx; box-shadow: 0 5rpx 15rpx rgba(0, 0, 0, 0.05); }
.item-header { display: flex; justify-content: space-between; margin-bottom: 20rpx; padding-bottom: 20rpx; border-bottom: 1px solid #f5f5f5; }
.expense-type text { font-size: 30rpx; font-weight: bold; color: #333; }
.expense-amount { font-size: 32rpx; font-weight: bold; color: #f5222d; }
.item-body { display: flex; flex-direction: column; }
.detail-item { display: flex; justify-content: space-between; padding: 15rpx 0; font-size: 28rpx; }
.detail-label { color: #666; } </style>
|