提交 2783dc69 authored 作者: coderBryanFu's avatar coderBryanFu

update

上级 4a92a5cb
...@@ -56,9 +56,9 @@ ...@@ -56,9 +56,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="right"> <!-- <div class="right">
<div class="right-header"> <div class="right-header">
<div class="title">{{ "风险测" }}</div> <div class="title">{{ "风险测" }}</div>
<div class="icon"> <div class="icon">
<img src="@/assets/icons/more.png" alt="" /> <img src="@/assets/icons/more.png" alt="" />
</div> </div>
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
<div class="text">{{ item.name }}</div> <div class="text">{{ item.name }}</div>
</div> </div>
</div> </div>
</div> </div> -->
</div> </div>
</template> </template>
...@@ -101,7 +101,7 @@ const leftList = ref([ ...@@ -101,7 +101,7 @@ const leftList = ref([
path: "/billHome" path: "/billHome"
}, },
{ {
name: "政令", name: "科技政令",
path: "/decree" path: "/decree"
}, },
{ {
...@@ -111,6 +111,10 @@ const leftList = ref([ ...@@ -111,6 +111,10 @@ const leftList = ref([
{ {
name: "出口管制", name: "出口管制",
path: "/exportControl" path: "/exportControl"
},
{
name: "科研合作限制",
path: "/cooperationRestrictions"
}, },
{ {
name: "投融资限制", name: "投融资限制",
...@@ -120,24 +124,22 @@ const leftList = ref([ ...@@ -120,24 +124,22 @@ const leftList = ref([
name: "市场准入限制", name: "市场准入限制",
path: "/marketAccessRestrictions" path: "/marketAccessRestrictions"
}, },
{
name: "合作限制",
path: "/cooperationRestrictions"
},
{ {
name: "规则限制", name: "规则限制",
path: "/ruleRestrictions" path: "/ruleRestrictions"
}, },
{
name: "美国主要创新主体",
path: "/innovationSubject"
},
{ {
name: "美国科技人物观点", name: "美国科技人物观点",
path: "/technologyFigures" path: "/technologyFigures"
}, },
{ {
name: "美国科研资助体系", name: "美国主要创新主体动向",
path: "/innovationSubject"
},
{
name: "美国科研资助体系分析",
path: "/scientificFunding" path: "/scientificFunding"
} }
]); ]);
......
...@@ -10,7 +10,7 @@ import "./styles/scrollbar.css"; ...@@ -10,7 +10,7 @@ import "./styles/scrollbar.css";
import "./styles/elui.css"; import "./styles/elui.css";
import "./styles/main.css"; import "./styles/main.css";
import '@/assets/fonts/font.css' import '@/assets/fonts/font.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
const app = createApp(App); const app = createApp(App);
// 注册所有图标 // 注册所有图标
...@@ -21,6 +21,8 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) { ...@@ -21,6 +21,8 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
// 注册全局函数 // 注册全局函数
app.config.globalProperties.$withFallbackImage = withFallbackImage; app.config.globalProperties.$withFallbackImage = withFallbackImage;
app.use(router); app.use(router);
app.use(ElementPlus); app.use(ElementPlus, {
locale: zhCn,
})
app.component("CardTitle", CardTitle); app.component("CardTitle", CardTitle);
app.mount("#app"); app.mount("#app");
<template>
<el-dialog
v-model="visible"
width="1280px"
:show-close="false"
:close-on-click-modal="false"
class="rule-subsidiary-dialog"
destroy-on-close
top="5vh"
draggable
>
<template #header>
<div class="dialog-header">
<div class="left-title">
<img :src="defaultIcon" alt="" class="title-icon" />
<span class="company-name">{{ companyName }}</span>
<span class="suffix-text">“实体清单50%规则” 涉及实体列表</span>
</div>
<div class="right-actions">
<div class="right-count">
<span class="highlight">{{ totalCount }}</span>
</div>
<el-icon class="close-btn" @click="visible = false"><Close /></el-icon>
</div>
</div>
</template>
<div class="dialog-content">
<el-table
:data="tableData"
table-layout="fixed"
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#fff' }"
style="width: 100%"
>
<el-table-column label="实体名称" min-width="300">
<template #default="{ row }">
<div class="entity-name-cell">
<el-avatar class="avatar" :size="24" :src="row.avatar || defaultIcon" />
<div class="name" :title="row.name">{{ row.name }}</div>
</div>
</template>
</el-table-column>
<el-table-column label="涉及领域" width="200">
<template #default="{ row }">
<div class="domain-cell">
<el-tag
v-for="tag in row.domains"
:key="tag"
class="domain-tag"
effect="plain"
:disable-transitions="true"
:style="getTagStyle(tag)"
>
{{ tag }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column prop="equityRatio" label="股权占比" width="120" align="center" />
<el-table-column prop="location" label="上市地点" width="120" align="center" />
<el-table-column prop="revenue" label="营收(亿元)" width="120" align="center" />
</el-table>
<div class="dialog-footer">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="totalCount"
layout="prev, pager, next"
prev-text="<"
next-text=">"
@current-change="handleCurrentChange"
/>
</div>
</div>
</el-dialog>
</template>
<script setup>
import { ref, defineProps, defineEmits, computed, watch } from "vue";
import { Close } from "@element-plus/icons-vue";
import defaultIcon from "@/assets/icons/default-icon1.png";
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
companyName: {
type: String,
default: ""
},
totalCount: {
type: Number,
default: 0
},
dataList: {
type: Array,
default: () => []
}
});
const emit = defineEmits(["update:modelValue"]);
const visible = computed({
get: () => props.modelValue,
set: val => emit("update:modelValue", val)
});
const currentPage = ref(1);
const pageSize = ref(10);
const tableData = computed(() => {
const start = (currentPage.value - 1) * pageSize.value;
const end = start + pageSize.value;
return props.dataList.slice(start, end).map(item => ({
...item,
name: item.orgName,
domains: item.techDomains || [],
equityRatio: item.equityRatio ? (item.equityRatio * 100).toFixed(2) + '%' : '--',
location: '--',
revenue: item.revenue || '--'
}));
});
const handleCurrentChange = val => {
currentPage.value = val;
};
const tableRowClassName = ({ rowIndex }) => {
return rowIndex % 2 === 0 ? "odd-row" : "";
};
const getTagStyle = tag => {
const colorPool = [
{ color: "#CD4246", background: "rgba(255, 242, 240, 1)", borderColor: "rgba(255, 163, 158, 1)" },
{ color: "#0E78F1", background: "rgba(230, 244, 255, 1)", borderColor: "rgba(145, 206, 255, 1)" },
{ color: "#722ED1", background: "rgba(249, 240, 255, 1)", borderColor: "rgba(211, 173, 247, 1)" },
{ color: "#13A8A8", background: "rgba(230, 255, 251, 1)", borderColor: "rgba(135, 232, 222, 1)" },
{ color: "#FA8C16", background: "rgba(255, 247, 230, 1)", borderColor: "rgba(255, 213, 145, 1)" },
{ color: "#52C41A", background: "rgba(246, 255, 237, 1)", borderColor: "rgba(183, 235, 143, 1)" }
];
let hash = 0;
for (let i = 0; i < tag.length; i++) {
hash = tag.charCodeAt(i) + ((hash << 5) - hash);
}
const index = Math.abs(hash) % colorPool.length;
return colorPool[index];
};
</script>
<style lang="scss" scoped>
.rule-subsidiary-dialog {
:deep(.el-dialog__header) {
margin-right: 0;
padding: 24px;
border-bottom: 1px solid #edeff2;
}
:deep(.el-dialog__body) {
padding: 0;
}
}
.dialog-header {
display: flex;
justify-content: space-between;
align-items: center;
.left-title {
display: flex;
align-items: center;
.title-icon {
width: 24px;
height: 24px;
margin-right: 8px;
}
.company-name {
font-size: 18px;
font-weight: 700;
color: #3b414b;
margin-right: 8px;
font-family: "Microsoft YaHei";
}
.suffix-text {
font-size: 18px;
font-weight: 700;
color: #3b414b;
font-family: "Microsoft YaHei";
}
}
.right-actions {
display: flex;
align-items: center;
.right-count {
font-size: 14px;
color: #5f656c;
font-weight: 700;
font-family: "Microsoft YaHei";
margin-right: 20px;
.highlight {
color: #cd4246;
margin: 0 4px;
font-size: 16px;
}
}
.close-btn {
font-size: 20px;
color: #909399;
cursor: pointer;
transition: color 0.2s;
&:hover {
color: #409eff;
}
}
}
}
.dialog-content {
height: 722px; /* Adjusted to fit total 851px approx with header (65px) and footer (64px) */
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 0 24px;
:deep(.el-table) {
--el-table-header-bg-color: #fff;
--el-table-border-color: transparent;
--el-table-row-hover-bg-color: rgba(248, 249, 250, 1);
}
:deep(.el-table__inner-wrapper::before) {
background-color: transparent;
}
:deep(.el-table__header-wrapper th) {
height: 60px;
background-color: #fff;
font-size: 16px;
font-weight: 700;
color: rgba(59, 65, 75, 1);
font-family: "Microsoft YaHei";
border-bottom: 1px solid rgba(230, 231, 232, 1);
}
:deep(.el-table__header-wrapper .cell) {
line-height: 22px;
}
:deep(.el-table__row) {
height: 64px;
}
:deep(.el-table__cell) {
border-bottom: 0;
font-size: 16px;
font-weight: 400;
color: rgb(95, 101, 108);
font-family: "Microsoft YaHei";
}
:deep(.odd-row td.el-table__cell) {
background-color: rgba(248, 249, 250, 1);
}
.entity-name-cell {
display: flex;
align-items: center;
.avatar {
flex: 0 0 24px;
margin-right: 9px;
}
.name {
font-size: 16px;
font-weight: 700;
color: rgba(59, 65, 75, 1);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.domain-cell {
display: flex;
align-items: center;
gap: 8px;
:deep(.el-tag) {
height: auto;
padding: 2px 8px;
border-radius: 4px;
font-size: 14px;
font-weight: 400;
font-family: "Microsoft YaHei";
line-height: 20px;
}
}
}
.dialog-footer {
height: 64px;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid #edeff2;
:deep(.el-pagination) {
--el-pagination-button-bg-color: #fff;
--el-pagination-hover-color: #0e78f1;
--el-pagination-font-size: 14px;
.el-pager li {
border: 1px solid #dcdfe6;
border-radius: 4px;
margin: 0 4px;
font-weight: 400;
color: #5f656c;
min-width: 32px;
height: 32px;
line-height: 30px;
&.is-active {
background-color: #0e78f1;
color: #fff;
border-color: #0e78f1;
}
&:hover:not(.is-active) {
color: #0e78f1;
border-color: #0e78f1;
}
}
.btn-prev,
.btn-next {
border: 1px solid #dcdfe6;
border-radius: 4px;
padding: 0;
margin: 0 4px;
min-width: 32px;
height: 32px;
line-height: 30px;
text-align: center;
&:hover {
color: #0e78f1;
border-color: #0e78f1;
}
&[disabled] {
border-color: #e4e7ed;
color: #c0c4cc;
}
}
}
}
</style>
\ No newline at end of file
...@@ -54,6 +54,7 @@ defineProps({ ...@@ -54,6 +54,7 @@ defineProps({
position: relative; position: relative;
overflow: hidden; overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease; transition: transform 0.3s ease, box-shadow 0.3s ease;
cursor: pointer;
} }
.info-card:hover { .info-card:hover {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<span class="news-source">{{ item.source }}</span> <span class="news-source">{{ item.source }}</span>
</div> </div>
</div> </div>
<el-tooltip <!-- <el-tooltip
effect="dark" effect="dark"
:content="item.description" :content="item.description"
popper-class="common-prompt-popper" popper-class="common-prompt-popper"
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
:show-after="500" :show-after="500"
> >
<div class="news-description">{{ item.description }}</div> <div class="news-description">{{ item.description }}</div>
</el-tooltip> </el-tooltip> -->
<div class="news-description">{{ item.description }}</div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -22,7 +22,7 @@ defineProps({ ...@@ -22,7 +22,7 @@ defineProps({
align-items: center; align-items: center;
width: 100%; width: 100%;
margin-bottom: 36px; margin-bottom: 36px;
padding: 10px 15px; padding: 0 15px;
} }
.color-block { .color-block {
......
...@@ -97,8 +97,8 @@ ...@@ -97,8 +97,8 @@
</div> </div>
</div> </div>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto"> <el-row :gutter="15" style="width: 1600px; margin: 0 auto; height: 528px; margin-top: 64px">
<CustomTitle id="position1" title="最新动态" style="margin-top: 10px" /> <CustomTitle id="position1" title="最新动态" />
<el-col :span="16"> <el-col :span="16">
<custom-container titleType="primary" title="最新出口管制政策" :titleIcon="houseIcon" height="450px"> <custom-container titleType="primary" title="最新出口管制政策" :titleIcon="houseIcon" height="450px">
<template #header-right> <template #header-right>
...@@ -121,7 +121,7 @@ ...@@ -121,7 +121,7 @@
</div> </div>
<el-carousel <el-carousel
ref="carouselRef" ref="carouselRef"
height="350px" height="370px"
:autoplay="true" :autoplay="true"
:interval="3000" :interval="3000"
arrow="never" arrow="never"
...@@ -245,8 +245,8 @@ ...@@ -245,8 +245,8 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto"> <el-row :gutter="15" style="width: 1600px; margin: 0 auto; height: 528px; margin-top: 64px">
<CustomTitle id="position2" title="资讯要闻" style="margin-top: 10px" /> <CustomTitle id="position2" title="资讯要闻" />
<el-col :span="12"> <el-col :span="12">
<custom-container title="新闻资讯" :titleIcon="newsIcon" height="450px"> <custom-container title="新闻资讯" :titleIcon="newsIcon" height="450px">
<template #header-right> <template #header-right>
...@@ -283,8 +283,8 @@ ...@@ -283,8 +283,8 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto"> <el-row :gutter="20" style="width: 1600px; margin: 0 auto; height: 528px; margin-top: 64px">
<CustomTitle id="position3" title="数据总览" style="margin-top: 10px" /> <CustomTitle id="position3" title="数据总览" />
<el-col :span="24"> <el-col :span="24">
<custom-container title="发布频度" :titleIcon="box3Icon" height="450px"> <custom-container title="发布频度" :titleIcon="box3Icon" height="450px">
<template #default> <template #default>
...@@ -380,7 +380,7 @@ ...@@ -380,7 +380,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto"> <el-row :gutter="20" style="width: 1600px; margin: 0 auto; height: 505px; margin-top: 16px">
<el-col :span="8"> <el-col :span="8">
<custom-container title="制裁领域分布" :titleIcon="radarIcon" height="480px"> <custom-container title="制裁领域分布" :titleIcon="radarIcon" height="480px">
<template #header-right> <template #header-right>
...@@ -397,12 +397,7 @@ ...@@ -397,12 +397,7 @@
<div style="display: flex; align-items: center; gap: 16px"> <div style="display: flex; align-items: center; gap: 16px">
<el-checkbox v-model="trendChecked" label="50%规则" size="large" /> <el-checkbox v-model="trendChecked" label="50%规则" size="large" />
<el-select v-model="selectedEntityId" placeholder="请选择清单类型" style="width: 160px"> <el-select v-model="selectedEntityId" placeholder="请选择清单类型" style="width: 160px">
<el-option <el-option v-for="item in infoList" :key="item.id" :label="item.nameZh" :value="item.id" />
v-for="item in infoList"
:key="item.id"
:label="item.nameZh"
:value="item.id"
/>
</el-select> </el-select>
</div> </div>
</template> </template>
...@@ -413,7 +408,7 @@ ...@@ -413,7 +408,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto"> <el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px">
<CustomTitle id="position4" title="资源库" style="margin-top: 0px" /> <CustomTitle id="position4" title="资源库" style="margin-top: 0px" />
<div class="resource-tabs"> <div class="resource-tabs">
<div <div
...@@ -670,7 +665,7 @@ ...@@ -670,7 +665,7 @@
</template> </template>
</el-row> </el-row>
</div> </div>
<el-dialog v-model="dialogVisible" width="800" :before-close="handleClose"> <!-- <el-dialog v-model="dialogVisible" width="800" :before-close="handleClose">
<template #title> <template #title>
<div class="dialog-title">50%规则子企业</div> <div class="dialog-title">50%规则子企业</div>
</template> </template>
...@@ -696,7 +691,13 @@ ...@@ -696,7 +691,13 @@
<el-button type="primary" @click="dialogVisible = false"> 确定 </el-button> <el-button type="primary" @click="dialogVisible = false"> 确定 </el-button>
</div> </div>
</template> </template>
</el-dialog> </el-dialog> -->
<RuleSubsidiaryDialog
v-model="dialogVisible"
:company-name="currentRuleCompany"
:total-count="currentRuleCount"
:data-list="currentOrgList"
/>
</div> </div>
<el-dialog v-model="mediaVisible" title="社交媒体信息" width="500" :before-close="handleMediaClose"> <el-dialog v-model="mediaVisible" title="社交媒体信息" width="500" :before-close="handleMediaClose">
<div class="dialog-content"> <div class="dialog-content">
...@@ -737,7 +738,7 @@ import CustomTitle from "./components/title.vue"; ...@@ -737,7 +738,7 @@ import CustomTitle from "./components/title.vue";
import NewsList from "./components/news.vue"; import NewsList from "./components/news.vue";
import MessageBubble from "./components/dialog.vue"; import MessageBubble from "./components/dialog.vue";
import CommonPrompt from "./commonPrompt/index.vue"; import CommonPrompt from "./commonPrompt/index.vue";
import RuleSubsidiaryDialog from "./components/RuleSubsidiaryDialog.vue";
import trumpAvatar from "@/assets/images/icon-trump.png"; import trumpAvatar from "@/assets/images/icon-trump.png";
import elongAvatar from "@/assets/images/icon-elong.png"; import elongAvatar from "@/assets/images/icon-elong.png";
import newsIcon from "@/assets/images/icon-news.png"; import newsIcon from "@/assets/images/icon-news.png";
...@@ -769,6 +770,10 @@ import { ...@@ -769,6 +770,10 @@ import {
getExportControlList getExportControlList
} from "@/api/exportControl"; } from "@/api/exportControl";
const currentRuleCompany = ref("");
const currentRuleCount = ref(0);
const currentRuleList = ref([]);
const handleToPosi = id => { const handleToPosi = id => {
const element = document.getElementById(id); const element = document.getElementById(id);
if (element && homeMainRef.value) { if (element && homeMainRef.value) {
...@@ -1139,7 +1144,6 @@ const searchExportControlText = ref(""); ...@@ -1139,7 +1144,6 @@ const searchExportControlText = ref("");
const infoListColor = ref(["rgba(206, 79, 81, 1)", "rgba(114, 46, 209, 1)", "rgba(132, 136, 142, 1)", "rgba(132, 136, 142, 1)"]); const infoListColor = ref(["rgba(206, 79, 81, 1)", "rgba(114, 46, 209, 1)", "rgba(132, 136, 142, 1)", "rgba(132, 136, 142, 1)"]);
const infoList = ref([]); const infoList = ref([]);
// 雷达图 // 雷达图
const domainChecked = ref(false); const domainChecked = ref(false);
const radarOption = ref({ const radarOption = ref({
...@@ -1673,7 +1677,6 @@ const handleSanc = item => { ...@@ -1673,7 +1677,6 @@ const handleSanc = item => {
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
// 查看更多风险信号 // 查看更多风险信号
const handleToMoreRiskSignal = () => { const handleToMoreRiskSignal = () => {
const route = router.resolve("/riskSignal"); const route = router.resolve("/riskSignal");
...@@ -1732,6 +1735,8 @@ const handleClose = () => { ...@@ -1732,6 +1735,8 @@ const handleClose = () => {
}; };
const handleOrgClick = item => { const handleOrgClick = item => {
// console.log(item, item.name); // console.log(item, item.name);
currentRuleCompany.value = item.name;
currentRuleCount.value = item.ruleOrgCount;
currentOrgList.value = item.ruleOrgList; currentOrgList.value = item.ruleOrgList;
dialogVisible.value = true; dialogVisible.value = true;
}; };
...@@ -1888,14 +1893,15 @@ const handleMediaClick = item => { ...@@ -1888,14 +1893,15 @@ const handleMediaClick = item => {
.box1-bottom { .box1-bottom {
padding-left: 30px; padding-left: 30px;
height: 172px;
padding-top: 16px;
box-sizing: border-box;
&-title { &-title {
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
margin-bottom: 15px; margin-bottom: 15px;
} }
&-content { &-content {
display: flex; display: flex;
gap: 15px; gap: 15px;
...@@ -2266,8 +2272,6 @@ const handleMediaClick = item => { ...@@ -2266,8 +2272,6 @@ const handleMediaClick = item => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
margin-bottom: 20px;
.home-main-header-center { .home-main-header-center {
margin-top: 51px; margin-top: 51px;
width: 960px; width: 960px;
...@@ -2359,11 +2363,11 @@ const handleMediaClick = item => { ...@@ -2359,11 +2363,11 @@ const handleMediaClick = item => {
display: flex; display: flex;
justify-content: center; justify-content: center;
gap: 16px; gap: 16px;
padding: 30px 0; // padding: 30px 0;
} }
.home-main-header-footer-info { .home-main-header-footer-info {
margin-top: 34px; margin-top: 36px;
} }
.home-main-header-btn-box { .home-main-header-btn-box {
...@@ -2418,7 +2422,7 @@ const handleMediaClick = item => { ...@@ -2418,7 +2422,7 @@ const handleMediaClick = item => {
} }
.home-main-center { .home-main-center {
margin-top: 34px; margin-top: 64px;
.center-top { .center-top {
height: 450px; height: 450px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论