Files
2026-03-06 16:50:46 +08:00

291 lines
6.3 KiB
Vue

<template>
<view class="container">
<!-- 头部个人信息 -->
<view class="header">
<view class="avatar-container" @tap="goLogin">
<view class="avatar">
<image
src="../../static/image/user.png"
mode="scaleToFill"
/>
</view>
</view>
<view class="user-info" @tap="goLogin">
<text class="username">{{ userInfo.username }}</text>
<text class="user-role">{{ userInfo.role }}</text>
</view>
</view>
<!-- 统计信息栏 -->
<!-- <view class="stats-bar">
<view class="stat-item" v-for="(item, index) in statsData" :key="index">
<text class="stat-number">{{ item.number }}</text>
<text class="stat-label">{{ item.label }}</text>
</view>
</view> -->
<!-- 菜单区域 -->
<view class="menu-section">
<!-- 账户信息组 -->
<!-- <view class="menu-group">
<view class="menu-item" v-for="(item, index) in accountMenus" :key="index" @tap="handleMenu(item)">
<text class="menu-icon">{{ item.icon }}</text>
<text class="menu-text">{{ item.text }}</text>
<uv-icon name="arrow-right" color="#999999"></uv-icon>
</view>
</view> -->
<!-- 工作相关组 -->
<view class="menu-group">
<view class="menu-item" v-for="(item, index) in workMenus" :key="index" @tap="handleMenu(item)">
<image :src="item.icon" mode="scaleToFill" />
<text class="menu-text">{{ item.text }}</text>
<!-- absolute :offset="['15%','43%']" -->
<uv-badge type="error" max="100" :value="item.num" v-show="item.num"></uv-badge>
<uv-icon name="arrow-right" color="#999999"></uv-icon>
</view>
</view>
<!-- 系统相关组 -->
<!-- <view class="menu-group">
<view class="menu-item" v-for="(item, index) in systemMenus" :key="index" @tap="handleMenu(item)">
<text class="menu-icon">{{ item.icon }}</text>
<text class="menu-text">{{ item.text }}</text>
<uv-icon name="arrow-right" color="#999999"></uv-icon>
</view>
</view> -->
</view>
<view class="btn" v-show="uni.getStorageSync('token')">
<uv-button text="退 出 登 录" size="large" style="width: 100%;" type="error" @tap="logOut"></uv-button>
</view>
</view>
</template>
<script setup>
import { ref, reactive } from 'vue'
import { taskCount } from '../../api/inventory'
import { userLogout } from '../../api/login'
import { auditCount } from "@/api/mine"
import { onShow } from '@dcloudio/uni-app'
import myTask from "../../static/iconfont/myTask.svg"
import print from "../../static/iconfont/print.svg"
// 用户信息
const userInfo = reactive({
username: '请登录',
role: ''
})
const goLogin = () => {
uni.reLaunch({
url: '/pages/login/login',
})
}
// 统计数据
const statsData = reactive([
{ number: '128', label: '今日入库' },
{ number: '89', label: '今日出库' },
{ number: '98%', label: '任务完成' }
])
// 工作相关菜单
const workMenus = reactive([
{ icon: myTask, text: '我的任务', type: 'task' },
// { icon: myTask, text: '待审核', type: 'audit' },
{ icon: print, text: '打印调试', type: 'print' },
{ icon: print, text: '签字调试', type: 'signature' }
])
const getCount = () => {
taskCount().then(res => {
workMenus[0].num = res.data
})
// let obj = {
// approverId: uni.getStorageSync('user').userId
// }
// auditCount(obj).then(res => {
// // console.log('审核数量', res.data)
// workMenus[1].num = res.data
// })
}
onShow(() => {
if (uni.getStorageSync('token')) {
userInfo.username = uni.getStorageSync('user').userName
userInfo.role = uni.getStorageSync('user').roles[0].roleName
getCount()
}
})
// 处理菜单点击
const handleMenu = (item) => {
console.log('菜单点击:', item.type)
// 根据类型处理不同的跳转逻辑
if (item.type == "task") {
uni.navigateTo({
url: `/pagesInventory/inventoryTask?type=all`
})
} else if (item.type == "audit") {
uni.navigateTo({
url: `/pagesMine/audit`
})
} else if (item.type == "print") {
uni.navigateTo({
url: `/pagesMine/print`
})
} else if (item.type == "signature") {
uni.navigateTo({
url: `/pagesMine/signPreview`
})
}
}
const logOut = () => {
userLogout().then(res => {
uni.clearStorage()
uni.navigateTo({
url: `/pages/login/login`
})
})
}
</script>
<style scoped lang="scss">
.container {
min-height: 100vh;
background-color: #f7f7f7;
position: relative;
}
.header {
background: linear-gradient(135deg, #199793, #07807b);
padding: 60rpx 40rpx;
color: #ffffff;
text-align: center;
}
.avatar-container {
margin-bottom: 30rpx;
}
.avatar {
width: 160rpx;
height: 160rpx;
border-radius: 50%;
background: #ffffff;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.2);
image {
width: 100rpx;
height: 100rpx;
}
}
.user-info {
margin-top: 20rpx;
}
.username {
font-size: 40rpx;
font-weight: 600;
margin-bottom: 10rpx;
display: block;
}
.user-role {
font-size: 28rpx;
opacity: 0.9;
display: block;
}
.stats-bar {
background: #ffffff;
padding: 30rpx;
display: flex;
justify-content: space-around;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
.stat-item {
text-align: center;
}
.stat-number {
font-size: 36rpx;
font-weight: 600;
color: #199793;
display: block;
}
.stat-label {
font-size: 24rpx;
color: #666666;
margin-top: 10rpx;
display: block;
}
.menu-section {
padding: 30rpx 30rpx 100rpx;
}
.menu-group {
background: #ffffff;
border-radius: 20rpx;
margin-bottom: 30rpx;
overflow: hidden;
}
.menu-item {
display: flex;
align-items: center;
padding: 30rpx;
border-bottom: 2rpx solid #f0f0f0;
image {
width: 34rpx;
height: 34rpx;
margin-right: 10rpx;
}
}
.menu-item:last-child {
border-bottom: none;
}
.menu-icon {
width: 48rpx;
height: 48rpx;
margin-right: 30rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 40rpx;
}
.menu-text {
flex: 1;
font-size: 30rpx;
}
.menu-arrow {
color: #999999;
font-size: 28rpx;
}
.btn {
position: absolute;
bottom: 0;
padding: 0 30rpx;
width: 100%;
box-sizing: border-box;
}
</style>