Blame view

pages/workbench/index.vue 6.77 KB
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>