From 787ad93deea5b3fee1dd4b8f2457da10e7005916 Mon Sep 17 00:00:00 2001 From: Zones <765289303@qq.com> Date: Wed, 10 Jun 2026 14:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E7=84=8A=E6=8E=A5=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/auth.js | 10 +- api/base.js | 11 + api/hj.js | 9 + assets/css/page.scss | 208 +++++++++++++++- assets/icon/nbd-icon.css | 26 +- components/nbd-select-project.vue | 79 +++++- components/nbd-select.vue | 325 +++++++++++++++++++++++++ pages.json | 39 +++ pages/index/index.vue | 155 ++++++++++-- pages/mine/index.vue | 277 +++++++++++++++++++++ pipe/diankou/list.vue | 371 +++++++++++++++++++++++++++++ static/tabs/about-active.png | Bin 0 -> 3649 bytes static/tabs/about.png | Bin 0 -> 1237 bytes static/tabs/application-active.png | Bin 0 -> 4079 bytes static/tabs/application.png | Bin 0 -> 1331 bytes static/tabs/home-active.png | Bin 0 -> 1041 bytes static/tabs/home.png | Bin 0 -> 1167 bytes static/tabs/mine-active.png | Bin 0 -> 1260 bytes static/tabs/mine.png | Bin 0 -> 1418 bytes store/index.js | 2 + store/modules/large.js | 25 ++ store/modules/menu.js | 102 ++++++++ store/modules/user.js | 32 ++- utils/constant.js | 49 ++++ 24 files changed, 1682 insertions(+), 38 deletions(-) create mode 100644 api/base.js create mode 100644 api/hj.js create mode 100644 components/nbd-select.vue create mode 100644 pages/mine/index.vue create mode 100644 pipe/diankou/list.vue create mode 100644 static/tabs/about-active.png create mode 100644 static/tabs/about.png create mode 100644 static/tabs/application-active.png create mode 100644 static/tabs/application.png create mode 100644 static/tabs/home-active.png create mode 100644 static/tabs/home.png create mode 100644 static/tabs/mine-active.png create mode 100644 static/tabs/mine.png create mode 100644 store/modules/large.js create mode 100644 store/modules/menu.js create mode 100644 utils/constant.js diff --git a/api/auth.js b/api/auth.js index e3c852f..6192427 100644 --- a/api/auth.js +++ b/api/auth.js @@ -3,5 +3,13 @@ import { post } from '@/utils/request.js' +/** + * 登录接口 + */ +export const reqLogin = (data) => post('user/postLoginOn', data) -export const reqLogin = (data) => post('user/postLoginOn', data) \ No newline at end of file +/** + * 请求控制权限 + */ + +export const reqMenuPowerList = (userId,projectId)=>get(`User/getMenuPowerList?userId=${userId}&projectId=${projectId}`) \ No newline at end of file diff --git a/api/base.js b/api/base.js new file mode 100644 index 0000000..d05d4e8 --- /dev/null +++ b/api/base.js @@ -0,0 +1,11 @@ +import { + get, + post +} from '@/utils/request.js' + +// BaseInfo/getProjectWorkArea?projectId=0792b983-4de2-44d5-adba-361b7fc99a97& + +/** + * 请求单位工程 + */ +export const reqProjectWorkArea = (projectId)=>get(`BaseInfo/getProjectWorkArea?projectId=${projectId}`) \ No newline at end of file diff --git a/api/hj.js b/api/hj.js new file mode 100644 index 0000000..d2f9bc3 --- /dev/null +++ b/api/hj.js @@ -0,0 +1,9 @@ +import { + get, + post +} from '@/utils/request.js' + +/** + * 获取焊接首页数据 + */ +export const reqHJIndexData = (projectId)=>get(`HJGLIndex/GetJGLIndexItem?projectId=${projectId}`) \ No newline at end of file diff --git a/assets/css/page.scss b/assets/css/page.scss index 843b307..e2ea56b 100644 --- a/assets/css/page.scss +++ b/assets/css/page.scss @@ -26,6 +26,8 @@ // 首页 .home { + padding-top: 80px; + padding-bottom: 60rpx; .u-border-bottom:after { border: none; } @@ -40,7 +42,9 @@ } &-icons { - height: 160rpx; + position: fixed; + top: 95px; + height: 80px; width: 100%; background-color: $u-type-primary; display: flex; @@ -145,4 +149,206 @@ } } } + + // 快捷应用 & 业务查询公共样式 + .section-card { + margin: 20rpx; + background: #fff; + border-radius: 16rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08); + padding: 24rpx; + + .section-title { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 24rpx; + font-size: 28rpx; + font-weight: 600; + color: #333; + + .title-left { + display: flex; + align-items: center; + } + + .title-line { + display: inline-block; + width: 8rpx; + height: 28rpx; + background: $u-type-primary; + border-radius: 4rpx; + margin-right: 16rpx; + } + + .edit-btn { + padding: 8rpx; + opacity: 0.8; + &:active { + opacity: 1; + } + } + } + + .section-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 24rpx 16rpx; + overflow-x: hidden; + } + + .grid-item { + display: flex; + flex-direction: column; + align-items: center; + padding: 16rpx 8rpx; + border-radius: 12rpx; + transition: background 0.2s; + min-width: 0; + + &:active { + background: #f5f6f8; + } + + .icon-box { + width: 100rpx; + height: 100rpx; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + } + + .item-label { + margin-top: 12rpx; + font-size: 22rpx; + color: #666; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + } + } + } + + // 编辑快捷应用弹窗样式 + .edit-quick { + padding: 32rpx 32rpx 0 32rpx; + height: 100%; + display: flex; + flex-direction: column; + box-sizing: border-box; + + .edit-title { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 28rpx; + font-weight: 600; + color: #333; + padding-bottom: 24rpx; + border-bottom: 1rpx solid #f0f0f0; + + .edit-tip { + font-size: 24rpx; + color: #999; + font-weight: 400; + } + } + + .edit-grid { + width: 100%; + overflow-y: scroll; + display: grid; + grid-template-columns: repeat(4, calc(25% - 20rpx)); + gap: 20rpx; + padding: 24rpx 0; + min-height: 0; + box-sizing: border-box; + } + + .edit-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 160rpx; + background: #f8f9fa; + border-radius: 16rpx; + position: relative; + transition: all 0.25s; + box-sizing: border-box; + + &.active { + background: rgba($color: #4a7df5, $alpha: 0.08); + border: 2rpx solid $u-type-primary; + } + + .icon-box { + width: 96rpx; + height: 96rpx; + display: flex; + align-items: center; + justify-content: center; + } + + .edit-label { + margin-top: 14rpx; + font-size: 22rpx; + color: #666; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 100%; + } + + .selected-mark { + position: absolute; + top: 6rpx; + right: 6rpx; + width: 40rpx; + height: 40rpx; + border-radius: 50%; + background: $u-type-primary; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 4rpx 12rpx rgba($color: $u-type-primary, $alpha: 0.3); + } + } + + .edit-btns { + display: flex; + gap: 24rpx; + padding-top: 20rpx; + padding-bottom: 10rpx; + position: absolute; + bottom: 10px;left:0;right:0; + .u-size-medium { + width: 40%; + } + .btn-cancel, + .btn-confirm { + height: 88rpx; + font-size: 30rpx; + border: none; + &::after { + border: none; + } + + } + + .btn-cancel { + background: #f5f6f8; + color: #666; + } + + .btn-confirm { + box-shadow: 0 4rpx 16rpx rgba($color: $u-type-primary, $alpha: 0.25); + } + } + } } \ No newline at end of file diff --git a/assets/icon/nbd-icon.css b/assets/icon/nbd-icon.css index 681d5ae..703c758 100644 --- a/assets/icon/nbd-icon.css +++ b/assets/icon/nbd-icon.css @@ -1,8 +1,8 @@ @font-face { font-family: "nbd-icon"; /* Project id 5193086 */ - src: url('//at.alicdn.com/t/c/font_5193086_zgg3m1cv22e.woff2?t=1781003671405') format('woff2'), - url('//at.alicdn.com/t/c/font_5193086_zgg3m1cv22e.woff?t=1781003671405') format('woff'), - url('//at.alicdn.com/t/c/font_5193086_zgg3m1cv22e.ttf?t=1781003671405') format('truetype'); + src: url('//at.alicdn.com/t/c/font_5193086_dyc00qt3bz.woff2?t=1781056075220') format('woff2'), + url('//at.alicdn.com/t/c/font_5193086_dyc00qt3bz.woff?t=1781056075220') format('woff'), + url('//at.alicdn.com/t/c/font_5193086_dyc00qt3bz.ttf?t=1781056075220') format('truetype'); } .nbd-icon { @@ -13,6 +13,26 @@ -moz-osx-font-smoothing: grayscale; } +.nbd-icon-a-facheguanli:before { + content: "\e683"; +} + +.nbd-icon-yuzhijian:before { + content: "\e647"; +} + +.nbd-icon-baozhuangguanli:before { + content: "\e60e"; +} + +.nbd-icon-diankouguanli:before { + content: "\e60f"; +} + +.nbd-icon-shiyabao:before { + content: "\e657"; +} + .nbd-icon-daiban:before { content: "\e612"; } diff --git a/components/nbd-select-project.vue b/components/nbd-select-project.vue index 62e7048..7308452 100644 --- a/components/nbd-select-project.vue +++ b/components/nbd-select-project.vue @@ -12,9 +12,13 @@ - {{item[props.labelKey]}} + + {{ item[props.labelKey] }} + 暂无匹配项目 @@ -24,7 +28,8 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/components/nbd-select.vue b/components/nbd-select.vue new file mode 100644 index 0000000..f014e7c --- /dev/null +++ b/components/nbd-select.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/pages.json b/pages.json index e1fa50f..c3d5b98 100644 --- a/pages.json +++ b/pages.json @@ -20,8 +20,47 @@ "navigationBarTitleText": "首页", "navigationStyle": "custom" } + }, + { + "path": "pages/mine/index", + "style": { + "navigationBarTitleText": "我的" + } } ], + "subPackages": [ + { + "root": "pipe", + "pages": [ + { + "path": "diankou/list", + "style": { + "navigationBarTitleText": "点口管理" + } + } + ] + } + ], + "tabBar": { + "color": "#cbcbcb", + "backgroundColor": "#2979ff", + "selectedColor": "#ffffff", + "borderStyle": "black", + "list": [{ + "text": "首页", + "pagePath": "pages/index/index", + "iconPath": "/static/tabs/home.png", + "selectedIconPath": "/static/tabs/home-active.png" + }, + { + "text": "个人中心", + "pagePath": "pages/mine/index", + "iconPath": "static/tabs/mine.png", + "selectedIconPath": "static/tabs/mine-active.png" + } + ], + "position": "bottom" + }, "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "施工管理", diff --git a/pages/index/index.vue b/pages/index/index.vue index a9c98b6..f6b5d46 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -7,7 +7,7 @@ - + 扫一扫 @@ -18,48 +18,112 @@ - 项目管道实时预制率 工厂焊接一次合格率 - 99.5% + {{hjIndexData?.GCFirstPassRate}} 现场焊接一次合格率 - 0% + {{hjIndexData?.XCFirstPassRate}} 工厂预制进度 - 49229.500/286639.000 DIN + {{hjIndexData?.GCProgress}} 现场焊接进度 - 5906.500/84951.000 DIN + {{hjIndexData?.XCProgress}} 工厂焊工功效 - 252 DIN/天 + {{hjIndexData?.GCWelderEfficacy}} 现场焊接功效 - 95 DIN/天 + {{hjIndexData?.XCWelderEfficacy}} 项目管道实时预制率 (包含工厂和现场的预制口) - 13% + {{hjIndexData?.PipePrefabricationRate}} - + + + + + + 快捷应用 + + + + + + + + + {{ item.name }} + + + + + + + + + + + + 业务查询 + + + + + + + + {{ item.name }} + + + + + + + + + 选择快捷应用 + + + + + + + {{ item.name }} + + + + + + + 取消 + 确定 + + + + label-key="ProjectName" value-key="ProjectId" :search-key="projectNameKeyword" + @search-change="handleSearchChange" @confirm="handleConfirmProject" /> @@ -73,13 +137,18 @@ ref } from 'vue' import { - useUserStore + useUserStore, + useMenuStore, + useLargeStore } from '@/store'; + import { storeToRefs } from 'pinia'; const userStore = useUserStore() + const menuStore = useMenuStore() + const largeStore = useLargeStore() const { setProjectList, setCurrentProject @@ -89,12 +158,52 @@ projectList, currentProject } = storeToRefs(userStore) + const { + quickApps, + queryApps, + editCache + } = storeToRefs(menuStore) + const { + hjIndexData + } = storeToRefs(largeStore) + const { + pastelColors + } = menuStore const navbarBg = reactive({ backgroundColor: "var(--u-type-primary)" }) + const projectNameKeyword = ref('') const showProject = ref(false) - - const currentProjectName = computed(()=>currentProject.value?.ProjectName||'') + const showEditQuick = ref(false) + + const currentProjectName = computed(() => currentProject.value?.ProjectName || '') + + const handleSkip= (item) => { + uni.navigateTo({ + url: item.path + }) + } + + // 打开编辑弹窗 + const openEditQuick = () => { + menuStore.openEdit() + showEditQuick.value = true + } + + // 切换选择状态 + const toggleSelect = (item) => { + menuStore.toggleSelect(item) + } + + // 确认编辑 + const handleConfirmEdit = () => { + menuStore.confirmEdit() + showEditQuick.value = false + uni.showToast({ + title: '已更新快捷应用', + icon: 'success' + }) + } const handleShowProjectSelect = () => { reqProjectByUserId(userInfo.value.PersonId).then(res => { @@ -105,24 +214,30 @@ /** * 项目列表点击确认 */ - const handleConfirmProject = (item)=>{ + const handleConfirmProject = (item) => { setCurrentProject(item) showProject.value = false } - + /** + * 项目按名称搜索 + */ + const handleSearchChange = (keyword) => { + projectNameKeyword.value = keyword + } + /** * 扫一扫 */ - const handleScan = ()=>{ + const handleScan = () => { uni.scanCode({ onlyFromCamera: true, - success (res) { + success(res) { console.log('条码类型:' + res.scanType); console.log('条码内容:' + res.result); }, fail(err) { - console.log("扫码失败了====>",err) + console.log("扫码失败了====>", err) } }); } - + \ No newline at end of file diff --git a/pages/mine/index.vue b/pages/mine/index.vue new file mode 100644 index 0000000..ee5832e --- /dev/null +++ b/pages/mine/index.vue @@ -0,0 +1,277 @@ + + + + + \ No newline at end of file diff --git a/pipe/diankou/list.vue b/pipe/diankou/list.vue new file mode 100644 index 0000000..d999a42 --- /dev/null +++ b/pipe/diankou/list.vue @@ -0,0 +1,371 @@ + + + + + diff --git a/static/tabs/about-active.png b/static/tabs/about-active.png new file mode 100644 index 0000000000000000000000000000000000000000..da56d0fc35771d2f94418f8d852bd239160ed736 GIT binary patch literal 3649 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 IW$W<&0KZn=O#lD@ literal 0 HcmV?d00001 diff --git a/static/tabs/about.png b/static/tabs/about.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9e1aad16c2ae61db358c88f193717163fe5268 GIT binary patch literal 1237 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 literal 0 HcmV?d00001 diff --git a/static/tabs/application.png b/static/tabs/application.png new file mode 100644 index 0000000000000000000000000000000000000000..06e3e3d18509aa12b114b13158faf0ae19a3a3c0 GIT binary patch literal 1331 zcmV-31oS22{v8QDdknDU|hGix7Uy3 z_%Fs--*Yx9YFHG-C!f-sK(vt0jIo{2j{|@S030`IQY+{m#@J!#*?Qf%5aNQ`Ljvjb zdM8m7A&6C;DP!zd2r;5I@9yq)H#Ro@T}DCXIRJ1er98FIt^rBY6t(nq6$HkfX`bf? zlq)1ja>F?@@nR_chv>*Rx9X57vymzmji$ueQvD>vZstSih?gZL%JppFn@Q(7Ez&>IroXYDy0tX z*m7M@qn3vb=IIrTv?j~4L*Kw)jk(#ZD2fxx&AlCBr_;evkbMd10)jLjM>gdJr4O-A zr+CF2I%c|7N}ai~T;uRT_u2R_9OS=Q0KgOghDxbXQ(tWZLpR>s+{CjFU46V#3ghOo pDNQ#5S=NDHYW*9Km(sjT?su{|kYI`w*9!mu002ovPDHLkV1hADWwQVP literal 0 HcmV?d00001 diff --git a/static/tabs/home-active.png b/static/tabs/home-active.png new file mode 100644 index 0000000000000000000000000000000000000000..c2abb1700195b82d2122f59fbb26144de9026e48 GIT binary patch literal 1041 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 { + const hjIndexData = ref(null) + + /** + * 获取焊接首页数据 + */ + const fetchHJIndex = (projectId)=>{ + reqHJIndexData(projectId).then(res=>{ + hjIndexData.value = res.data + }) + } + return { + hjIndexData, + fetchHJIndex + } +}) diff --git a/store/modules/menu.js b/store/modules/menu.js new file mode 100644 index 0000000..1391eb8 --- /dev/null +++ b/store/modules/menu.js @@ -0,0 +1,102 @@ +import { + defineStore +} from 'pinia' +import { + ref, + computed +} from 'vue' +import {pastelColors,defaultApps} from '@/utils/constant.js' +import {reqMenuPowerList} from '@/api/auth.js' + +export const useMenuStore = defineStore('menu', () => { + // 应用列表(默认配置 + 持久化) + const appsList = ref([...defaultApps]) + // 编辑时的临时缓存 + const editCache = ref([]) + // 菜单的权限列表(后端返回的有权限的菜单 code 数组) + const menuProwerList = ref([]) + + // 快捷应用列表(已选择的) + const quickApps = computed(() => appsList.value.filter(app => app.selected&&hasMenuPermission(app.menuId))) + + // 业务查询列表(未选择的) + const queryApps = computed(() => appsList.value.filter(app => !app.selected&&hasMenuPermission(app.menuId))) + + /** + * 打开编辑弹窗(备份当前状态) + */ + const openEdit = () => { + editCache.value = appsList.value.filter(app => hasMenuPermission(app.menuId)) + } + + /** + * 切换应用选择状态 + */ + const toggleSelect = (item) => { + item.selected = !item.selected + } + + /** + * 确认编辑(保存更改) + */ + const confirmEdit = () => { + appsList.value = editCache.value.map(app => ({ ...app })) + } + + /** + * 请求菜单权限列表 + */ + const fetchMenuPowerList = async (userId, projectId) => { + if (!userId || !projectId) return + try { + const res = await reqMenuPowerList(userId, projectId) + menuProwerList.value = res.data || [] + } catch (err) { + console.error('获取菜单权限失败:', err) + menuProwerList.value = [] + } + } + + /** + * 判断菜单是否有权限打开 + * @param {string} menuCode - 菜单编码/标识 + * @returns {boolean} 是否有权限 + */ + const hasMenuPermission = (menuCode) => { + if (!menuCode) return true + return menuProwerList.value.includes(menuCode) + } + + /** + * 根据权限过滤快捷应用 + */ + const quickAppsWithPermission = computed(() => { + if (menuProwerList.value.length === 0) return quickApps.value + return quickApps.value.filter(app => { + return hasMenuPermission(app.permissionCode) + }) + }) + + return { + appsList, + editCache, + quickApps, + quickAppsWithPermission, + queryApps, + menuProwerList, + pastelColors, + openEdit, + toggleSelect, + confirmEdit, + fetchMenuPowerList, + hasMenuPermission + } +}, { + persist: { + enabled: true, + strategies: [{ + key: 'menu', + paths: [], + }] + }, +}) diff --git a/store/modules/user.js b/store/modules/user.js index 2a29055..f6cb338 100644 --- a/store/modules/user.js +++ b/store/modules/user.js @@ -2,12 +2,13 @@ import { defineStore } from 'pinia' import { - ref + ref, + watch } from 'vue' import { reqLogin } from '@/api/auth.js' - +import { useMenuStore, useLargeStore } from '@/store' export const useUserStore = defineStore('user', () => { const token = ref("") const userInfo = ref(null) @@ -20,6 +21,20 @@ export const useUserStore = defineStore('user', () => { const projectList = ref([]) const currentProject = ref(null) + // 监听 currentProject 变化,获取菜单权限 + watch(() => currentProject.value?.ProjectId, (newId) => { + if (newId) { + // 项目变化 请求菜单权限 + const menuStore = useMenuStore() + const userId = userInfo.value?.PersonId + menuStore.fetchMenuPowerList(userId, newId) + // 项目变化 请求焊接首页数据 + const largeStore = useLargeStore() + largeStore.fetchHJIndex(newId) + + } + }, { immediate: true }) + /** * 登出 @@ -27,11 +42,11 @@ export const useUserStore = defineStore('user', () => { const logout = () => { token.value = "" userInfo.value = null - loginForm.value = { - account: '', - password: '', - Telephone: '', - } + // loginForm.value = { + // account: '', + // password: '', + // Telephone: '', + // } currentProject.value = null } @@ -79,7 +94,8 @@ export const useUserStore = defineStore('user', () => { projectList, currentProject, setProjectList, - setCurrentProject + setCurrentProject, + logout } }, { persist: { diff --git a/utils/constant.js b/utils/constant.js new file mode 100644 index 0000000..f12539d --- /dev/null +++ b/utils/constant.js @@ -0,0 +1,49 @@ +// 淡雅配色方案(马卡龙色系) +export const pastelColors = [ + '#7eb6ff', // 淡蓝 + '#ffb787', // 淡橙 + '#8fd6a8', // 淡绿 + '#b99bf8', // 淡紫 + '#ff8fa3', // 淡粉 + '#80deea', // 青色 + '#ffd56b', // 淡黄 +] + +// 默认应用配置 +export const defaultApps = [{ + name: '点口管理', + icon: 'diankouguanli', + menuId: '3ACE25CE-C5CE-4CEC-AD27-0D5CF1DF2F01', + path: "/pipe/diankou/list", + prefix: 'nbd-icon', + selected: true + }, + { + name: '试压管理', + icon: 'shiyabao', + menuId: '55976B16-2C33-406E-B514-2FE42D031071', + prefix: 'nbd-icon', + selected: true + }, + { + name: '包装管理', + icon: 'baozhuangguanli', + menuId: "25DED954-10C9-47CC-99F2-C44FDE9E0A81", + prefix: 'nbd-icon', + selected: true + }, + { + name: '发货管理', + icon: 'a-facheguanli', + menuId: "EEC0D060-C15E-4D25-B015-C2B91F735DAC", + prefix: 'nbd-icon', + selected: true + }, + { + name: '预制组件管理', + icon: 'yuzhijian', + menuId: "8255554C-0A92-4C7B-BF19-779AF0220A8C", + prefix: 'nbd-icon', + selected: true + } +] \ No newline at end of file