提交 cf7baa70 authored 作者: 闫鹏's avatar 闫鹏

合并分支 'yp-dev' 到 'pre'

Yp dev 查看合并请求 !390
流水线 #630 已通过 于阶段
in 5 分 7 秒
......@@ -137,6 +137,16 @@ export function getReasonAndSan(sanRecordId) {
return http.get(`/api/sanctionList/invFin/getReasonAndSan?sanRecordId=${sanRecordId}`);
}
/**
* 分页查询制裁实体清单
* url:/sanctionList/pageQuery
*/
export function getEntitiesList(params) {
return http.post("/api/sanctionList/pageQuery", params);
}
/**
* 制裁历程
* url:/entitiesDataCount/getSanRecord
......
......@@ -8,6 +8,28 @@ import {
// Token管理
const TOKEN_KEY = 'auth_token'
// 定义全局控制器,以便在取消后重新赋值
let currentMainAbortController = new AbortController()
/**
* 获取当前有效的 AbortSignal
* 供 axios 拦截器和 fetch 请求共同使用
*/
export const getMainAbortSignal = () => {
return currentMainAbortController.signal
}
/**
* 取消所有正在进行的请求
* 路由守卫中调用此方法
*/
export const cancelAllMainRequests = () => {
// 1. 终止当前控制器的所有请求
currentMainAbortController.abort()
// 2. 创建一个新的控制器,供后续新请求使用
currentMainAbortController = new AbortController()
}
// ===== 兼容导出(勿删):历史代码仍会 import formatBearerAuthorization =====
// 说明:当前线上版本后端用 `token` 头,不用 Authorization;但为了不影响其它模块编译/运行,这里保留该方法导出。
const formatBearerAuthorization = (raw) => {
......@@ -70,6 +92,10 @@ service.interceptors.request.use(config => {
config.headers['X-API-Key'] = aiApiKey
}
}
if (!config.signal) {
config.signal = getMainAbortSignal()
}
return config
}, error => {
console.log(error)
......
......@@ -3,6 +3,7 @@ import { setToken, removeToken, getToken } from "@/api/request.js";
import { AUTH_LOGOUT_CHANNEL } from "@/utils/authCrossTabLogout.js";
import { cancelAllRequests } from "@/api/finance/service.js"
import { cancelAllMainRequests } from "@/api/request.js"
/** localStorage:跨标签页记录当前前端的 bootId(与 vite define 的 __APP_BOOT_ID__ 对齐) */
const VITE_BOOT_STORAGE_KEY = "app_vite_boot_id";
......@@ -149,6 +150,7 @@ const router = createRouter({
router.beforeEach((to, from, next) => {
// 在每次路由跳转开始前,取消上一个页面所有未完成的请求
// 这能防止旧页面的数据回来覆盖新页面,也能减少服务器压力
cancelAllMainRequests();
cancelAllRequests();
if (import.meta.env.DEV) {
clearTokenIfNewDevBoot();
......
......@@ -117,9 +117,10 @@
</div>
</el-tooltip>
<div class="dynamic-item-tags">
<span v-for="(tag, tIndex) in item.tags" :key="tIndex" class="tag" :class="getTagClass(tag)">
<!-- <span v-for="(tag, tIndex) in item.tags" :key="tIndex" class="tag" :class="getTagClass(tag)">
{{ tag }}
</span>
</span> -->
<AreaTag v-for="(tag, tIndex) in item.tags" :key="tIndex" :tagName="tag" />
</div>
</div>
</div>
......@@ -278,6 +279,7 @@ import { onMounted, ref, computed, inject, watch, onUnmounted } from "vue";
import { useRouter } from "vue-router";
import Echarts from "@/components/Chart/index.vue";
import SimplePagination from "@/components/SimplePagination.vue";
import AreaTag from "@/components/base/AreaTag/index.vue";
import * as echarts from "echarts";
import defaultIcon from "../../assets/defaultIcon.png";
import leftBtn from "../../assets/left-btn.png";
......@@ -510,8 +512,8 @@ const handleNewsClick = item => {
// }
// });
// window.open(href, "_blank");
gotoNewsDetail(item.id);
gotoNewsDetail(item.id);
};
// 点击联合制裁项-如果是政令则跳转详情
......
差异被折叠。
......@@ -49,8 +49,8 @@
:class="{ active: currentSanctionId === item.id }"
@click="handleSanctionSelect(item.id)"
>
<!-- <div class="item-left">{{ item.date }}-{{ item.title }}</div> -->
<div class="item-left">{{ item.date }}-实体清单更新</div>
<div class="item-left">{{ item.date }}-{{ item.title }}</div>
<!-- <div class="item-left">{{ item.date }}-实体清单更新</div> -->
<div class="item-right">{{ item.count }}{{ item.unit }}</div>
</div>
</div>
......
......@@ -29,55 +29,20 @@
</AnalysisBox>
</div>
<div class="left-bottom">
<!-- <div class="title">
<div class="box"></div>
<div class="text">实体清单更新历史</div>
<div class="filters">
<el-select v-model="selectedDomain" placeholder="Select"
style="width: 150px; height: 32px; margin-right: 16px">
<el-option v-for="item in domainOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-checkbox v-model="onlyChina">只看涉华动态</el-checkbox>
</div>
<div class="btn">
<img src="../../../../assets/下载按钮.png" alt="" />
<img src="../../../../assets/收藏按钮.png" alt="" />
</div>
</div>
<div class="left-bottom-main">
<div class="sanction-list" v-for="item in sanctionList" :key="item.id">
<div class="time">
<div class="year">{{ item.year }}</div>
<div class="date">{{ item.date }}</div>
</div>
<img :src="item.icon || title" alt="" />
<div class="main">
<div class="main-title" @click="handleClick(item)">{{ item.name }}</div>
<el-tooltip effect="dark" :content="item.summary" popper-class="common-prompt-popper" placement="top"
:show-after="500">
<div class="main-desc">{{ item.summary }}</div>
</el-tooltip>
<div class="tag-box">
<div v-for="tag in item.techDomainList" :key="tag" class="tag-item">{{ tag }}</div>
</div>
<div :class="{ 'count-tag': item.cnEntityCount }">
{{ item.cnEntityCount ? `${item.cnEntityCount}家中国实体` : "" }}
</div>
</div>
</div>
</div>
<div class="left-footer">
<div class="total-count"> {{ totalAll }} </div>
<el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
layout="prev, pager, next" background @current-change="handlePageChangeAll" />
</div> -->
<AnalysisBox title="实体清单更新历史" :showAllBtn="false">
<template #header-btn>
<div class="filters">
<el-select v-model="selectedDomain" placeholder="Select"
style="width: 150px; height: 32px; margin-right: 16px">
<el-option v-for="item in domainOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select
v-model="selectedDomain"
placeholder="Select"
style="width: 150px; height: 32px; margin-right: 16px"
>
<el-option
v-for="item in domainOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-checkbox v-model="onlyChina">只看涉华动态</el-checkbox>
</div>
......@@ -91,8 +56,13 @@
<img :src="item.icon || title" alt="" />
<div class="main">
<div class="main-title" @click="handleClick(item)">{{ item.name }}</div>
<el-tooltip effect="dark" :content="item.summary" popper-class="common-prompt-popper" placement="top"
:show-after="500">
<el-tooltip
effect="dark"
:content="item.summary"
popper-class="common-prompt-popper"
placement="top"
:show-after="500"
>
<div class="main-desc">{{ item.summary }}</div>
</el-tooltip>
<div class="tag-box">
......@@ -107,14 +77,20 @@
</div>
<div class="left-footer">
<div class="total-count">共 {{ totalAll }} 项</div>
<el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
layout="prev, pager, next" background @current-change="handlePageChangeAll" />
<el-pagination
v-model:current-page="currentPageAll"
:page-size="pageSizeAll"
:total="totalAll"
layout="prev, pager, next"
background
@current-change="handlePageChangeAll"
/>
</div>
</AnalysisBox>
</div>
</div>
<div class="right">
<AnalysisBox title="发布机构" :showAllBtn="false">
<AnalysisBox title="发布机构" :showAllBtn="false" :height="auto">
<div class="right-main">
<div class="right-main-title" @click="handleClickOrg(publishInfo)">
<img :src="publishInfo.imageUrl" alt="" />
......@@ -130,8 +106,12 @@
<span>关键人物</span>
</div>
<div class="key-person-list">
<div class="person-item" v-for="(item, index) in publishInfo.personList" :key="index"
@click="handlePerClick(item)">
<div
class="person-item"
v-for="(item, index) in publishInfo.personList"
:key="index"
@click="handlePerClick(item)"
>
<img :src="item.imageUrl" alt="" />
<div class="person-info">
<CommonPrompt :content="item.name">
......@@ -160,11 +140,19 @@
</div>
</div>
</div>
<div class="more-btn" v-if="publishOrgInfo.length < dynamicTotal" @click="handleLoadMoreDynamic">
<!-- <div class="more-btn" v-if="publishOrgInfo.length < dynamicTotal" @click="handleLoadMoreDynamic">
<span>查看更多</span>
<el-icon>
<ArrowDown />
</el-icon>
</div> -->
<div class="dynamic-footer">
<simple-pagination
v-model:current-page="dynamicPage"
:page-size="dynamicPageSize"
:total="dynamicTotal"
@page-change="handleListPageChange"
/>
</div>
</div>
</div>
......@@ -176,6 +164,7 @@
<script setup>
import { ref, onMounted, watch } from "vue";
import router from "@/router";
import SimplePagination from "@/components/SimplePagination.vue";
import title from "../../../../assets/title.png";
import defaultIcon from "../../../../../assets/icons/default-avatar.png";
import icon01 from "../../assets/icon01.png";
......@@ -376,7 +365,10 @@ const getPublishOrgInfoFn = async (isLoadMore = false) => {
console.error("获取发布机构动态失败:", error);
}
};
const handleListPageChange = val => {
dynamicPage.value = val;
getPublishOrgInfoFn(false);
};
const handleLoadMoreDynamic = () => {
dynamicPage.value++;
getPublishOrgInfoFn(true);
......@@ -401,17 +393,16 @@ const getEntityInfoFn = async id => {
const sanTypeId = ref("");
// 跳转到数据资源库
const handleToDataLibrary = (item) => {
console.log('item', item);
const handleToDataLibrary = item => {
console.log("item", item);
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label
let params
if (domainStr === '全部领域') {
let domainStr = domainOptions.filter(item => item.value === selectedDomain.value)[0].label;
let params;
if (domainStr === "全部领域") {
params = {
isCnEntityOnly: true,
selectedDate: JSON.stringify([item.postDate, item.postDate])
}
};
} else {
params = {
isCnEntityOnly: true,
......@@ -424,8 +415,7 @@ const handleToDataLibrary = (item) => {
query: params
});
window.open(route.href, "_blank");
}
};
onMounted(() => {
sanTypeId.value = route.query.sanTypeId;
......@@ -616,7 +606,7 @@ onMounted(() => {
border-radius: 20px;
background-color: rgba(206, 79, 81, 0.1);
cursor: pointer;
&:hover{
&:hover {
text-decoration: underline;
}
}
......@@ -646,11 +636,13 @@ onMounted(() => {
.right {
width: 520px;
height: 1020px;
height: auto;
// min-height: 900px;
max-height: 1280px;
.right-main {
padding: 7px 24px 20px 23px;
height: 100%;
.right-main-title {
cursor: pointer;
width: 473px;
......@@ -767,7 +759,12 @@ onMounted(() => {
.right-main-dynamic {
width: 100%;
height: 900px;
display: flex;
flex-direction: column;
// justify-content: space-between;
// height: auto;
position: relative;
.dynamic-title {
display: flex;
align-items: center;
......@@ -788,8 +785,9 @@ onMounted(() => {
}
.dynamic-list {
max-height: 500px;
overflow-y: auto;
// max-height: 500px;
height: auto;
// overflow-y: auto;
padding-right: 10px;
/* 滚动条样式 */
......@@ -880,6 +878,11 @@ onMounted(() => {
margin-right: 4px;
}
}
.dynamic-footer {
position: absolute;
bottom: 50px;
left: 180px;
}
}
}
}
......
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论