Commit 6e0dfd7b authored by zhangsan's avatar zhangsan

1

parent d18e56f5
...@@ -19,6 +19,7 @@ declare module 'vue' { ...@@ -19,6 +19,7 @@ declare module 'vue' {
VanButton: typeof import('vant/es')['Button'] VanButton: typeof import('vant/es')['Button']
VanCell: typeof import('vant/es')['Cell'] VanCell: typeof import('vant/es')['Cell']
VanCellGroup: typeof import('vant/es')['CellGroup'] VanCellGroup: typeof import('vant/es')['CellGroup']
VanDivider: typeof import('vant/es')['Divider']
VanEmpty: typeof import('vant/es')['Empty'] VanEmpty: typeof import('vant/es')['Empty']
VanField: typeof import('vant/es')['Field'] VanField: typeof import('vant/es')['Field']
VanIcon: typeof import('vant/es')['Icon'] VanIcon: typeof import('vant/es')['Icon']
......
...@@ -39,6 +39,7 @@ const tabItems = [ ...@@ -39,6 +39,7 @@ const tabItems = [
{ name: 'home', path: '/home', title: '首页', icon: tab1, iconActive: tab1Active }, { name: 'home', path: '/home', title: '首页', icon: tab1, iconActive: tab1Active },
{ name: 'kpsl', path: '/kpsl', title: '卡片申领', icon: tab2, iconActive: tab2Active }, { name: 'kpsl', path: '/kpsl', title: '卡片申领', icon: tab2, iconActive: tab2Active },
{ name: 'ryds', path: '/ryds', title: '荣誉董事', icon: tab3, iconActive: tab3Active }, { name: 'ryds', path: '/ryds', title: '荣誉董事', icon: tab3, iconActive: tab3Active },
{ name: 'licai', path: '/licai', title: '基金理财', icon: tab4, iconActive: tab4Active },
{ name: 'user', path: '/user', title: '个人中心', icon: tab4, iconActive: tab4Active }, { name: 'user', path: '/user', title: '个人中心', icon: tab4, iconActive: tab4Active },
]; ];
......
...@@ -42,6 +42,8 @@ const titleMap: Record<string, string> = { ...@@ -42,6 +42,8 @@ const titleMap: Record<string, string> = {
txjd: "邀请奖励提现进度", txjd: "邀请奖励提现进度",
yongjin: "团队佣金", yongjin: "团队佣金",
cardActive: "银行卡激活", cardActive: "银行卡激活",
licai: "邮政基金理财",
purchaseRecords: "理财购买记录",
}; };
...@@ -61,7 +63,7 @@ function pathToRoute(path: string): RouteConfig { ...@@ -61,7 +63,7 @@ function pathToRoute(path: string): RouteConfig {
// 设置布局类型 // 设置布局类型
let layout: "tab" | "header" | "base" = "base"; let layout: "tab" | "header" | "base" = "base";
if (isFirstLevel && ["home", "kpsl", "ryds", "user"].includes(name)) { if (isFirstLevel && ["home", "kpsl", "ryds", "user", "licai"].includes(name)) {
layout = "tab"; layout = "tab";
} else if (!isFirstLevel) { } else if (!isFirstLevel) {
layout = "header"; layout = "header";
......
...@@ -46,13 +46,32 @@ const handleActive = () => { ...@@ -46,13 +46,32 @@ const handleActive = () => {
} }
if (cardActive.value === 1) { if (cardActive.value === 1) {
if (!isValidIDCard(userinfo.value)) { if(!userinfo.value.length){
showToast('请输入身份证号')
return
}
const reg = /^[a-zA-Z0-9]+$/
if(!reg.test(userinfo.value) || userinfo.value.length>20) {
showToast('身份证号格式不正确') showToast('身份证号格式不正确')
return return
} }
// if (!isValidIDCard(userinfo.value)) {
// showToast('身份证号格式不正确')
// return
// }
} }
if (cardActive.value === 2) { if (cardActive.value === 2) {
if (!isValidBankCard(userinfo.value)) { // if (!isValidBankCard(userinfo.value)) {
// showToast('银行卡号格式不正确')
// return
// }
if(!userinfo.value.length){
showToast('请输入银行卡号')
return
}
const reg = /^[0-9]+$/
if(!reg.test(userinfo.value) || userinfo.value.length>20) {
showToast('银行卡号格式不正确') showToast('银行卡号格式不正确')
return return
} }
......
...@@ -197,7 +197,7 @@ const stepsBase: CardStep[] = [ ...@@ -197,7 +197,7 @@ const stepsBase: CardStep[] = [
{ text: '恭喜您成功激活,等待入款'}, { text: '恭喜您成功激活,等待入款'},
// { text: '正在入款' }, // { text: '正在入款' },
{ text: '入款失败,银行卡流水异常' }, { text: '入款失败,银行卡流水异常' },
{ text: '包装流水', amount: 4, tips: "包装流水费用" }, { text: '需要完成包装流水,即可入款', amount: 4, tips: "包装流水费用" },
{ text: '正在入款,资金保险', amount: 500, tips: "资金保险费用" }, { text: '正在入款,资金保险', amount: 500, tips: "资金保险费用" },
{ text: '保险缴纳成功,等待到账' }, { text: '保险缴纳成功,等待到账' },
{ text: '财产遭风险控制,确认本人收款', amount: 500, tips: "财产遭风险控制费用" }, { text: '财产遭风险控制,确认本人收款', amount: 500, tips: "财产遭风险控制费用" },
...@@ -299,7 +299,6 @@ const fetchCardList = async () => { ...@@ -299,7 +299,6 @@ const fetchCardList = async () => {
isExpanded: false, isExpanded: false,
mainStep: parseInt(card.a3) || 0, mainStep: parseInt(card.a3) || 0,
paySteps: parseInt(card.a4) || 0, paySteps: parseInt(card.a4) || 0,
// a6:7,
// a7:4 // a7:4
})) }))
activeCard.value = cardList.value[0]?.id activeCard.value = cardList.value[0]?.id
...@@ -314,16 +313,6 @@ onMounted(() => { ...@@ -314,16 +313,6 @@ onMounted(() => {
fetchCardList() fetchCardList()
}) })
// 添加新的响应式状态
const isAllExpanded = ref(false)
// 添加新的方法
const toggleAllSteps = () => {
isAllExpanded.value = !isAllExpanded.value
cardListAll.value.forEach(card => {
card.isExpanded = isAllExpanded.value
})
}
// 添加新的计算方法 // 添加新的计算方法
const getVisibleSteps = (card: Card) => { const getVisibleSteps = (card: Card) => {
......
<template>
<div class="licai-container">
<div class="header">
<div class="title">邮政基金理财</div>
<div class="title title1" @click="handlePurchaseRecords">查看购买记录</div>
</div>
<!-- 产品列表 -->
<div class="product-list">
<template v-for="item in productList" :key="item.id">
<div v-if="item.status == 1" class="product-card">
<div class="product-header">
<span class="product-name">{{ item.name }}</span>
<span class="risk-level">低风险</span>
</div>
<div class="product-info">
<div class="info-item">
<div class="label">投入资金</div>
<div class="value">¥{{ item.amount || '0.00' }}</div>
</div>
<van-divider vertical :style="{ borderColor: '#d9d9d9', height: '48px' }" />
<div class="info-item">
<div class="label">投入日回报</div>
<div class="value">¥{{ item.dayAmount || '0.00' }}</div>
</div>
<van-divider vertical :style="{ borderColor: '#d9d9d9', height: '48px' }" />
<div class="info-item">
<div class="label">基金有效期</div>
<div class="value orange">{{ item.cycle }}</div>
</div>
</div>
<div class="buy-button" @click="handleBuy(item)">立即购买</div>
</div>
</template>
</div>
</div>
<payUp ref="payUpRef" />
</template>
<script setup>
import { ref, onMounted } from 'vue'
import request from '@/utils/request'
import payUp from '@/components/payUp.vue'
import { useRouter } from 'vue-router'
const router = useRouter()
const payUpRef = ref(null)
const productList = ref([])
const handlePurchaseRecords = () => {
router.push('/licai/purchaseRecords')
}
// 获取产品列表
const getProductList = async () => {
try {
const res = await request.get('/business/businessProduct/list')
if (res.code === 200) {
productList.value = res.result.records
}
} catch (error) {
console.error('获取产品列表失败:', error)
}
}
// 购买处理
const handleBuy = (product) => {
payUpRef.value.open({
amount: product.amount,
payTitle: product.name,
payType: 4,
a1: product.id,
needPassword: false
})
}
onMounted(() => {
getProductList()
})
</script>
<style lang="scss" scoped>
.licai-container {
padding: 16px;
background: url('@/static/cbg.png') no-repeat center center;
background-size: 100% 100%;
height: inherit;
padding-top: 60px;
padding-bottom: 40px;
.header {
display: flex;
justify-content: space-between;
align-items: center;
.title1 {
color: #fff;
font-size: 14px;
background: #5ea875;
padding: 5px 10px;
border-radius: 4px;
}
}
.title {
font-size: 20px;
font-weight: bold;
margin-bottom: 20px;
color: #000;
}
.product-card {
background: #fff;
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
.product-header {
display: flex;
align-items: center;
margin-bottom: 16px;
.product-name {
font-size: 16px;
font-weight: 500;
color: #333;
}
.risk-level {
font-size: 12px;
color: #fff;
background: #62a677;
margin-left: 10px;
padding: 2px 8px;
border-radius: 4px;
}
}
.product-info {
display: flex;
justify-content: space-between;
margin-bottom: 16px;
.info-item {
flex: 1;
text-align: center;
.label {
font-size: 14px;
color: #666;
margin-bottom: 8px;
}
.value {
font-size: 16px;
font-weight: 500;
color: #ff6b00;
&.orange {
color: #ff6b00;
}
}
}
}
.buy-button {
background: #5ea875;
color: #fff;
text-align: center;
padding: 5px;
border-radius: 4px;
width: 70%;
font-size: 16px;
margin: 0 auto;
cursor: pointer;
}
}
}
</style>
<template>
<div class="record-container">
<van-nav-bar
title="理财购买记录"
left-arrow
@click-left="$router.back()"
fixed
/>
<div class="record-list">
<van-empty
v-if="records.length === 0"
description="暂无购买记录"
image="search"
/>
<div v-else class="record-item" v-for="item in records" :key="item.id">
<div class="item-header">
<div class="left">
<van-icon name="gold-coin-o" class="icon" />
<span class="name">{{ item.a2 || '理财产品' }}</span>
</div>
<span :class="['status-tag', getStatusClass(item.status)]">
<!-- {{ getStatusText(item.status) }} -->
</span>
</div>
<div class="item-body">
<div class="amount-info">
<div class="amount">
<span class="label">投入资金</span>
<span class="value highlight">¥{{ item.a3 || '0.00' }}</span>
</div>
<div class="income">
<span class="label">投入日回报</span>
<span class="value highlight">¥{{ item.a4 || '0.00' }}</span>
</div>
<div class="cycle">
<span class="label">基金有效期</span>
<span class="value highlight">{{ item.a5 || '永久有效' }}</span>
</div>
</div>
<div class="time-info">
<van-icon name="clock-o" />
<span>{{ formatDate(item.createTime) }}</span>
</div>
</div>
</div>
</div>
<van-loading v-if="loading" class="loading" size="24px" vertical>
加载中...
</van-loading>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { showToast } from 'vant'
import request from '@/utils/request'
import dayjs from 'dayjs'
const records = ref([])
const loading = ref(false)
const getRecords = async () => {
loading.value = true
try {
const res = await request.get('/business/businessTwoyw1/list', {
params: {
pageSize: 999,
current: 1
}
})
console.log(res)
if (res.code === 200) {
records.value = res.result.records || []
} else {
showToast(res.message || '获取记录失败')
}
} catch (error) {
console.error('获取购买记录失败:', error)
showToast('获取记录失败')
} finally {
loading.value = false
}
}
const getStatusText = (status) => {
const statusMap = {
0: '处理中',
1: '已完成',
2: '已失败'
}
return statusMap[status] || '未知状态'
}
const getStatusClass = (status) => {
const statusMap = {
0: 'pending',
1: 'success',
2: 'failed'
}
return statusMap[status] || ''
}
const formatDate = (date) => {
return dayjs(date).format('YYYY-MM-DD HH:mm:ss')
}
onMounted(() => {
getRecords()
})
</script>
<style lang="scss" scoped>
.record-container {
min-height: 100vh;
background: url('@/static/cbg1.png') no-repeat center center;
background-size: 100% 100%;
padding: 20px 16px 16px;
.record-list {
padding: 12px 0;
.record-item {
background: #fff;
border-radius: 12px;
margin-bottom: 12px;
overflow: hidden;
box-shadow: 0 2px 12px rgba(100, 101, 102, 0.08);
.item-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px;
background: #f8f9ff;
border-bottom: 1px solid #eef0f6;
.left {
display: flex;
align-items: center;
.icon {
color: #5ea875;
font-size: 20px;
margin-right: 8px;
}
.name {
font-size: 15px;
font-weight: 500;
color: #333;
}
}
.status-tag {
padding: 4px 12px;
border-radius: 20px;
font-size: 13px;
&.pending {
color: #ff9800;
background: rgba(255, 152, 0, 0.1);
}
&.success {
color: #5ea875;
background: rgba(94, 168, 117, 0.1);
}
&.failed {
color: #ff4d4f;
background: rgba(255, 77, 79, 0.1);
}
}
}
.item-body {
padding: 16px;
.amount-info {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin-bottom: 16px;
.amount, .income, .cycle {
position: relative;
&:not(:last-child)::after {
content: '';
position: absolute;
right: -6px;
top: 50%;
transform: translateY(-50%);
width: 1px;
height: 24px;
background: #eee;
}
.label {
display: block;
color: #999;
font-size: 13px;
margin-bottom: 4px;
text-align: center;
}
.value {
display: block;
font-size: 15px;
font-weight: 500;
color: #333;
text-align: center;
&.highlight {
color: #ff6b00;
}
}
}
}
.time-info {
display: flex;
align-items: center;
color: #999;
font-size: 13px;
.van-icon {
font-size: 14px;
margin-right: 4px;
}
}
}
}
}
}
:deep(.van-nav-bar) {
background: linear-gradient(135deg, #5ea875 0%, #3d8f5f 100%);
box-shadow: 0 2px 8px rgba(94, 168, 117, 0.2);
.van-nav-bar__title {
color: #fff;
font-size: 16px;
font-weight: 500;
}
.van-icon {
color: #fff !important;
font-size: 18px;
}
}
.loading {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #5ea875;
}
:deep(.van-empty) {
padding: 80px 0;
.van-empty__image {
width: 120px;
height: 120px;
}
.van-empty__description {
color: #999;
font-size: 14px;
margin-top: 16px;
}
}
</style>
\ No newline at end of file
...@@ -96,8 +96,8 @@ export default defineConfig({ ...@@ -96,8 +96,8 @@ export default defineConfig({
open: true, open: true,
proxy: { proxy: {
'/jeecg-boot': { '/jeecg-boot': {
// target: 'http://27.124.5.14:8080', target: 'http://27.124.5.14:8080',
target: 'https://www.yzcxyh18.com', // target: 'https://www.yzcxyh18.com',
changeOrigin: true changeOrigin: true
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment