Files
jnpf_app/components/CommonPane/indexSystem.vue
2026-01-22 11:01:19 +08:00

210 lines
4.2 KiB
Vue

<template>
<view class="card">
<view class="card-content">
<view class="card-tabs u-flex">
<view class="u-flex card-left">
<view class="card-title">{{title}}</view>
</view>
<view @click="openPage" class="morebtn">更多<u-icon name="arrow-right" class="u-p-r-10"
color="#666"></u-icon></view>
</view>
<view class="card-item">
<!-- 遍历渲染业务图标 -->
<view class="item u-flex-col" v-for="(item,index) in cardData" :key="index" @click="clickItem(item)">
<view class="item-icon" :style="{ background: item.iconBackground || '#008cff' }">
<!-- 使用 iconify-icon 渲染 ep 系列图标 -->
<iconify-icon
:icon="item.icon"
color="#ffffff"
width="24"
height="24"
></iconify-icon>
</view>
<view class="item-title u-m-t-8">{{item.name}}</view>
</view>
<view v-if="showAdd" class="item u-flex-col u-col-center" @click="add">
<text class="u-font-40 item-icon more">+</text>
<text class="u-m-t-8 item-title">添加</text>
</view>
</view>
<JnpfEmpty v-if="!cardData.length && type != 'collect' "></JnpfEmpty>
</view>
</view>
</template>
<script>
export default {
props: {
title: {
type: String,
default: "我的收藏"
},
menuList: {
type: Array,
default: () => []
},
flowList: {
type: Array,
default: () => []
},
showAdd: {
type: Boolean,
default: false
},
type: {
type: String,
default: "collect"
},
flowEnabled: {
type: Boolean,
default: false
}
},
data() {
return {
tabList: [{
name: '应用功能',
type: 'menu'
}],
current: 0,
cardData: [],
userInfo: {}
}
},
computed: {
tabType() {
return this.tabList[this.current].type
}
},
watch: {
menuList: {
handler(val) {
if (this.current != 0) this.cardData = this.flowList
},
immediate: true
},
flowList: {
handler(val) {
if (this.current == 0) this.cardData = this.menuList
},
immediate: true
}
},
created() {
this.userInfo = uni.getStorageSync('userInfo') || {}
this.handleTabList()
},
methods: {
handleTabList() {
if (this.flowEnabled) {
this.tabList.push({
name: '发起审批',
type: 'flow'
})
}
},
tabChange(index) {
this.current = index;
if (this.tabType === 'menu') this.cardData = this.menuList
if (this.tabType === 'flow') this.cardData = this.flowList
},
clickItem(item) {
this.$emit('launch', {
...item,
tabType: this.tabType
})
},
openPage() {
this.$emit('openPage', '/pages/apply/menu/index')
},
add() {
let url = this.tabType === 'menu' ? '/pages/apply/allAppApply/index' :
'/pages/workFlow/allAppWorkFlow/index'
this.$emit('addApp', url)
}
}
}
</script>
<style lang="scss">
.card {
margin-top: 20rpx;
&-title {
padding: 0 20rpx;
color: #303133;
font-size: 36rpx;
margin-bottom: 10rpx;
font-weight: 500;
}
&-content {
width: 100%;
height: 100%;
background-color: #fff;
padding-top: 15rpx;
.card-tabs {
width: 100%;
justify-content: space-between;
.card-left {}
.morebtn {
color: #666;
}
}
.card-item {
width: 100%;
display: flex;
flex-wrap: wrap;
flex-direction: row;
.item {
width: 33.33%;
padding: 10px;
justify-content: center;
align-items: center;
padding: 30rpx 0;
.item-icon {
width: 50px;
height: 50px;
/* 关键:改为 flex 布局,让图标居中 */
display: flex;
align-items: center;
justify-content: center;
color: #fff;
border-radius: 18px;
font-size: 24px;
background-color: #f0f2f6;
/* 移除原有伪类样式,避免干扰 */
&:before {
margin: 0;
}
}
.more {
background: #ececec;
color: #666;
font-size: 1.5625rem;
/* 保持添加按钮的居中 */
display: flex;
align-items: center;
justify-content: center;
}
.item-title {
width: 92px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
font-size: 24rpx;
}
}
}
}
}
</style>