From 9ec6b9818c2df812ce086472093ff6ce9cff01ba Mon Sep 17 00:00:00 2001 From: Teo <2642673902@qq.com> Date: Thu, 28 Aug 2025 20:10:46 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9D=83=E9=99=90?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E4=BE=9B=E5=BA=94=E5=95=86=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/project/contractor/types.ts | 16 ++- src/api/supplierInput/supplierInput/index.ts | 2 +- src/components/ProjectSelector/index.vue | 6 ++ src/permission.ts | 105 ++++++++++--------- src/store/modules/user.ts | 1 + src/views/materials/purchaseDoc/index.vue | 12 ++- src/views/project/contractor/index.vue | 31 ++++-- src/views/tender/supplierInput/index.vue | 1 + 8 files changed, 108 insertions(+), 66 deletions(-) diff --git a/src/api/project/contractor/types.ts b/src/api/project/contractor/types.ts index f041fa6..0d4ab3f 100644 --- a/src/api/project/contractor/types.ts +++ b/src/api/project/contractor/types.ts @@ -28,10 +28,10 @@ export interface ContractorVO { * 管理人联系电话 */ custodianPhone: string; - /** + /** * 分包类型 */ - contractorType?: string; + contractorType?: string; /** * 公司相关文件 @@ -54,6 +54,14 @@ export interface ContractorForm extends BaseEntity { * 主键id */ id?: string | number; + /** + * 供应商id + */ + supplierId?: string | number; + /** + * 供应商 + */ + supplier?: string; /** * 主键id @@ -127,10 +135,10 @@ export interface ContractorQuery extends PageQuery { * 管理人联系电话 */ custodianPhone?: string; - /** + /** * 分包类型 */ - contractorType?: string; + contractorType?: string; /** * 日期范围参数 diff --git a/src/api/supplierInput/supplierInput/index.ts b/src/api/supplierInput/supplierInput/index.ts index 719aa11..834b072 100644 --- a/src/api/supplierInput/supplierInput/index.ts +++ b/src/api/supplierInput/supplierInput/index.ts @@ -8,7 +8,7 @@ import { SupplierInputVO, SupplierInputForm, SupplierInputQuery } from '@/api/su * @returns {*} */ -export const listSupplierInput = (query?: SupplierInputQuery): AxiosPromise => { +export const listSupplierInput = (query?: any): AxiosPromise => { return request({ url: '/supplierInput/supplierInput/list', method: 'get', diff --git a/src/components/ProjectSelector/index.vue b/src/components/ProjectSelector/index.vue index 5884a27..1259482 100644 --- a/src/components/ProjectSelector/index.vue +++ b/src/components/ProjectSelector/index.vue @@ -56,7 +56,13 @@ const handleSelect = async (projectId: string) => { text: '项目切换中...', background: 'rgba(0, 0, 0, 0.7)' }); + setTimeout(() => { + if (loadingInstance && loadingInstance.visible) { + loadingInstance.close(); + } + }, 3000); await changeProject(projectId); + console.log('切换项目', selectedProject); // 更新项目 & 权限 userStore.setSelectedProject(selectedProject); diff --git a/src/permission.ts b/src/permission.ts index b3a14d7..6162675 100644 --- a/src/permission.ts +++ b/src/permission.ts @@ -10,6 +10,8 @@ import useUserStore from '@/store/modules/user'; import useSettingsStore from '@/store/modules/settings'; import usePermissionStore from '@/store/modules/permission'; +let isFirst = false; + NProgress.configure({ showSpinner: false }); const whiteList = ['/login', '/register', '/social-callback', '/register*', '/register/*', '/materials/purchaseDoc/uploadCode']; @@ -17,57 +19,64 @@ const isWhiteList = (path: string) => { return whiteList.some((pattern) => isPathMatch(pattern, path)); }; -router.beforeEach(async (to, from, next) => { +router.beforeEach(async (to, from) => { NProgress.start(); - if (to.path == '/indexEquipment' || to.path == '/materials/purchaseDoc/uploadCode' || to.path == '/codeDetail') { - next(); - } else if (getToken()) { - to.meta.title && useSettingsStore().setTitle(to.meta.title); - /* has token*/ - if (to.path === '/login') { - next({ path: '/' }); - NProgress.done(); - } else if (isWhiteList(to.path)) { - next(); - } else { - if (useUserStore().roles.length === 0 || $cache.local.getJSON('isCheckRole')) { - isRelogin.show = true; - // 判断当前用户是否已拉取完user_info信息 - const [err] = await tos(useUserStore().getInfo()); - if (err) { - await useUserStore().logout(); - ElMessage.error(err); - next({ path: '/' }); - } else { - isRelogin.show = false; - const accessRoutes = await usePermissionStore().generateRoutes(); - // 根据roles权限生成可访问的路由表 - accessRoutes.forEach((route) => { - if (!isHttp(route.path)) { - router.addRoute(route); // 动态添加可访问路由表 - console.log('🚀 ~ route:', route); - } - }); - $cache.local.remove('isCheckRole'); - // @ts-expect-error hack方法 确保addRoutes已完成 - next({ path: to.path, replace: true, params: to.params, query: to.query, hash: to.hash, name: to.name as string }); // hack方法 确保addRoutes已完成 - } - } else { - next(); - } - } - } else { - // 没有token - if (isWhiteList(to.path)) { - // 在免登录白名单,直接进入 - next(); - } else { - const redirect = encodeURIComponent(to.fullPath || '/'); - next(`/login?redirect=${redirect}`); // 否则全部重定向到登录页 - NProgress.done(); - } + // 特殊页面放行 + if (['/indexEquipment', '/materials/purchaseDoc/uploadCode', '/codeDetail'].includes(to.path)) { + return true; } + + // 已登录 + if (getToken()) { + if (to.meta.title) useSettingsStore().setTitle(to.meta.title); + + if (to.path === '/login') { + NProgress.done(); + return { path: '/' }; + } + + if (isWhiteList(to.path)) { + return true; + } + if ((!isFirst && useUserStore().roles.length === 0) || $cache.local.getJSON('isCheckRole') === 'true') { + isFirst = true; + isRelogin.show = true; + + const [err] = await tos(useUserStore().getInfo()); + + if (err) { + await useUserStore().logout(); + ElMessage.error(err); + NProgress.done(); + return { path: '/' }; + } + + isRelogin.show = false; + const accessRoutes = await usePermissionStore().generateRoutes(); + accessRoutes.forEach((route) => { + if (!isHttp(route.path)) router.addRoute(route); + }); + + $cache.local.remove('isCheckRole'); + + // 确保路由已添加后再跳转 + return { ...to, replace: true }; + } + + return true; + } else { + isFirst = false; + } + + // 未登录 + if (isWhiteList(to.path)) { + return true; + } + + const redirect = encodeURIComponent(to.fullPath || '/'); + NProgress.done(); + return { path: `/login?redirect=${redirect}` }; }); router.afterEach(() => { diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index a2a9836..178ac33 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -88,6 +88,7 @@ export const useUserStore = defineStore('user', () => { } } const [err, res] = await to(getUserInfo()); + console.log(111111111111); if (res) { const data = res.data; diff --git a/src/views/materials/purchaseDoc/index.vue b/src/views/materials/purchaseDoc/index.vue index b1523aa..a1bc27a 100644 --- a/src/views/materials/purchaseDoc/index.vue +++ b/src/views/materials/purchaseDoc/index.vue @@ -133,8 +133,8 @@ > - - + + { form.value.associationList = form.value.planId?.map((item: any) => ({ planId: item })); + form.value.supplier = supplierOptions.value.find((item) => item.id == form.value.supplierId)?.supplierName; if (form.value.id) { await updatePurchaseDoc(form.value).finally(() => (buttonLoading.value = false)); @@ -514,10 +518,10 @@ const getBatchList = async () => { }; const getSupplierList = async () => { - const res = await listContractor({ + const res = await listSupplierInput({ projectId: currentProject.value?.id, pageNum: 1, - contractorType: 4, + state: 'finish', pageSize: 10000 }); supplierOptions.value = res.rows; diff --git a/src/views/project/contractor/index.vue b/src/views/project/contractor/index.vue index 4bfcdc8..6b8953b 100644 --- a/src/views/project/contractor/index.vue +++ b/src/views/project/contractor/index.vue @@ -81,6 +81,11 @@ + + + + + @@ -121,6 +126,7 @@ import { ContractorForm, ContractorQuery, ContractorVO } from '@/api/project/con import ContractorFileDialog from '@/views/project/contractor/component/ContractorFileDialog.vue'; import { useUserStoreHook } from '@/store/modules/user'; import { getDicts, listData } from '@/api/system/dict/data'; +import { listSupplierInput } from '@/api/supplierInput/supplierInput'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -152,6 +158,8 @@ const initFormData: ContractorForm = { principalPhone: undefined, custodian: undefined, custodianPhone: undefined, + supplierId: undefined, + supplier: undefined, contractorType: undefined, fileMap: undefined, remark: undefined, @@ -257,6 +265,8 @@ const submitForm = () => { if (valid) { form.value.projectId = currentProject.value?.id; buttonLoading.value = true; + form.value.supplier = supplierOptions.value.find((item) => item.id == form.value.supplierId)?.supplierName; + if (form.value.id) { await updateContractor(form.value).finally(() => (buttonLoading.value = false)); } else { @@ -278,15 +288,16 @@ const handleDelete = async (row?: ContractorVO) => { await getList(); }; -/** 导出按钮操作 */ -const handleExport = () => { - proxy?.download( - 'project/contractor/export', - { - ...queryParams.value - }, - `contractor_${new Date().getTime()}.xlsx` - ); +/** 获取供应商 */ +const supplierOptions = ref([]); +const getSupplierList = async () => { + const res = await listSupplierInput({ + projectId: currentProject.value?.id, + pageNum: 1, + state: 'finish', + pageSize: 10000 + }); + supplierOptions.value = res.rows; }; /** 文件操作 **/ @@ -304,6 +315,7 @@ const listeningProject = watch( queryParams.value.projectId = nid; form.value.projectId = nid; console.log('监听项目id', queryParams.value.projectId, form.value.projectId); + getSupplierList(); getList(); } ); @@ -314,5 +326,6 @@ onUnmounted(() => { onMounted(() => { getDictList(); getList(); + getSupplierList(); }); diff --git a/src/views/tender/supplierInput/index.vue b/src/views/tender/supplierInput/index.vue index bbebc86..680aaf1 100644 --- a/src/views/tender/supplierInput/index.vue +++ b/src/views/tender/supplierInput/index.vue @@ -275,6 +275,7 @@ + Date: Thu, 28 Aug 2025 22:00:23 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=E6=9D=83=E9=99=90bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- src/store/modules/user.ts | 12 +----- src/views/system/dept/index.vue | 76 ++++++++++++--------------------- 3 files changed, 30 insertions(+), 60 deletions(-) diff --git a/.env.development b/.env.development index 99e7d78..500d6b0 100644 --- a/.env.development +++ b/.env.development @@ -12,7 +12,7 @@ VITE_APP_BASE_API = 'http://192.168.110.209:8899' # 罗成 # VITE_APP_BASE_API = 'http://192.168.110.213:8899' # 朱银 -# VITE_APP_BASE_API = 'http://192.168.110.180:8899' +# VITE_APP_BASE_API = 'http://192.168.110.149:8899' #曾涛 # VITE_APP_BASE_API = 'http://192.168.110.171:8899' diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 178ac33..fcdc115 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -75,9 +75,7 @@ export const useUserStore = defineStore('user', () => { id: p.projectId, name: p.projectName || '未知项目' })); - setProjects(projectList); - // 如果有缓存的选中项目,且该项目在当前项目列表中存在,则使用缓存的项目 const storedProject = getSelectedProjectFromStorage(); if (storedProject && projectList.some((p) => p.id === storedProject.id)) { @@ -88,17 +86,14 @@ export const useUserStore = defineStore('user', () => { } } const [err, res] = await to(getUserInfo()); - console.log(111111111111); - if (res) { const data = res.data; const user = data.user; const profile = user.avatar == '' || user.avatar == null ? defAva : user.avatar; - if (data.roles && data.roles.length > 0) { - setRoles(); permissionList.value = data.permissions; roleList.value = data.roles; + setRoles(); } else { roles.value = ['ROLE_DEFAULT']; } @@ -113,19 +108,16 @@ export const useUserStore = defineStore('user', () => { } return Promise.reject(err); }; - const setInfo = async () => { const [err, res] = await to(getUserInfo()); - if (res) { const data = res.data; const user = data.user; const profile = user.avatar == '' || user.avatar == null ? defAva : user.avatar; - if (data.roles && data.roles.length > 0) { - setRoles(); permissionList.value = data.permissions; roleList.value = data.roles; + setRoles(); } else { roles.value = ['ROLE_DEFAULT']; } diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index c9d9247..e8c763e 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -1,7 +1,6 @@