Blame view

pages/workbench/index.vue 4.64 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;
993d98fa   刘淇   工作台
101
      const rawMenuData = userStore.moduleListInfo || cache.get(globalConfig.cache.moduleListKey);
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
102
      moduleList.value = rawMenuData || [];
48ff5b95   刘淇   底部导航
103
      loading.value = false;
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
104
105
      console.log('原始菜单数据:', moduleList.value);
      console.log('过滤后有子节点的父模块:', filteredModuleList.value);
37c26bd3   刘淇   巡查计划
106
107
108
    } catch (error) {
      console.error('获取菜单数据失败:', error);
      moduleList.value = [];
9b30ab8c   刘淇   新增快速工单,原版
109
      loading.value = false;
c293da23   刘淇   新园林init
110
    }
37c26bd3   刘淇   巡查计划
111
  });
c293da23   刘淇   新园林init
112
  
37c26bd3   刘淇   巡查计划
113
114
  const handleMenuClick = (item: MenuItem) => {
    if (!item.jumpUrl) {
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
115
      uni.showToast({ title: '暂无跳转链接', icon: 'none', duration: 2000 });
37c26bd3   刘淇   巡查计划
116
      return;
c293da23   刘淇   新园林init
117
    }
37c26bd3   刘淇   巡查计划
118
119
120
121
    uni.navigateTo({
      url: item.jumpUrl,
      fail: (err) => {
        console.error('页面跳转失败:', err);
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
122
        uni.showToast({ title: '页面路径错误', icon: 'none', duration: 2000 });
37c26bd3   刘淇   巡查计划
123
124
      }
    });
c293da23   刘淇   新园林init
125
126
127
  };
  </script>
  
48ff5b95   刘淇   底部导航
128
  <style scoped lang="scss">
48ff5b95   刘淇   底部导航
129
  .page-container {
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
130
131
    position: relative;
    min-height: 100vh;
5cb33b90   刘淇   完成巡查计划 详情
132
  }
37c26bd3   刘淇   巡查计划
133
  
37c26bd3   刘淇   巡查计划
134
135
136
137
138
139
140
141
  .blue-decor-block {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 200px;
    background-color: #577ee3;
    z-index: 1;
c293da23   刘淇   新园林init
142
  }
37c26bd3   刘淇   巡查计划
143
  
37c26bd3   刘淇   巡查计划
144
145
146
  .content-wrap {
    position: relative;
    z-index: 2;
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
147
    padding: 120px 0 0;
48ff5b95   刘淇   底部导航
148
149
    display: flex;
    flex-direction: column;
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
150
    gap: 20rpx;
48ff5b95   刘淇   底部导航
151
152
  }
  
48ff5b95   刘淇   底部导航
153
154
155
156
  .menu-card-wrap {
    width: 100%;
  }
  
48ff5b95   刘淇   底部导航
157
  .card-container {
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
158
159
160
    --u-card-content-padding: 0;
    border-radius: 8rpx;
    overflow: hidden;
48ff5b95   刘淇   底部导航
161
162
  }
  
48ff5b95   刘淇   底部导航
163
164
  .card-content {
    display: flex;
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
165
166
    flex-wrap: wrap;
    gap: 20rpx;
48ff5b95   刘淇   底部导航
167
168
  }
  
48ff5b95   刘淇   底部导航
169
  .content-block {
48ff5b95   刘淇   底部导航
170
    width: calc((100% - 3 * 20rpx) / 4);
48ff5b95   刘淇   底部导航
171
172
    display: flex;
    flex-direction: column;
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
173
174
175
    align-items: center;
    justify-content: center;
    padding: 14rpx 0;
48ff5b95   刘淇   底部导航
176
    border-radius: 8rpx;
48ff5b95   刘淇   底部导航
177
178
    touch-action: manipulation;
    transition: background-color 0.2s;
c293da23   刘淇   新园林init
179
  }
37c26bd3   刘淇   巡查计划
180
  
48ff5b95   刘淇   底部导航
181
182
183
  .content-block:active {
    background-color: #e9ecef;
  }
37c26bd3   刘淇   巡查计划
184
  
48ff5b95   刘淇   底部导航
185
  .block-icon {
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
186
187
    display: block;
    margin: 0 auto;
48ff5b95   刘淇   底部导航
188
189
  }
  
37c26bd3   刘淇   巡查计划
190
  .grid-text {
48ff5b95   刘淇   底部导航
191
    font-size: 26rpx;
37c26bd3   刘淇   巡查计划
192
193
194
    color: #333;
    text-align: center;
    margin-top: 10rpx;
67af4c8e   刘淇   工作台 如果没有子节点就不渲染父节点
195
    display: block;
c293da23   刘淇   新园林init
196
  }
37c26bd3   刘淇   巡查计划
197
  </style>