228 lines
4.7 KiB
Vue
228 lines
4.7 KiB
Vue
<template>
|
|
<div class="user-center-container">
|
|
<!-- 左侧边栏 -->
|
|
<UserSidebar
|
|
:user-phone="userPhone"
|
|
:valuation-count="valuationCount"
|
|
:current-menu="currentMenu"
|
|
:menu-list="menuList"
|
|
@menu-click="handleMenuClick"
|
|
/>
|
|
|
|
<!-- 右侧内容区 -->
|
|
<div class="content-area">
|
|
<!-- 返回按钮 -->
|
|
<div class="back-button" @click="handleBackToHome">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M15 18L9 12L15 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
<span>返回首页</span>
|
|
</div>
|
|
|
|
<!-- 子路由视图 -->
|
|
<router-view
|
|
:asset-list="assetList"
|
|
:invoice-list="invoiceList"
|
|
@return-home="handleBackToHome"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref, onMounted, h, watch, computed } from 'vue'
|
|
import { useRouter, useRoute } from 'vue-router'
|
|
import api from '@/api'
|
|
import UserSidebar from './components/UserSidebar.vue'
|
|
|
|
const router = useRouter()
|
|
const route = useRoute()
|
|
|
|
// 当前菜单(从路由路径计算)
|
|
const currentMenu = computed(() => {
|
|
const path = route.path
|
|
if (path.includes('/history')) return 'history'
|
|
if (path.includes('/transfer')) return 'transfer'
|
|
if (path.includes('/invoice')) return 'invoice'
|
|
return 'history'
|
|
})
|
|
|
|
// 用户信息
|
|
const userPhone = ref('')
|
|
const valuationCount = ref(0)
|
|
|
|
// 资产列表
|
|
const assetList = ref([])
|
|
|
|
// 开票列表
|
|
const invoiceList = ref([
|
|
{ id: 1, name: '某某公司', status: '待审' },
|
|
{ id: 2, name: '某某公司', status: '待审' }
|
|
])
|
|
|
|
// 菜单列表
|
|
const menuList = ref([
|
|
{
|
|
id: 'history',
|
|
label: '估值记录',
|
|
icon: () => h('svg', {
|
|
width: 20,
|
|
height: 20,
|
|
viewBox: '0 0 24 24',
|
|
fill: 'none',
|
|
xmlns: 'http://www.w3.org/2000/svg'
|
|
}, [
|
|
h('path', {
|
|
d: 'M12 8V12L15 15',
|
|
stroke: 'currentColor',
|
|
'stroke-width': 2,
|
|
'stroke-linecap': 'round'
|
|
}),
|
|
h('circle', {
|
|
cx: 12,
|
|
cy: 12,
|
|
r: 9,
|
|
stroke: 'currentColor',
|
|
'stroke-width': 2
|
|
})
|
|
])
|
|
},
|
|
{
|
|
id: 'transfer',
|
|
label: '对公转账',
|
|
icon: () => h('svg', {
|
|
width: 20,
|
|
height: 20,
|
|
viewBox: '0 0 24 24',
|
|
fill: 'none',
|
|
xmlns: 'http://www.w3.org/2000/svg'
|
|
}, [
|
|
h('path', {
|
|
d: 'M12 2V6M12 18V22M6 12H2M22 12H18',
|
|
stroke: 'currentColor',
|
|
'stroke-width': 2,
|
|
'stroke-linecap': 'round'
|
|
}),
|
|
h('circle', {
|
|
cx: 12,
|
|
cy: 12,
|
|
r: 4,
|
|
stroke: 'currentColor',
|
|
'stroke-width': 2
|
|
})
|
|
])
|
|
},
|
|
{
|
|
id: 'invoice',
|
|
label: '开票管理',
|
|
icon: () => h('svg', {
|
|
width: 20,
|
|
height: 20,
|
|
viewBox: '0 0 24 24',
|
|
fill: 'none',
|
|
xmlns: 'http://www.w3.org/2000/svg'
|
|
}, [
|
|
h('rect', {
|
|
x: 3,
|
|
y: 3,
|
|
width: 18,
|
|
height: 18,
|
|
rx: 2,
|
|
stroke: 'currentColor',
|
|
'stroke-width': 2
|
|
}),
|
|
h('path', {
|
|
d: 'M8 12H16M8 16H13',
|
|
stroke: 'currentColor',
|
|
'stroke-width': 2,
|
|
'stroke-linecap': 'round'
|
|
})
|
|
])
|
|
}
|
|
])
|
|
|
|
// 返回首页
|
|
function handleBackToHome() {
|
|
router.push('/home')
|
|
}
|
|
|
|
// 菜单点击
|
|
function handleMenuClick(menu) {
|
|
// 使用路由导航
|
|
router.push(`/user-center/${menu.id}`)
|
|
}
|
|
|
|
// 加载数据
|
|
async function loadData() {
|
|
try {
|
|
const phone = localStorage.getItem('phone')
|
|
if (phone) {
|
|
userPhone.value = phone
|
|
}
|
|
|
|
const res = await api.getHistoryList()
|
|
if (res && res.results) {
|
|
assetList.value = res.results
|
|
valuationCount.value = res.results.length
|
|
}
|
|
} catch (error) {
|
|
console.error('加载数据失败:', error)
|
|
}
|
|
}
|
|
|
|
onMounted(() => {
|
|
loadData()
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.user-center-container {
|
|
display: flex;
|
|
min-height: 100vh;
|
|
background: #F5F7FA;
|
|
}
|
|
|
|
/* 右侧内容区 */
|
|
.content-area {
|
|
flex: 1;
|
|
padding: 20px;
|
|
overflow-y: auto;
|
|
position: relative;
|
|
}
|
|
|
|
.back-button {
|
|
position: absolute;
|
|
top: 44px; /* Align with the content card's top padding area */
|
|
left: 44px; /* Align with the content card's left padding area */
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
padding: 0;
|
|
color: #606266;
|
|
cursor: pointer;
|
|
transition: all 0.3s ease;
|
|
font-size: 14px;
|
|
background: transparent;
|
|
z-index: 10;
|
|
box-shadow: none;
|
|
}
|
|
|
|
.back-button:hover {
|
|
color: #A30113;
|
|
}
|
|
|
|
.back-button svg {
|
|
transition: transform 0.3s ease;
|
|
}
|
|
|
|
.back-button:hover svg {
|
|
transform: translateX(-4px);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.user-center-container {
|
|
flex-direction: column;
|
|
}
|
|
}
|
|
</style>
|