diff --git a/.env.production b/.env.production index de149ab..f08ed82 100644 --- a/.env.production +++ b/.env.production @@ -13,4 +13,4 @@ ENV = 'production' # VUE_APP_BASE_API = 'http://39.101.188.84:7071' # 正式环境 -VUE_APP_BASE_API = 'https://gysl.sipac.gov.cn/api' +VUE_APP_BASE_API = '/api' diff --git a/src/components/bearicon/index.vue b/src/components/bearicon/index.vue index ce46504..2a416ad 100644 --- a/src/components/bearicon/index.vue +++ b/src/components/bearicon/index.vue @@ -2,7 +2,7 @@
- + @@ -26,7 +26,7 @@ export default { computed: { showCompanySection() { const isCompany = this.checkRole(['company']); - const isCommon = this.checkRole(['common']); + const isCommon = this.checkRole(['common','gov']); // 如果两个角色都存在,则隐藏企业端 return isCompany && !isCommon; } @@ -52,8 +52,8 @@ export default { const response = await getMessageCounttwo(); if (response && response.code === 200) { this.countstwo = response.data; // 将消息数量赋值给 counts - } else { } - } catch (error) { } + } else { } + } catch (error) {} }, } } diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index babdcf6..ee53317 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -10,7 +10,7 @@
-
+
{{ name }}
@@ -69,7 +69,7 @@ export default { //展示判断 showCompanySection() { const isCompany = this.checkRole(['company']) - const isCommon = this.checkRole(['common']) + const isCommon = this.checkRole(['common','gov']) return isCompany && !isCommon }, topNav: { diff --git a/src/permission.js b/src/permission.js index c93bc92..032f2ef 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,121 +1,155 @@ -import router from './router' -import store from './store' -import { Message } from 'element-ui' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' -import { getToken, setToken } from '@/utils/auth' -import { isPathMatch } from '@/utils/validate' -import { isRelogin } from '@/utils/request' -import { extractPrefix } from '@/utils/common' +import router from "./router"; +import store from "./store"; +import { Message } from "element-ui"; +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; +import { getToken, setToken } from "@/utils/auth"; +import { isPathMatch } from "@/utils/validate"; +import { isRelogin } from "@/utils/request"; +import { extractPrefix } from "@/utils/common"; // 政务登录接口 -import { governmentGetInfo } from '@/api/login/index' +import { governmentGetInfo } from "@/api/login/index"; -NProgress.configure({ showSpinner: false }) +NProgress.configure({ showSpinner: false }); -const whiteList = ['/login', '/register'] +const whiteList = ["/login", "/register"]; const isWhiteList = (path) => { - return whiteList.some(pattern => isPathMatch(pattern, path)) -} + return whiteList.some((pattern) => isPathMatch(pattern, path)); +}; router.beforeEach((to, from, next) => { - if (!extractPrefix(to.path)) { - store.commit("SET_CRUMBS", false); + if(!extractPrefix(to.path)){ + store.commit("SET_CRUMBS",false); + } + NProgress.start(); + + // 提取所有 URL 参数(包括 hash 后面的部分) + const search = + window.location.search || window.location.hash.split("?")[1] || ""; + const params = new URLSearchParams(search); + const userToken = params.get("userToken"); + const signature = params.get("signature"); + const timespan = params.get("timespan"); + + console.log(userToken, signature, timespan, "参数"); + + // 如果已经处理过一次登录逻辑,不再重复执行 + if (from.path === to.path && store.getters.token) { + next(); + return; } - NProgress.start() - -const { userToken, signature, timespan } = to.query -console.log(userToken, signature, timespan, '参数') - - -if (userToken && signature && timespan) { - // 政务登录 - governmentGetInfo({ - userToken, - signature, - timespan - }).then(res => { - const token = res.token - if (token) { - setToken(token) - localStorage.setItem('otherToken', userToken) - - const newQuery = { ...to.query } - delete newQuery.userToken - delete newQuery.signature - delete newQuery.timespan - const newPath = to.path + '?' + new URLSearchParams(newQuery).toString() - window.history.replaceState({}, '', newPath) + // 如果存在政务参数,并且不在登录页,则强制跳转过去 + if (userToken && signature && timespan && to.path !== "/login") { + next({ + path: "/login", + query: { userToken, signature, timespan }, + replace: true, + }); + return; + } - if (store.getters.roles.length === 0) { - isRelogin.show = true - store.dispatch('GetInfo').then(() => { - isRelogin.show = false - store.dispatch('GenerateRoutes').then(accessRoutes => { - router.addRoutes(accessRoutes) - next({ ...to, replace: true }) + if (to.path === "/login" && userToken && signature && timespan) { + governmentGetInfo({ userToken, signature, timespan }) + .then((res) => { + const token = res.data.token; + if (!token) { + // 清除 URL 参数,避免循环 + const cleanPath = + window.location.pathname + window.location.hash.split("?")[0]; + window.history.replaceState({}, "", cleanPath); + throw new Error("未获取到有效 token"); + } + + setToken(token); + localStorage.setItem("otherToken", userToken); + + // 清除 URL 参数 + const cleanPath = + window.location.pathname + (window.location.hash || ""); + window.history.replaceState({}, "", cleanPath); + + // 如果已有角色信息,直接跳转 + if (store.getters.roles.length > 0) { + next("/"); // 或者 next(to.query.redirect || "/") + return; + } + + // 否则获取用户信息并加载路由 + isRelogin.show = true; + store + .dispatch("GetInfo") + .then(() => { + isRelogin.show = false; + return store.dispatch("GenerateRoutes"); }) - }).catch(err => { - store.dispatch('LogOut').then(() => { - Message.error(err) - next({ path: '/' }) + .then((accessRoutes) => { + router.addRoutes(accessRoutes); + next(to.query.redirect || "/"); // 跳转到目标页或首页 }) - }) - } else { - next() - } - } - }).catch(err => { - console.error('政务系统登录失败:', err) - Message.error('政务系统登录失败,请重新登录') - }) - - return -} - - + .catch((err) => { + console.error("获取用户信息失败:", err); + return store.dispatch("LogOut").then(() => { + Message.error(err.message || "获取用户信息失败"); + next("/login"); + }); + }); + }) + .catch((err) => { + console.error("政务系统登录失败:", err); + // 清除 URL 参数,避免循环 + const cleanPath = + window.location.pathname + (window.location.hash || ""); + window.history.replaceState({}, "", cleanPath); + Message.error(err.message || "政务系统登录失败"); + next("/login"); + }); + return; + } - //原来的登录逻辑 - const token = getToken() + // 原始本地登录逻辑 + const token = getToken(); if (token) { - to.meta.title && store.dispatch('settings/setTitle', to.meta.title) - if (to.path === '/login') { - next({ path: '/' }) - NProgress.done() + to.meta.title && store.dispatch("settings/setTitle", to.meta.title); + if (to.path === "/login") { + next({ path: "/" }); + NProgress.done(); } else if (isWhiteList(to.path)) { - next() + next(); } else { if (store.getters.roles.length === 0) { - isRelogin.show = true - store.dispatch('GetInfo').then(() => { - isRelogin.show = false - store.dispatch('GenerateRoutes').then(accessRoutes => { - router.addRoutes(accessRoutes) - next({ ...to, replace: true }) - }) - }).catch(err => { - store.dispatch('LogOut').then(() => { - Message.error(err) - next({ path: '/' }) + isRelogin.show = true; + store + .dispatch("GetInfo") + .then(() => { + isRelogin.show = false; + store.dispatch("GenerateRoutes").then((accessRoutes) => { + router.addRoutes(accessRoutes); + next({ ...to, replace: true }); + }); }) - }) + .catch((err) => { + store.dispatch("LogOut").then(() => { + Message.error(err); + next("/"); + }); + }); } else { - next() + next(); } } } else { if (isWhiteList(to.path)) { - next() + next(); } else { - next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) - NProgress.done() + next(`/login?redirect=${encodeURIComponent(to.fullPath)}`); } } -}) +}); router.afterEach(() => { - NProgress.done() -}) \ No newline at end of file + NProgress.done(); +}); diff --git a/src/router/index.js b/src/router/index.js index 1b1cbb6..d1452f2 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -17,7 +17,7 @@ import Layout from "@/layout"; * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 - * roles: ['admin', 'common'] // 访问路由的角色权限 + * roles: ['admin', 'common','gov'] // 访问路由的角色权限 * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 * meta : { noCache: true // 如果设置为true,则不会被 缓存(默认 false) @@ -44,9 +44,14 @@ export const constantRoutes = [ { path: "/login", // 正式环境登录页 - // component: () => import("@/views/login"), + component: () => import("@/views/login"), // 测试 - component: () => import("@/views/login_v1"), + // component: () => import("@/views/login_v1"), + hidden: true, + }, + { + path: "/login_v2", + component: () => import("@/views/login_v2"), hidden: true, }, { diff --git a/src/views/components/ProjectDetails/Basic.vue b/src/views/components/ProjectDetails/Basic.vue index 39874a1..af746a7 100644 --- a/src/views/components/ProjectDetails/Basic.vue +++ b/src/views/components/ProjectDetails/Basic.vue @@ -13,7 +13,7 @@ style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"> 编辑 - 编辑 @@ -181,8 +181,8 @@ - - + + @@ -447,7 +447,7 @@ export default { { label: '竣工验收时间', value: data.acceptanceTime }, { label: '建设进度', value: data.jsjd }, { label: '统一社会信用代码', value: data.tyshxydm }, - { label: '计划投资额', value: data.jhtze }, + { label: '计划投资额(亿元)', value: data.jhtze }, { label: '所属产业目录', value: this.mlMap[data.ml] || '' }, { label: '所属细分产业', value: this.xfMap[data.xfcy] || '' }, { label: '项目法人单位简介', value: data.unitIntroduction }, diff --git a/src/views/components/ProjectDetails/Buildings.vue b/src/views/components/ProjectDetails/Buildings.vue index 635bba1..177806f 100644 --- a/src/views/components/ProjectDetails/Buildings.vue +++ b/src/views/components/ProjectDetails/Buildings.vue @@ -25,7 +25,7 @@ 导入 - 导出 diff --git a/src/views/components/ProjectDetails/Months.vue b/src/views/components/ProjectDetails/Months.vue index 292d0cc..028ad69 100644 --- a/src/views/components/ProjectDetails/Months.vue +++ b/src/views/components/ProjectDetails/Months.vue @@ -13,7 +13,7 @@ style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"> 新增 - 导出 @@ -80,10 +80,10 @@
@@ -137,8 +137,8 @@ - - + + @@ -192,7 +192,7 @@ export default { status: "已更新", // 状态固定为“已更新” monthDoneAmount: "", // 当月完成投资 totalDoneAmount: "", // 累计完成投资 - cumulativeArea: "", // 截止目前累计建成面积 + jzmqjc: "", // 截止目前累计建成面积 xmjzxq: "" // 项目进展详情 }, rules: { @@ -250,7 +250,7 @@ export default { status: "已更新", monthDoneAmount: "", totalDoneAmount: "", - cumulativeArea: "", + jzmqjc: "", xmjzxq: "" }; this.dialogVisible = true; @@ -309,7 +309,7 @@ export default { status: '已更新', monthDoneAmount: item.monthDoneAmount ?? 0, totalDoneAmount: item.totalDoneAmount ?? 0, - cumulativeArea: item.cumulativeArea ?? '', + jzmqjc: item.jzmqjc ?? '', xmjzxq: item.xmjzxq ?? '' })); } else { @@ -337,7 +337,7 @@ export default { month: row.month, monthDoneAmount: row.monthDoneAmount, totalDoneAmount: row.totalDoneAmount, - cumulativeArea: row.cumulativeArea, + jzmqjc: row.jzmqjc, xmjzxq: row.xmjzxq }; diff --git a/src/views/components/ProjectDetails/Others.vue b/src/views/components/ProjectDetails/Others.vue index 36ee4f1..e4567e6 100644 --- a/src/views/components/ProjectDetails/Others.vue +++ b/src/views/components/ProjectDetails/Others.vue @@ -7,7 +7,7 @@ 其他信息
- 新增 @@ -20,7 +20,7 @@ style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"> {{ isEditMode ? '保存' : '编辑' }} - 导出 @@ -41,7 +41,7 @@ - 删除 diff --git a/src/views/components/ProjectDetails/Programme.vue b/src/views/components/ProjectDetails/Programme.vue index 3fa9b46..ac3bcb5 100644 --- a/src/views/components/ProjectDetails/Programme.vue +++ b/src/views/components/ProjectDetails/Programme.vue @@ -19,7 +19,7 @@ style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"> 保存 - 导出 diff --git a/src/views/components/ProjectDetails/spanmanage.vue b/src/views/components/ProjectDetails/spanmanage.vue index 84f1af3..fc230a0 100644 --- a/src/views/components/ProjectDetails/spanmanage.vue +++ b/src/views/components/ProjectDetails/spanmanage.vue @@ -6,7 +6,7 @@ 标签管理:
-
+
添加标签
@@ -18,7 +18,7 @@
-
+
删除
@@ -35,7 +35,7 @@