Commit 48ff5b958f5b7c051f3575955c23ec815754441d
1 parent
a7a0b46e
底部导航
Showing
11 changed files
with
111 additions
and
82 deletions
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) => { | @@ -138,7 +122,7 @@ const handleMenuClick = (item: MenuItem) => { | ||
| 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) => { | @@ -153,19 +137,14 @@ const handleMenuClick = (item: MenuItem) => { | ||
| 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) => { | @@ -176,21 +155,70 @@ const handleMenuClick = (item: MenuItem) => { | ||
| 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