提交 93b74825 authored 作者: 张烨's avatar 张烨

feat:市场准入限制-337和232增加功能板块

上级 302579c7
<template>
<div class="view-box">
<div class="icon-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="">
</div>
<div class="tips-content">{{ props.tips }}</div>
<div class="icon-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="">
</div>
</div>
</template>
<script setup lang="ts" name="AiTips">
const props = defineProps({
tips: {
type: String,
default: ''
}
});
</script>
<style scoped lang="scss">
.view-box {
width: 100%;
display: flex;
align-items: center;
padding: 7px 12px;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
.icon-left {
width: 20px;
height: 20px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.tips-content {
color: rgb(5, 95, 194);
font-size: 16px;
font-weight: 400;
line-height: 24px;
margin-left: 13px;
flex: 1;
}
.icon-right {
width: 24px;
height: 24px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
}
</style>
\ No newline at end of file
<template>
<AnalysisBox :title="props.title" :showAllBtn="false" height="auto">
<div class="box-main">
<div v-for="(item, index) in props.listData" :key="index" class="box-item">
<div class="item-tag">行政令</div>
<div class="item-right">
<div class="item-head">
<div class="item-name one-line-ellipsis">{{ item.name }}</div>
<div class="item-time">{{ item.time }}</div>
</div>
<div class="item-text one-line-ellipsis">{{ item.text }}</div>
</div>
</div>
</div>
</AnalysisBox>
</template>
<script setup lang="ts" name="RelatedEvent">
const props = defineProps({
listData: {
type: Array as any,
default: () => ([])
},
title: {
type: String,
default: ""
}
})
</script>
<style scoped lang="scss">
.box-main {
padding: 0 16px 16px;
.box-item {
border-top: 1px solid var(--bg-black-5);
padding: 6px;
display: flex;
font-size: 16px;
font-family: Source Han Sans CN;
.item-tag {
width: 80px;
height: 28px;
line-height: 28px;
border-radius: 14px;
text-align: center;
margin-right: 16px;
margin-top: 7px;
color: var(--color-yellow-100);
background-color: var(--color-yellow-10);
}
.item-right {
width: 20px;
flex: auto;
line-height: 30px;
.item-head {
display: flex;
.item-name {
width: 20px;
flex: auto;
font-weight: bold;
color: var(--text-primary-80-color);
}
.item-time {
margin-left: 100px;
flex: none;
color: var(--text-primary-65-color);
}
}
.item-text {
color: var(--text-primary-65-color);
}
}
}
.box-item:last-child {
border-bottom: 1px solid var(--bg-black-5);
}
}
</style>
\ No newline at end of file
<template>
<AnalysisBox :title="title" :showAllBtn="false" height="auto">
<el-empty v-if="!props.listData?.length" description="暂无数据" :image-size="200" />
<div v-else class="box-main">
<div class="data-list">
<div class="data-item" v-for="(item, index) in props.listData" :key="index">
<div class="item-head">
<div class="item-name">{{ item.title }}</div>
<div class="button-box">
<div class="button-icon">
<img src="../assets/icons/open.png" alt="" />
</div>
<div class="button-text">跳转原文</div>
</div>
</div>
<div class="item-down">
<div class="item-text" v-for="(text, num) in item.data" :key="num">{{ text }}</div>
</div>
</div>
</div>
<AiTips :tips="tips"></AiTips>
</div>
</AnalysisBox>
</template>
<script setup lang="ts" name="SurveyConclusion">
import AiTips from "@/views/marketAccessRestrictions/com/AiTips.vue";
const props = defineProps({
listData: {
type: Array as any,
default: () => ([])
},
title: {
type: String,
default: ""
},
tips: {
type: String,
default: ""
}
})
</script>
<style scoped lang="scss">
.box-main {
padding: 0 22px 20px;
.data-list {
margin-bottom: 16px;
border-top: 1px solid rgba(234, 236, 238, 1);
.data-item {
.item-head {
padding: 0 20px;
height: 48px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
display: flex;
align-items: center;
.item-name {
width: 20px;
flex: auto;
font-family: Source Han Sans CN;
font-size: 18px;
font-weight: bold;
line-height: 30px;
color: var(--text-primary-80-color);
}
.button-box {
display: flex;
align-items: center;
margin-left: 50px;
.button-icon {
width: 16px;
height: 16px;
font-size: 0;
margin-right: 4px;
img {
width: 100%;
height: 100%;
}
}
.button-text {
color: var(--color-primary-100);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 12px;
}
}
}
.item-text {
letter-spacing: 1px;
padding: 12px 20px 12px 40px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
border-bottom: 1px solid rgba(234, 236, 238, 1);
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="view-box">
<el-empty v-if="!props.surveyList?.length" description="当前条件下暂无数据" :image-size="200" />
<div class="timeline-item" v-for="(item, index) in props.surveyList" :key="item.searchid" @click="onNavigateToDetail(item)">
<div class="timeline-date">
<div class="date-text">{{ item.searchdatezh.slice(0,4) }}</div>
<div class="date-text">{{ item.searchdatezh.slice(5) }}</div>
</div>
<div class="timeline-line-box">
<div class="timeline-icon">
<img v-if="item.sortimageurl" :src="item.sortimageurl" alt="" />
<div v-else class="default-dot"></div>
</div>
<div class="timeline-line" v-if="index !== props.surveyList.length - 1"></div>
</div>
<div class="timeline-content-card">
<div class="item-head">
<div :class="`item-tag tag-${item.sortcode}`">{{ item.sortcode }}</div>
<div class="item-name">{{ item.searchname }}</div>
<div class="item-state">
<span class="dot"></span> {{ item.casestatus }}
</div>
</div>
<div class="card-body">
{{ item.content }}
</div>
<div class="card-footer">
<div class="footer-left-tags">
<AreaTag v-for="(name, num) in item.searchArea" :key="num" :tagName="name"></AreaTag>
</div>
<div class="footer-right-flags">
<div class="flag-icon" v-for="(name, num) in item.countryImage" :key="num">
<img :src="name" alt="" />
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup name="SurveyHistory">
import router from "@/router";
const props = defineProps({
surveyList: {
type: Array,
default: () => ([]),
},
})
const onNavigateToDetail = item => {
window.sessionStorage.setItem("curTabName", item.searchname);
const curRoute = router.resolve({
path: "/marketSingleCaseLayout/overview",
query: { id: item.sortcode, searchId: item.searchid }
});
window.open(curRoute.href, "_blank");
};
</script>
<style scoped lang="scss">
.view-box {
min-height: 600px;
width: 100%;
padding: 18px 27px 0 24px;
border-top: 1px solid rgba(234, 236, 238, 1);
border-bottom: 1px solid rgba(234, 236, 238, 1);
}
.timeline-item {
display: flex;
cursor: pointer;
.timeline-date {
width: 80px;
text-align: right;
margin-right: 16px;
.date-text {
height: 24px;
font-size: 16px;
font-weight: 700;
color: var(--color-main-active);
line-height: 24px;
letter-spacing: 1px;
}
}
.timeline-line-box {
width: 40px;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
.timeline-icon {
width: 32px;
height: 32px;
z-index: 2;
background: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 0;
img {
width: 100%;
height: 100%;
}
.default-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: orange;
}
}
.timeline-line {
width: 2px;
flex: 1;
background: #eaeeef;
margin: 4px 0;
}
}
.timeline-content-card {
width: 20px;
flex: auto;
padding: 2px 16px 0;
margin-bottom: 30px;
&:hover .item-head .item-name {
color: var(--color-main-active);
text-decoration: underline;
}
.item-head {
display: flex;
align-items: center;
margin-bottom: 10px;
.item-tag {
width: 48px;
height: 24px;
line-height: 24px;
text-align: center;
border-radius: 4px;
font-weight: bold;
font-size: 16px;
margin-right: 12px;
}
.tag-337 {
border: 1px solid #91caff;
background: #e6f4ff;
color: #055fc2;
}
.tag-232 {
border: 1px solid #b37feb;
background: #f9f0ff;
color: #722ed1;
}
.tag-301 {
border: 1px solid #ffd591;
background: #fff7e6;
color: #fa8c16;
}
.item-name {
font-size: 18px;
line-height: 18px;
font-weight: bold;
color: #3b414b;
width: 20px;
flex: auto;
}
.item-state {
font-size: 16px;
color: #84888e;
color: var(--color-main-active);
margin-left: 100px;
}
}
.card-body {
font-size: 16px;
color: #5f656c;
line-height: 30px;
margin-bottom: 8px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
.card-footer {
display: flex;
gap: 8px;
align-items: center;
.footer-left-tags {
display: flex;
gap: 8px;
.area-tag {
padding: 2px 12px;
background: #e6f7ff;
border: 1px solid #91d5ff;
color: #1890ff;
border-radius: 4px;
font-size: 14px;
}
}
.footer-right-flags {
display: flex;
gap: 4px;
.flag-icon {
width: 12px;
height: 24px;
img {
border-radius: 50%;
border: 1px solid #eee;
width: 24px;
height: 100%;
object-fit: cover;
}
}
}
}
}
}
</style>
\ No newline at end of file
......@@ -8,8 +8,7 @@
placeholder="搜索市场准入限制调查" :containerRef="containerRef" areaName="" />
</div>
<div class="home-main-header-card-box">
<div class="home-main-header-card-box-box1 card" v-for="item in sortInfo" :key="item.sortCode"
@click="onNavigateToCase(item.sortCode, item.sortName)">
<div :class="getCardClass(item.sortCode)" v-for="item in sortInfo" :key="item.sortCode" @click="onNavigateToCase(item)">
<div class="header">
<div class="header-left">{{ item.sortName }}</div>
<div class="header-right">{{ `${item.sortCount}项` }}</div>
......@@ -21,32 +20,6 @@
</div>
</div>
</div>
<!-- <div class="home-main-header-card-box-box2 card"
@click="onNavigateToCase(sortInfo[2]?.sortCode, sortInfo[2]?.sortName)">
<div class="header">
<div class="header-left">{{ sortInfo[2]?.sortName }}</div>
<div class="header-right">{{ `${sortInfo[2]?.sortCount}项` }}</div>
</div>
<div class="content-box">
<div class="item">{{ sortInfo[2]?.sortMeasure }}</div>
<div class="item">
{{ sortInfo[2]?.sortDescription }}
</div>
</div>
</div>
<div class="home-main-header-card-box-box3 card"
@click="onNavigateToCase(sortInfo[0]?.sortCode, sortInfo[0]?.sortName)">
<div class="header">
<div class="header-left">{{ sortInfo[0]?.sortName }}</div>
<div class="header-right">{{ `${sortInfo[0]?.sortCount}项` }}</div>
</div>
<div class="content-box">
<div class="item">{{ sortInfo[0]?.sortMeasure }}</div>
<div class="item">
{{ sortInfo[0]?.sortDescription }}
</div>
</div>
</div> -->
</div>
</div>
<div class="home-main-center">
......@@ -55,7 +28,7 @@
<div class="box1">
<overviewMainBox title="调查进展" @toDetail="handleClickToDetail()">
<template #header-icon>
<img style="width: 100%; height: 100%" src="./assets/icons/icon1.svg" alt="" />
<img style="width: 100%; height: 100%" src="./assets/icons/icon_1599.png" alt="" />
</template>
<div class="box1-left" @click="handleSwithCurSurvey('left')">
<LeftBtn />
......@@ -325,51 +298,7 @@
</div>
<div class="title">{{ "市场准入限制调查" }}</div>
</div>
<div class="right-main">
<el-empty v-if="surveyInfoList.length === 0" description="当前条件下暂无数据" :image-size="200" />
<div v-else class="right-main-item" v-for="(item, index) in surveyInfoList" :key="index" @click="onNavigateToDetail(item)">
<div class="item-left">
<div class="item-left-item"> {{ formatDate(item.searchdate, 'year') }}</div>
<div class="item-left-item"> {{ formatDate(item.searchdate, 'date') }}</div>
</div>
<div class="item-center">
<div class="icon">
<img :src='item.sortimageurl' alt="" />
</div>
<div class="line" v-if="index !== surveyInfoList.length - 1"></div>
</div>
<div class="item-right">
<div class="item-right-header">
<div class="tag"
:class="{ tag1: item.sortcode === '337', tag2: item.sortcode === '301', tag3: item.sortcode === '232' }">
{{ item.sortcode }}</div>
<div class="title">{{ item.searchname }}</div>
<div class="status" v-if="item.casestatus">
<div class="status-icon"></div>
<div class="status-text">{{ item.casestatus }}</div>
</div>
</div>
<div class="item-right-content" v-if="item.content">
{{ item.content }}
</div>
<div class="item-right-footer">
<!-- <div class="area-box" v-for="(val, idx) in item.searchArea" :key="idx">
<div class="area">{{ val }}</div>
</div> -->
<div class="area-box" v-if="item.searchArea.length">
<AreaTag v-for="(val, idx) in item.searchArea" :key="idx" :tagName="val"></AreaTag>
</div>
<div class="flag-box">
<div class="flag" v-for="(vall, idxx) in item.countryImage" :key="idxx">
<img :src="vall" alt="" />
</div>
</div>
</div>
</div>
</div>
</div>
<SurveyHistory :surveyList="surveyInfoList"></SurveyHistory>
<div class="right-footer">
<div class="footer-left">
{{ `共 ${totalDiscussNum} 项` }}
......@@ -396,6 +325,7 @@ import TipTab from "@/components/base/TipTab/index.vue"
import MessageBubble from "@/components/base/messageBubble/index.vue"
import NewsList from "@/components/base/newsList/index.vue";
import DivideHeader from "@/components/DivideHeader.vue";
import SurveyHistory from "@/views/marketAccessRestrictions/com/SurveyHistory.vue"
import setChart from "@/utils/setChart";
import router from "@/router";
......@@ -422,6 +352,9 @@ import {
} from "@/api/marketAccessRestrictions/index";
import { getRiskSignal, getNews, getRemarks } from "@/api/common/index";
import { ElMessage } from "element-plus";
import { useGotoNewsDetail } from '@/router/modules/news';
const getCardClass = (code) => ['card', `theme-${code}`]
const handleToPosi = id => {
const element = document.getElementById(id);
......@@ -468,8 +401,9 @@ const handleGetStatSort = async () => {
try {
const res = await getStatSort();
console.log("首页分类", res);
// sortInfo.value = res.data.sort((a, b) => a.sortCode - b.sortCode);
sortInfo.value = res.data;
} catch (error) { }
} catch (error) {}
};
// 调查进展
......@@ -493,11 +427,11 @@ const handleClickToDetail = () => {
};
// 跳转调查案件
const onNavigateToCase = (id, curTabName) => {
window.sessionStorage.setItem("curTabName", curTabName);
const onNavigateToCase = (item) => {
window.sessionStorage.setItem("curTabName", item.sortName);
const route = router.resolve({
path: "/marketAccessLayout",
query: { id }
query: { id: item.sortCode }
});
window.open(route.href, "_blank");
};
......@@ -543,14 +477,9 @@ const handleGetBox2Data = async () => {
// 新闻资讯
const newsList = ref([]);
// 获取新闻资讯列表
const handleGetBox3Data = async () => {
const params = {
moduleId: "0104"
};
try {
const res = await getNews(params);
const res = await getNews({moduleId: "0104"});
console.log("新闻资讯", res);
if (res.code === 200 && res.data) {
newsList.value = res.data.map(item => {
......@@ -562,26 +491,17 @@ const handleGetBox3Data = async () => {
}
} catch (error) { }
};
// 点击新闻条目,跳转到新闻分析页
// 查看新闻资讯详情
const gotoNewsDetail = useGotoNewsDetail()
const handleToNewsAnalysis = news => {
const route = router.resolve({
path: "/newsAnalysis",
query: {
newsId: news.newsId
}
});
window.open(route.href, "_blank");
gotoNewsDetail(news.newsId)
};
// 社交媒体
const messageList = ref([]);
const handleGetBox4Data = async () => {
const params = {
moduleId: "0104"
};
try {
const res = await getRemarks(params);
const res = await getRemarks({moduleId: "0104"});
console.log("社交媒体", res);
if (res.code === 200 && res.data) {
messageList.value = res.data;
......@@ -1469,14 +1389,6 @@ onMounted(async () => {
.card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
&:hover {
transform: translateY(-3px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
}
.home-main-header-card-box-box1 {
width: 520px;
height: 142px;
background: #fff;
......@@ -1493,7 +1405,6 @@ onMounted(async () => {
top: 15px;
width: 4px;
height: 111px;
background: rgba(250, 140, 22, 1);
}
.header {
......@@ -1515,7 +1426,6 @@ onMounted(async () => {
margin-top: 28px;
margin-right: 35px;
height: 24px;
color: rgba(250, 140, 22, 1);
font-family: Source Han Sans CN;
font-size: 30px;
font-weight: 700;
......@@ -1540,143 +1450,40 @@ onMounted(async () => {
white-space: nowrap;
}
}
}
.home-main-header-card-box-box2 {
width: 520px;
height: 142px;
background: #fff;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
position: relative;
cursor: pointer;
&:hover {
transform: translateY(-3px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
}
// &:hover {
// margin-top: -2px;
// }
.theme-301 {
&::before {
content: "";
position: absolute;
z-index: 99;
left: 0;
top: 15px;
width: 4px;
height: 111px;
background: rgba(114, 46, 209, 1);
background: rgba(250, 140, 22, 1);
}
.header {
height: 56px;
display: flex;
justify-content: space-between;
.header-left {
margin-left: 30px;
margin-top: 26px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 20px;
font-weight: 700;
line-height: 26px;
}
.header-right {
margin-top: 28px;
margin-right: 35px;
height: 24px;
color: rgba(114, 46, 209, 1);
font-family: Source Han Sans CN;
font-size: 30px;
font-weight: 700;
line-height: 24px;
color: rgba(250, 140, 22, 1);
}
}
.content-box {
margin-left: 30px;
.item {
width: 485px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 24px;
margin-top: 8px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.theme-232 {
&::before {
background: rgba(114, 46, 209, 1);
}
.header {
.header-right {
color: rgba(114, 46, 209, 1);
}
}
}
.home-main-header-card-box-box3 {
width: 520px;
height: 142px;
background: #fff;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
position: relative;
cursor: pointer;
// &:hover {
// margin-top: -3px;
// box-shadow: 0 0 5px 5px rgba(10, 87, 166, 0.1);
// }
.theme-337 {
&::before {
content: "";
position: absolute;
z-index: 99;
left: 0;
top: 15px;
width: 4px;
height: 111px;
background: var(--color-main-active);
}
.header {
height: 56px;
display: flex;
justify-content: space-between;
.header-left {
margin-left: 30px;
margin-top: 26px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 20px;
font-weight: 700;
line-height: 26px;
}
.header-right {
margin-top: 28px;
margin-right: 35px;
height: 24px;
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-size: 30px;
font-weight: 700;
line-height: 24px;
}
}
.content-box {
margin-left: 30px;
.item {
width: 485px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 24px;
margin-top: 8px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
......@@ -2475,6 +2282,7 @@ onMounted(async () => {
margin: 0 auto;
margin-top: 34px;
display: flex;
align-items: flex-start;
gap: 16px;
.left {
......@@ -2560,7 +2368,6 @@ onMounted(async () => {
.right-header {
height: 48px;
display: flex;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.icon {
width: 24px;
......@@ -2589,225 +2396,6 @@ onMounted(async () => {
}
}
.right-main {
box-sizing: border-box;
padding: 18px 27px 0 24px;
height: calc(100% - 108px);
border-bottom: 1px solid rgba(230, 231, 232, 1);
.right-main-item {
height: 154px;
display: flex;
cursor: pointer;
height: max-content;
.item-left {
width: 100px;
height: 48px;
padding-right: 20px;
.item-left-item {
height: 24px;
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-style: Bold;
font-size: 16px;
font-weight: 700;
line-height: 24px;
letter-spacing: 1px;
text-align: right;
}
}
.item-center {
width: 30px;
.icon {
width: 30px;
height: 30px;
border-radius: 15px;
img {
width: 100%;
height: 100%;
}
}
.line {
height: 100%;
margin-left: 14px;
width: 2px;
min-height: 64px;
max-height: 124px;
border-radius: 1.5px;
background: rgba(234, 236, 238, 1);
}
}
.item-right {
padding-left: 20px;
&:hover {
.item-right-header>.title {
color: var(--color-main-active);
text-decoration: underline;
}
}
.item-right-header {
height: 26px;
display: flex;
align-items: center;
.tag {
width: 48px;
height: 24px;
padding: 0 8px;
box-sizing: border-box;
font-family: Source Han Sans CN;
font-style: Bold;
font-size: 16px;
font-weight: 700;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
border-radius: 4px;
}
.tag1 {
border: 1px solid rgba(145, 202, 255, 1);
background: rgba(230, 244, 255, 1);
color: rgba(5, 95, 194, 1);
}
.tag2 {
border: 1px solid rgba(255, 213, 145, 1);
background: rgba(255, 247, 230, 1);
color: rgba(250, 140, 22, 1);
}
.tag3 {
border: 1px solid rgba(211, 173, 247, 1);
background: rgba(249, 240, 255, 1);
color: rgba(114, 46, 209, 1);
}
.title {
margin-left: 9px;
width: 880px;
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.status {
margin-left: 9px;
display: flex;
width: 76px;
height: 24px;
justify-content: flex-end;
gap: 5px;
align-items: center;
.status-icon {
width: 4px;
height: 4px;
border-radius: 2px;
background: var(--color-main-active);
}
.status-text {
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: right;
}
}
}
.item-right-content {
margin-top: 9px;
width: 1022px;
height: 60px;
color: rgba(95, 101, 108, 1);
font-family: Source Han Sans CN;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
.item-right-footer {
width: 1022px;
height: 24px;
margin-top: 9px;
display: flex;
gap: 8px;
margin-bottom: 10px;
.area-box {
display: flex;
gap: 8px;
.area {
height: 24px;
padding: 0 8px;
border-radius: 4px;
background: rgba(231, 243, 255, 1);
color: var(--color-main-active);
font-family: Source Han Sans CN;
font-style: Regular;
font-size: 14px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
}
.flag-box {
display: flex;
position: relative;
.flag {
width: 24px;
height: 24px;
border-radius: 12px;
border: 2px solid #fff;
overflow: hidden;
position: absolute;
img {
width: 100%;
height: 100%;
}
}
:nth-child(1) {
left: 18px;
z-index: 99;
}
}
}
}
}
}
.right-footer {
box-sizing: border-box;
padding-top: 15px;
......
......@@ -3,16 +3,7 @@
<div class="wrapper-header">
<div class="header-filters">
<div class="search-box">
<el-input
v-model="searchText"
style="width: 240px; height: 32px"
placeholder="搜索调查案件"
@keyup.enter="handleSearch"
>
<template #prefix>
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-input v-model="searchText" style="width: 360px; height: 32px" placeholder="搜索调查案件" @keyup.enter="handleSearch" :suffix-icon="Search"></el-input>
</div>
<div class="dropdown-filters">
<el-select v-model="filterStage" placeholder="全部阶段" class="filter-select" clearable>
......@@ -40,59 +31,31 @@
</div>
<div class="wrapper-main">
<div class="left">
<div class="left-box2">
<div class="left-box2-header">
<!-- 科技领域 -->
<div class="left-box">
<div class="left-header">
<div class="icon"></div>
<div class="title">{{ "科技领域" }}</div>
</div>
<div class="left-box2-main">
<div class="checkbox-group">
<el-checkbox
v-model="checkAllAreas"
:indeterminate="isIndeterminateAreas"
@change="handleCheckAllAreasChange"
class="filter-checkbox"
>
全部领域
<div class="left-main">
<el-checkbox-group class="checkbox-group" v-model="checkedAreaList" @change="handleCheckedAreasChange">
<el-checkbox class="filter-checkbox" label="全部领域"> 全部领域 </el-checkbox>
<el-checkbox v-for="area in surveyAreaList" :key="area.id" :label="area.id" class="filter-checkbox">
{{ area.name }}
</el-checkbox>
<div class="area-grid">
<el-checkbox
v-for="area in surveyAreaList"
:key="area.id"
v-model="checkedAreaList"
:label="area.id"
class="filter-checkbox"
@change="handleCheckedAreasChange"
>
{{ area.name }}
</el-checkbox>
</div>
</div>
</el-checkbox-group>
</div>
</div>
<div class="left-box1">
<div class="left-box1-header">
<!-- 发布时间 -->
<div class="left-box">
<div class="left-header">
<div class="icon"></div>
<div class="title">{{ "发布时间" }}</div>
</div>
<div class="left-box1-main">
<div class="checkbox-group">
<el-checkbox
v-model="checkAllYears"
:indeterminate="isIndeterminateYears"
@change="handleCheckAllYearsChange"
class="filter-checkbox"
>
全部时间
</el-checkbox>
<el-checkbox
v-for="year in displayedYearList"
:key="year.id"
v-model="checkedSurveyYears"
:label="year.id"
class="filter-checkbox"
@change="handleCheckedYearsChange"
>
<div class="left-main">
<el-checkbox-group class="checkbox-group" v-model="checkedSurveyYears" @change="handleCheckedYearsChange">
<el-checkbox class="filter-checkbox" label="全部时间"> 全部时间 </el-checkbox>
<el-checkbox v-for="year in displayedYearList" :key="year.id" :label="year.id" class="filter-checkbox">
{{ year.name }}
</el-checkbox>
<div v-if="surveyYearList.length > 6" class="expand-btn" @click="isYearExpanded = !isYearExpanded">
......@@ -102,7 +65,7 @@
<ArrowDown v-else />
</el-icon>
</div>
</div>
</el-checkbox-group>
</div>
</div>
</div>
......@@ -113,44 +76,7 @@
</div>
<div class="title">{{ "232调查历程" }}</div>
</div>
<div class="right-main" v-loading="listLoading">
<div
class="timeline-item"
v-for="(item, index) in surveyInfoList"
:key="index"
@click="handleToSingleCase(item)"
>
<div class="timeline-date">
<div class="date-text">{{ item.timeZH || item.time }}</div>
</div>
<div class="timeline-line-box">
<div class="timeline-icon">
<img v-if="item.sortImageUrl" :src="item.sortImageUrl" alt="" />
<div v-else class="default-dot"></div>
</div>
<div class="timeline-line" v-if="index !== surveyInfoList.length - 1"></div>
</div>
<div class="timeline-content-card">
<div class="card-header">
<div class="tag-box">
<div class="tag-232">{{ item.tag }}</div>
<div class="title">{{ item.title }}</div>
</div>
<div class="status" :class="{ 'status-active': item.status === '调查中' }">
<span class="dot"></span> {{ item.status }}
</div>
</div>
<div class="card-body">
{{ item.content }}
</div>
<div class="card-footer">
<div class="area-tag" v-for="(area, idx) in item.areaList" :key="idx">
{{ area }}
</div>
</div>
</div>
</div>
</div>
<SurveyHistory v-loading="listLoading" :surveyList="surveyInfoList"></SurveyHistory>
<div class="right-footer">
<div class="footer-left">
{{ `共${totalDiscussNum}项调查` }}
......@@ -173,12 +99,9 @@
<script setup>
import { ref, onMounted, watch, computed } from "vue";
import router from "@/router";
import { useRoute } from "vue-router";
import { Search, ArrowDown, ArrowUp } from "@element-plus/icons-vue";
import { getSearchAllArea, getSearchAllYear, getSurveyList } from "@/api/marketAccessRestrictions";
const route = useRoute();
import SurveyHistory from "@/views/marketAccessRestrictions/com/SurveyHistory.vue"
// 顶部过滤项
const searchText = ref("");
......@@ -255,19 +178,7 @@ const handleFetchSurveyList = async () => {
};
const res = await getSurveyList(params);
if (res.code === 200 && res.data) {
surveyInfoList.value = res.data.content.map(item => {
return {
time: item.SEARCHDATE,
timeZH: item.SEARCHDATEZH,
title: item.SEARCHNAME,
content: item.SEARCHDESC || item.SEARCHNAME,
status: item.CASESTATUS || "调查中",
areaList: item.searchArea || [],
tag: item.SORTCODE || "232",
id: item.SEARCHID,
sortImageUrl: item.SORTIMAGEURL
};
});
surveyInfoList.value = res.data.content;
totalDiscussNum.value = res.data.totalElements || 0;
}
} catch (error) {
......@@ -287,17 +198,6 @@ const handleSearch = () => {
handleFetchSurveyList();
};
const handleToSingleCase = item => {
const curRoute = router.resolve({
path: "/marketSingleCaseLayout/overview",
query: {
id: "232",
searchId: item.id + ""
}
});
window.open(curRoute.href, "_blank");
};
// 监听过滤条件
watch([checkedSurveyYears, checkedAreaList, isSort, filterStage, filterParty, filterReason], () => {
if (isInitializing.value) return;
......@@ -343,7 +243,7 @@ onMounted(async () => {
.case-wrapper {
width: 1600px;
margin: 0 auto;
padding-top: 20px;
padding: 20px 0;
.wrapper-header {
height: 32px;
......@@ -357,6 +257,12 @@ onMounted(async () => {
gap: 16px;
align-items: center;
.search-box {
background-color: #fff;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 4px;
}
.dropdown-filters {
display: flex;
gap: 12px;
......@@ -396,10 +302,10 @@ onMounted(async () => {
.wrapper-main {
display: flex;
justify-content: space-between;
gap: 16px;
.left {
width: 300px;
width: 360px;
min-height: 560px;
height: fit-content;
padding-bottom: 20px;
......@@ -407,19 +313,20 @@ onMounted(async () => {
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: #fff;
.left-box1,
.left-box2 {
.left-box {
margin-top: 17px;
.left-box1-header,
.left-box2-header {
.left-header {
display: flex;
align-items: center;
.icon {
width: 8px;
height: 16px;
background: var(--color-main-active);
border-radius: 0 2px 2px 0;
}
.title {
margin-left: 17px;
color: var(--color-main-active);
......@@ -431,16 +338,8 @@ onMounted(async () => {
.checkbox-group {
padding: 10px 0 0 25px;
display: flex;
flex-direction: column;
.area-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 4px;
}
.filter-checkbox {
width: 130px;
margin-bottom: 8px;
height: 32px;
:deep(.el-checkbox__label) {
......@@ -448,6 +347,7 @@ onMounted(async () => {
color: #5f656c;
}
}
.expand-btn {
color: var(--color-main-active);
font-size: 14px;
......@@ -455,6 +355,7 @@ onMounted(async () => {
display: flex;
align-items: center;
margin-top: 4px;
.el-icon {
margin-left: 4px;
}
......@@ -463,7 +364,8 @@ onMounted(async () => {
}
.right {
width: 1284px;
flex: auto;
width: 20px;
min-height: 700px;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
......@@ -474,7 +376,6 @@ onMounted(async () => {
height: 48px;
display: flex;
align-items: center;
border-bottom: 1px solid #eaeeef;
padding: 0 20px;
.icon {
width: 22px;
......@@ -490,136 +391,6 @@ onMounted(async () => {
}
}
.right-main {
padding: 30px 40px;
.timeline-item {
display: flex;
cursor: pointer;
&:hover {
.timeline-content-card {
background-color: #f5f7fa;
}
}
.timeline-date {
width: 100px;
text-align: right;
padding-right: 20px;
.date-text {
font-size: 16px;
font-weight: 700;
color: var(--color-main-active);
line-height: 24px;
}
}
.timeline-line-box {
width: 40px;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
.timeline-icon {
width: 32px;
height: 32px;
z-index: 2;
background: #fff;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
}
.default-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: orange;
}
}
.timeline-line {
width: 2px;
flex: 1;
background: #eaeeef;
margin: 4px 0;
}
}
.timeline-content-card {
flex: 1;
// border: 1px solid #eaeeef;
border-radius: 8px;
padding: 16px 20px;
margin-left: 10px;
margin-bottom: 24px;
transition: all 0.3s;
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
.tag-box {
display: flex;
align-items: center;
gap: 12px;
.tag-232 {
padding: 2px 10px;
border: 1px solid #b37feb;
background: #f9f0ff;
color: #722ed1;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.title {
font-size: 18px;
font-weight: 700;
color: #3b414b;
}
}
.status {
font-size: 16px;
color: #84888e;
.dot {
margin-right: 4px;
}
}
.status-active {
color: var(--color-main-active);
}
}
.card-body {
font-size: 16px;
color: #5f656c;
line-height: 1.6;
margin-bottom: 16px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
.card-footer {
display: flex;
gap: 8px;
.area-tag {
padding: 2px 12px;
background: #e6f7ff;
border: 1px solid #91d5ff;
color: #1890ff;
border-radius: 4px;
font-size: 14px;
}
}
}
}
}
.right-footer {
display: flex;
justify-content: space-between;
......
......@@ -2,17 +2,7 @@
<div class="case-wrapper">
<div class="wrapper-header">
<div class="search-box">
<el-input
v-model="searchText"
style="width: 300px; height: 32px"
placeholder="搜索调查案件"
@keyup.enter="handleSearch"
>
<template #append
><el-button @click="handleSearch"
><el-icon><Search color="#84888E" /></el-icon></el-button
></template>
</el-input>
<el-input v-model="searchText" style="width: 360px; height: 32px" placeholder="搜索调查案件" @keyup.enter="handleSearch" :suffix-icon="Search"></el-input>
</div>
<div class="select-box">
<div class="paixu-btn" @click="handleSwithSort">
......@@ -30,74 +20,43 @@
</div>
<div class="wrapper-main">
<div class="left">
<div class="left-box2">
<div class="left-box2-header">
<!-- 科技领域 -->
<div class="left-box">
<div class="left-header">
<div class="icon"></div>
<div class="title">{{ "科技领域" }}</div>
</div>
<div class="left-box2-main">
<div class="checkbox-group">
<el-checkbox
v-model="checkAllAreas"
:indeterminate="isIndeterminateAreas"
@change="handleCheckAllAreasChange"
class="filter-checkbox"
>
全部领域
</el-checkbox>
<el-checkbox
v-for="area in surveyAreaList"
:key="area.id"
v-model="checkedAreaList"
:label="area.id"
class="filter-checkbox"
@change="handleCheckedAreasChange"
>
<div class="left-main">
<el-checkbox-group class="checkbox-group" v-model="checkedAreaList" @change="handleCheckedAreasChange">
<el-checkbox class="filter-checkbox" label="全部领域"> 全部领域 </el-checkbox>
<el-checkbox v-for="area in surveyAreaList" :key="area.id" :label="area.id" class="filter-checkbox">
{{ area.name }}
</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
<div class="left-box1">
<div class="left-box1-header">
<!-- 发布时间 -->
<div class="left-box">
<div class="left-header">
<div class="icon"></div>
<div class="title">{{ "发布时间" }}</div>
</div>
<div class="left-box1-main">
<div class="checkbox-group">
<el-checkbox
v-model="checkAllYears"
:indeterminate="isIndeterminateYears"
@change="handleCheckAllYearsChange"
class="filter-checkbox"
>
全部时间
</el-checkbox>
<el-checkbox
v-for="year in displayedYearList"
:key="year.id"
v-model="checkedSurveyYears"
:label="year.id"
class="filter-checkbox"
@change="handleCheckedYearsChange"
>
<div class="left-main">
<el-checkbox-group class="checkbox-group" v-model="checkedSurveyYears" @change="handleCheckedYearsChange">
<el-checkbox class="filter-checkbox" label="全部时间"> 全部时间 </el-checkbox>
<el-checkbox v-for="year in displayedYearList" :key="year.id" :label="year.id" class="filter-checkbox">
{{ year.name }}
</el-checkbox>
<div
v-if="surveyYearList.length > 6"
class="expand-btn"
@click="isYearExpanded = !isYearExpanded"
>
<div v-if="surveyYearList.length > 6" class="expand-btn" @click="isYearExpanded = !isYearExpanded">
{{ isYearExpanded ? "收起" : "更早" }}
<el-icon>
<ArrowUp v-if="isYearExpanded" />
<ArrowDown v-else />
</el-icon>
</div>
</div>
</el-checkbox-group>
</div>
</div>
</div>
<div class="right">
<div class="right-header">
......@@ -106,53 +65,11 @@
</div>
<div class="title">{{ "301调查历程" }}</div>
</div>
<div class="right-main" v-loading="listLoading">
<div class="item" v-for="(item, index) in surveyInfoList" :key="index" @click="handleToSingleCase(item)">
<div class="item-left">{{ item.time }}</div>
<div class="item-center">
<div class="icon">
<!-- <img :src="item.img" alt="" /> -->
</div>
<div class="line" v-if="index !== surveyInfoList.length - 1"></div>
</div>
<div class="item-right">
<div class="item-right-header">
<div class="tag tag1">{{ item.tag }}</div>
<div class="title">{{ item.title }}</div>
<div class="status">
<div class="status-icon"></div>
<div class="status-text">{{ item.status }}</div>
</div>
</div>
<div class="item-right-content">
{{ item.content }}
</div>
<div class="item-right-footer">
<div class="area-box" v-for="(val, idx) in item.areaList" :key="idx">
<div class="area">{{ val }}</div>
</div>
<div class="flag-box">
<div class="flag" v-for="(vall, idxx) in item.countryList" :key="idxx">
<img :src="vall" alt="" style="width: 100%; height: 100%; border-radius: 50%;" />
</div>
</div>
</div>
</div>
</div>
</div>
<SurveyHistory v-loading="listLoading" :surveyList="surveyInfoList"></SurveyHistory>
<div class="right-footer">
<div class="footer-left">
{{ `共 ${totalDiscussNum} 项` }}
</div>
<div class="footer-left">{{ `共 ${totalDiscussNum} 项` }}</div>
<div class="footer-right">
<el-pagination
@current-change="handleCurrentChange"
:pageSize="pageSize"
:current-page="currentPage"
background
layout="prev, pager, next"
:total="totalDiscussNum"
/>
<el-pagination @current-change="handleCurrentChange" :pageSize="pageSize" :current-page="currentPage" background layout="prev, pager, next" :total="totalDiscussNum" />
</div>
</div>
</div>
......@@ -162,11 +79,9 @@
<script setup>
import { ref, onMounted, watch, computed } from "vue";
import router from "@/router";
import { useRoute } from "vue-router";
import { Search, ArrowDown, ArrowUp } from "@element-plus/icons-vue";
import { getSearchAllArea, getSearchAllYear, getSurveyList } from "@/api/marketAccessRestrictions";
const route = useRoute();
import SurveyHistory from "@/views/marketAccessRestrictions/com/SurveyHistory.vue"
const isSort = ref(true); // true 升序 false 倒序
const handleSwithSort = () => {
......@@ -238,18 +153,7 @@ const handleFetchSurveyList = async () => {
};
const res = await getSurveyList(params);
if (res.code === 200 && res.data) {
surveyInfoList.value = res.data.content.map(item => {
return {
time: item.SEARCHDATEZH || item.SEARCHDATE,
title: item.SEARCHNAME,
content: item.SEARCHNAME, // 或者其他字段,API文档没给出具体描述字段,暂用名称
status: item.CASESTATUS,
areaList: item.searchArea || [],
countryList: item.countryImage || [],
tag: item.SORTCODE || "301",
id: item.SEARCHID
};
});
surveyInfoList.value = res.data.content;
totalDiscussNum.value = res.data.totalElements || 0;
}
} catch (error) {
......@@ -281,19 +185,6 @@ watch(
}
);
const handleToSingleCase = item => {
console.log(item)
// router.push('/marketSingleCaseLayout/overview')
const curRoute = router.resolve({
path: "/marketSingleCaseLayout/overview",
query: {
id: route.query.id + '',
searchId: item.id + ''
}
});
window.open(curRoute.href, "_blank");
};
const handleGetSearchAllArea = async () => {
try {
const res = await getSearchAllArea({
......@@ -346,18 +237,20 @@ onMounted(async () => {
<style lang="scss" scoped>
.case-wrapper {
// width: 100%;
// height: 100%;
overflow: hidden;
width: 1600px;
margin: 0 auto;
padding: 20px 0;
.wrapper-header {
width: 1600px;
width: 100%;
height: 32px;
margin: 16px auto;
display: flex;
margin-bottom: 16px;
justify-content: space-between;
.search-box {
width: 300px;
display: flex;
background-color: #fff;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 4px;
}
.select-box {
height: 32px;
......@@ -409,12 +302,11 @@ onMounted(async () => {
}
}
}
.wrapper-main {
width: 1600px;
// height: 900px;
margin: 0 auto;
display: flex;
justify-content: space-between;
gap: 16px;
.left {
width: 360px;
min-height: 560px;
......@@ -422,58 +314,62 @@ onMounted(async () => {
padding-bottom: 20px;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
.left-box1 {
background: #fff;
.left-box {
margin-top: 17px;
// height: 260px;
.left-box1-header {
.left-header {
display: flex;
align-items: center;
.icon {
width: 8px;
height: 16px;
margin-top: 4px;
border-radius: 2px 2px 0 0;
background: var(--color-main-active);
border-radius: 0 2px 2px 0;
}
.title {
height: 2px;
margin-left: 17px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
}
}
.left-box2 {
margin-top: 17px;
.left-box2-header {
display: flex;
.icon {
width: 8px;
height: 16px;
margin-top: 4px;
border-radius: 2px 2px 0 0;
background: var(--color-main-active);
}
.title {
height: 2px;
margin-left: 17px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
.checkbox-group {
padding: 10px 0 0 25px;
.filter-checkbox {
width: 130px;
margin-bottom: 8px;
height: 32px;
:deep(.el-checkbox__label) {
font-size: 16px;
font-weight: 700;
line-height: 24px;
color: #5f656c;
}
}
.expand-btn {
color: var(--color-main-active);
font-size: 14px;
cursor: pointer;
display: flex;
align-items: center;
margin-top: 4px;
.el-icon {
margin-left: 4px;
}
}
}
}
.right {
margin-left: 16px;
width: 1224px;
width: 20px;
flex: auto;
min-height: 700px;
height: 770px;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
......@@ -482,7 +378,6 @@ onMounted(async () => {
height: 48px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.icon {
width: 22px;
height: 18px;
......@@ -505,170 +400,6 @@ onMounted(async () => {
text-align: left;
}
}
.right-main {
padding-top: 6px;
height: 660px;
border-bottom: 1px solid rgba(230, 231, 232, 1);
overflow: auto;
.item {
height: 154px;
display: flex;
cursor: pointer;
&:hover {
background: var(--color-bg-hover) !important;
}
.item-left {
width: 100px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 16px;
font-weight: 700;
line-height: 24px;
letter-spacing: 1px;
text-align: right;
padding-right: 16px;
}
.item-center {
width: 30px;
height: 154px;
.icon {
width: 30px;
height: 30px;
border-radius: 15px;
background: orange;
}
.line {
margin-left: 14px;
width: 2px;
height: 124px;
border-radius: 1.5px;
background: rgba(234, 236, 238, 1);
}
}
.item-right {
padding-left: 20px;
.item-right-header {
height: 26px;
display: flex;
align-items: center;
.tag {
width: 48px;
height: 24px;
padding: 0 8px;
box-sizing: border-box;
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 16px;
font-weight: 700;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
border-radius: 4px;
}
.tag1 {
border: 1px solid rgba(145, 202, 255, 1);
background: rgba(230, 244, 255, 1);
color: rgba(5, 95, 194, 1);
}
.tag2 {
border: 1px solid rgba(255, 213, 145, 1);
background: rgba(255, 247, 230, 1);
color: rgba(250, 140, 22, 1);
}
.tag3 {
border: 1px solid rgba(211, 173, 247, 1);
background: rgba(249, 240, 255, 1);
color: rgba(114, 46, 209, 1);
}
.title {
margin-left: 9px;
width: 880px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.status {
margin-left: 9px;
display: flex;
width: 76px;
height: 24px;
justify-content: space-between;
align-items: center;
.status-icon {
width: 4px;
height: 4px;
border-radius: 2px;
background: var(--color-main-active);
}
.status-text {
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: right;
}
}
}
.item-right-content {
margin-top: 9px;
width: 1022px;
height: 60px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
.item-right-footer {
margin-top: 9px;
display: flex;
gap: 8px;
.area-box {
display: flex;
.area {
height: 24px;
padding: 0 8px;
border-radius: 4px;
background: rgba(231, 243, 255, 1);
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 14px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
}
.flag-box {
display: flex;
.flag {
width: 24px;
height: 24px;
border-radius: 12px;
background: orange;
}
}
}
}
}
}
.right-footer {
box-sizing: border-box;
padding-top: 15px;
......@@ -691,29 +422,4 @@ onMounted(async () => {
}
}
}
.checkbox-group{
padding-top: 10px;
margin-left: 16px;
.expand-btn {
width: 140px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
color: var(--color-main-active);
font-size: 14px;
cursor: pointer;
user-select: none;
&:hover {
opacity: 0.8;
}
.el-icon {
margin-left: 4px;
}
}
}
.filter-checkbox {
width: 140px;
margin-bottom: 8px;
}
</style>
\ No newline at end of file
......@@ -45,7 +45,6 @@
{{ area.name }}
</el-checkbox>
</el-checkbox-group>
</div>
</div>
<!-- 发布时间 -->
......@@ -89,46 +88,7 @@
</div>
<div class="right">
<AnalysisBox title="337调查历程" width="1224px" height="auto">
<div class="right-main" v-loading="listLoading">
<div class="timeline-item" v-for="(item, index) in surveyInfoList" :key="index"
@click="handleToSingleCase(item)">
<div class="timeline-date">
<div class="date-text">{{ item.timeZH.slice(0,4) }}</div>
<div class="date-text">{{ item.timeZH.slice(5) }}</div>
</div>
<div class="timeline-line-box">
<div class="timeline-icon">
<img v-if="item.sortImageUrl" :src="item.sortImageUrl" alt="" />
<div v-else class="default-dot"></div>
</div>
<div class="timeline-line" v-if="index !== surveyInfoList.length - 1"></div>
</div>
<div class="timeline-content-card">
<div class="card-header">
<div class="tag-box">
<div class="tag-337">{{ item.tag }}</div>
<div class="title">{{ item.title }}</div>
</div>
<div class="status" :class="{ 'status-active': true }">
<span class="dot"></span> {{ item.status }}
</div>
</div>
<div class="card-body">
{{ item.content }}
</div>
<div class="card-footer">
<div class="footer-left-tags">
<AreaTag v-for="(area, idx) in item.areaList" :key="idx" :tagName="area"></AreaTag>
</div>
<div class="footer-right-flags">
<div class="flag-icon" v-for="(flag, fidx) in item.countryList" :key="fidx">
<img :src="flag" alt="" />
</div>
</div>
</div>
</div>
</div>
</div>
<SurveyHistory v-loading="listLoading" :surveyList="surveyInfoList"></SurveyHistory>
<div class="right-footer">
<div class="footer-left">{{ `共${totalDiscussNum}项调查` }}</div>
<div class="footer-right">
......@@ -144,14 +104,11 @@
<script setup>
import { ref, onMounted, watch, computed } from "vue";
import router from "@/router";
import { useRoute } from "vue-router";
import { Search, ArrowDown, ArrowUp } from "@element-plus/icons-vue";
import { getSearchAllArea, getSearchAllYear, getSurveyList, getSearchAllCountry } from "@/api/marketAccessRestrictions";
import AnalysisBox from "@/components/base/boxBackground/analysisBox.vue"
const route = useRoute();
import SurveyHistory from "@/views/marketAccessRestrictions/com/SurveyHistory.vue"
// 顶部过滤项
const searchText = ref("");
......@@ -255,22 +212,9 @@ const handleFetchSurveyList = async () => {
sortOrder: isSort.value ? "asc" : "desc"
};
const res = await getSurveyList(params);
if (res.code === 200 && res.data) {
surveyInfoList.value = res.data.content.map(item => {
return {
time: item.searchdate,
timeZH: item.searchdatezh,
title: item.searchname,
content: item.content,
status: item.casestatus,
areaList: item.searchArea || [],
countryList: item.countryImage || [],
tag: item.sortcode || "337",
id: item.searchid,
sortImageUrl: item.sortimageurl
};
});
totalDiscussNum.value = res.data.totalElements || 0;
if (res.code === 200) {
surveyInfoList.value = res.data?.content || [];
totalDiscussNum.value = res.data?.totalElements || 0;
}
} catch (error) {
console.error("获取调查列表失败", error);
......@@ -289,17 +233,6 @@ const handleSearch = () => {
handleFetchSurveyList();
};
const handleToSingleCase = item => {
const curRoute = router.resolve({
path: "/marketSingleCaseLayout/overview",
query: {
id: "337",
searchId: item.id + ""
}
});
window.open(curRoute.href, "_blank");
};
// 监听过滤条件
watch(
[checkedSurveyYears, checkedAreaList, checkedCountryList, isSort, filterStage, filterParty, filterReason],
......@@ -359,8 +292,7 @@ onMounted(async () => {
.case-wrapper {
width: 1600px;
margin: 0 auto;
padding-top: 20px;
padding-bottom: 35px;
padding: 20px 0;
.wrapper-header {
height: 32px;
......@@ -375,11 +307,9 @@ onMounted(async () => {
align-items: center;
.search-box {
:deep(.el-input__wrapper) {
background-color: #fff;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 4px;
}
background-color: #fff;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 4px;
}
.dropdown-filters {
......@@ -426,7 +356,7 @@ onMounted(async () => {
.wrapper-main {
display: flex;
justify-content: space-between;
gap: 16px;
.left {
width: 360px;
......@@ -462,21 +392,10 @@ onMounted(async () => {
.checkbox-group {
padding: 10px 0 0 25px;
// display: flex;
// flex-direction: column;
// .area-grid,
// .year-grid,
// .country-grid {
// display: grid;
// grid-template-columns: repeat(2, 1fr);
// gap: 4px;
// }
.filter-checkbox {
width: 130px;
margin-bottom: 8px;
height: 32px;
:deep(.el-checkbox__label) {
font-size: 16px;
color: #5f656c;
......@@ -499,204 +418,8 @@ onMounted(async () => {
}
.right {
width: 1224px;
.right-header {
height: 48px;
display: flex;
align-items: center;
padding: 0 20px;
.icon {
width: 22px;
img {
width: 100%;
}
}
.title {
margin-left: 12px;
font-size: 20px;
font-weight: 700;
color: var(--color-main-active);
}
}
.right-main {
padding: 18px 27px 0 24px;
border-top: 1px solid var(--bg-black-5);
.timeline-item {
display: flex;
cursor: pointer;
.timeline-date {
width: 100px;
text-align: right;
padding-right: 20px;
.date-text {
height: 24px;
font-size: 16px;
font-weight: 700;
color: var(--color-main-active);
line-height: 24px;
letter-spacing: 1px;
}
}
.timeline-line-box {
width: 40px;
display: flex;
flex-direction: column;
align-items: center;
position: relative;
.timeline-icon {
width: 32px;
height: 32px;
z-index: 2;
background: #fff;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
}
.default-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: orange;
}
}
.timeline-line {
width: 2px;
flex: 1;
background: #eaeeef;
margin: 4px 0;
}
}
.timeline-content-card {
flex: 1;
border-radius: 8px;
padding: 0 20px;
margin-left: 10px;
margin-bottom: 24px;
transition: all 0.3s;
&:hover {
.card-header>.tag-box>.title {
color: var(--color-main-active);
text-decoration: underline;
}
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
.tag-box {
display: flex;
align-items: center;
gap: 12px;
.tag-337 {
padding: 2px 10px;
border: 1px solid #91caff;
background: #e6f4ff;
color: #055fc2;
border-radius: 4px;
font-weight: 700;
font-size: 16px;
}
.title {
font-size: 18px;
font-weight: 700;
color: #3b414b;
}
}
.status {
font-size: 16px;
color: #84888e;
.dot {
margin-right: 4px;
}
}
.status-active {
color: var(--color-main-active);
}
}
.card-body {
font-size: 16px;
color: #5f656c;
line-height: 1.6;
margin-bottom: 16px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
overflow: hidden;
}
.card-footer {
display: flex;
gap: 8px;
align-items: center;
.footer-left-tags {
display: flex;
gap: 8px;
.area-tag {
padding: 2px 12px;
background: #e6f7ff;
border: 1px solid #91d5ff;
color: #1890ff;
border-radius: 4px;
font-size: 14px;
}
}
.footer-right-flags {
display: flex;
gap: 4px;
.flag-icon {
width: 24px;
height: 24px;
border-radius: 50%;
overflow: hidden;
border: 1px solid #eee;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
}
}
}
}
}
flex: auto;
width: 20px;
.right-footer {
height: 74px;
......@@ -704,7 +427,6 @@ onMounted(async () => {
justify-content: space-between;
align-items: center;
padding: 0 40px;
border-top: 1px solid rgba(234, 236, 238, 1);
.footer-left {
font-size: 14px;
......@@ -714,8 +436,4 @@ onMounted(async () => {
}
}
}
.filter-checkbox {
width: 130px;
}
</style>
<template>
<div class="wrap">
<div class="header">
<div class="header-top">
<div class="left">
<div class="icon">
<img :src="curSurvey.image" alt="" />
</div>
<div class="info">
<div class="title">{{ curSurvey.title }}</div>
<div class="content">
{{ curSurvey.desc }}
</div>
</div>
<div class="page-box">
<div class="page-top">
<div class="head-box">
<div class="head-icon">
<img :src="curSurvey.image" alt="" />
</div>
<!-- <div class="right">
<div class="icon">
<div class="head-info">
<div class="head-name one-line-ellipsis">{{ curSurvey.title }}</div>
<div class="head-text one-line-ellipsis">{{ curSurvey.desc }}</div>
</div>
<!-- <div class="head-button">
<div class="button-icon">
<img src="./assets/images/button-icon.png" alt="" />
</div>
<div class="text">{{ "查看官网" }}</div>
<div class="button-text">{{ "查看官网" }}</div>
</div> -->
</div>
<div class="header-footer">
<div
class="btn-item"
:class="{ btnItemActive: activeBtnName === item.name }"
v-for="(item, index) in btnList"
:key="index"
@click="handleClickBtn(item)"
>
<div class="page-tabs">
<div :class="['tab-item', {'tab-active': activeName==item.name}]" v-for="(item, index) in tabList" :key="index" @click="handleClickBtn(item)">
<div class="icon">
<img :src="item.acitveIcon" alt="" v-if="activeBtnName === item.name" />
<img :src="item.activeIcon" alt="" v-if="activeName==item.name" />
<img :src="item.icon" alt="" v-else />
</div>
<div class="text" :class="{ textActive: activeBtnName === item.name }">
<div class="text" :class="{ textActive: activeName==item.name }">
{{ item.name }}
</div>
</div>
......@@ -58,17 +48,17 @@ import Img301 from "./assets/images/301.png";
import { useRoute } from "vue-router";
const route = useRoute();
const btnList = ref([
const tabList = ref([
{
name: "调查案件",
icon: icon2,
acitveIcon: icon2Active,
activeIcon: icon2Active,
path: "/marketAccessLayout/case"
},
{
name: "数据统计",
icon: icon1,
acitveIcon: icon1Active,
activeIcon: icon1Active,
path: "/marketAccessLayout/overview"
}
]);
......@@ -78,150 +68,136 @@ const curSurvey = computed(() => {
return {
title: "301调查",
desc: '由美国贸易代表办公室依据《1974年贸易法》第301条针对"不合理或不公正贸易做法"发起的调查',
image: Img301
image: Img301,
};
} else if (route.query.id === "232") {
return {
title: "232调查",
desc: "依据《1962年贸易扩展法》第232条款,授权美国商务部对“特定进口产品是否威胁或损害美国国家安全”而开展的全面调查。",
image: Img232
image: Img232,
};
} else {
return {
title: "337调查",
desc: '美国国际贸易委员会根据《1930年关税法》第337节及相关修正案进行的调查,主要针对进口贸易中的知识产权侵权行为以及其他不公平竞争行为',
image: Img337
image: Img337,
};
}
});
const activeBtnName = ref("调查案件");
const activeName = ref("调查案件");
const handleClickBtn = item => {
activeBtnName.value = item.name;
activeName.value = item.name;
router.push({
path: item.path,
query: {
id: route.query.id
}
query: { id: route.query.id }
});
};
onMounted(() => {
if (route.path === "/marketAccessLayout/overview") {
activeBtnName.value = "数据统计";
activeName.value = "数据统计";
} else {
activeBtnName.value = "调查案件";
activeName.value = "调查案件";
}
});
</script>
<style lang="scss" scoped>
.wrap {
.page-box {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
background-color: #f7f8f9;
.header {
width: 1920px;
height: 148px;
background: rgba(255, 255, 255, 1);
.page-top {
width: 1600px;
margin: 0 auto;
box-sizing: border-box;
border-bottom: 1px solid rgba(230, 231, 232, 1);
background: rgba(255, 255, 255, 1);
.header-top {
.head-box {
width: 100%;
display: flex;
height: 100px;
justify-content: space-between;
.left {
margin-left: 160px;
margin-top: 24px;
display: flex;
.icon {
width: 54px;
height: 54px;
img {
width: 100%;
height: 100%;
}
padding: 30px 0 20px;
.head-icon {
width: 54px;
height: 54px;
font-size: 0px;
margin-right: 16px;
img {
width: 100%;
height: 100%;
}
.info {
margin-left: 14px;
margin-top: -1px;
.title {
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 700;
line-height: 26px;
}
.content {
margin-top: 1px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
.head-info {
width: 20px;
flex: auto;
.head-name {
width: 100%;
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: bold;
line-height: 26px;
}
.head-text {
width: 100%;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
.right {
margin-top: 24px;
margin-right: 160px;
.head-button {
margin-left: 100px;
width: 120px;
height: 36px;
border-radius: 6px;
background: var(--color-main-active);
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
.icon {
.button-icon {
width: 16px;
height: 16px;
margin-left: 16px;
margin-top: 10px;
position: relative;
z-index: 99;
font-size: 0;
img {
width: 100%;
height: 100%;
}
}
.text {
.button-text {
margin-left: 8px;
margin-top: 7px;
height: 22px;
color: rgba(255, 255, 255, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 22px;
}
}
}
.header-footer {
height: 48px;
margin-left: 160px;
.page-tabs {
display: flex;
gap: 24px;
.btn-item {
align-items: flex-start;
.tab-item {
height: 40px;
display: flex;
align-items: center;
gap: 4px;
cursor: pointer;
margin-right: 24px;
.icon {
width: 16px;
height: 16px;
margin-top: 16px;
font-size: 0;
img {
width: 100%;
height: 100%;
}
}
.text {
margin-left: 2px;
margin-top: 12px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
......@@ -234,13 +210,24 @@ onMounted(() => {
font-weight: 700;
}
}
.btnItemActive {
border-bottom: 3px solid var(--color-main-active);
.tab-active {
position: relative;
&::after {
content: "";
position: absolute;
bottom: 0px;
left: 0;
width: 100%;
height: 3px;
background-color: var(--color-main-active);
}
}
}
}
.main {
width: 1920px;
border-top: 1px solid rgba(230, 231, 232, 1);
background-color: #f7f8f9;
width: 100%;
height: 20px;
flex: auto;
}
......
......@@ -201,13 +201,16 @@ onMounted(() => {
<style lang="scss" scoped>
.wrap {
width: 100%;
height: 100%;
overflow: hidden;
width: 1600px;
margin: 0 auto;
padding: 20px 0;
display: flex;
flex-direction: column;
gap: 16px;
.top {
display: flex;
justify-content: space-between;
margin: 16px 160px;
.item {
width: 388px;
height: 80px;
......@@ -338,7 +341,6 @@ onMounted(() => {
.center {
display: flex;
justify-content: space-between;
margin: 0 160px;
.box1 {
width: 792px;
height: 360px;
......@@ -364,7 +366,6 @@ onMounted(() => {
}
}
.footer {
margin: 16px 160px;
display: flex;
justify-content: space-between;
.box3 {
......
<template>
<div class="wrap">
<!-- <div class="sider-tab-box">
<SiderTabs :siderList="siderTabList" @clickSiderItem="handleClickTabItem" />
</div> -->
<div class="top">
<div class="box1 box" v-loading="box1Loading">
<div class="box-header">
......@@ -143,28 +140,6 @@ import getSankeyChart from "./utils/sankey";
import getPieChart from "./utils/piechart";
import getbarChart from "@/views/bill/utils/barchart";
import { getSearchCountry, getStatArea, getStatNum, getSearchDirection } from "@/api/marketAccessRestrictions";
import SiderTabs from "@/components/base/SiderTabs/index.vue"
// const siderTabList = ref([
// {
// name: '分析内11111',
// active: false
// },
// {
// name: '分析内2',
// active: true
// },
// {
// name: '分析内3',
// active: false
// },
// ])
// const handleClickTabItem = (value) => {
// console.log('val',value);
// }
const selectYear = ref("2025");
......@@ -339,14 +314,12 @@ onMounted(() => {
<style lang="scss" scoped>
.wrap {
overflow: hidden;
position: relative;
.sider-tab-box{
position: absolute;
left: 20px;
top: 20px;
}
width: 1600px;
margin: 0 auto;
padding: 20px 0;
display: flex;
flex-direction: column;
gap: 16px;
.box {
width: 792px;
......@@ -473,7 +446,6 @@ onMounted(() => {
display: flex;
justify-content: center;
gap: 16px;
margin: 16px auto;
.box1 {
.box1-main {
......@@ -494,9 +466,6 @@ onMounted(() => {
display: flex;
justify-content: center;
gap: 16px;
margin: 0 auto;
margin-bottom: 16px;
.box3 {
.box3-main {
height: 304px;
......
......@@ -41,45 +41,6 @@
</div>
<div class="footer">
<div class="box3" v-loading="box3Loading">
<!-- <div class="box-header">
<div class="header-left"></div>
<div class="title">中国公司受调查情况</div>
<div class="header-btn-box">
<div class="btn" :class="{ btnActive: btnActiveName === '调查次数' }" @click="handleClickBox3Btn('调查次数')">
调查次数
</div>
<div class="btn" :class="{ btnActive: btnActiveName === '注册地分布' }" @click="handleClickBox3Btn('注册地分布')">
注册地分布
</div>
</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div v-show="btnActiveName === '调查次数'" class="box3-main" id="chart3"></div>
<div v-show="btnActiveName === '注册地分布'" class="box3-main1">
<div class="box3-main1-left">
<div class="box3-main1-left-item" v-for="(item, index) in mapData" :key="index">
<div class="box3-main1-left-item-left">{{ index + 1 }}</div>
<div class="box3-main1-left-item-center">{{ item.name }}</div>
<div class="box3-main1-left-item-right">
{{ item.value + "次" }}
</div>
</div>
</div>
<div class="box3-main1-right" id="chartMap"></div>
</div>
<div class="box3-footer">
<TipTab />
</div> -->
<AnalysisBox title="中国公司受调查情况">
<template #header-btn>
<div class="header-btn-box">
......@@ -520,25 +481,16 @@ onMounted(() => {
<style lang="scss" scoped>
.wrap {
width: 100%;
overflow: hidden;
position: relative;
.graph-box {
position: absolute;
top: 100px;
left: 100px;
width: 1000px;
height: 600px;
border-radius: 10px;
z-index: 9999;
background: #fff;
}
width: 1600px;
margin: 0 auto;
padding: 20px 0;
display: flex;
flex-direction: column;
gap: 16px;
.top {
display: flex;
justify-content: space-between;
margin: 16px 160px;
.item {
width: 388px;
......@@ -631,36 +583,6 @@ onMounted(() => {
font-weight: 700;
}
// .header-btn-box {
// position: absolute;
// top: 14px;
// right: 120px;
// display: flex;
// .btn {
// margin-left: 8px;
// height: 28px;
// padding: 0 8px;
// box-sizing: border-box;
// border: 1px solid rgba(230, 231, 232, 1);
// border-radius: 4px;
// background: rgba(255, 255, 255, 1);
// text-align: center;
// line-height: 28px;
// color: rgba(59, 65, 75, 1);
// font-family: Microsoft YaHei;
// font-size: 16px;
// font-weight: 400;
// cursor: pointer;
// }
// .btnActive {
// border: 1px solid var(--color-main-active);
// background: rgba(246, 250, 255, 1);
// color: var(--color-main-active);
// }
// }
.header-right {
position: absolute;
top: 14px;
......@@ -684,7 +606,6 @@ onMounted(() => {
.center {
display: flex;
justify-content: space-between;
margin: 0 160px;
.box1 {
width: 792px;
......@@ -717,7 +638,6 @@ onMounted(() => {
}
.footer {
margin: 16px 160px;
display: flex;
justify-content: space-between;
......
<template>
<div class="wrapper">
<div class="box1 box">
<div class="box-header">
<div class="header-left"></div>
<div class="title">行业背景</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<AnalysisBox title="行业背景" :showAllBtn="false" height="auto">
<div class="box1-main">
<div class="box1-main-item" v-for="(bg, index) in bgList" :key="index">
<!-- <div class="id">{{ index + 1 + "." }}</div> -->
<div class="title">{{ bg.title }}</div>
</div>
</div>
<div class="box-footer">
<div class="box-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div>
<div class="box-footer-center">
{{
`美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。`
}}
</div>
<div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
<div class="box2 box">
<div class="box-header">
<div class="header-left"></div>
<div class="title">市场需求</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box2-main">
<div class="box2-main-item" v-for="(demand, index) in demandList" :key="index">
<div class="box2-main-item-header">
<div class="header-left">
{{ demand.title }}
</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/images/icon-open.png" alt="" />
</div>
<div class="text">{{ "跳转原文" }}</div>
</div>
</div>
<div class="box2-main-item-content">
<div class="content-item" v-for="(val, idx) in demand.data" :key="idx">
<!-- <div class="id">{{ idx + 1 + "." }}</div> -->
<div class="title">{{ val.title }}</div>
</div>
</div>
</div>
</div>
<div class="box-footer">
<div class="box-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div>
<div class="box-footer-center">
{{
`美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。`
}}
</div>
<div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
<div class="data-list">
<div class="data-item" v-for="(bg, index) in bgList" :key="index">{{ bg.title }}</div>
</div>
<AiTips tips="钒作为被美国列为对经济与国家安全至关重要且供应链易受中断的关键矿产,广泛应用于国防、关键基础设施等多个领域,美国钒产业以二次生产为主、产业高度集中且依赖进口原料,同时通过征收反倾销税、加征关税及签订国际合作协议等方式管控钒进口。"></AiTips>
</div>
</div>
<div class="box3 box">
<div class="box-header">
<div class="header-left"></div>
<div class="title">国内外供应情况</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box3-main">
<div class="box3-main-item" v-for="(supply, index) in supplyList" :key="index">
<div class="box3-main-item-header">
<div class="header-left">
{{ supply.title }}
</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/images/icon-open.png" alt="" />
</div>
<div class="text">{{ "跳转原文" }}</div>
</div>
</div>
<div class="box3-main-item-content">
<div class="content-item" v-for="(val, idx) in supply.data" :key="idx">
<!-- <div class="id">{{ idx + 1 + "." }}</div> -->
<div class="title">{{ val.title }}</div>
</div>
</div>
</div>
</div>
<div class="box-footer">
<div class="box-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div>
<div class="box-footer-center">
{{
`美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。`
}}
</div>
<div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
<div class="box4 box">
<div class="box-header">
<div class="header-left"></div>
<div class="title">未来产业格局</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box4-main">
<div class="box4-main-item" v-for="(item, index) in box4List" :key="index">
<div class="box4-main-item-header">
<div class="header-left">
{{ item.title }}
</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/images/icon-open.png" alt="" />
</AnalysisBox>
<SurveyConclusion title="市场需求" :listData="demandList" tips="美国钒市场年均表观消费量约 8590 吨且进口依赖度超 80%,需求主要集中在钢铁产业(占 90%),钛产业和非冶金领域各占 5%,2020 年受新冠疫情冲击需求下滑;全球钒需求以钢铁产业为主(90%-93%),中国是最大消费国,航空航天领域需求稳定、钒液流电池为新兴增长点,化工领域提供稳定补充。"></SurveyConclusion>
<SurveyConclusion title="国内外供应情况" :listData="supplyList" tips="美国钒供应以二次生产为主、原生供应仅一家企业且已停产,存在潜在产能但需达到一定钒价才具经济性,原料进口依赖度高;全球钒产能集中在中国、俄罗斯等四国,中国主导供应,欧盟、南非等为主要出口方,美国进口来源集中且本土生产竞争力弱,多国规划新增产能有望大幅提升全球矿山产量。"></SurveyConclusion>
<SurveyConclusion title="未来产业格局" :listData="box4List" tips="美国钒产业短期将通过产能扩张提升自给率,中长期有望进一步降低进口依赖度,同时受政策驱动与多重风险挑战影响;全球钒市场需求将受钢铁产业结构调整和储能需求增长支撑,供应格局向多极化发展,价格受产能释放与储能需求影响呈现短期低位、中长期有望回升的态势,贸易与政策层面的竞争和管控将持续加剧。"></SurveyConclusion>
<AnalysisBox title="调查建议" :showAllBtn="false" height="auto">
<div class="box5-main">
<div class="data-list">
<div class="data-item" v-for="(item, index) in suggestionList" :key="index">
<div class="item-head">
<div class="item-name">{{ item.title }}</div>
<div class="button-box">
<div class="button-icon">
<img src="@/views/marketAccessRestrictions/assets/icons/open.png" alt="" />
</div>
<div class="button-text">跳转原文</div>
</div>
<div class="text">{{ "跳转原文" }}</div>
</div>
</div>
<div class="box4-main-item-content">
<div class="content-item" v-for="(val, idx) in item.data" :key="idx">
<!-- <div class="id">{{ idx + 1 + "." }}</div> -->
<div class="title">{{ val.title }}</div>
</div>
</div>
</div>
</div>
<div class="box-footer">
<div class="box-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div>
<div class="box-footer-center">
{{
`美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。`
}}
</div>
<div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
<div class="box5 box">
<div class="box-header">
<div class="header-left"></div>
<div class="title">调查建议</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box5-main">
<div class="box5-main-item" v-for="(suggestion, index) in suggestionList" :key="index">
<div class="box5-main-item-header">{{ suggestion.title }}</div>
<div class="box5-main-item-content">
<div class="content-item" v-for="(val, idx) in suggestion.data" :key="idx">
<div class="content-item-title">{{val.title }}</div>
<div class="content-item-info">
<div class="desc">{{ val.info.desc }}</div>
<div class="info-bill" v-if="val.info.bill">
<div class="info-bill-box">
<div class="info-bill-left">{{ "法案" }}</div>
<div class="info-bill-center">{{ val.info.bill }}</div>
<div class="info-bill-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
<div class="item-down">
<div class="content-item" v-for="(val, idx) in item.data" :key="idx">
<div class="content-item-title">{{val.title }}</div>
<div class="content-item-info">
<div class="desc">{{ val.info.desc }}</div>
<div class="info-bill" v-if="val.info.bill">
<div class="info-bill-box">
<div class="info-bill-left">{{ "法案" }}</div>
<div class="info-bill-center">{{ val.info.bill }}</div>
<div class="info-bill-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
</div>
......@@ -220,21 +43,9 @@
</div>
</div>
</div>
<AiTips tips="美国为降低盟友及自身在钕铁硼磁体价值链对中国的依赖、保障国家安全,一方面推动关键矿物多边及双边合作,另一方面通过支持相关税收抵免法案、分配额外资金等立法与政策举措,强化稀土及非稀土磁体相关国内供应链建设。"></AiTips>
</div>
<div class="box-footer">
<div class="box-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div>
<div class="box-footer-center">
{{
`美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。`
}}
</div>
<div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
</AnalysisBox>
</div>
</template>
......@@ -242,6 +53,8 @@
import { ref, onMounted } from "vue";
import { useRoute } from "vue-router";
import { getReportAnalyze } from "@/api/marketAccessRestrictions/index.js";
import SurveyConclusion from "@/views/marketAccessRestrictions/com/SurveyConclusion.vue";
import AiTips from "@/views/marketAccessRestrictions/com/AiTips.vue";
const route = useRoute();
const searchId = route.query.searchId || "232";
......@@ -264,22 +77,37 @@ const getData = async () => {
// 市场需求
getReportAnalyze({ searchId, type: "02" }).then((res) => {
if (res.data) {
demandList.value = groupData(res.data);
if (res.code==200) {
demandList.value = res.data.map(item => {
return {
title: item.TITLE,
data: item.CONTENT?.split(/\r\n|\n/).filter(line => line.trim()) || [],
};
});
}
});
// 国内外供应情况
getReportAnalyze({ searchId, type: "03" }).then((res) => {
if (res.data) {
supplyList.value = groupData(res.data);
if (res.code==200) {
supplyList.value = res.data.map(item => {
return {
title: item.TITLE,
data: item.CONTENT?.split(/\r\n|\n/).filter(line => line.trim()) || [],
};
});
}
});
// 未来产业格局
getReportAnalyze({ searchId, type: "04" }).then((res) => {
if (res.data) {
box4List.value = groupData(res.data);
if (res.code==200) {
box4List.value = res.data.map(item => {
return {
title: item.TITLE,
data: item.CONTENT?.split(/\r\n|\n/).filter(line => line.trim()) || [],
};
});
}
});
......@@ -336,483 +164,150 @@ onMounted(() => {
<style lang="scss" scoped>
.wrapper {
width: 100%;
height: 100%;
overflow-y: auto;
.box-header {
height: 56px;
display: flex;
position: relative;
.header-left {
margin-top: 20px;
width: 8px;
height: 16px;
border-radius: 0 4px 4px 0;
background: var(--color-main-active);
}
.title {
margin-left: 14px;
margin-top: 16px;
height: 24px;
line-height: 24px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
}
.header-btn-box {
position: absolute;
top: 14px;
right: 116px;
display: flex;
.btn {
margin-left: 8px;
height: 28px;
padding: 0 8px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 4px;
background: rgba(255, 255, 255, 1);
text-align: center;
line-height: 28px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
cursor: pointer;
}
.btnActive {
border: 1px solid var(--color-main-active);
background: rgba(246, 250, 255, 1);
color: var(--color-main-active);
}
}
.header-right {
position: absolute;
top: 14px;
right: 12px;
display: flex;
justify-content: flex-end;
gap: 4px;
.icon {
width: 28px;
height: 28px;
img {
width: 100%;
height: 100%;
}
}
}
}
.box-footer {
margin: 24px auto 0;
width: 1568px;
height: 64px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
display: flex;
align-items: center;
gap: 13px;
padding: 0 12px;
.box-footer-left {
width: 19px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.box-footer-center {
width: 939px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.box-footer-right {
width: 24px;
height: 24px;
img {
width: 100%;
height: 100%;
}
}
}
.box {
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
margin: 16px auto;
}
.box1 {
width: 1600px;
// height: 588px;
.box1-main {
// height: 425px;
margin-top: 2px;
overflow: hidden;
overflow-y: auto;
}
.box1-main-item {
margin: 0 auto;
width: 1552px;
padding: 12px 23px 12px 44px;
width: 1600px;
margin: 20px auto;
display: flex;
flex-direction: column;
gap: 16px;
}
.box1-main {
padding: 0 22px 20px;
.data-list {
margin-bottom: 16px;
border-top: 1px solid rgba(234, 236, 238, 1);
.data-item {
letter-spacing: 1px;
padding: 12px 20px 12px 40px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
display: flex;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.id {
width: 18px;
}
.title {
flex: 1;
}
}
}
.box2 {
width: 1600px;
// height: 921px;
.box2-main {
// height: 760px;
width: 1552px;
margin: 2px auto 0;
.box2-main-item {
width: 1552px;
.box2-main-item-header {
height: 48px;
}
.box5-main {
padding: 0 22px 20px;
.data-list {
margin-bottom: 16px;
border-top: 1px solid rgba(234, 236, 238, 1);
.data-item {
.item-head {
padding: 0 20px;
height: 48px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
display: flex;
align-items: center;
.item-name {
width: 20px;
flex: auto;
font-family: Source Han Sans CN;
font-size: 18px;
font-weight: bold;
line-height: 30px;
color: var(--text-primary-80-color);
}
.button-box {
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
.header-left {
margin-left: 12px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.header-right {
margin-right: 22px;
display: flex;
gap: 5px;
justify-content: flex-end;
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 14px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 14px;
letter-spacing: 0px;
text-align: justify;
margin-left: 50px;
.button-icon {
width: 16px;
height: 16px;
font-size: 0;
margin-right: 4px;
img {
width: 100%;
height: 100%;
}
}
}
.box2-main-item-content {
.content-item {
box-sizing: border-box;
padding: 12px 23px 12px 44px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
color: rgba(59, 65, 75, 1);
.button-text {
color: var(--color-primary-100);
font-family: Microsoft YaHei;
font-size: 16px;
font-size: 12px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
display: flex;
.id {
width: 18px;
}
.title {
flex: 1;
}
line-height: 12px;
}
}
}
}
}
.box3 {
width: 1600px;
// height: 957px;
.box3-main {
// height: 795px;
width: 1552px;
margin: 2px auto 0;
.box3-main-item {
width: 1552px;
.box3-main-item-header {
height: 48px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
.header-left {
margin-left: 12px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.header-right {
margin-right: 22px;
display: flex;
gap: 5px;
justify-content: flex-end;
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 14px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 14px;
letter-spacing: 0px;
text-align: justify;
}
}
}
.box3-main-item-content {
.content-item {
box-sizing: border-box;
.item-down {
margin-bottom: 10px;
.content-item {
.content-item-title {
padding: 12px 23px 12px 44px;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
display: flex;
.id {
width: 18px;
}
.title {
flex: 1;
}
}
}
}
}
}
.box4 {
width: 1600px;
// height: 954px;
.box4-main {
// height: 795px;
width: 1552px;
margin: 2px auto 0;
.box4-main-item {
width: 1552px;
.box4-main-item-header {
height: 48px;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
.header-left {
margin-left: 12px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
line-height: 24px;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
}
.header-right {
margin-right: 22px;
display: flex;
gap: 5px;
justify-content: flex-end;
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 14px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 14px;
letter-spacing: 0px;
text-align: justify;
}
}
}
.box4-main-item-content {
.content-item {
box-sizing: border-box;
.content-item-info {
padding: 12px 23px 12px 44px;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
display: flex;
.id {
width: 18px;
}
.title {
flex: 1;
}
}
}
}
}
}
.box5 {
width: 1600px;
// height: 813px;
.box5-main {
// height: 650px;
width: 1552px;
margin: 0 auto;
margin-top: 2px;
.box5-main-item {
.box5-main-item-header {
width: 1552px;
height: 48px;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
line-height: 48px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
letter-spacing: 0px;
text-align: justify;
padding-left: 12px;
}
.box5-main-item-content {
margin-bottom: 10px;
.content-item {
.content-item-title {
padding: 12px 23px 12px 44px;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.desc {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 700;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
padding-left: 15px;
}
.content-item-info {
padding: 12px 23px 12px 44px;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.desc {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
padding-left: 15px;
}
.info-bill {
.info-bill {
border-radius: 4px;
display: inline-block;
background: rgba(246, 250, 255, 1);
.info-bill-box {
display: flex;
margin-top: 4px;
height: 32px;
border-radius: 4px;
display: inline-block;
background: rgba(246, 250, 255, 1);
.info-bill-box {
display: flex;
margin-top: 4px;
height: 32px;
gap: 16px;
align-items: center;
padding: 0 8px;
.info-bill-left {
height: 22px;
padding: 0 4px;
border-radius: 4px;
background: rgba(246, 250, 255, 1);
gap: 16px;
align-items: center;
padding: 0 8px;
.info-bill-left {
height: 22px;
padding: 0 4px;
border-radius: 4px;
background: rgba(231, 243, 255, 1);
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.info-bill-center {
height: 24px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
.info-bill-right {
width: 20px;
height: 20px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
background: rgba(231, 243, 255, 1);
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.info-bill-center {
height: 24px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
.info-bill-right {
width: 20px;
height: 20px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
}
......@@ -823,4 +318,4 @@ onMounted(() => {
}
}
}
</style>
</style>
\ No newline at end of file
......@@ -446,9 +446,9 @@ onMounted(() => {
<style lang="scss" scoped>
.deep-dig-container {
display: flex;
padding: 16px 160px;
width: 1600px;
margin: 20px auto;
gap: 16px;
background: #f7f8f9;
.box {
background: #ffffff;
......@@ -553,7 +553,7 @@ onMounted(() => {
}
.left-section {
width: 320px;
width: 480px;
flex-shrink: 0;
.company-list-box {
......@@ -565,11 +565,12 @@ onMounted(() => {
margin-bottom: 16px;
.area-select {
flex: 0 0 100px;
width: 150px;
}
.search-input {
flex: 1;
flex: auto;
width: 20px;
}
}
......@@ -624,7 +625,8 @@ onMounted(() => {
}
.right-section {
flex: 1;
flex: auto;
width: 20px;
display: flex;
flex-direction: column;
gap: 16px;
......
......@@ -26,5 +26,6 @@ onMounted(() => {
.deepdig-wrap {
width: 100%;
height: 100%;
overflow-y: auto;
}
</style>
\ No newline at end of file
<template>
<div class="wrapper">
<div class="header">
<div class="header-top">
<div class="header-top-left">{{ curSurvey.name }}</div>
<div class="header-top-right">
<div class="title">
{{ curSurvey.title }}
</div>
<div class="time">{{ curSurvey.time }}</div>
<div class="page-box">
<div class="page-top">
<div class="head-box">
<div class="head-icon">
<img :src="curSurvey.image" alt="" />
</div>
<div class="head-info">
<div class="head-name one-line-ellipsis">{{ curSurvey.title }}</div>
<div class="head-text">{{ curSurvey.time }}</div>
</div>
<div :class="`item-tag tag-${curSurvey.name}`">{{ curSurvey.name }}调查</div>
</div>
<div class="header-footer">
<div class="nav-box">
<div
class="nav-item"
:class="{ navItemActive: item.isActive }"
v-for="(item, index) in navList"
v-show="item.isShow"
:key="index"
@click="handleClickNav(index)"
>
<div class="icon">
<img v-if="!item.isActive" :src="item.icon" alt="" />
<img v-else :src="item.activeIcon" alt="" />
</div>
<div class="text" :class="{ textActive: item.isActive }">
{{ item.name }}
</div>
<div class="page-tabs">
<div :class="['tab-item', {'tab-active': activeName==item.name}]" v-for="(item, index) in tabList" :key="index" @click="handleClickBtn(item)">
<div class="icon">
<img :src="item.activeIcon" alt="" v-if="activeName==item.name" />
<img :src="item.icon" alt="" v-else />
</div>
<div class="text" :class="{ textActive: activeName==item.name }">
{{ item.name }}
</div>
</div>
<div class="btn-box">
<!-- <div class="btn">
<div class="icon">
<img src="./assets/images/btn-icon1.png" alt="" />
</div>
<div class="text">{{ "查看官网" }}</div>
</div> -->
<div class="btn1">
<div class="icon">
<img src="./assets/images/btn-icon2.png" alt="" />
</div>
<div class="text">{{ "分析报告" }}</div>
<div style="width:20px; flex:auto;"></div>
<div class="head-button">
<div class="button-icon">
<img src="./assets/images/btn-icon2.png" alt="" />
</div>
<div class="button-text">{{ "分析报告" }}</div>
</div>
</div>
</div>
......@@ -56,77 +41,50 @@ import { ref, onMounted, computed } from "vue";
import router from "@/router";
import NavIcon1 from "./assets/images/nav-icon1.png";
import NavIcon1Active from "./assets/images/nav-icon1-active.png";
import NavIcon2 from "./assets/images/nav-icon2.png";
import NavIcon2Active from "./assets/images/nav-icon2-active.png";
import NavIcon3 from "./assets/images/nav-icon2.png";
import NavIcon3Active from "./assets/images/nav-icon2-active.png";
import Img337 from "./assets/images/337.png";
import Img232 from "./assets/images/232.png";
import Img301 from "./assets/images/301.png";
import { useRoute } from "vue-router";
const route = useRoute();
const navList = ref([
const tabList = ref([
{
name: "调查概况",
icon: NavIcon1,
activeIcon: NavIcon1Active,
isActive: true,
isShow: true,
path: "/marketSingleCaseLayout/overview"
},
// {
// name: "报告解析",
// icon: NavIcon2,
// activeIcon: NavIcon2Active,
// isActive: false,
// isShow: route.query.id === "337",
// path: "/marketSingleCaseLayout/deepdig"
// },
{
name: "影响分析",
icon: NavIcon3,
activeIcon: NavIcon3Active,
isActive: false,
isShow: true,
path: "/marketSingleCaseLayout/deepdig"
}
]);
const handleClickNav = index => {
navList.value.forEach(item => {
item.isActive = false;
});
navList.value[index].isActive = true;
router.push({
path: navList.value[index].path,
query: {
...route.query
}
});
};
const surveyList = ref([
{
title: "337-TA-1443:外国制造的半导体器件及其下游产品和组件",
time: "2025年7月18日",
image: Img337,
name: "337"
},
{
title: "231-TA-1225:进口药及进口原材料的调查",
time: "2021年9月21日",
image: Img232,
name: "232"
},
{
title: "美国贸易代表第301条关于中国针对海事、物流和造船业以争取主导地位的行动",
time: "2025年4月17日",
image: Img301,
name: "301"
}
]);
// const curSurvey = ref( {
// title: "337-TA-1443:外国制造的半导体器件及其下游产品和组件",
// time: '2025年7月18日',
// name: '337'
// });
const curSurvey = computed(() => {
let survey;
if (route.query.id === "232") {
......@@ -139,170 +97,203 @@ const curSurvey = computed(() => {
return survey;
});
onMounted(() => {});
const activeName = ref("调查案件");
const handleClickBtn = item => {
activeName.value = item.name;
router.push({
path: item.path,
query: { ...route.query }
});
};
onMounted(() => {
console.log('route', route);
if (route.path === "/marketSingleCaseLayout/deepdig") {
activeName.value = "影响分析";
} else {
activeName.value = "调查概况";
}
});
</script>
<style lang="scss" scoped>
.wrapper {
.page-box {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
background-color: #f7f8f9;
.header {
width: 1920px;
height: 148px;
background: rgba(255, 255, 255, 1);
.page-top {
width: 1600px;
margin: 0 auto;
box-sizing: border-box;
border-bottom: 1px solid rgba(230, 231, 232, 1);
background: rgba(255, 255, 255, 1);
padding: 24px 160px 0;
.header-top {
.head-box {
width: 100%;
display: flex;
.header-top-left {
width: 48px;
height: 48px;
box-sizing: border-box;
border: 1px solid rgba(145, 202, 255, 1);
border-radius: 4px;
background: rgba(230, 244, 255, 1);
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
text-align: center;
line-height: 48px;
padding: 30px 0 20px;
.head-icon {
width: 54px;
height: 54px;
font-size: 0px;
margin-right: 16px;
img {
width: 100%;
height: 100%;
}
}
.header-top-right {
margin-left: 20px;
.title {
.head-info {
width: 20px;
flex: auto;
.head-name {
width: 100%;
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 700;
font-weight: bold;
line-height: 26px;
}
.time {
.head-text {
width: 100%;
height: 24px;
color: rgba(132, 136, 142, 1);
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
.item-tag {
height: 24px;
line-height: 24px;
padding: 0 8px;
border-radius: 4px;
font-weight: bold;
font-size: 16px;
letter-spacing: 2px;
}
.tag-337 {
border: 1px solid #91caff;
background: #e6f4ff;
color: #055fc2;
}
.tag-232 {
border: 1px solid #b37feb;
background: #f9f0ff;
color: #722ed1;
}
.tag-301 {
border: 1px solid #ffd591;
background: #fff7e6;
color: #fa8c16;
}
.head-button {
margin-left: 100px;
width: 120px;
height: 36px;
border-radius: 6px;
background: var(--color-main-active);
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
.button-icon {
width: 16px;
height: 16px;
font-size: 0;
img {
width: 100%;
height: 100%;
}
}
.button-text {
margin-left: 8px;
color: rgba(255, 255, 255, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
}
}
}
.header-footer {
.page-tabs {
display: flex;
justify-content: space-between;
margin-top: 24px;
.nav-box {
height: 48px;
align-items: flex-start;
.tab-item {
height: 40px;
display: flex;
.navItemActive {
border-bottom: 3px solid var(--color-main-active);
}
.nav-item {
display: flex;
width: 95px;
margin-right: 20px;
cursor: pointer;
.icon {
width: 16px;
height: 16px;
margin-top: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
width: 72px;
height: 24px;
margin-top: 12px;
margin-left: 4px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 400;
line-height: 24px;
}
.textActive {
font-size: 18px;
font-weight: 700;
color: var(--color-main-active);
align-items: center;
gap: 4px;
cursor: pointer;
margin-right: 24px;
.icon {
width: 16px;
height: 16px;
font-size: 0;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 400;
line-height: 24px;
}
.textActive {
color: var(--color-main-active);
font-weight: 700;
}
}
.tab-active {
position: relative;
&::after {
content: "";
position: absolute;
bottom: 0px;
left: 0;
width: 100%;
height: 3px;
background-color: var(--color-main-active);
}
}
.btn-box {
height: 48px;
.head-button {
position: relative;
top: -5px;
width: 120px;
height: 36px;
border-radius: 6px;
background: var(--color-main-active);
display: flex;
.btn {
margin-top: 2px;
width: 120px;
height: 36px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 6px;
background: rgba(255, 255, 255, 1);
display: flex;
cursor: pointer;
.icon {
width: 16px;
height: 16px;
margin-left: 16px;
margin-top: 10px;
img {
width: 100%;
height: 100%;
}
}
.text {
margin-left: 8px;
margin-top: 7px;
height: 22px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 22px;
justify-content: center;
align-items: center;
cursor: pointer;
.button-icon {
width: 16px;
height: 16px;
font-size: 0;
img {
width: 100%;
height: 100%;
}
}
.btn1 {
margin-left: 12px;
margin-top: 2px;
width: 120px;
height: 36px;
border-radius: 6px;
background: var(--color-main-active);
display: flex;
cursor: pointer;
.icon {
width: 16px;
height: 16px;
margin-left: 16px;
margin-top: 10px;
img {
width: 100%;
height: 100%;
}
}
.text {
margin-left: 8px;
margin-top: 7px;
height: 22px;
color: #fff;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 22px;
}
.button-text {
margin-left: 8px;
color: rgba(255, 255, 255, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
}
}
}
}
.main {
width: 1920px;
border-top: 1px solid rgba(230, 231, 232, 1);
background-color: #f7f8f9;
width: 100%;
height: 20px;
flex: auto;
}
......
<template>
<div class="wrapper" v-loading="loading">
<div class="wrapper">
<div class="left">
<div class="box1">
<div class="box-header">
<div class="header-left"></div>
<div class="title">基本信息</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box1-main">
<AnalysisBox title="基本信息" :showAllBtn="false" height="auto">
<div class="box1-main" v-loading="loading">
<div class="box1-item">
<div class="box1-item-left">{{ "案卷编号:" }}</div>
<div class="box1-item-right">{{ baseInfo.SEARCHNUM || '-' }}</div>
......@@ -70,42 +55,20 @@
<div class="box1-item-right">{{ baseInfo.ISTARIFF === 'Y' ? `是,增加${baseInfo.ADDTARIFF}%` : '否' }}</div>
</div>
</div>
</div>
</AnalysisBox>
</div>
<div class="right">
<div class="box2" v-loading="box2Loading">
<div class="box-header">
<div class="header-left"></div>
<div class="title">调查脉络</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box2-main">
<!-- <AnalysisBox title="调查脉络" :showAllBtn="false" height="auto">
<div class="box2-main" v-loading="box2Loading">
<div class="box2-line-box"></div>
<div
class="box2-item"
:class="{ box2ItemFooter: index % 2 }"
v-for="(item, index) in timeLineList"
:key="index"
>
<div class="box2-item" :class="{ box2ItemFooter: index % 2 }" v-for="(item, index) in timeLineList" :key="index">
<div class="point" :class="{ pointFooter: index % 2 }">
<img src="@/assets/images/dot.png" alt="" />
</div>
<div class="box2-item-header">
<div class="title">{{ item.time }}</div>
</div>
<div class="box2-item-content">
{{ item.content }}
</div>
<div class="box2-item-content">{{ item.content }}</div>
</div>
<div class="arrow-left">
<img src="@/assets/icons/card-btn-left.png" alt="" />
......@@ -127,50 +90,9 @@
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
<div class="box3" v-loading="box3Loading">
<div class="box-header">
<div class="header-left"></div>
<div class="title">调查结论</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box3-main">
<div class="box3-main-item" v-for="(item, index) in surveyResult" :key="index">
<div class="box3-main-item-header">
<div class="header-left">{{ item.title }}</div>
<div class="header-right">
<div class="icon">
<img src="./assets/images/open.png" alt="" />
</div>
<div class="text">{{ "跳转原文" }}</div>
</div>
</div>
<div class="box3-main-item-content" v-for="(val, idx) in item.data" :key="idx">
<div class="content-item">{{ val }}</div>
</div>
</div>
</div>
<div class="box3-footer">
<div class="box3-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div>
<div class="box3-footer-center">
{{
`美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。`
}}
</div>
<div class="box3-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" />
</div>
</div>
</div>
</AnalysisBox> -->
<SurveyConclusion title="调查结论" :listData="surveyResult" :tips="tips"></SurveyConclusion>
<RelatedEvent title="相关行政举措" :listData="eventList"></RelatedEvent>
</div>
</div>
</template>
......@@ -179,6 +101,10 @@
import { ref, onMounted } from "vue";
import { useRoute } from "vue-router";
import { getSearchBlurb, getSearchContext, getSearchConclusion } from "@/api/marketAccessRestrictions";
import RelatedEvent from "@/views/marketAccessRestrictions/com/RelatedEvent.vue";
import SurveyConclusion from "@/views/marketAccessRestrictions/com/SurveyConclusion.vue";
const tips = "美国 232 调查认定,钕铁硼永磁体(关键领域核心材料)进口威胁其国家安全,因中国主导全球市场、美本土产能薄弱,未提关税,提议扶持本土供应链。"
const route = useRoute();
const loading = ref(false);
......@@ -239,13 +165,11 @@ const handleGetSearchConclusion = async () => {
const res = await getSearchConclusion({
searchId: route.query.searchId
});
if (res.code === 200 && res.data) {
if (res.code === 200) {
surveyResult.value = res.data.map(item => {
// 将 CONTENT 按换行符分割,并过滤掉空行
const contentList = item.CONTENT ? item.CONTENT.split(/\r\n|\n/).filter(line => line.trim()) : [];
return {
title: item.TITLE,
data: contentList
data: item.CONTENT?.split(/\r\n|\n/).filter(line => line.trim()) || [],
};
});
}
......@@ -256,6 +180,25 @@ const handleGetSearchConclusion = async () => {
}
};
// 相关行政举措
const eventList = ref([
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
])
onMounted(() => {
handleGetSearchBlurb();
handleGetSearchContext();
......@@ -265,430 +208,206 @@ onMounted(() => {
<style lang="scss" scoped>
.wrapper {
width: 100%;
// height: 1191px;
padding: 0 160px;
width: 1600px;
margin: 20px auto;
display: flex;
.box-header {
height: 56px;
gap: 16px;
.left {
width: 520px;
display: flex;
position: relative;
.header-left {
margin-top: 20px;
width: 8px;
height: 16px;
border-radius: 0 4px 4px 0;
background: var(--color-main-active);
}
.title {
margin-left: 14px;
margin-top: 16px;
flex-direction: column;
gap: 16px;
}
.right {
width: 20px;
flex: auto;
display: flex;
flex-direction: column;
gap: 16px;
}
}
.box1-main {
padding: 0 22px;
.box1-item {
display: flex;
margin-bottom: 16px;
.box1-item-left {
width: 100px;
height: 24px;
line-height: 24px;
color: var(--color-main-active);
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-size: 16px;
font-weight: 700;
line-height: 24px;
margin-top: 3px;
margin-bottom: 3px;
}
.header-btn-box {
position: absolute;
top: 14px;
right: 52px;
display: flex;
.btn {
margin-left: 8px;
height: 28px;
padding: 0 8px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 4px;
background: rgba(255, 255, 255, 1);
text-align: center;
line-height: 28px;
.box1-item-right {
width: 346px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
.box1-item-right1 {
.box1-item-right1-item {
width: 346px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
cursor: pointer;
line-height: 24px;
}
.btnActive {
border: 1px solid var(--color-main-active);
background: rgba(246, 250, 255, 1);
}
}
}
.box2-main {
padding: 0 22px;
height: 250px;
display: flex;
justify-content: center;
position: relative;
.box2-line-box {
position: absolute;
left: 0;
top: 114px;
height: 8px;
width: 100%;
background: url("@/assets/icons/line-bg.png") repeat;
}
.box2-item {
width: 320px;
height: 120px;
position: relative;
box-sizing: border-box;
padding-left: 13px;
border-left: 1px solid #0a57a6;
margin-left: -100px;
.box2-item-header {
display: flex;
width: 240px;
.title {
color: var(--color-main-active);
height: 26px;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
}
}
.header-info {
height: 22px;
.box2-item-content {
width: 300px;
min-height: 48px;
max-height: 96px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
overflow: hidden;
}
.point {
position: absolute;
right: 84px;
top: 17px;
display: flex;
justify-content: flex-end;
.icon {
margin-top: 3px;
width: 14px;
height: 14px;
margin-right: 8px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 22px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
left: -8px;
bottom: -7px;
width: 15px;
height: 15px;
img {
width: 100%;
height: 100%;
}
}
.header-right {
.pointFooter {
position: absolute;
top: 14px;
right: 12px;
display: flex;
justify-content: flex-end;
gap: 4px;
.icon {
width: 28px;
height: 28px;
img {
width: 100%;
height: 100%;
}
left: -8px;
top: -7px;
width: 15px;
height: 15px;
img {
width: 100%;
height: 100%;
}
}
.time {
height: 24px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
position: absolute;
bottom: -36px;
left: 0;
}
}
.left {
width: 520px;
.box1 {
margin-top: 16px;
width: 520px;
height: 837px;
border-radius: 4px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
.box1-main {
margin-top: 6px;
margin-left: 22px;
.box1-item {
display: flex;
margin-bottom: 16px;
.box1-item-left {
width: 100px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
margin-top: 3px;
margin-bottom: 3px;
}
.box1-item-right {
width: 346px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
.box1-item-right1 {
.box1-item-right1-item {
width: 346px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
}
}
.box2ItemFooter {
margin-top: 118px;
margin-left: -120px;
box-sizing: border-box;
padding-top: 20px;
}
.arrow-left {
width: 24px;
height: 48px;
position: absolute;
left: 0;
top: 95px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
.right {
width: 1064px;
margin-left: 16px;
.box2 {
margin-top: 16px;
width: 1064px;
height: 410px;
border-radius: 4px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
.box2-main {
margin: 0 auto;
margin-top: 10px;
height: 250px;
// width: 1054px;
// overflow-x: auto;
// overflow-y: hidden;
display: flex;
justify-content: center;
position: relative;
padding-left: 120px;
.box2-line-box {
position: absolute;
left: 0;
top: 114px;
height: 8px;
width: 100%;
background: url("@/assets/icons/line-bg.png") repeat;
}
.box2-item {
width: 320px;
height: 120px;
// background: pink;
position: relative;
box-sizing: border-box;
padding-left: 13px;
border-left: 1px solid #0a57a6;
margin-left: -100px;
.box2-item-header {
display: flex;
width: 240px;
.title {
color: var(--color-main-active);
height: 26px;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
}
}
.box2-item-content {
width: 300px;
min-height: 48px;
max-height: 96px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
overflow: hidden;
}
.point {
position: absolute;
left: -8px;
bottom: -7px;
width: 15px;
height: 15px;
img {
width: 100%;
height: 100%;
}
}
.pointFooter {
position: absolute;
left: -8px;
top: -7px;
width: 15px;
height: 15px;
img {
width: 100%;
height: 100%;
}
}
.time {
height: 24px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
position: absolute;
bottom: -36px;
left: 0;
}
}
.box2ItemFooter {
margin-top: 118px;
margin-left: -120px;
box-sizing: border-box;
padding-top: 20px;
}
.arrow-left {
width: 24px;
height: 48px;
position: absolute;
left: 0;
top: 95px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
.arrow-right {
width: 24px;
height: 48px;
position: absolute;
right: 0;
top: 95px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
}
.box2-footer {
margin: 24px auto 0;
width: 1032px;
height: 64px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
display: flex;
align-items: center;
gap: 13px;
padding: 0 12px;
.box2-footer-left {
width: 19px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.box2-footer-center {
width: 939px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.box2-footer-right {
width: 24px;
height: 24px;
img {
width: 100%;
height: 100%;
}
}
}
.arrow-right {
width: 24px;
height: 48px;
position: absolute;
right: 0;
top: 95px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
.box3 {
margin-top: 16px;
margin-bottom: 35px;
width: 1064px;
// height: 714px;
border-radius: 4px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
padding-bottom: 18px;
.box3-main {
width: 1016px;
// height: 550px;
margin: 0 auto;
overflow: hidden;
overflow-y: auto;
.box3-main-item {
.box3-main-item-header {
width: 1016px;
height: 48px;
box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
display: flex;
justify-content: space-between;
align-items: center;
.header-left {
margin-left: 12px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.header-right {
display: flex;
margin-right: 22px;
gap: 5px;
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 14px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 12px;
font-weight: 400;
line-height: 14px;
letter-spacing: 0px;
text-align: justify;
}
}
}
.box3-main-item-content {
.content-item {
width: 1014px;
padding: 12px 23px 12px 44px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
border-bottom: 1px solid rgba(234, 236, 238, 1);
}
}
}
}
.box3-footer {
margin: 24px auto 0;
width: 1032px;
height: 64px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
display: flex;
align-items: center;
gap: 13px;
padding: 0 12px;
.box3-footer-left {
width: 19px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.box3-footer-center {
width: 939px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.box3-footer-right {
width: 24px;
height: 24px;
img {
width: 100%;
height: 100%;
}
}
}
}
}
.box2-footer {
margin: 20px 22px;
height: 64px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
display: flex;
align-items: center;
gap: 13px;
padding: 0 12px;
.box2-footer-left {
width: 19px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.box2-footer-center {
width: 939px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
.box2-footer-right {
width: 24px;
height: 24px;
img {
width: 100%;
height: 100%;
}
}
}
......
......@@ -339,8 +339,8 @@ onMounted(() => {
<style lang="scss" scoped>
.wrapper {
width: 100%;
padding: 0 160px;
width: 1600px;
margin: 20px auto;
display: flex;
.box-header {
height: 56px;
......
<template>
<div class="wrapper" v-loading="loading">
<div class="left">
<div class="box1">
<div class="box-header">
<div class="header-left"></div>
<div class="title">基本信息</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
</div>
<div class="box1-main">
<AnalysisBox title="基本信息" :showAllBtn="false" height="auto">
<div class="box1-main">
<div class="box1-item">
<div class="box1-item-left">{{ "调查案号:" }}</div>
<div class="box1-item-right">{{ baseInfo.SEARCHNUM || '-' }}</div>
......@@ -52,11 +37,7 @@
<div class="box1-item">
<div class="box1-item-left">{{ "案件进展:" }}</div>
<div class="box1-item-right2">
<div
class="box1-item-right2-item"
v-for="(item, index) in processList"
:key="index"
>
<div class="box1-item-right2-item" v-for="(item, index) in processList" :key="index">
<div class="icon">
<img src="./assets/images/icon1.png" alt="" />
</div>
......@@ -66,72 +47,41 @@
</div>
</div>
</div>
</div>
</div>
<div class="right">
<div class="box2">
<div class="box-header">
<div class="header-left"></div>
<div class="title">原告信息</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</AnalysisBox>
<AnalysisBox title="调查公告" :showAllBtn="false" height="auto">
<div class="box4-main">
<div v-for="(item, index) in afficheList" :key="index" class="box4-item">
<div class="item-icon">
<img src="@/views/marketAccessRestrictions/singleCaseLayout/assets/images/icon_affiche.png" alt="">
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
<div class="item-right">
<div class="item-time">{{ item.time }}</div>
<div class="item-text">{{ item.text }}</div>
</div>
</div>
</div>
<div class="box2-main">
<div class="box2-main-top">
<div class="left">
{{ baseInfo.ORGNAME ? baseInfo.ORGNAME.substring(0, 3) : '-' }}
</div>
<div class="right">
<div class="title">{{ baseInfo.ORGNAME || '-' }}</div>
<div class="info">{{ "-" }}</div>
</div>
</div>
<div class="box2-main-center">
{{ baseInfo.ORGBLURB || '-' }}
</div>
<div class="box2-main-footer">
<div class="box2-main-footer-left">
<img src="./assets/images/footer-icon1.png" alt="" />
</div>
<div class="box2-main-footer-center">
{{ baseInfo.ORGBLURB || '-' }}
</div>
<div class="box2-main-footer-right">
<img src="./assets/images/footer-icon2.png" alt="" />
</div>
</div>
</div>
</div>
<div class="box3">
<div class="box-header">
<div class="header-left"></div>
<div class="title">被告信息</div>
<div class="header-info">
<div class="icon">
<img src="./assets/images/header-info-icon.png" alt="">
</div>
</AnalysisBox>
</div>
<div class="right">
<AnalysisBox title="原告信息" :showAllBtn="false" height="auto">
<div class="box2-main">
<div class="data-head">
<div class="data-icon">{{ baseInfo.ORGNAME?.substring(0, 3) }}</div>
<div class="data-right">
<div class="data-name">{{ baseInfo.ORGNAME }}</div>
<div class="data-desc">{{ "" }}</div>
</div>
<div class="text">{{ '以下为列名被告企业及其关联公司' }}</div>
</div>
<div class="header-right">
<div class="icon">
<img src="@/assets/icons/box-header-icon2.png" alt="" />
</div>
<div class="icon">
<img src="@/assets/icons/box-header-icon3.png" alt="" />
</div>
</div>
<div class="data-text">{{ baseInfo.ORGBLURB || '-' }}</div>
<AiTips :tips="tips"></AiTips>
</div>
<div class="box3-main">
<div class="box3-main-box" v-for="(item, index) in caseList" :key="index">
<div class="box3-main-box-header">{{ item.title }}</div>
<div class="box3-main-box-content">
<div class="content-item" v-for="(val, idx) in item.companyList" :key="idx">
</AnalysisBox>
<AnalysisBox title="被告信息" :showAllBtn="false" height="auto">
<div class="box3-main">
<div class="data-item" v-for="(item, index) in caseList" :key="index">
<div class="data-head">{{ item.title }}</div>
<div class="info-list">
<div class="info-item" v-for="(val, idx) in item.companyList" :key="idx">
<div class="icon">
<img :src="val.logo" alt="" v-if="val.logo">
<div class="default-logo" v-else>{{ val.name ? val.name.substring(0, 1) : '' }}</div>
......@@ -139,9 +89,10 @@
<div class="text">{{ val.name }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</AnalysisBox>
<RelatedEvent title="相关事件" :listData="eventList"></RelatedEvent>
</div>
</div>
</template>
......@@ -150,12 +101,17 @@ import { ref, onMounted } from "vue";
import { useRoute } from "vue-router";
import { getSearchBlurb } from "@/api/marketAccessRestrictions";
import AiTips from "@/views/marketAccessRestrictions/com/AiTips.vue";
import RelatedEvent from "@/views/marketAccessRestrictions/com/RelatedEvent.vue";
const tips = `Pantech是韩国的一家通信设备公司,曾经是手机制造商,但现在可能已转型为专利持有实体。这类公司常被称为"非执业实体"(NPE)或"专利断言实体"(PAE),通过专利授权和诉讼获取收益。这些企业曾经是行业龙头,但因科技和市场形态巨变,加上自身改革步伐缓慢,经营状况每况愈下。卖掉实体业务部门后,留下来的是高达几万件的专利。`
const route = useRoute();
const loading = ref(false);
const baseInfo = ref({});
const processList = ref([]);
const caseList = ref([]);
// 调查概况
const handleGetSearchBlurb = async () => {
loading.value = true;
try {
......@@ -163,6 +119,7 @@ const handleGetSearchBlurb = async () => {
searchId: route.query.searchId,
sortCode: "337"
});
console.log("调查概况", res)
if (res.code === 200 && res.data) {
const data = res.data;
baseInfo.value = data;
......@@ -195,12 +152,54 @@ const handleGetSearchBlurb = async () => {
}
}
} catch (error) {
console.error("获取调查详情失败", error);
} finally {
loading.value = false;
console.log("获取调查概况失败", error);
}
loading.value = false;
};
// 调查公告
const afficheList = ref([
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
{
time: "2025-03-30",
text: "美国ITC正式对外国制造的半导体器件及其下游产品和组件启动337调查"
},
]);
// 相关事件
const eventList = ref([
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
{
name: "某些特定外国制造的半导体器件及其下游产品和组件;委员会最终裁定未违反第337条的通知;调查终止",
text: "特此通知,2025 年 2 月 18 日,根据 1930 年《关税法》第 337 条(经修订)已代表爱尔兰 Longitude Licensing Ltd.和爱尔",
time: "2025年4月15日"
},
])
onMounted(() => {
handleGetSearchBlurb();
});
......@@ -208,8 +207,8 @@ onMounted(() => {
<style lang="scss" scoped>
.wrapper {
width: 100%;
padding: 0 160px;
width: 1600px;
margin: 20px auto;
display: flex;
.box-header {
height: 56px;
......@@ -304,287 +303,251 @@ onMounted(() => {
}
.left {
width: 520px;
.box1 {
margin-top: 16px;
width: 520px;
height: 837px;
border-radius: 4px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
.box1-main {
margin-top: 6px;
margin-left: 22px;
.box1-item {
display: flex;
margin-bottom: 16px;
.box1-item-left {
width: 100px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
margin-top: 3px;
margin-bottom: 3px;
}
.box1-item-right {
width: 346px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
.box1-item-right1 {
display: flex;
flex-wrap: wrap;
gap: 8px;
.tag {
margin-top: 3px;
margin-bottom: 3px;
height: 24px;
box-sizing: border-box;
border: 1px solid rgba(135, 232, 222, 1);
border-radius: 4px;
background: rgba(230, 255, 251, 1);
line-height: 24px;
text-align: center;
padding: 0 8px;
color: rgba(19, 168, 168, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
}
}
.box1-item-right2 {
.box1-item-right2-item {
width: 332px;
height: 36px;
display: flex;
.icon {
width: 10px;
height: 10px;
margin-left: 17px;
margin-top: 10px;
img {
width: 100%;
height: 100%;
}
}
.time {
height: 24px;
margin-left: 16px;
margin-top: 6px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.title {
height: 24px;
margin-left: 16px;
margin-top: 6px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
}
}
}
}
display: flex;
flex-direction: column;
gap: 16px;
}
.right {
width: 1064px;
width: 20px;
flex: auto;
margin-left: 16px;
.box2 {
margin-top: 16px;
width: 1064px;
height: 410px;
border-radius: 4px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
.box2-main {
.box2-main-top {
display: flex;
width: 1012px;
height: 69px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
margin: 0 auto;
.left {
width: 48px;
height: 48px;
text-align: center;
line-height: 48px;
background: rgba(231, 243, 255, 1);
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 700;
}
.right {
margin-left: 16px;
.title {
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.info {
color: rgba(95, 101, 108, 1);
height: 24px;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
display: flex;
flex-direction: column;
gap: 16px;
}
}
.box1-main {
padding: 0 22px;
.box1-item {
display: flex;
margin-bottom: 16px;
.box1-item-left {
width: 100px;
height: 24px;
flex: none;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
margin-top: 3px;
margin-bottom: 3px;
}
.box1-item-right {
width: 346px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
.box1-item-right1 {
display: flex;
flex-wrap: wrap;
gap: 8px;
.tag {
margin-top: 3px;
margin-bottom: 3px;
height: 24px;
box-sizing: border-box;
border: 1px solid rgba(135, 232, 222, 1);
border-radius: 4px;
background: rgba(230, 255, 251, 1);
line-height: 24px;
text-align: center;
padding: 0 8px;
color: rgba(19, 168, 168, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
}
}
.box1-item-right2 {
.box1-item-right2-item {
width: 332px;
height: 36px;
display: flex;
.icon {
width: 10px;
height: 10px;
margin-left: 17px;
margin-top: 10px;
img {
width: 100%;
height: 100%;
}
}
.box2-main-center {
width: 1012px;
margin: 0 auto;
margin-top: 13px;
color: rgba(59, 65, 75, 1);
.time {
height: 24px;
margin-left: 16px;
margin-top: 6px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.title {
height: 24px;
margin-left: 16px;
margin-top: 6px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
height: 160px;
overflow-y: auto;
}
.box2-main-footer {
margin: 0 auto;
margin-top: 10px;
width: 1034px;
height: 88px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 4px;
background: rgba(246, 251, 255, 1);
box-sizing: border-box;
padding: 6px 12px;
}
}
}
}
.box2-main {
padding: 0 22px 20px;
.data-head {
display: flex;
border-bottom: 1px solid rgba(234, 236, 238, 1);
padding-bottom: 16px;
.data-icon {
width: 48px;
height: 48px;
text-align: center;
line-height: 48px;
background: rgba(231, 243, 255, 1);
color: var(--color-main-active);
font-size: 14px;
font-weight: bold;
font-family: Microsoft YaHei;
}
.data-right {
width: 20px;
flex: auto;
margin-left: 16px;
font-size: 16px;
font-family: Source Han Sans CN;
.data-name {
color: var(--text-primary-80-color);
font-weight: bold;
}
.data-desc {
color: var(--text-primary-65-color);
font-weight: 400;
}
}
}
.data-text {
width: 1012px;
margin: 0 auto;
margin-top: 13px;
color: rgba(59, 65, 75, 1);
font-family: Source Han Sans CN;
font-size: 16px;
font-weight: 400;
line-height: 24px;
height: 160px;
overflow-y: auto;
}
}
.box3-main {
padding: 0 22px 20px;
.data-item {
.data-head {
height: 36px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 36px;
}
.info-list {
padding-top: 13px;
display: flex;
flex-wrap: wrap;
.info-item {
display: flex;
height: 30px;
width: 50%;
margin-bottom: 10px;
.icon {
width: 24px;
height: 24px;
margin-top: 3px;
display: flex;
.box2-main-footer-left {
width: 19px;
height: 20px;
margin-top: 22px;
img {
width: 100%;
height: 100%;
}
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
}
.box2-main-footer-center {
margin-top: 2px;
margin-left: 13px;
width: 941px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
display: -webkit-box;
-webkit-line-clamp: 3;
line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.box2-main-footer-right {
margin-left: 13px;
margin-top: 26px;
.default-logo {
width: 24px;
height: 24px;
border-radius: 12px;
background: rgba(231, 243, 255, 1);
img {
width: 12px;
height: 12px;
margin-top: 6px;
margin-left: 6px;
}
}
}
}
}
.box3 {
margin-top: 16px;
margin-bottom: 35px;
width: 1064px;
border-radius: 4px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1);
.box3-main {
margin-top: 1px;
margin-left: 24px;
margin-right: 27px;
.box3-main-box {
margin-bottom: 18px;
.box3-main-box-header {
height: 36px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
background: #e7f3ff;
color: var(--color-main-active);
font-size: 12px;
font-weight: 700;
line-height: 36px;
}
.box3-main-box-content {
padding-top: 13px;
display: flex;
flex-wrap: wrap;
.content-item {
display: flex;
height: 30px;
width: 50%;
margin-bottom: 11px;
.icon {
width: 24px;
height: 24px;
margin-top: 3px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
}
.default-logo {
width: 24px;
height: 24px;
background: #e7f3ff;
color: var(--color-main-active);
font-size: 12px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
}
}
.text {
margin-left: 13px;
height: 30px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-right: 10px;
}
}
align-items: center;
justify-content: center;
border-radius: 4px;
}
}
.text {
margin-left: 13px;
height: 30px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-right: 10px;
}
}
}
}
}
.box4-main {
padding: 0 16px 16px;
.box4-item {
border-top: 1px solid var(--bg-black-5);
padding: 6px;
display: flex;
.item-icon {
width: 15px;
height: 15px;
font-size: 0px;
margin-right: 16px;
margin-top: 7px;
img {
width: 100%;
height: 100%;
}
}
.item-right {
width: 20px;
flex: auto;
font-family: Source Han Sans CN;
font-size: 16px;
line-height: 30px;
.item-time {
font-weight: bold;
color: var(--text-primary-80-color);
}
.item-text {
color: var(--text-primary-65-color);
}
}
}
.box4-item:last-child {
border-bottom: 1px solid var(--bg-black-5);
}
}
</style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论