alipay-emulator/pages/finance-management/edit/edit.vue

232 lines
5.4 KiB
Vue

<template>
<view class="container">
<NavBar title="修改理财数据" bgColor="#F5F5F5" isRightButton @right-click="handleRightButtonClick"></NavBar>
<scroll-view scroll-y class="form-content">
<!-- 基础信息 -->
<view class="section-title">基础信息</view>
<view class="card">
<view class="form-item">
<text class="label">持卡人姓名</text>
<input class="input" v-model="financeInfo.cardHolderName" />
</view>
<picker mode="selector" :range="vipLevels" @change="onVipLevelChange">
<view class="form-item">
<text class="label">财富等级</text>
<view class="picker-value">{{ financeInfo.vipLevel }} </view>
</view>
</picker>
<view class="form-item">
<text class="label">权益文案</text>
<input class="input" v-model="financeInfo.benefitsText" />
</view>
</view>
<!-- 财富收益 -->
<view class="section-title">财富收益</view>
<view class="card" v-for="(item, key) in financeInfo.fortune" :key="key">
<view class="card-header">{{ getFortuneName(key) }}</view>
<view class="form-item">
<text class="label">总金额</text>
<input class="input" type="digit" v-model="item.labelSub" @input="onTotalAmountInput(item)" />
</view>
<view class="form-item">
<text class="label">昨日收益</text>
<input class="input" type="digit" v-model="item.value" />
</view>
</view>
<!-- 资产信息 -->
<view class="section-title">资产信息</view>
<view class="card">
<view class="form-item">
<text class="label">家庭保障份数</text>
<input class="input" type="number" v-model="financeInfo.familyProtection" />
</view>
<view class="form-item">
<text class="label">保险信息</text>
<input class="input" v-model="financeInfo.myAssets.baoxian.labelSub" />
</view>
</view>
<!-- 额度信息 -->
<view class="section-title">额度信息</view>
<view class="card">
<view class="form-item" v-for="(item, key) in financeInfo.myQuota" :key="key">
<text class="label">{{ getQuotaName(key) }}</text>
<input class="input" v-model="item.labelSub" />
</view>
</view>
<view class="placeholder"></view>
</scroll-view>
</view>
</template>
<script setup>
import NavBar from '@/components/nav-bar/nav-bar.vue'
import { ref, reactive, toRefs, onMounted } from 'vue';
const defualtData = {
benefitsText: '尊享礼遇18000元/年',
cardHolderName: 'XiaoMing',
vipLevel: "v3",
navigationMenuStyle: "style-1",
bgImage: "/static/image/finance-management/bg-style/style-1.png",
familyProtection: "3",
searchText: "小而美的基金",
fortune: {
yuebao: { value: 3.53, labelSub: "100000" },
dingqi: { value: 50, labelSub: "100000" },
jijin: { value: 5000, labelSub: "100000" },
huangjin: { value: -300, labelSub: "100000" },
yulingbao: { value: 20, labelSub: "100000" }
},
myAssets: {
baoxian: { labelSub: "3份保单保障中", type: "text" }
},
myQuota: {
huabei: { labelSub: "可用100000", type: "text" },
jubei: { labelSub: "可用100000", type: "text" },
beizhi: { labelSub: "可用100000", type: "text" },
wangshangdai: { labelSub: "预计可借100000", type: "text" }
}
}
const data = reactive({
financeInfo: JSON.parse(JSON.stringify(defualtData))
})
const { financeInfo } = toRefs(data)
const fortuneMap = {
yuebao: '余额宝',
dingqi: '定期',
jijin: '基金',
huangjin: '黄金',
yulingbao: '余利宝'
}
const quotaMap = {
huabei: '花呗',
jubei: '借呗',
beizhi: '备用金',
wangshangdai: '网商贷'
}
const getFortuneName = (key) => fortuneMap[key] || key
const getQuotaName = (key) => quotaMap[key] || key
const vipLevels = ['v1', 'v2', 'v3']
const onVipLevelChange = (e) => {
financeInfo.value.vipLevel = vipLevels[e.detail.value]
}
const onTotalAmountInput = (item) => {
// 使用 setTimeout 确保 v-model 更新后再处理,或者直接处理 value
// 简单的非负数过滤
if (item.labelSub && item.labelSub.toString().includes('-')) {
item.labelSub = item.labelSub.replace('-', '')
}
}
onMounted(() => {
const stored = {
...defualtData,
...uni.getStorageSync('financeInfo')
}
if (stored) {
// Deep merge to ensure structure integrity
Object.assign(data.financeInfo, stored)
}
})
const handleRightButtonClick = () => {
uni.setStorageSync('financeInfo', data.financeInfo)
uni.navigateBack()
}
</script>
<style>
@import "@/common/main.css";
page {
background-color: #F8F8F8;
height: 100vh;
overflow: hidden;
}
</style>
<style lang="less" scoped>
.container {
display: flex;
flex-direction: column;
height: 100vh;
}
.form-content {
flex: 1;
height: 0;
padding: 24rpx;
box-sizing: border-box;
}
.section-title {
font-size: 28rpx;
color: #666;
margin: 24rpx 0 16rpx 12rpx;
font-weight: 500;
}
.card {
background-color: #fff;
border-radius: 16rpx;
padding: 0 24rpx;
margin-bottom: 24rpx;
.card-header {
padding: 24rpx 0 12rpx;
font-size: 30rpx;
font-weight: bold;
color: #333;
border-bottom: 1rpx solid #f5f5f5;
margin-bottom: 12rpx;
}
}
.form-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx 0;
border-bottom: 1rpx solid #F5F5F5;
&:last-child {
border-bottom: none;
}
.label {
font-size: 30rpx;
color: #333;
width: 240rpx;
}
.input {
flex: 1;
font-size: 30rpx;
color: #333;
text-align: right;
}
.picker-value {
flex: 1;
font-size: 30rpx;
color: #333;
text-align: right;
}
}
.placeholder {
height: 60rpx;
}
</style>