提交 0f1bd742 authored 作者: 朱政's avatar 朱政

feat:跳转加密解密问题

上级 b7c76f73
流水线 #637 已通过 于阶段
in 1 分 50 秒
/**
* 与根目录 `goToPage.js` 中 getDecodedParams 及合作限制详情 query 解码行为一致,
* 供智库/合作限制从 `@/utils/goToPage` 迁出后使用(不修改 `goToPage` 目录与 `goToPage.js`)。
*/
import router from "@/router/index";
/** 新窗口打开合作限制详情:id 为 base64(encodeURIComponent(明文)),与概览列表跳转一致 */
export function goToCooperationRestrictionsDetail(plainId, sessionTabTitle) {
const s = String(plainId ?? "").trim();
if (!s) return;
if (sessionTabTitle != null && sessionTabTitle !== "") {
window.sessionStorage.setItem("cooperationRestrictionsTabName", String(sessionTabTitle));
}
let encoded;
try {
encoded = btoa(encodeURIComponent(s));
} catch (_) {
return;
}
if (!encoded) return;
const r = router.resolve({
name: "CooperationRestrictionsDetail",
query: { id: encoded }
});
window.open(r.href, "_blank");
}
/** 合作限制详情页 `route.query.id` 解码(兼容明文数字与 base64 包装) */
export function decodeCooperationRestrictionQueryId(raw) {
if (raw == null) return null;
const s0 = String(raw).trim();
if (!s0) return null;
if (/^\d+$/.test(s0)) return s0;
if (/^[A-Za-z0-9+/_-]+={0,2}$/.test(s0)) {
try {
const normalized = s0.replace(/-/g, "+").replace(/_/g, "/");
const padded = normalized + "===".slice((normalized.length + 3) % 4);
const decoded = atob(padded);
try {
return decodeURIComponent(decoded);
} catch (_) {
return decoded;
}
} catch (_) {}
}
return s0;
}
...@@ -283,7 +283,7 @@ import cyyIcon from "@/assets/icons/cyy.png"; ...@@ -283,7 +283,7 @@ import cyyIcon from "@/assets/icons/cyy.png";
import ghdIcon from "@/assets/icons/ghd.png"; import ghdIcon from "@/assets/icons/ghd.png";
import mzdIcon from "@/assets/icons/mzd.png"; import mzdIcon from "@/assets/icons/mzd.png";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { goToDataCountryBill } from "@/utils/goToPage"; import { goToDataCountryBill } from "@/utils/goToPage/methods/dataLibrary";
const router = useRouter(); const router = useRouter();
......
...@@ -322,7 +322,7 @@ import iconILetter from "./assets/icons/icon-iLetter.png"; ...@@ -322,7 +322,7 @@ import iconILetter from "./assets/icons/icon-iLetter.png";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { useGotoNewsDetail } from "@/router/modules/news"; import { useGotoNewsDetail } from "@/router/modules/news";
import { goToBill } from "@/utils/goToPage"; import { goToBill } from "@/utils/goToPage/methods/bill";
// 跳转人物主页(MessageBubble 的 person-click 传入整条列表项,需取 personId) // 跳转人物主页(MessageBubble 的 person-click 传入整条列表项,需取 personId)
const handleClickToCharacter = async item => { const handleClickToCharacter = async item => {
......
...@@ -132,7 +132,7 @@ import { getPersonSummaryInfo } from "@/api/common/index"; ...@@ -132,7 +132,7 @@ import { getPersonSummaryInfo } from "@/api/common/index";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import TimeSortSelectBox from '@/components/base/TimeSortSelectBox/index.vue' import TimeSortSelectBox from '@/components/base/TimeSortSelectBox/index.vue'
import AreaTag from '@/components/base/AreaTag/index.vue' import AreaTag from '@/components/base/AreaTag/index.vue'
import { getDecodedParams } from "@/utils/goToPage"; import { getDecodedParams } from "@/utils/goToPage/methods/getDecode";
const route = useRoute(); const route = useRoute();
const container = ref(null) const container = ref(null)
......
...@@ -120,6 +120,7 @@ import RiskSignal from "@/components/base/riskSignal/index.vue"; ...@@ -120,6 +120,7 @@ import RiskSignal from "@/components/base/riskSignal/index.vue";
import RiskSignalOverviewDetailDialog from "@/components/base/RiskSignalOverviewDetailDialog/index.vue"; import RiskSignalOverviewDetailDialog from "@/components/base/RiskSignalOverviewDetailDialog/index.vue";
import { ref, onMounted, computed } from "vue"; import { ref, onMounted, computed } from "vue";
import router from "@/router"; import router from "@/router";
import { goToCooperationRestrictionsDetail } from "@/utils/goToPageRouteHelpers.js";
import { navigateToViewRiskSignal } from "@/utils/riskSignalOverviewNavigate"; import { navigateToViewRiskSignal } from "@/utils/riskSignalOverviewNavigate";
import { getCoopRestrictionTrends, getCoopRestrictionSignals } from "@/api/coopRestriction/coopRestriction.js"; import { getCoopRestrictionTrends, getCoopRestrictionSignals } from "@/api/coopRestriction/coopRestriction.js";
import defaultImg from "./assets/usImg.png"; import defaultImg from "./assets/usImg.png";
...@@ -206,36 +207,14 @@ const handleClickToDetail = item => { ...@@ -206,36 +207,14 @@ const handleClickToDetail = item => {
const activeItem = item && item.ID ? item : mainTrend.value; const activeItem = item && item.ID ? item : mainTrend.value;
const id = activeItem?.ID || activeItem?.id || activeItem?.limitId; const id = activeItem?.ID || activeItem?.id || activeItem?.limitId;
if (!id) return; if (!id) return;
window.sessionStorage.setItem("cooperationRestrictionsTabName", activeItem?.LIMITNAME || ""); goToCooperationRestrictionsDetail(id, activeItem?.LIMITNAME || "");
const encodedId = (() => {
const s = String(id).trim();
if (!s) return "";
try { return btoa(encodeURIComponent(s)); } catch (_) { return s; }
})();
if (!encodedId) return;
const curRoute = router.resolve({
name: "CooperationRestrictionsDetail",
query: { id: encodedId }
});
window.open(curRoute.href, "_blank");
}; };
// 点击风险信号详情 // 点击风险信号详情
const handleToRiskDetail = (item) => { const handleToRiskDetail = (item) => {
const id = item?.cooperationId || item?.ID || item?.id || item?.limitId; const id = item?.cooperationId || item?.ID || item?.id || item?.limitId;
if (!id) return; if (!id) return;
const encodedId = (() => { goToCooperationRestrictionsDetail(id, undefined);
const s = String(id).trim();
if (!s) return "";
try { return btoa(encodeURIComponent(s)); } catch (_) { return s; }
})();
if (!encodedId) return;
const curRoute = router.resolve({
name: "CooperationRestrictionsDetail",
query: { id: encodedId },
});
window.open(curRoute.href, "_blank");
}; };
const isRiskOverviewDetailOpen = ref(false); const isRiskOverviewDetailOpen = ref(false);
......
...@@ -73,8 +73,8 @@ ...@@ -73,8 +73,8 @@
<script setup> <script setup>
import { ref, onMounted, watch, computed } from "vue"; import { ref, onMounted, watch, computed } from "vue";
import { useRouter } from "vue-router";
import { getCoopRestrictionList } from "@/api/coopRestriction/coopRestriction"; import { getCoopRestrictionList } from "@/api/coopRestriction/coopRestriction";
import { goToCooperationRestrictionsDetail } from "@/utils/goToPageRouteHelpers.js";
import TimeSortSelectBox from "@/components/base/TimeSortSelectBox/index.vue"; import TimeSortSelectBox from "@/components/base/TimeSortSelectBox/index.vue";
import defaultImg from "../../assets/images/default-icon2.png"; import defaultImg from "../../assets/images/default-icon2.png";
...@@ -136,33 +136,11 @@ const getMainDataList = async () => { ...@@ -136,33 +136,11 @@ const getMainDataList = async () => {
} }
}; };
const router = useRouter();
const encodeBase64Param = (val) => {
const s = String(val ?? "").trim();
if (!s) return "";
try {
return btoa(encodeURIComponent(s));
} catch (_) {
return s;
}
};
const handleClick = item => { const handleClick = item => {
const id = item?.id || item?.limitId || item?.ID; const id = item?.id || item?.limitId || item?.ID;
if (!id) return; if (!id) return;
window.sessionStorage.setItem( const tabTitle = item?.limitName || item?.title || item?.name || "";
"cooperationRestrictionsTabName", goToCooperationRestrictionsDetail(id, tabTitle);
item?.limitName || item?.title || item?.name || ""
);
const encodedId = encodeBase64Param(id);
if (!encodedId) return;
const routeData = router.resolve({
name: "CooperationRestrictionsDetail",
query: {
id: encodedId
}
});
window.open(routeData.href, "_blank");
}; };
const navList = ref([ const navList = ref([
......
...@@ -103,31 +103,11 @@ ...@@ -103,31 +103,11 @@
import { ref, watch, computed } from "vue"; import { ref, watch, computed } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { getCoopRestrictionIntroduction, getCoopRestrictionRelated, getCoopRestrictionBackground, getCoopRestrictionClause } from "@/api/coopRestriction/coopRestriction"; import { getCoopRestrictionIntroduction, getCoopRestrictionRelated, getCoopRestrictionBackground, getCoopRestrictionClause } from "@/api/coopRestriction/coopRestriction";
import { decodeCooperationRestrictionQueryId } from "@/utils/goToPageRouteHelpers.js";
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const decodeQueryId = (raw) => { const limitId = computed(() => decodeCooperationRestrictionQueryId(route.query?.id));
if (raw == null) return null;
const s0 = String(raw).trim();
if (!s0) return null;
// 明文数字直接返回
if (/^\d+$/.test(s0)) return s0;
// base64(encodeURIComponent(id)) 解码(兼容短 base64:Mg==)
if (/^[A-Za-z0-9+/_-]+={0,2}$/.test(s0)) {
try {
const normalized = s0.replace(/-/g, "+").replace(/_/g, "/");
const padded = normalized + "===".slice((normalized.length + 3) % 4);
const decoded = atob(padded);
try {
return decodeURIComponent(decoded);
} catch (_) {
return decoded;
}
} catch (_) { }
}
return s0;
};
const limitId = computed(() => decodeQueryId(route.query?.id));
import defaultImg from "./assets/image01.png" import defaultImg from "./assets/image01.png"
import defaultCom from "../assets/images/default-icon2.png" import defaultCom from "../assets/images/default-icon2.png"
import Harvard from "./assets/哈佛.png"; import Harvard from "./assets/哈佛.png";
......
...@@ -173,7 +173,7 @@ import { getPostOrgList, getPostMemberList } from '@/api/bill/billHome' ...@@ -173,7 +173,7 @@ import { getPostOrgList, getPostMemberList } from '@/api/bill/billHome'
import { search, getStatusList } from '@/api/comprehensiveSearch' import { search, getStatusList } from '@/api/comprehensiveSearch'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import getDateRange from '@/utils/getDateRange' import getDateRange from '@/utils/getDateRange'
import { getDecodedParams } from '@/utils/goToPage' import { getDecodedParams } from '@/utils/goToPage/methods/getDecode'
import goToPage from '@/utils/goToPage/index' import goToPage from '@/utils/goToPage/index'
const route = useRoute(); const route = useRoute();
......
...@@ -186,7 +186,7 @@ import { ElMessage } from 'element-plus' ...@@ -186,7 +186,7 @@ import { ElMessage } from 'element-plus'
import getDateRange from '@/utils/getDateRange' import getDateRange from '@/utils/getDateRange'
import { getDepartmentList } from "@/api/decree/home"; import { getDepartmentList } from "@/api/decree/home";
import { getDecodedParams } from '@/utils/goToPage' import { getDecodedParams } from '@/utils/goToPage/methods/getDecode'
import goToPage from '@/utils/goToPage/index' import goToPage from '@/utils/goToPage/index'
const route = useRoute(); const route = useRoute();
......
...@@ -172,7 +172,7 @@ import InputBox from "../components/InputBox/index.vue"; ...@@ -172,7 +172,7 @@ import InputBox from "../components/InputBox/index.vue";
import DataChartSwitchBox from '../components/dataChartSwitchBox/index.vue' import DataChartSwitchBox from '../components/dataChartSwitchBox/index.vue'
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import router from "@/router"; import router from "@/router";
import { getDecodedParams } from "@/utils/goToPage"; import { getDecodedParams } from "@/utils/goToPage/methods/getDecode";
import { search, getThinkTankList } from "@/api/comprehensiveSearch"; import { search, getThinkTankList } from "@/api/comprehensiveSearch";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
......
...@@ -293,7 +293,7 @@ import defaultNewsIcon from "@/assets/icons/default-icon-news.png"; ...@@ -293,7 +293,7 @@ import defaultNewsIcon from "@/assets/icons/default-icon-news.png";
import AreaTag from "@/components/base/AreaTag/index.vue"; import AreaTag from "@/components/base/AreaTag/index.vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { getDecodedParams } from "@/utils/goToPage"; import { getDecodedParams } from "@/utils/goToPage/methods/getDecode";
const router = useRouter(); const router = useRouter();
const thinkTankId = computed(() => getDecodedParams()); const thinkTankId = computed(() => getDecodedParams());
......
...@@ -64,9 +64,11 @@ import PolicyTracking from "./PolicyTracking/index.vue"; ...@@ -64,9 +64,11 @@ import PolicyTracking from "./PolicyTracking/index.vue";
import ThinkInfo from "./thinkInfo/index.vue"; import ThinkInfo from "./thinkInfo/index.vue";
import { getThinkTankSummary } from "@/api/thinkTank/overview"; import { getThinkTankSummary } from "@/api/thinkTank/overview";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { getDecodedParams } from "@/utils/goToPage"; import { getDecodedParams } from "@/utils/goToPage/methods/getDecode";
const router = useRouter(); const router = useRouter();
// 兼容 getDecodedParams 内部直接使用全局 router 的写法
window.router = router;
const tabActiveName = ref("智库动态"); const tabActiveName = ref("智库动态");
const switchTab = name => { const switchTab = name => {
tabActiveName.value = name; tabActiveName.value = name;
...@@ -75,7 +77,9 @@ const switchTab = name => { ...@@ -75,7 +77,9 @@ const switchTab = name => {
const thinkTank = ref({}); const thinkTank = ref({});
// 获取智库基本信息 // 获取智库基本信息
const handleGetThinkTankSummary = async () => { const handleGetThinkTankSummary = async () => {
const id = getDecodedParams() const decoded = getDecodedParams();
// getDecodedParams: 有时返回对象(来自 ?data=),有时返回字符串(来自 params)
const id = typeof decoded === "object" && decoded !== null ? decoded.id : decoded;
try { try {
const parmas = { const parmas = {
......
...@@ -78,7 +78,7 @@ import { ...@@ -78,7 +78,7 @@ import {
getResourceLibraryReportDateRangeFromTimeSelection getResourceLibraryReportDateRangeFromTimeSelection
} from "../../utils/resourceLibraryFilters"; } from "../../utils/resourceLibraryFilters";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { getDecodedParams } from "@/utils/goToPage"; import { getDecodedParams } from "@/utils/goToPage/methods/getDecode";
import ThinkTankReport from "./ThinkTankReport/index.vue"; import ThinkTankReport from "./ThinkTankReport/index.vue";
import CongressHearing from "./CongressHearing/index.vue"; import CongressHearing from "./CongressHearing/index.vue";
const router = useRouter(); const router = useRouter();
......
...@@ -259,7 +259,7 @@ import { ref, onMounted, nextTick, computed } from "vue"; ...@@ -259,7 +259,7 @@ import { ref, onMounted, nextTick, computed } from "vue";
import setChart from "@/utils/setChart"; import setChart from "@/utils/setChart";
import getPieChart from "./utils/piechart"; import getPieChart from "./utils/piechart";
import getTreeMapChart from "./utils/treeMapChart"; import getTreeMapChart from "./utils/treeMapChart";
import { getDecodedParams } from "@/utils/goToPage"; import { getDecodedParams } from "@/utils/goToPage/methods/getDecode";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { import {
getThinkTankInfoBasic, getThinkTankInfoBasic,
......
...@@ -502,7 +502,8 @@ import { setCanvasCreator } from "echarts/core"; ...@@ -502,7 +502,8 @@ import { setCanvasCreator } from "echarts/core";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { useGotoNewsDetail } from '@/router/modules/news'; import { useGotoNewsDetail } from '@/router/modules/news';
import { goToDataThinkTank, goToThinkTank } from "@/utils/goToPage"; import { goToThinkTank } from "@/utils/goToPage/methods/thinkTank.js";
import { goToDataThinkTank } from "@/utils/goToPage/methods/dataLibrary.js";
const gotoNewsDetail = useGotoNewsDetail() const gotoNewsDetail = useGotoNewsDetail()
const containerRef = ref(null); const containerRef = ref(null);
const isRiskDetailVisible = ref(false); const isRiskDetailVisible = ref(false);
...@@ -2451,7 +2452,7 @@ const handleToDataLibrary = (item) => { ...@@ -2451,7 +2452,7 @@ const handleToDataLibrary = (item) => {
const selectParam = { const selectParam = {
orgnizationName: item.name orgnizationName: item.name
} }
// 使用 goToPage.js 统一的 Base64(encodeURIComponent(JSON)) 加密传参方式 // 使用 goToPage/methods/dataLibrary 与数据资源库一致的 Base64(encodeURIComponent(JSON)) 传参
goToDataThinkTank(selectParam) goToDataThinkTank(selectParam)
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论