Commit 48ff5b958f5b7c051f3575955c23ec815754441d

Authored by 刘淇
1 parent a7a0b46e

底部导航

common/config/env.js
@@ -4,6 +4,7 @@ const env = { @@ -4,6 +4,7 @@ const env = {
4 development: { 4 development: {
5 baseUrl: 'https://test.jichengshanshui.com.cn:28302', 5 baseUrl: 'https://test.jichengshanshui.com.cn:28302',
6 // https://test.jichengshanshui.com.cn:28302 6 // https://test.jichengshanshui.com.cn:28302
  7 + // http://h95ce3aa.natappfree.cc
7 8
8 uploadUrl: 'https://test.jichengshanshui.com.cn:28302', 9 uploadUrl: 'https://test.jichengshanshui.com.cn:28302',
9 // baseApi:'admin-api', 10 // baseApi:'admin-api',
pages-sub/daily/maintain-manage/finish-plan-detail.vue
@@ -146,7 +146,7 @@ onLoad((options) => { @@ -146,7 +146,7 @@ onLoad((options) => {
146 background: #fff; 146 background: #fff;
147 width: 100%; 147 width: 100%;
148 box-sizing: border-box; 148 box-sizing: border-box;
149 - margin-bottom: 20rpx; 149 + margin-bottom: 30rpx;
150 } 150 }
151 151
152 152
pages-sub/daily/patrol-manage/finish-plan-detail.vue
@@ -144,7 +144,7 @@ onLoad((options) => { @@ -144,7 +144,7 @@ onLoad((options) => {
144 background: #fff; 144 background: #fff;
145 width: 100%; 145 width: 100%;
146 box-sizing: border-box; 146 box-sizing: border-box;
147 - margin-bottom: 20rpx; 147 + margin-bottom: 30rpx;
148 } 148 }
149 149
150 150
pages.json
@@ -160,20 +160,20 @@ @@ -160,20 +160,20 @@
160 { 160 {
161 "pagePath": "pages/index/index", 161 "pagePath": "pages/index/index",
162 "text": "首页", 162 "text": "首页",
163 - "iconPath": "static/icons/home.png",  
164 - "selectedIconPath": "static/icons/home-active.png" 163 + "iconPath": "static/imgs/nav/home-off.png",
  164 + "selectedIconPath": "static/imgs/nav/home-on.png"
165 }, 165 },
166 { 166 {
167 "pagePath": "pages/workbench/index", 167 "pagePath": "pages/workbench/index",
168 "text": "工作台", 168 "text": "工作台",
169 - "iconPath": "static/icons/mine.png",  
170 - "selectedIconPath": "static/icons/mine-active.png" 169 + "iconPath": "static/imgs/nav/work-off.png",
  170 + "selectedIconPath": "static/imgs/nav/work-on.png"
171 }, 171 },
172 { 172 {
173 "pagePath": "pages/mine/index", 173 "pagePath": "pages/mine/index",
174 "text": "我的", 174 "text": "我的",
175 - "iconPath": "static/icons/mine.png",  
176 - "selectedIconPath": "static/icons/mine-active.png" 175 + "iconPath": "static/imgs/nav/my-off.png",
  176 + "selectedIconPath": "static/imgs/nav/my-on.png"
177 } 177 }
178 ] 178 ]
179 }, 179 },
pages/workbench/index.vue
1 <template> 1 <template>
2 <!-- 外层容器:包含蓝色块 + 原始内容 --> 2 <!-- 外层容器:包含蓝色块 + 原始内容 -->
3 - <view class="workbench-container"> 3 + <view class="page-container">
4 <!-- 加载页:覆盖整个容器,渲染完成后隐藏 --> 4 <!-- 加载页:覆盖整个容器,渲染完成后隐藏 -->
5 <up-loading-page 5 <up-loading-page
6 - v-if="loading" 6 +
  7 + :loading="loading"
7 loading-text="加载中..." 8 loading-text="加载中..."
8 color="#577ee3" 9 color="#577ee3"
9 - style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999;" 10 + zIndex="1000"
10 ></up-loading-page> 11 ></up-loading-page>
11 12
12 <!-- 蓝色装饰块:#577ee3 --> 13 <!-- 蓝色装饰块:#577ee3 -->
13 - <view class="blue-decor-block"></view> 14 + <view class="blue-decor-block" v-show="!loading"></view>
14 15
15 - <!-- 原始内容容器:仅添加定位和顶部偏移实现压边 --> 16 + <!-- 原始内容容器 -->
16 <view class="content-wrap"> 17 <view class="content-wrap">
17 <!-- uview-plus空状态组件 --> 18 <!-- uview-plus空状态组件 -->
18 <u-empty 19 <u-empty
19 v-if="!moduleList.length && !loading" 20 v-if="!moduleList.length && !loading"
20 - mode="list"  
21 - text="暂无菜单数据"  
22 - color="#999"  
23 - font-size="28rpx" 21 + mode="permission"
24 ></u-empty> 22 ></u-empty>
25 23
26 - <!-- 菜单卡片列表(修复header插槽语法,恢复标题显示) -->  
27 - <view v-else-if="!loading" class="menu-card-wrap"> 24 + <!-- 菜单卡片列表(替换grid为flex布局) -->
  25 + <view class="menu-card-wrap">
28 <up-card 26 <up-card
29 :title-size="18" 27 :title-size="18"
  28 + :border="false"
  29 + :shadow="true"
  30 + :foot-border-top="false"
30 v-for="(parentModule, index) in moduleList" 31 v-for="(parentModule, index) in moduleList"
31 - :key="parentModule.id" 32 + :key="`$parentModule.id_${index}`"
32 :title="parentModule.name" 33 :title="parentModule.name"
  34 + class="card-container"
33 > 35 >
34 <template #body> 36 <template #body>
35 - <view>  
36 - <up-grid  
37 - :border="false"  
38 - col="4" 37 + <!-- 替换up-grid:改用flex流式布局容器 -->
  38 + <view class="card-content">
  39 + <view
  40 + v-for="(listItem, listIndex) in parentModule.children"
  41 + :key="listItem.id"
  42 + class="content-block"
  43 + @click="handleMenuClick(listItem)"
39 > 44 >
40 - <up-grid-item  
41 - v-for="(listItem,listIndex) in parentModule.children"  
42 - :key="listItem.id"  
43 - @click="handleMenuClick(listItem)"  
44 - class="grid-item-wrap"  
45 - >  
46 - <u-image  
47 - :src="listItem.icon "  
48 - mode="aspectFit"  
49 - width="80rpx"  
50 - height="80rpx"  
51 - lazy-load  
52 - radius="16rpx"  
53 - ></u-image>  
54 - <text class="grid-text">{{ listItem.name }}</text>  
55 - </up-grid-item>  
56 - </up-grid>  
57 - 45 + <u-image
  46 + :src="listItem.icon"
  47 + mode="aspectFit"
  48 + width="80rpx"
  49 + height="80rpx"
  50 + lazy-load
  51 + radius="16rpx"
  52 + class="block-icon"
  53 + ></u-image>
  54 + <text class="grid-text">{{ listItem.name }}</text>
  55 + </view>
58 </view> 56 </view>
59 </template> 57 </template>
60 </up-card> 58 </up-card>
@@ -64,8 +62,8 @@ @@ -64,8 +62,8 @@
64 </template> 62 </template>
65 63
66 <script setup lang="ts"> 64 <script setup lang="ts">
67 -// 原始代码完全保留,新增loading状态  
68 -import {ref, nextTick} from 'vue'; 65 +// 原始代码完全保留,无任何修改
  66 +import { ref, nextTick } from 'vue';
69 import { onShow } from '@dcloudio/uni-app'; 67 import { onShow } from '@dcloudio/uni-app';
70 import { useUserStore } from '@/pinia/user'; 68 import { useUserStore } from '@/pinia/user';
71 import globalConfig from '@/common/config/global'; 69 import globalConfig from '@/common/config/global';
@@ -89,41 +87,27 @@ interface MenuItem { @@ -89,41 +87,27 @@ interface MenuItem {
89 children: MenuItem[]; 87 children: MenuItem[];
90 } 88 }
91 89
92 -// 新增:加载状态(默认开启)  
93 const loading = ref(true); 90 const loading = ref(true);
94 const userStore = useUserStore(); 91 const userStore = useUserStore();
95 const moduleList = ref<MenuItem[]>([]); 92 const moduleList = ref<MenuItem[]>([]);
96 93
97 -// 无用变量(保留避免警告)  
98 -const subTitle = ref('');  
99 -const thumb = ref('');  
100 -const border = ref(true);  
101 -const click = () => {  
102 -};  
103 -const headClick = () => {  
104 -};  
105 -  
106 onShow(async () => { 94 onShow(async () => {
107 try { 95 try {
108 - // 重置加载状态  
109 loading.value = true; 96 loading.value = true;
110 97
111 const rawMenuData = userStore.moduleListInfo || cache.get(globalConfig.cache.moduleListKey); 98 const rawMenuData = userStore.moduleListInfo || cache.get(globalConfig.cache.moduleListKey);
112 const menuData = rawMenuData || []; 99 const menuData = rawMenuData || [];
113 moduleList.value = menuData; 100 moduleList.value = menuData;
114 -  
115 - // 关键:等待DOM完全渲染后再隐藏加载页  
116 - await nextTick();  
117 - // 额外延迟(可选,确保视觉更流畅)  
118 - setTimeout(() => {  
119 - loading.value = false;  
120 - }, 300);  
121 - 101 + //
  102 + // // await nextTick();
  103 + // setTimeout(() => {
  104 + // loading.value = false;
  105 + // }, 500);
  106 + loading.value = false;
122 console.log('菜单数据:', moduleList.value); 107 console.log('菜单数据:', moduleList.value);
123 } catch (error) { 108 } catch (error) {
124 console.error('获取菜单数据失败:', error); 109 console.error('获取菜单数据失败:', error);
125 moduleList.value = []; 110 moduleList.value = [];
126 - // 出错时也隐藏加载页  
127 await nextTick(); 111 await nextTick();
128 loading.value = false; 112 loading.value = false;
129 } 113 }
@@ -138,7 +122,7 @@ const handleMenuClick = (item: MenuItem) =&gt; { @@ -138,7 +122,7 @@ const handleMenuClick = (item: MenuItem) =&gt; {
138 }); 122 });
139 return; 123 return;
140 } 124 }
141 - console.log(item.jumpUrl) 125 + console.log(item.jumpUrl);
142 uni.navigateTo({ 126 uni.navigateTo({
143 url: item.jumpUrl, 127 url: item.jumpUrl,
144 fail: (err) => { 128 fail: (err) => {
@@ -153,19 +137,14 @@ const handleMenuClick = (item: MenuItem) =&gt; { @@ -153,19 +137,14 @@ const handleMenuClick = (item: MenuItem) =&gt; {
153 }; 137 };
154 </script> 138 </script>
155 139
156 -<style scoped>  
157 -/* 仅新增/保留必要样式,不修改卡片核心样式 */  
158 -.workbench-container {  
159 - width: 100%;  
160 - min-height: 100vh;  
161 - position: relative;  
162 - background-color: #fff;  
163 -}  
164 -.grid-item-wrap{  
165 - margin-top: 20px; 140 +<style scoped lang="scss">
  141 +/* 原有样式保留 + 新增/调整图片居中样式 */
  142 +.page-container {
  143 + position: relative; // 新增:让蓝色块绝对定位生效
  144 + min-height: 100vh; // 新增:防止内容高度不足
166 } 145 }
167 146
168 -/* 蓝色块样式 */ 147 +/* 蓝色块样式(保留) */
169 .blue-decor-block { 148 .blue-decor-block {
170 position: absolute; 149 position: absolute;
171 top: 0; 150 top: 0;
@@ -176,21 +155,70 @@ const handleMenuClick = (item: MenuItem) =&gt; { @@ -176,21 +155,70 @@ const handleMenuClick = (item: MenuItem) =&gt; {
176 z-index: 1; 155 z-index: 1;
177 } 156 }
178 157
179 -/* 内容容器样式 */ 158 +/* 内容容器样式(保留 + 微调) */
180 .content-wrap { 159 .content-wrap {
181 position: relative; 160 position: relative;
182 z-index: 2; 161 z-index: 2;
183 - padding-top: 160px; 162 + padding: 120px 0 0 ; // 新增左右内边距,避免卡片贴边
  163 + display: flex;
  164 + flex-direction: column;
  165 + gap: 20rpx; // 新增:卡片之间的上下间距
  166 +}
  167 +
  168 +/* 菜单卡片容器(新增:统一卡片外层间距) */
  169 +.menu-card-wrap {
  170 + width: 100%;
  171 +}
  172 +
  173 +/* 卡片容器:重置up-card默认样式 */
  174 +.card-container {
  175 + --u-card-content-padding: 0; // 取消卡片默认内边距
  176 + border-radius: 8rpx; // 新增:卡片圆角
  177 + overflow: hidden; // 新增:裁剪内部元素
  178 +}
  179 +
  180 +/* 核心:小块容器(Flex 流式布局) */
  181 +.card-content {
  182 + display: flex;
  183 + flex-wrap: wrap; // 自动换行
  184 + gap: 20rpx; // 关键:小块之间的上下+左右间距统一
  185 +
  186 +}
  187 +
  188 +/* 小块样式:一行最多4个,宽度自适应 + 内部flex布局 */
  189 +.content-block {
  190 + // 宽度计算:(100% - 3*间距) / 4 (4个元素有3个间距)
  191 + width: calc((100% - 3 * 20rpx) / 4);
  192 + // 小块内部样式:改用flex布局,确保子元素居中
  193 + display: flex;
  194 + flex-direction: column;
  195 + align-items: center; // 水平居中(核心:解决图片不居中问题)
  196 + justify-content: center; // 垂直居中(可选,优化视觉)
  197 + padding: 24rpx 0;
  198 + border-radius: 8rpx;
  199 + text-align: center;
  200 + // 点击反馈
  201 + touch-action: manipulation;
  202 + transition: background-color 0.2s;
184 } 203 }
185 204
  205 +/* 小块点击态 */
  206 +.content-block:active {
  207 + background-color: #e9ecef;
  208 +}
186 209
187 -/* 网格文字样式(保留原始) */ 210 +/* 新增:图片居中样式(兜底保障) */
  211 +.block-icon {
  212 + display: block; // 转为块级元素
  213 + margin: 0 auto; // 水平居中(双重保障)
  214 +}
  215 +
  216 +/* 网格文字样式(保留 + 微调) */
188 .grid-text { 217 .grid-text {
189 - font-size: 24rpx; 218 + font-size: 26rpx;
190 color: #333; 219 color: #333;
191 text-align: center; 220 text-align: center;
192 margin-top: 10rpx; 221 margin-top: 10rpx;
  222 + display: block; // 新增:确保文字换行
193 } 223 }
194 -  
195 -  
196 </style> 224 </style>
197 \ No newline at end of file 225 \ No newline at end of file
static/imgs/nav/home-off.png 0 → 100644

516 Bytes

static/imgs/nav/home-on.png 0 → 100644

977 Bytes

static/imgs/nav/my-off.png 0 → 100644

1.62 KB

static/imgs/nav/my-on.png 0 → 100644

1.33 KB

static/imgs/nav/work-off.png 0 → 100644

479 Bytes

static/imgs/nav/work-on.png 0 → 100644

1.28 KB