Blame view

pages/workbench/index.vue 5.88 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
      <!-- 蓝色装饰块 -->
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>