factory_mp/pages/index/index.vue

339 lines
6.7 KiB
Vue

<template>
<view class="home-page">
<!-- 顶部用户信息 -->
<view class="home-header">
<view class="home-user-row" @click="goUserInfo">
<view class="home-avatar">
<text class="home-avatar-text">{{avatarText}}</text>
</view>
<view class="home-user-info">
<text class="home-user-name">{{welTitle}}</text>
<text class="home-date">{{currentDate}}</text>
</view>
</view>
</view>
<!-- 统计卡片 -->
<view class="stat-section">
<navigator class="stat-card" url="../wf/index?category=duty" hover-class="stat-card-hover">
<view class="stat-card-head">
<text class="stat-card-title tc-green">待办</text>
<text class="stat-card-icon-r">📋</text>
</view>
<view class="stat-card-body">
<text class="stat-card-num">{{duty_count}}</text>
<text class="stat-card-unit"></text>
</view>
</navigator>
<navigator class="stat-card" url="../wf/index?category=owner" hover-class="stat-card-hover">
<view class="stat-card-head">
<text class="stat-card-title tc-blue">我的</text>
<text class="stat-card-icon-r">📁</text>
</view>
<view class="stat-card-body">
<text class="stat-card-num">{{owner_count}}</text>
<text class="stat-card-unit"></text>
</view>
</navigator>
</view>
<!-- 常用流程 -->
<view class="flow-section">
<view v-for="group in wfOptions" :key="group.category" class="flow-group">
<view class="section-header">
<view class="section-title">
<view class="section-dot"></view>
<text>{{ group.category }}</text>
</view>
</view>
<view class="flow-grid">
<view class="flow-grid-item" v-for="(item, index) in group.items" :key="index" @click="pageEnter(item)" hover-class="flow-item-hover">
<view class="flow-icon-wrap" :class="'flow-icon-c' + (index % 3)">
<image class="flow-icon" :src="item.icon_path?item.icon_path:'/static/yuding.png'" mode="aspectFill" />
</view>
<text class="flow-name">{{item.name}}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import tool from "../../utils/tools.js";
import { auth } from '@/utils/auth.js'
export default {
data() {
return {
welTitle: "",
avatarText: "",
imageSrc:"",
currentDate: tool.getTodayDate(),
wfOptions: [],
duty_count: 0,
owner_count: 0
}
},
mounted() {
this.initWelTitle();
this.getWfOptions();
},
onShow() {
// #ifdef MP-WEIXIN
uni.hideHomeButton()
// #endif
this.getTicketCount();
},
methods: {
getTicketCount() {
this.$api.getTicket({category:"duty", page:1, page_size:1}).then(res=>{
this.duty_count = res.count;
})
this.$api.getTicket({category:"owner", page:1, page_size:1}).then(res=>{
this.owner_count = res.count;
})
},
getWfOptions() {
let permissions = auth.getPermissions();
const groups = {};
this.$api.getWorkflow({ page: 0 }).then((res) => {
res.forEach((item) => {
if(item.key && permissions.includes(item.key)) {
let cate = item.cate;
if (!cate){cate="未分组"}
if (!groups[cate]) {
groups[cate] = [];
}
groups[cate].push(item);
}
})
// 转换为数组形式,便于模板遍历
this.wfOptions = Object.keys(groups).map(category => ({
category,
items: groups[category]
}));
});
},
initWelTitle() {
let userInfo = uni.getStorageSync("userInfo")
let name = userInfo.name;
this.welTitle = `${name},您好!`
this.avatarText = name ? name.slice(-2) : '👤'
},
goUserInfo() {
uni.navigateTo({
url: "/pages/system/userInfo"
})
},
pageEnter(item){
const viewPath = item.view_path;
let view_path = item.view_path2?item.view_path2:item.view_path;
uni.navigateTo({
url:`/pages${view_path}?mode=add`
}).catch(e=>{
console.log(e)
if (e.errMsg.indexOf("not found")!=-1){
uni.showToast({
title: '该页面暂未完成',
icon: 'none'
});
}
})
}
}
}
</script>
<style lang="scss" scoped>
.home-page {
min-height: 100vh;
background: #F5F7FA;
padding-bottom: 40rpx;
}
// ========== 顶部用户信息 ==========
.home-header {
background: #FFFFFF;
padding: 28rpx 32rpx;
margin-bottom: 0;
}
.home-user-row {
display: flex;
align-items: center;
}
.home-avatar {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
background: linear-gradient(135deg, #2BA471, #48C68B);
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
flex-shrink: 0;
}
.home-avatar-text {
color: #FFFFFF;
font-size: 28rpx;
font-weight: 700;
}
.home-user-info {
display: flex;
flex-direction: column;
}
.home-user-name {
font-size: 32rpx;
font-weight: 700;
color: #1A2E25;
}
.home-date {
font-size: 24rpx;
color: #999;
margin-top: 4rpx;
}
// ========== 统计卡片 ==========
.stat-section {
display: flex;
gap: 0;
padding: 0;
}
.stat-card {
flex: 1;
background: #FFFFFF;
border-radius: 0;
padding: 24rpx;
text-decoration: none;
}
.stat-card-hover {
opacity: 0.96;
transform: scale(0.98);
}
.stat-card-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
}
.stat-card-title {
font-size: 26rpx;
font-weight: 700;
}
.tc-green { color: #2BA471; }
.tc-blue { color: #3594E6; }
.stat-card-icon-r {
font-size: 36rpx;
opacity: 0.5;
}
.stat-card-body {
display: flex;
align-items: baseline;
}
.stat-card-num {
font-size: 60rpx;
font-weight: 800;
color: #1A2E25;
line-height: 1;
margin-right: 8rpx;
}
.stat-card-unit {
font-size: 24rpx;
color: #999;
}
// ========== 常用流程 ==========
.flow-section {
padding: 0;
}
.flow-group {
background: #FFFFFF;
border-radius: 0;
padding: 32rpx 24rpx;
margin-bottom: 0;
}
.section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
padding: 0 8rpx;
}
.section-title {
display: flex;
align-items: center;
font-size: 32rpx;
font-weight: 700;
color: #1A2E25;
}
.section-dot {
width: 8rpx;
height: 36rpx;
background: #2BA471;
border-radius: 4rpx;
margin-right: 16rpx;
}
.flow-grid {
display: flex;
flex-wrap: wrap;
}
.flow-grid-item {
width: 33.33%;
display: flex;
flex-direction: column;
align-items: center;
padding: 16rpx 0;
margin-bottom: 8rpx;
}
.flow-item-hover {
opacity: 0.6;
}
.flow-icon-wrap {
width: 96rpx;
height: 96rpx;
border-radius: 24rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 14rpx;
}
// 三色循环
.flow-icon-c0 { background: #C6EADA; }
.flow-icon-c1 { background: #C4DEFF; }
.flow-icon-c2 { background: #FFE0C8; }
.flow-icon {
width: 48rpx;
height: 48rpx;
}
.flow-name {
font-size: 24rpx;
color: #444;
text-align: center;
line-height: 1.4;
}
</style>