c293da23
刘淇
新园林init
|
1
|
<template>
|
48ff5b95
刘淇
底部导航
|
2
|
<view class="page-container">
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
3
|
<!-- 加载页 -->
|
9b30ab8c
刘淇
新增快速工单,原版
|
4
|
<up-loading-page
|
48ff5b95
刘淇
底部导航
|
5
|
:loading="loading"
|
9b30ab8c
刘淇
新增快速工单,原版
|
6
7
|
loading-text="加载中..."
color="#577ee3"
|
48ff5b95
刘淇
底部导航
|
8
|
zIndex="1000"
|
9b30ab8c
刘淇
新增快速工单,原版
|
9
10
|
></up-loading-page>
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
11
|
<!-- 蓝色装饰块 -->
|
48ff5b95
刘淇
底部导航
|
12
|
<view class="blue-decor-block" v-show="!loading"></view>
|
c293da23
刘淇
新园林init
|
13
|
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
14
|
<!-- 内容容器 -->
|
37c26bd3
刘淇
巡查计划
|
15
|
<view class="content-wrap">
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
16
|
<!-- 空状态:过滤后无数据且非加载中时显示 -->
|
37c26bd3
刘淇
巡查计划
|
17
|
<u-empty
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
18
|
v-if="!filteredModuleList.length && !loading"
|
48ff5b95
刘淇
底部导航
|
19
|
mode="permission"
|
37c26bd3
刘淇
巡查计划
|
20
21
|
></u-empty>
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
22
23
|
<!-- 菜单卡片列表:仅渲染有子节点的父模块 -->
<view class="menu-card-wrap">
|
37c26bd3
刘淇
巡查计划
|
24
|
<up-card
|
993d98fa
刘淇
工作台
|
25
|
:title-size="18"
|
48ff5b95
刘淇
底部导航
|
26
27
28
|
:border="false"
:shadow="true"
:foot-border-top="false"
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
29
|
v-for="(parentModule, index) in filteredModuleList"
|
48ff5b95
刘淇
底部导航
|
30
|
:key="`$parentModule.id_${index}`"
|
993d98fa
刘淇
工作台
|
31
|
:title="parentModule.name"
|
48ff5b95
刘淇
底部导航
|
32
|
class="card-container"
|
37c26bd3
刘淇
巡查计划
|
33
|
>
|
37c26bd3
刘淇
巡查计划
|
34
|
<template #body>
|
48ff5b95
刘淇
底部导航
|
35
36
37
38
39
40
|
<view class="card-content">
<view
v-for="(listItem, listIndex) in parentModule.children"
:key="listItem.id"
class="content-block"
@click="handleMenuClick(listItem)"
|
37c26bd3
刘淇
巡查计划
|
41
|
>
|
48ff5b95
刘淇
底部导航
|
42
43
44
45
46
47
48
49
50
51
52
|
<u-image
:src="listItem.icon"
mode="aspectFit"
width="80rpx"
height="80rpx"
lazy-load
radius="16rpx"
class="block-icon"
></u-image>
<text class="grid-text">{{ listItem.name }}</text>
</view>
|
37c26bd3
刘淇
巡查计划
|
53
54
55
|
</view>
</template>
</up-card>
|
c293da23
刘淇
新园林init
|
56
57
58
59
60
|
</view>
</view>
</view>
</template>
|
37c26bd3
刘淇
巡查计划
|
61
|
<script setup lang="ts">
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
62
|
import { ref, computed } from 'vue'; // 新增 computed
|
993d98fa
刘淇
工作台
|
63
64
65
66
|
import { onShow } from '@dcloudio/uni-app';
import { useUserStore } from '@/pinia/user';
import globalConfig from '@/common/config/global';
import cache from '@/common/utils/cache';
|
37c26bd3
刘淇
巡查计划
|
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
interface MenuItem {
id: number;
name: string;
subtitle?: string;
type: number;
sort: number;
parentId: number;
icon: string;
jumpUrl: string;
miniAppId?: string;
badgeText?: string;
badgeColor?: string;
statisticCount: number | null;
hasStatistic: boolean;
extra: any;
children: MenuItem[];
}
|
c293da23
刘淇
新园林init
|
85
|
|
9b30ab8c
刘淇
新增快速工单,原版
|
86
|
const loading = ref(true);
|
c293da23
刘淇
新园林init
|
87
|
const userStore = useUserStore();
|
37c26bd3
刘淇
巡查计划
|
88
89
|
const moduleList = ref<MenuItem[]>([]);
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
90
91
92
93
94
95
96
97
|
// 计算属性:过滤出有子节点的父模块(children 存在且长度 > 0)
const filteredModuleList = computed(() => {
return moduleList.value.filter(item => {
// 确保 children 是数组且长度大于 0
return Array.isArray(item.children) && item.children.length > 0;
});
});
|
37c26bd3
刘淇
巡查计划
|
98
|
onShow(async () => {
|
c293da23
刘淇
新园林init
|
99
|
try {
|
9b30ab8c
刘淇
新增快速工单,原版
|
100
|
loading.value = true;
|
e6a04285
刘淇
单图情况 宽高70*70
|
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
// ========== 核心新增:登录状态判断 ==========
// 1. 定义登录判断逻辑(多维度校验,确保准确性)
const isLogin = () => {
// 从缓存获取token(核心登录标识)
const token = cache.get(globalConfig.cache.tokenKey) || userStore.token;
// 从缓存/Pinia获取用户信息
const userInfo = cache.get(globalConfig.cache.userInfoKey) || userStore.userInfo;
// 满足任一核心条件即视为已登录
return (!!token && !!userInfo);
};
// 2. 未登录处理:跳转登录页,阻止后续逻辑执行
if (!isLogin()) {
uni.showToast({ title: '请先登录', icon: 'none', duration: 1500 });
// 延迟跳转,确保提示语正常显示
setTimeout(() => {
// 使用reLaunch跳转,清空页面栈,避免返回当前菜单页
uni.reLaunch({
|
2e2b95d3
刘淇
修改接口路径 和命名
|
121
|
url: '/pages/login/index', // 替换为你的实际登录页路径
|
e6a04285
刘淇
单图情况 宽高70*70
|
122
123
124
125
126
127
128
129
130
131
132
133
|
fail: (err) => {
console.error('跳转登录页失败:', err);
uni.showToast({ title: '跳转登录页异常', icon: 'none' });
}
});
}, 1500);
// 隐藏加载状态
loading.value = false;
// 终止后续代码执行
return;
}
|
993d98fa
刘淇
工作台
|
134
|
const rawMenuData = userStore.moduleListInfo || cache.get(globalConfig.cache.moduleListKey);
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
135
|
moduleList.value = rawMenuData || [];
|
48ff5b95
刘淇
底部导航
|
136
|
loading.value = false;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
137
138
|
console.log('原始菜单数据:', moduleList.value);
console.log('过滤后有子节点的父模块:', filteredModuleList.value);
|
37c26bd3
刘淇
巡查计划
|
139
140
141
|
} catch (error) {
console.error('获取菜单数据失败:', error);
moduleList.value = [];
|
9b30ab8c
刘淇
新增快速工单,原版
|
142
|
loading.value = false;
|
c293da23
刘淇
新园林init
|
143
|
}
|
37c26bd3
刘淇
巡查计划
|
144
|
});
|
c293da23
刘淇
新园林init
|
145
|
|
37c26bd3
刘淇
巡查计划
|
146
147
|
const handleMenuClick = (item: MenuItem) => {
if (!item.jumpUrl) {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
148
|
uni.showToast({ title: '暂无跳转链接', icon: 'none', duration: 2000 });
|
37c26bd3
刘淇
巡查计划
|
149
|
return;
|
c293da23
刘淇
新园林init
|
150
|
}
|
37c26bd3
刘淇
巡查计划
|
151
152
153
154
|
uni.navigateTo({
url: item.jumpUrl,
fail: (err) => {
console.error('页面跳转失败:', err);
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
155
|
uni.showToast({ title: '页面路径错误', icon: 'none', duration: 2000 });
|
37c26bd3
刘淇
巡查计划
|
156
157
|
}
});
|
c293da23
刘淇
新园林init
|
158
159
160
|
};
</script>
|
48ff5b95
刘淇
底部导航
|
161
|
<style scoped lang="scss">
|
48ff5b95
刘淇
底部导航
|
162
|
.page-container {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
163
164
|
position: relative;
min-height: 100vh;
|
5cb33b90
刘淇
完成巡查计划 详情
|
165
|
}
|
37c26bd3
刘淇
巡查计划
|
166
|
|
37c26bd3
刘淇
巡查计划
|
167
168
169
170
171
172
173
174
|
.blue-decor-block {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 200px;
background-color: #577ee3;
z-index: 1;
|
c293da23
刘淇
新园林init
|
175
|
}
|
37c26bd3
刘淇
巡查计划
|
176
|
|
37c26bd3
刘淇
巡查计划
|
177
178
179
|
.content-wrap {
position: relative;
z-index: 2;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
180
|
padding: 120px 0 0;
|
48ff5b95
刘淇
底部导航
|
181
182
|
display: flex;
flex-direction: column;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
183
|
gap: 20rpx;
|
48ff5b95
刘淇
底部导航
|
184
185
|
}
|
48ff5b95
刘淇
底部导航
|
186
187
188
189
|
.menu-card-wrap {
width: 100%;
}
|
48ff5b95
刘淇
底部导航
|
190
|
.card-container {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
191
192
193
|
--u-card-content-padding: 0;
border-radius: 8rpx;
overflow: hidden;
|
48ff5b95
刘淇
底部导航
|
194
195
|
}
|
48ff5b95
刘淇
底部导航
|
196
197
|
.card-content {
display: flex;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
198
199
|
flex-wrap: wrap;
gap: 20rpx;
|
48ff5b95
刘淇
底部导航
|
200
201
|
}
|
48ff5b95
刘淇
底部导航
|
202
|
.content-block {
|
48ff5b95
刘淇
底部导航
|
203
|
width: calc((100% - 3 * 20rpx) / 4);
|
48ff5b95
刘淇
底部导航
|
204
205
|
display: flex;
flex-direction: column;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
206
207
208
|
align-items: center;
justify-content: center;
padding: 14rpx 0;
|
48ff5b95
刘淇
底部导航
|
209
|
border-radius: 8rpx;
|
48ff5b95
刘淇
底部导航
|
210
211
|
touch-action: manipulation;
transition: background-color 0.2s;
|
c293da23
刘淇
新园林init
|
212
|
}
|
37c26bd3
刘淇
巡查计划
|
213
|
|
48ff5b95
刘淇
底部导航
|
214
215
216
|
.content-block:active {
background-color: #e9ecef;
}
|
37c26bd3
刘淇
巡查计划
|
217
|
|
48ff5b95
刘淇
底部导航
|
218
|
.block-icon {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
219
220
|
display: block;
margin: 0 auto;
|
48ff5b95
刘淇
底部导航
|
221
222
|
}
|
37c26bd3
刘淇
巡查计划
|
223
|
.grid-text {
|
48ff5b95
刘淇
底部导航
|
224
|
font-size: 26rpx;
|
37c26bd3
刘淇
巡查计划
|
225
226
227
|
color: #333;
text-align: center;
margin-top: 10rpx;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
228
|
display: block;
|
c293da23
刘淇
新园林init
|
229
|
}
|
37c26bd3
刘淇
巡查计划
|
230
|
</style>
|