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
|
<!-- 蓝色装饰块 -->
|
12e66ec8
刘淇
新增树
|
12
13
14
15
16
|
<view class="blue-decor-block" v-show="!loading">
<!-- ✅ 修复1:增加可选链+默认值,防止数据为undefined报错 -->
<text class="welcome-text u-line-1">你好{{userInfo?.user?.nickname || ''}},欢迎登录</text>
<text class="platform-name">全域智能运营管理平台</text>
</view>
|
c293da23
刘淇
新园林init
|
17
|
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
18
|
<!-- 内容容器 -->
|
37c26bd3
刘淇
巡查计划
|
19
|
<view class="content-wrap">
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
20
|
<!-- 空状态:过滤后无数据且非加载中时显示 -->
|
37c26bd3
刘淇
巡查计划
|
21
|
<u-empty
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
22
|
v-if="!filteredModuleList.length && !loading"
|
48ff5b95
刘淇
底部导航
|
23
|
mode="permission"
|
37c26bd3
刘淇
巡查计划
|
24
25
|
></u-empty>
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
26
27
|
<!-- 菜单卡片列表:仅渲染有子节点的父模块 -->
<view class="menu-card-wrap">
|
37c26bd3
刘淇
巡查计划
|
28
|
<up-card
|
993d98fa
刘淇
工作台
|
29
|
:title-size="18"
|
48ff5b95
刘淇
底部导航
|
30
31
32
|
:border="false"
:shadow="true"
:foot-border-top="false"
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
33
|
v-for="(parentModule, index) in filteredModuleList"
|
48ff5b95
刘淇
底部导航
|
34
|
:key="`$parentModule.id_${index}`"
|
993d98fa
刘淇
工作台
|
35
|
:title="parentModule.name"
|
48ff5b95
刘淇
底部导航
|
36
|
class="card-container"
|
37c26bd3
刘淇
巡查计划
|
37
|
>
|
37c26bd3
刘淇
巡查计划
|
38
|
<template #body>
|
48ff5b95
刘淇
底部导航
|
39
40
41
42
43
44
|
<view class="card-content">
<view
v-for="(listItem, listIndex) in parentModule.children"
:key="listItem.id"
class="content-block"
@click="handleMenuClick(listItem)"
|
37c26bd3
刘淇
巡查计划
|
45
|
>
|
48ff5b95
刘淇
底部导航
|
46
47
48
49
50
51
52
53
54
55
56
|
<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
刘淇
巡查计划
|
57
58
59
|
</view>
</template>
</up-card>
|
c293da23
刘淇
新园林init
|
60
61
62
63
64
|
</view>
</view>
</view>
</template>
|
37c26bd3
刘淇
巡查计划
|
65
|
<script setup lang="ts">
|
12e66ec8
刘淇
新增树
|
66
|
import { ref, computed } from 'vue';
|
993d98fa
刘淇
工作台
|
67
68
69
70
|
import { onShow } from '@dcloudio/uni-app';
import { useUserStore } from '@/pinia/user';
import globalConfig from '@/common/config/global';
import cache from '@/common/utils/cache';
|
37c26bd3
刘淇
巡查计划
|
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
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
|
89
|
|
12e66ec8
刘淇
新增树
|
90
|
// ========== 全局变量定义区 ==========
|
9b30ab8c
刘淇
新增快速工单,原版
|
91
|
const loading = ref(true);
|
c293da23
刘淇
新园林init
|
92
|
const userStore = useUserStore();
|
37c26bd3
刘淇
巡查计划
|
93
|
const moduleList = ref<MenuItem[]>([]);
|
12e66ec8
刘淇
新增树
|
94
95
|
// ✅ 修复2:声明全局的用户信息变量,模板可访问 + 初始化空对象兜底,杜绝undefined
const userInfo = ref<any>(cache.get(globalConfig.cache.userInfoKey) || userStore.userInfo || {});
|
37c26bd3
刘淇
巡查计划
|
96
|
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
97
98
99
100
101
102
103
104
|
// 计算属性:过滤出有子节点的父模块(children 存在且长度 > 0)
const filteredModuleList = computed(() => {
return moduleList.value.filter(item => {
// 确保 children 是数组且长度大于 0
return Array.isArray(item.children) && item.children.length > 0;
});
});
|
37c26bd3
刘淇
巡查计划
|
105
|
onShow(async () => {
|
c293da23
刘淇
新园林init
|
106
|
try {
|
9b30ab8c
刘淇
新增快速工单,原版
|
107
|
loading.value = true;
|
12e66ec8
刘淇
新增树
|
108
109
|
// ✅ 修复3:重新赋值全局userInfo,保证数据最新
userInfo.value = cache.get(globalConfig.cache.userInfoKey) || userStore.userInfo || {};
|
e6a04285
刘淇
单图情况 宽高70*70
|
110
|
|
12e66ec8
刘淇
新增树
|
111
|
// 登录状态判断(多维度校验,确保准确性)
|
e6a04285
刘淇
单图情况 宽高70*70
|
112
|
const isLogin = () => {
|
e6a04285
刘淇
单图情况 宽高70*70
|
113
114
|
// 从缓存获取token(核心登录标识)
const token = cache.get(globalConfig.cache.tokenKey) || userStore.token;
|
12e66ec8
刘淇
新增树
|
115
116
117
|
// 从全局变量取值,无需再声明局部变量
const userInfoVal = userInfo.value;
console.log('当前用户信息:', userInfoVal?.user);
|
e6a04285
刘淇
单图情况 宽高70*70
|
118
|
// 满足任一核心条件即视为已登录
|
12e66ec8
刘淇
新增树
|
119
|
return !!token && !!userInfoVal;
|
e6a04285
刘淇
单图情况 宽高70*70
|
120
121
|
};
|
12e66ec8
刘淇
新增树
|
122
|
// 未登录处理:跳转登录页,阻止后续逻辑执行
|
e6a04285
刘淇
单图情况 宽高70*70
|
123
124
125
126
|
if (!isLogin()) {
uni.showToast({ title: '请先登录', icon: 'none', duration: 1500 });
// 延迟跳转,确保提示语正常显示
setTimeout(() => {
|
e6a04285
刘淇
单图情况 宽高70*70
|
127
|
uni.reLaunch({
|
12e66ec8
刘淇
新增树
|
128
|
url: '/pages/login/index',
|
e6a04285
刘淇
单图情况 宽高70*70
|
129
130
131
132
133
134
|
fail: (err) => {
console.error('跳转登录页失败:', err);
uni.showToast({ title: '跳转登录页异常', icon: 'none' });
}
});
}, 1500);
|
e6a04285
刘淇
单图情况 宽高70*70
|
135
|
loading.value = false;
|
e6a04285
刘淇
单图情况 宽高70*70
|
136
137
138
|
return;
}
|
993d98fa
刘淇
工作台
|
139
|
const rawMenuData = userStore.moduleListInfo || cache.get(globalConfig.cache.moduleListKey);
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
140
|
moduleList.value = rawMenuData || [];
|
48ff5b95
刘淇
底部导航
|
141
|
loading.value = false;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
142
143
|
console.log('原始菜单数据:', moduleList.value);
console.log('过滤后有子节点的父模块:', filteredModuleList.value);
|
37c26bd3
刘淇
巡查计划
|
144
145
146
|
} catch (error) {
console.error('获取菜单数据失败:', error);
moduleList.value = [];
|
9b30ab8c
刘淇
新增快速工单,原版
|
147
|
loading.value = false;
|
c293da23
刘淇
新园林init
|
148
|
}
|
37c26bd3
刘淇
巡查计划
|
149
|
});
|
c293da23
刘淇
新园林init
|
150
|
|
37c26bd3
刘淇
巡查计划
|
151
152
|
const handleMenuClick = (item: MenuItem) => {
if (!item.jumpUrl) {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
153
|
uni.showToast({ title: '暂无跳转链接', icon: 'none', duration: 2000 });
|
37c26bd3
刘淇
巡查计划
|
154
|
return;
|
c293da23
刘淇
新园林init
|
155
|
}
|
37c26bd3
刘淇
巡查计划
|
156
157
158
159
|
uni.navigateTo({
url: item.jumpUrl,
fail: (err) => {
console.error('页面跳转失败:', err);
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
160
|
uni.showToast({ title: '页面路径错误', icon: 'none', duration: 2000 });
|
37c26bd3
刘淇
巡查计划
|
161
162
|
}
});
|
c293da23
刘淇
新园林init
|
163
164
165
|
};
</script>
|
48ff5b95
刘淇
底部导航
|
166
|
<style scoped lang="scss">
|
48ff5b95
刘淇
底部导航
|
167
|
.page-container {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
168
169
|
position: relative;
min-height: 100vh;
|
5cb33b90
刘淇
完成巡查计划 详情
|
170
|
}
|
37c26bd3
刘淇
巡查计划
|
171
|
|
37c26bd3
刘淇
巡查计划
|
172
173
174
175
176
|
.blue-decor-block {
position: absolute;
top: 0;
left: 0;
width: 100%;
|
12e66ec8
刘淇
新增树
|
177
178
179
|
height: 280px;
background: url("https://img.jichengshanshui.com.cn:28207/appimg/bg.jpg") no-repeat;
background-size: 100% 100%;
|
37c26bd3
刘淇
巡查计划
|
180
|
z-index: 1;
|
12e66ec8
刘淇
新增树
|
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
color:#fff;
text-align: left;
padding-left: 20px;
.welcome-text {
padding-top: 80px;
font-size: 20px;
display: block;
margin-bottom: 10px;
font-weight: 500;
}
.platform-name {
margin-bottom: 10px;
font-size: 20px;
display: block;
opacity: 0.95;
}
|
c293da23
刘淇
新园林init
|
198
|
}
|
37c26bd3
刘淇
巡查计划
|
199
|
|
37c26bd3
刘淇
巡查计划
|
200
201
202
|
.content-wrap {
position: relative;
z-index: 2;
|
12e66ec8
刘淇
新增树
|
203
|
padding: 150px 0 0;
|
48ff5b95
刘淇
底部导航
|
204
205
|
display: flex;
flex-direction: column;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
206
|
gap: 20rpx;
|
48ff5b95
刘淇
底部导航
|
207
208
|
}
|
48ff5b95
刘淇
底部导航
|
209
210
211
212
|
.menu-card-wrap {
width: 100%;
}
|
48ff5b95
刘淇
底部导航
|
213
|
.card-container {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
214
215
216
|
--u-card-content-padding: 0;
border-radius: 8rpx;
overflow: hidden;
|
48ff5b95
刘淇
底部导航
|
217
218
|
}
|
48ff5b95
刘淇
底部导航
|
219
220
|
.card-content {
display: flex;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
221
222
|
flex-wrap: wrap;
gap: 20rpx;
|
12e66ec8
刘淇
新增树
|
223
|
//padding: 20rpx; // ✅ 优化:增加内边距,内容不贴边
|
48ff5b95
刘淇
底部导航
|
224
225
|
}
|
48ff5b95
刘淇
底部导航
|
226
|
.content-block {
|
48ff5b95
刘淇
底部导航
|
227
|
width: calc((100% - 3 * 20rpx) / 4);
|
48ff5b95
刘淇
底部导航
|
228
229
|
display: flex;
flex-direction: column;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
230
231
232
|
align-items: center;
justify-content: center;
padding: 14rpx 0;
|
48ff5b95
刘淇
底部导航
|
233
|
border-radius: 8rpx;
|
48ff5b95
刘淇
底部导航
|
234
235
|
touch-action: manipulation;
transition: background-color 0.2s;
|
c293da23
刘淇
新园林init
|
236
|
}
|
37c26bd3
刘淇
巡查计划
|
237
|
|
48ff5b95
刘淇
底部导航
|
238
239
240
|
.content-block:active {
background-color: #e9ecef;
}
|
37c26bd3
刘淇
巡查计划
|
241
|
|
48ff5b95
刘淇
底部导航
|
242
|
.block-icon {
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
243
244
|
display: block;
margin: 0 auto;
|
48ff5b95
刘淇
底部导航
|
245
246
|
}
|
37c26bd3
刘淇
巡查计划
|
247
|
.grid-text {
|
48ff5b95
刘淇
底部导航
|
248
|
font-size: 26rpx;
|
37c26bd3
刘淇
巡查计划
|
249
250
251
|
color: #333;
text-align: center;
margin-top: 10rpx;
|
67af4c8e
刘淇
工作台 如果没有子节点就不渲染父节点
|
252
|
display: block;
|
c293da23
刘淇
新园林init
|
253
|
}
|
37c26bd3
刘淇
巡查计划
|
254
|
</style>
|