提交 486b8d7c authored 作者: 付康's avatar 付康

合并分支 'lzl-dev' 到 'master'

Lzl dev 查看合并请求 !72
......@@ -89,6 +89,19 @@ export function getBillPersonAnalyze(params) {
})
}
// 议员相关性分析领域人物动态-根据法案ID获取议员分析领域人物动态
/**
* @param {id, isOppose,areaId}
* @header token
*/
export function getBillPersonAnalyzeDy(params) {
return request({
method: 'GET',
url: `/api/billInfoBean/personAnalyze/news/${params.id}/${params.areaId}`,
params,
})
}
// 主要条款-根据法案ID获取原文id列表
/**
* @param {id}
......@@ -110,33 +123,33 @@ export function getBillContentId(params) {
export function getBillContentTk(params) {
return request({
method: 'GET',
url: `/api/billInfoBean/content/tk/${params.billid}/${params.id}`,
url: `/api/billInfoBean/content/tk/${params.billId}/${params.id}`,
params,
})
}
// 限制方式-根据法案原文ID获取限制方式列表
/**
* @param {billId}
* @param {billId,versionId,cRelated}
* @header token
*/
export function getBillContentXzfs(params) {
return request({
method: 'GET',
url: `/api/billInfoBean/content/xzfs/${params.id}`,
url: `/api/billInfoBean/content/xzfs/${params.billId}/${params.versionId}`,
params,
})
}
// 涉及行业-根据法案原文ID获取行业领域列表
/**
* @param {id}
* @param {billId,versionId,cRelated}
* @header token
*/
export function getBillHyly(params) {
return request({
method: 'GET',
url: `/api/billInfoBean/content/hyly/${params.id}`,
url: `/api/billInfoBean/content/hyly/${params.billId}/${params.versionId}`,
params,
})
}
......@@ -166,3 +179,16 @@ export function getBillDyqkSummary(params) {
params,
})
}
// 获取法案全文-根据法案ID获取法案全文
/**
* @param {id}
* @header token
*/
export function getBillFullText(params) {
return request({
method: 'GET',
url: `/api/billInfoBean/content/${params.id}`,
params,
})
}
......@@ -104,6 +104,15 @@ const exportControlRoutes = [
title: "单条制裁详情"
}
},
// V2.0单条制裁详情-实体清单原文
{
path: "/exportControl/origin",
name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue"),
meta: {
title: "实体清单原文"
}
},
]
export default exportControlRoutes
\ No newline at end of file
......@@ -5,7 +5,7 @@
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import { ref, onMounted, onBeforeUnmount, watch } from "vue";
import * as echarts from "echarts";
import "echarts-wordcloud";
......@@ -13,57 +13,73 @@ const props = defineProps({
// 词云数据
data: {
type: Array,
required: true,
// 示例:
// [
// { name: 'Vue', value: 1000 },
// { name: 'ECharts', value: 618 },
// // ...
// ]
required: true
},
// 词云形状,可以是 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon' 等
// 词云形状
shape: {
type: String,
default: "circle",
default: "circle"
},
// 选中的项的名字
selectedName: {
type: String,
default: ""
}
});
const emit = defineEmits(["wordClick"]);
const echartWord = ref(null);
let myChart = null;
const initChart = () => {
if (echartWord.value) {
if (myChart) {
myChart.dispose();
}
myChart = echarts.init(echartWord.value);
const chartData = props.data.map(item => {
const isSelected = item.name === props.selectedName;
if (isSelected) {
return {
...item,
// 提升选中项的权重,确保其在布局中占主导地位
value: 100, // 给予一个显著高于其他的固定大值,使其占据中心
textStyle: {
fontWeight: "bold",
color: "#fff",
backgroundColor: "rgba(189, 33, 33, 0.9)",
borderRadius: 20,
padding: [8, 16] // 适当增加 padding 以确保背景块足够大
}
};
}
return {
...item,
value: Math.floor(Math.random() * 20) + 10 // 为非选中项分配较小的随机权重,有助于均匀分布
};
});
const option = {
grid: {
left: 5,
top: 5,
right: 5,
bottom: 5,
left: 0,
top: 0,
right: 0,
bottom: 0
},
series: [
{
type: "wordCloud",
shape: props.shape,
// 其他形状你可以使用形状路径
// shape: 'circle', // 示例
// 或者自定义路径
gridSize: 20, // 网格大小,影响词间距。
sizeRange: [15, 25], // 定义词云中文字大小的范围
gridSize: 30, // 增大网格间距,防止重叠
sizeRange: [16, 26], // 保持字体大小
rotationRange: [0, 0],
rotationStep: 0,
drawOutOfBound: false, // 是否超出画布
// 字体
drawOutOfBound: true,
layoutAnimation: true,
keepAspect: true,
textStyle: {
// normal: {
// color: function () {
// return 'rgb(' + [
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160)
// ].join(',') + ')';
// }
// },
color: function () {
let colors = [
"rgba(189, 33, 33, 1)",
......@@ -71,25 +87,37 @@ const initChart = () => {
"rgba(220, 190, 68, 1)",
"rgba(96, 58, 186, 1)",
"rgba(32, 121, 69, 1)",
"rgba(22, 119, 255, 1)",
"rgba(22, 119, 255, 1)"
];
return colors[parseInt(Math.random() * colors.length)];
},
emphasis: {
shadowBlur: 5,
shadowColor: "#333",
},
},
// 设置词云数据
data: props.data,
shadowColor: "#333"
}
},
],
data: chartData
}
]
};
myChart.setOption(option);
myChart.on("click", params => {
emit("wordClick", params.data);
});
window.addEventListener("resize", myChart.resize);
}
};
watch(
() => [props.data, props.selectedName],
() => {
initChart();
},
{ deep: true }
);
onMounted(() => {
initChart();
});
......
......@@ -223,7 +223,7 @@
</div>
</div>
<div class="box2-main">
<div class="box2-main-item" v-for="(item, index) in warningList" :key="index">
<div class="box2-main-item" v-for="(item, index) in warningList" :key="index" @click="handleClickToDetailO(item)">
<div
class="item-left"
:class="{
......@@ -283,7 +283,9 @@
{{ news.newsDate ? news.newsDate.slice(5) : "" }} - {{ news.newsOrg }}
</div>
</div>
<CommonPrompt :content="news.newsContent">
<div class="right-footer">{{ news.newsContent }}</div>
</CommonPrompt>
</div>
</div>
</div>
......@@ -772,6 +774,7 @@ import {
} from "@/api/bill/billHome";
import { getPersonSummaryInfo } from "@/api/common/index";
import DivideHeader from "@/components/DivideHeader.vue";
import CommonPrompt from "../commonPrompt/index.vue";
import { useContainerScroll } from "@/hooks/useScrollShow";
......@@ -944,13 +947,13 @@ const curBill = ref({
// 查看详情
const handleClickToDetail = () => {
window.sessionStorage.setItem("billId", curBill.value.billId);
const route = router.resolve("/billLayout");
const route = router.resolve("/billLayout?billId=" + curBill.value.billId);
window.open(route.href, "_blank");
};
// 查看详情 传递参数
const handleClickToDetailO = item => {
window.sessionStorage.setItem("billId", item.billId);
const route = router.resolve("/billLayout");
const route = router.resolve("/billLayout?billId=" + item.billId);
window.open(route.href, "_blank");
};
......@@ -980,133 +983,6 @@ const handleToMoreNews = () => {
// 风险信号
const warningList = ref([]);
// 资源库 法案列表
// const billList = ref([
// {
// billName: "大而美法案",
// introductionDate: "2025年7月4日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill1,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "GENIUS稳定币法案",
// introductionDate: "2025年7月5日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill2,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年7月6日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill3,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年7月7日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill4,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "汽车零部件25%关税实施规则",
// introductionDate: "2025年7月10日",
// status: "重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill5,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "汽车零部件25%关税实施规则",
// introductionDate: "2025年7月12日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill6,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "小额豁免包裹政策调整",
// introductionDate: "2025年7月14日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill7,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "NIH预算否决案",
// introductionDate: "2025年7月15日",
// status: "重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill8,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "得州国会选区重划法案",
// introductionDate: "2025年7月17日",
// status: "一般风险",
// tagList: ["集成电路", "人工智能"],
// img: bill9,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年7月24日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill10,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年8月4日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill11,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年8月8日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill12,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年8月8日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill12,
// yuan: "众议院",
// dangpai: "共和党"
// }
// ]);
// 当前展示法案列表
// const curBillList = computed(() => {
// const startIndex = (currentPage.value - 1) * 12;
// const endIndex = startIndex + 12;
// return billList.value.slice(startIndex, endIndex);
// });
const box7selectetedTime = ref("2025");
const box7YearList = ref([
......
......@@ -39,11 +39,6 @@
<div class="name">{{ billInfoGlobal.tarName }}</div>
</div>
<div class="right-box-bottom">
<!-- <el-button type="plain" size="large" icon="Search" @click="handleSwitchActiveName('法案原文')"
>法案原文</el-button
>
<el-button type="primary" size="large" icon="EditPen">分析报告</el-button> -->
<div class="btn1" @click="handleSwitchActiveName('法案原文')">
<div class="icon">
<img src="./assets/icons/btn-icon1.png" alt="" />
......@@ -85,21 +80,21 @@
<div class="report-main">
<div class="report-header">
<div class="report-header-left">
<div class="text">法案版本:</div>
<!-- <div class="text">法案版本:</div>
<div class="select-box">
<el-select v-model="curBill" placeholder="选择法案" style="width: 240px">
<el-option v-for="item in billList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</div> -->
</div>
<div class="report-header-right">
<div class="btn">
<!-- <div class="btn">
<div class="icon">
<img src="./assets/images/report-header-icon1.png" alt="" />
</div>
<div class="text">翻译</div>
</div>
<div class="btn">
</div> -->
<!-- <div class="btn">
<div class="icon">
<img src="./assets/images/report-header-icon2.png" alt="" />
</div>
......@@ -116,16 +111,17 @@
<img src="./assets/images/report-header-icon4.png" alt="" />
</div>
<div class="text">查找</div>
</div>
</div> -->
</div>
</div>
<div class="report-content">
<div class="content-left">
<img src="./assets/images/report1.png" alt="" />
<iframe v-if="billFullText" :src="billFullText" width="100%" height="100%" frameborder="0"></iframe>
<!-- <img v-else src="./assets/images/report1.png" alt="" /> -->
</div>
<div class="content-right">
<!-- <div class="content-right">
<img src="./assets/images/report2.png" alt="" />
</div>
</div> -->
</div>
</div>
</div>
......@@ -135,7 +131,10 @@
<script setup>
import { ref, onMounted } from "vue";
import router from "@/router";
import { getBillInfoGlobal } from "@/api/bill";
import { useRoute } from "vue-router";
import { getBillInfoGlobal, getBillFullText } from "@/api/bill";
const route = useRoute();
import icon1 from "./assets/icons/icon1.png";
import icon1Active from "./assets/icons/icon1_active.png";
......@@ -147,13 +146,28 @@ import icon4 from "./assets/icons/icon4.png";
import icon4Active from "./assets/icons/icon4_active.png";
import USALogo from "./assets/images/USA-logo.png";
// 法案原文
const billFullText = ref("");
const getBillFullTextFn = async () => {
const res = await getBillFullText({
id: route.query.billId
});
if (res.code === 200) {
console.log("法案全文", res);
if (res.data) {
billFullText.value = typeof res.data === "string" ? res.data.trim() : res.data;
}
}
};
const activeName = ref("分析报告");
// 获取法案全局信息
const billInfoGlobal = ref({});
const getBillInfoGlobalFn = async () => {
const res = await getBillInfoGlobal({
id: window.sessionStorage.getItem("billId")
id: route.query.billId
});
if (res.code === 200) {
console.log("法案全局信息", res);
......@@ -165,6 +179,9 @@ const getBillInfoGlobalFn = async () => {
const handleSwitchActiveName = name => {
activeName.value = name;
if (name === "法案原文") {
getBillFullTextFn();
}
};
const curBill = ref("公法(2025年7月4日)");
......@@ -212,7 +229,12 @@ const activeTitle = ref("法案概况");
const handleClickMainHeaderBtn = item => {
activeTitle.value = item.name;
window.sessionStorage.setItem("activeTitle", activeTitle.value);
router.push(item.path);
router.push({
path: item.path,
query: {
billId: route.query.billId
}
});
};
onMounted(() => {
......@@ -499,6 +521,7 @@ onMounted(() => {
justify-content: flex-end;
gap: 8px;
.btn1 {
cursor: pointer;
width: 120px;
height: 36px;
box-sizing: border-box;
......@@ -559,6 +582,7 @@ onMounted(() => {
}
}
.btn3 {
cursor: pointer;
width: 120px;
height: 36px;
border-radius: 6px;
......@@ -715,10 +739,12 @@ onMounted(() => {
}
}
.report-content {
width: 100%;
display: flex;
margin-top: 35px;
.content-left {
width: 680px;
// width: 680px;
width: 100%;
height: 786px;
// background: #eee;
// overflow-y: auto;
......
......@@ -33,6 +33,7 @@ defineProps({
<style>
.common-prompt-popper.el-popper {
z-index: 10000000 !important;
padding: 8px 16px !important;
border-radius: 10px !important;
background-color: rgb(59, 65, 75) !important;
......
......@@ -24,8 +24,11 @@
<script setup>
import { onMounted, ref } from "vue";
import { useRoute } from "vue-router";
import router from "@/router";
const route = useRoute();
const siderBtnList = ref([
{
name: "流程概要",
......@@ -49,7 +52,12 @@ const handleClickLeftSiderBtn = (item,index) => {
item.isActive = false
})
siderBtnList.value[index].isActive = true
router.push(item.path);
router.push({
path: item.path,
query: {
billId: route.query.billId
}
});
};
</script>
......
......@@ -861,6 +861,7 @@ onMounted(() => {
img {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.item-center {
......
......@@ -1195,8 +1195,9 @@ onMounted(async () => {
font-size: 14px;
font-weight: 600;
line-height: 22px;
padding: 0 20px;
.box3-main-center-header-box1 {
width: 430px;
width: 370px;
text-align: center;
}
.box3-main-center-header-box2 {
......@@ -1204,7 +1205,7 @@ onMounted(async () => {
text-align: center;
}
.box3-main-center-header-box3 {
width: 77px;
width: 75px;
text-align: center;
}
.box3-main-center-header-box4 {
......@@ -1212,11 +1213,11 @@ onMounted(async () => {
text-align: center;
}
.box3-main-center-header-box5 {
width: 80px;
width: 100px;
text-align: center;
}
.box3-main-center-header-box6 {
width: 126px;
width: 90px;
text-align: center;
}
}
......@@ -1236,7 +1237,7 @@ onMounted(async () => {
display: flex;
height: 45px;
.item-box1 {
width: 400px;
width: 370px;
display: flex;
.box1-left {
width: 130px;
......@@ -1282,7 +1283,7 @@ onMounted(async () => {
border-radius: 0;
}
:deep(.el-progress-bar__outer) {
background: rgba(22, 119, 255, 0.5);
background: rgba(22, 119, 255, 0.1);
border-radius: 0;
}
}
......@@ -1292,7 +1293,7 @@ onMounted(async () => {
border-radius: 0;
}
:deep(.el-progress-bar__outer) {
background: rgba(255, 172, 77, 0.5);
background: rgba(255, 172, 77, 0.1);
border-radius: 0;
}
}
......@@ -1322,7 +1323,7 @@ onMounted(async () => {
}
}
.item-box3 {
width: 77px;
width: 75px;
text-align: center;
.box3-1 {
height: 14px;
......@@ -1368,7 +1369,7 @@ onMounted(async () => {
}
}
.item-box5 {
width: 80px;
width: 100px;
text-align: center;
.box5-1 {
height: 14px;
......@@ -1389,12 +1390,12 @@ onMounted(async () => {
}
}
.item-box6 {
width: 116px;
width: 90px;
text-align: center;
.img-box {
width: 30px;
height: 30px;
margin-left: 50px;
margin-left: 30px;
img {
width: 100%;
height: 100%;
......
......@@ -156,9 +156,9 @@
</div>
<div class="text">{{ "变更条款" }}</div>
</div>
<div class="box4-right" @click="handleSwitchCompareDialog(true)">
<!-- <div class="box4-right" @click="handleSwitchCompareDialog(true)">
{{ "条款对比 >" }}
</div>
</div> -->
</div>
<div class="dialog-box5">
<div class="box5-item" v-for="(sub, subIndex) in currentDetailItem.fynrList" :key="subIndex">
......@@ -757,6 +757,7 @@ onMounted(() => {
height: 30px;
border-left: 1px solid rgb(20, 89, 187);
padding: 0 10px;
margin-bottom: 8px;
.item-title {
line-height: 26px;
color: rgb(59, 65, 75);
......@@ -794,6 +795,7 @@ onMounted(() => {
font-size: 16px;
font-weight: 400;
line-height: 24px;
margin-bottom: 4px;
}
.item-main {
border-left: 1px solid rgb(20, 89, 187);
......@@ -802,6 +804,7 @@ onMounted(() => {
display: flex;
align-items: baseline;
width: 269px;
margin-bottom: 4px;
.icon {
margin: 9px 12px;
width: 6px;
......@@ -965,6 +968,7 @@ onMounted(() => {
height: 30px;
border-left: 1px solid rgba(255, 172, 77, 1);
padding: 5px 10px;
margin-top: 8px;
.item-title {
line-height: 26px;
color: rgb(59, 65, 75);
......@@ -1002,6 +1006,7 @@ onMounted(() => {
font-size: 16px;
font-weight: 400;
line-height: 24px;
margin-top: 8px;
}
.item-main {
border-left: 1px solid rgba(255, 172, 77, 1);
......@@ -1010,6 +1015,7 @@ onMounted(() => {
display: flex;
align-items: baseline;
width: 269px;
margin-top: 4px;
.icon {
margin: 9px 12px;
width: 6px;
......@@ -1339,23 +1345,26 @@ onMounted(() => {
margin-left: 23px;
width: 438px;
.box5-item {
height: 30px;
min-height: 30px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
line-height: 1.5;
display: flex;
margin-bottom: 8px;
.icon {
flex-shrink: 0;
margin-left: 15px;
width: 6px;
height: 6px;
margin-top: 12px;
margin-top: 9px;
border-radius: 3px;
background: #84888e;
}
.text {
margin-left: 10px;
word-break: break-all;
}
}
}
......
......@@ -86,8 +86,11 @@
<script setup>
import { onMounted, ref } from "vue";
import { useRoute } from "vue-router";
import router from '@/router'
const route = useRoute();
const siderBtnList = ref([
{
name: '法案简介',
......@@ -106,7 +109,12 @@ const siderBtnList = ref([
const siderBtnActive = ref("法案简介");
const handleClickLeftSiderBtn = (item) => {
siderBtnActive.value = item.name
router.push(item.path)
router.push({
path: item.path,
query: {
billId: route.query.billId
}
})
}
const progressList = ref([
{
......
......@@ -44,7 +44,12 @@ const handleClickLeftSiderBtn = (item,index) => {
item.isActive = false
})
siderBtnList.value[index].isActive = true
router.push(item.path);
router.push({
path: item.path,
query: {
billId: route.query.billId
}
});
};
</script>
......
......@@ -179,7 +179,9 @@
<!-- <img :src="uncheckIcon" alt=""> -->
<img :src="checkedIcon" alt="" />
</div>
<div class="item-right">{{ val }}</div>
<div class="item-right">
<CommonPrompt :content="val">{{ val }}</CommonPrompt>
</div>
</div>
</div>
</div>
......@@ -209,7 +211,10 @@
<script setup>
import { ref, onMounted, nextTick, computed } from "vue";
import { useRoute } from "vue-router";
import * as echarts from "echarts";
const route = useRoute();
import { getCompanyList, getIndustryHyly, getHylyList, getCompanyDetail } from "@/api/influence";
import getBarChart from "./utils/barChart";
import getLineChart from "./utils/lineChart";
......@@ -229,6 +234,7 @@ import checkedIcon from "./assets/images/checked.png";
import closeIcon from "./assets/images/close.png";
import Fishbone from "./components/fishbone.vue";
import CommonPrompt from "../../commonPrompt/index.vue";
import CompanyImg from "./assets/images/symbol.png";
......@@ -1127,9 +1133,6 @@ onMounted(async () => {
font-size: 14px;
font-weight: 400;
line-height: 22px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
......
......@@ -177,7 +177,7 @@
</div> -->
<div class="info-box">
<div class="info-left">
<img :src="defaultAvatar" alt="" />
<img :src="defaultAvatar" alt="" @click="handleClickAvatar(curPerson.id)"/>
<div class="usr-icon1">
<img src="./assets/images/usr-icon1.png" alt="" />
</div>
......@@ -267,7 +267,7 @@
<div class="inner-left">
<div class="info-box">
<div class="info-top">
<img src="./assets/images/usr1.png" alt="" />
<img :src="defaultAvatar" alt="" />
<div class="usr-icon1">
<img src="./assets/images/usr-icon1.png" alt="" />
</div>
......@@ -305,7 +305,7 @@
status2: tag.status === 2,
status3: tag.status === 3
}"
v-for="(tag, index) in tagList"
v-for="(tag, index) in curPerson.tagList"
:key="index"
>
{{ tag.title }}
......@@ -335,30 +335,10 @@
{{ item.newsContent }}
</div>
<div class="pic">
<img src="./assets/imgs/img1.png" alt="" />
<img :src="defaultNew" alt="" />
</div>
</div>
</el-timeline-item>
<!-- <el-timeline-item timestamp="2018/4/3" placement="top">
<div class="timeline-content1">
<div class="text">
当地时间周五,美国众议院预算委员会投票否决了共和党提出的党派性税收与支出法案,强硬派保守党人的持续反对导致法案推进受阻。为安抚委员会内的极右翼成员,共和党领袖正考虑对法案进行重大修改,包括将医疗补助的工作要求实施时间从原定的2029年提前,并立即取消无证移民...
</div>
<div class="pic">
<img src="./assets/imgs/img2.png" alt="" />
</div>
</div>
</el-timeline-item>
<el-timeline-item timestamp="2018/4/2" placement="top">
<div class="timeline-content1">
<div class="text">
20252月中旬,众议院预算委员会通过《2025财年预算决议》,特朗普的减税议程迈出第一步。决议要求:延长2017年特朗普首个任期内出台的减税条款,计划在未来十年减税4.5万亿美元,强制性支出需合计削减2万亿美元,部分支出需控制增幅,未来十年共削减政府开支1.5万亿...
</div>
<div class="pic">
<img src="./assets/imgs/img3.png" alt="" />
</div>
</div>
</el-timeline-item> -->
</el-timeline>
</div>
</div>
......@@ -369,22 +349,41 @@
<script setup>
import { onMounted, ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import WordCloudMap from "./WordCloudMap.vue";
import STimeline from "./STimeline.vue";
import { getBillInfo, getBillPerson, getBillEvent, getBillDyqk } from "@/api/bill";
import defaultAvatar from "../assets/images/default-icon1.png";
import defaultNew from "../assets/images/default-icon-news.png";
const box2BtnActive = ref(1);
const handleClcikBox2Btn = index => {
box2BtnActive.value = index;
};
const route = useRoute();
const router = useRouter();
const box3BtnActive = ref("");
const handleClcikBox3Btn = (name, index) => {
box3BtnActive.value = name;
curPerson.value = personList.value[index];
personEventList.value = personList.value[index].eventList;
// 跳转到人物页面
const handleClickAvatar = id => {
const routeData = router.resolve({
path: "/characterPage",
query: {
personId: id
}
});
window.open(routeData.href, "_blank");
};
// 获取URL地址里面的billId
const billId = ref(route.query.billId);
// console.log(billId.value)
// const box2BtnActive = ref(1);
// const handleClcikBox2Btn = index => {
// box2BtnActive.value = index;
// };
// const box3BtnActive = ref("");
// const handleClcikBox3Btn = (name, index) => {
// box3BtnActive.value = name;
// curPerson.value = personList.value[index];
// personEventList.value = personList.value[index].eventList;
// };
const dialogBoxBtnActive = ref(0);
const handleClcikDialogBoxBtn = index => {
......@@ -540,7 +539,7 @@ const basicInfo = ref({});
const handleGetBasicInfo = async () => {
const params = {
id: window.sessionStorage.getItem("billId")
id: billId.value
};
try {
const res = await getBillInfo(params);
......@@ -579,21 +578,13 @@ const warningNum = ref(0);
// 法案进展 获取前期进展 --也是提出人左上角列表
const handleGetBillDyqk = async () => {
const params = {
id: window.sessionStorage.getItem("billId")
id: billId.value
};
try {
const res = await getBillDyqk(params);
console.log("前期进展", res);
timelineData.value = res.data;
// faList.value = res.data.map(item => {
// return {
// label: item.actionTitle,
// value: item.actionTitle,
// id: item.id
// };
// });
// selectValue.value = faList.value[0];
// handleGetBillPerson(faList.value[0].id);
} catch (error) {
console.error(error);
}
......@@ -605,35 +596,20 @@ const curPerson = ref({});
// 人物动态
const personEventList = ref([]);
// 提出人 --动议id
// const handleGetBillPerson = async id => {
// const params = {
// id: id
// };
// try {
// const res = await getBillPerson(params);
// console.log("提出人", res);
// personList.value = res.data;
// box3BtnActive.value = res.data.length ? res.data[0].name : "";
// curPerson.value = res.data.length ? res.data[0] : {};
// personEventList.value = res.data.length ? res.data[0].eventList : [];
// } catch (error) {
// console.error(error);
// }
// };
// 法案提出人
const handleGetBillPerson = async () => {
const params = {
billId: window.sessionStorage.getItem("billId")
billId: billId.value
};
try {
const res = await getBillPerson(params);
console.log("提出人", res);
personList.value = res.data;
box3BtnActive.value = res.data.length ? res.data[0].name : "";
// personList.value = res.data;
// box3BtnActive.value = res.data.length ? res.data[0].name : "";
curPerson.value = res.data.length ? res.data[0] : {};
personEventList.value = res.data.length ? res.data[0].eventList : [];
// personEventList.value = res.data.length ? res.data[0].eventList : [];
} catch (error) {
console.error(error);
}
......
......@@ -160,10 +160,13 @@
<script setup>
import { ref, onMounted } from "vue";
import { useRoute } from "vue-router";
import * as echarts from "echarts";
import getPieChart from "./utils/piechart";
import { getBillContentId, getBillContentTk, getBillContentXzfs, getBillHyly } from "@/api/bill";
const route = useRoute();
const curBill = ref("");
const curBillId = ref(null);
const checkedValue = ref(false);
......@@ -173,172 +176,7 @@ const currentPage = ref(1);
const pageSize = ref(10);
const total = ref(0);
const mainTermsList = ref([
{
id: 1,
title: "废除价值800美元以下进口包裹的免税政策,改为征收30%关税或每件25-50美元费用。",
header: "第51255条",
headerEn: "Sec.51225",
content: "Elimination of De Minimis Rule for imports valued below $800.",
tags: [
{
name: "关税",
status: 2
},
{
name: "跨境电商",
status: 1
}
]
},
{
id: 2,
title: "对所有进口商品加征10%关税。",
header: "第51255条",
headerEn: "Sec.51225",
content: "Imposing a 10% baseline tariff on all imported goods.",
tags: [
{
name: "关税",
status: 2
}
]
},
{
id: 3,
title: "第50404条:若美企与中企签订超100万美元技术许可协议,将丧失政府补贴资格。",
header: "第51255条",
headerEn: "Sec.51225",
content:
"Sec. 50404. If the taxpayer has entered into any technology licensing agreement with a FEOC exceeding $1,000,000...",
tags: [
{
name: "技术封锁",
status: 6
}
]
},
{
id: 4,
title: "第4502条:2025年9月30日后终止电动汽车消费者税收抵免。",
header: "第51255条",
headerEn: "Sec.51225",
content: "Sec.4502. Termination of electric vehicle consumer tax credits after September 30, 2025.",
tags: [
{
name: "税收",
status: 2
},
{
name: "新能源",
status: 1
}
]
},
{
id: 5,
title: "2026年1月1日起对使用进口组件的光伏项目征收15%消费税。",
header: "第51255条",
headerEn: "Sec.51225",
content: "Imposition of 15% excise tax on solar projects using imported components after January 1, 2026.",
tags: [
{
name: "供应链打压",
status: 3
},
{
name: "光伏",
status: 1
}
]
},
{
id: 6,
title: "若风电/光伏项目中受关注外国实体(FEOC)组件成本占比超标(如2026年太阳能为40%),则取消税收抵免。",
header: "第51255条",
headerEn: "Sec.51225",
content:
"Prohibiting tax credits for wind/solar projects if components from Foreign Entities of Concern (FEOC) exceed cost ratios ...",
tags: [
{
name: "供应链打压",
status: 3
},
{
name: "光伏",
status: 1
}
]
},
{
id: 7,
title: "第50401条:2025年起,若电池中关键矿物由受关注外国实体(FEOC)提取、加工或回收,则该车辆无法享受税收抵免。",
header: "第51255条",
headerEn: "Sec.51225",
content:
"Sec. 50401. No tax credit shall be allowed for any vehicle placed in service after December 31, 2024, if any of the...",
tags: [
{
name: "供应链打压",
status: 3
},
{
name: "新能源",
status: 1
}
]
},
{
id: 8,
title: "Sec. 50401. No tax credit shall be allowed for any vehicle placed in service after December 31, 2024, if any of the...",
header: "第51255条",
headerEn: "Sec.51225",
content:
"Sec. 50405. No credit shall be allowed under this chapter to any entity in which a foreign adversary holds 25% or more ...",
tags: [
{
name: "新能源",
status: 1
}
]
},
{
id: 9,
title: "第4501条:芯片企业税收抵免提至35%,但禁止在中国大陆扩大先进制程生产。",
header: "第51255条",
headerEn: "Sec.51225",
content:
"Sec. 4501. The advanced manufacturing investment credit under section 48D shall be increased to 35%, provided that ...",
tags: [
{
name: "技术封锁",
status: 5
},
{
name: "半导体",
status: 4
}
]
},
{
id: 10,
title: "第20013条:授权拨款5亿美元用于向台湾提供防御物资、训练及其他服务。",
content:
"Sec. 20013. $500,000,000 is authorized to be appropriated for the provision of defense articles, training, and other ...",
header: "第51255条",
headerEn: "Sec.51225",
tags: [
{
name: "拨款",
status: 2
},
{
name: "军工",
status: 6
}
]
}
]);
const mainTermsList = ref([]);
const btnActiveIndex = ref(1);
const handleSelectBtn = index => {
btnActiveIndex.value = index;
......@@ -382,13 +220,15 @@ const handleChangeBill = val => {
curBillId.value = item.id;
currentPage.value = 1;
handleGetBillContentTk(checkedValue.value ? "Y" : "N");
handleGetBillContentXzfs();
handleGetBillHyly();
}
};
// 获取法案id列表
const handleGetBillList = async () => {
const params = {
id: window.sessionStorage.getItem("billId")
id: route.query.billId
};
try {
const res = await getBillContentId(params);
......@@ -410,6 +250,8 @@ const handleGetBillList = async () => {
const handleChangeCheckbox = val => {
currentPage.value = 1;
handleGetBillContentTk(val ? "Y" : "N");
handleGetBillContentXzfs();
handleGetBillHyly();
};
const handleCurrentChange = val => {
......@@ -420,16 +262,17 @@ const handleCurrentChange = val => {
// 根据原文ID获取条款列表
const handleGetBillContentTk = async cRelated => {
const params = {
billid: window.sessionStorage.getItem("billId"),
billId: route.query.billId,
id: curBill.value,
cRelated: cRelated,
currentPage: currentPage.value - 1,
pageSize: pageSize.value
pageSize: pageSize.value,
currentPage: currentPage.value
};
try {
const res = await getBillContentTk(params);
console.log("条款内容", res);
mainTermsList.value = res.data.content.map(item => {
if (res && res.data) {
mainTermsList.value = (res.data.content || []).map(item => {
// 处理 fynr
if (item.fynr) {
const matchComplex = item.fynr.match(/^(?:正文内容[::]\s*)?[“"]?\s*第\s*([0-9a-zA-Z]+)\s*[条节][::\.\。]?[”"]?\s*/);
......@@ -462,14 +305,24 @@ const handleGetBillContentTk = async cRelated => {
}
return item;
});
total.value = res.data.totalElements;
} catch (error) {}
total.value = res.data.totalElements || 0;
} else {
mainTermsList.value = [];
total.value = 0;
}
} catch (error) {
console.error("获取条款内容失败", error);
mainTermsList.value = [];
total.value = 0;
}
};
// 获取限制方式列表
const handleGetBillContentXzfs = async () => {
const params = {
id: window.sessionStorage.getItem("billId")
billId: route.query.billId,
versionId: curBill.value,
cRelated: checkedValue.value ? "Y" : "N"
};
try {
......@@ -481,13 +334,17 @@ const handleGetBillContentXzfs = async () => {
value: item.countTk
};
});
let chart1 = getPieChart(chart1Data.value, chart1ColorList.value);
setChart(chart1, "chart1");
} catch (error) {}
};
// 行业领域
const handleGetBillHyly = async () => {
const params = {
id: window.sessionStorage.getItem("billId")
billId: route.query.billId,
versionId: curBill.value,
cRelated: checkedValue.value ? "Y" : "N"
};
try {
......@@ -499,7 +356,6 @@ const handleGetBillHyly = async () => {
value: item.countTk
};
});
console.log("chart2Data", chart2Data.value);
let chart2 = getPieChart(chart2Data.value, chart2ColorList.value);
setChart(chart2, "chart2");
......
......@@ -6,7 +6,9 @@
</div>
<div class="news-content">
<div class="news-header">
<div class="news-title">{{ item.title }}</div>
<CommonPrompt :content="item.title" class="news-title-prompt">
<span class="news-title">{{ item.title }}</span>
</CommonPrompt>
<div class="news-meta">
<span class="news-time">{{ item.time }}</span> ·
<span class="news-source">{{ item.source }}</span>
......@@ -100,6 +102,13 @@ const handleItemClick = item => {
justify-content: space-between;
align-items: flex-start;
margin-bottom: 8px;
overflow: hidden;
}
.news-title-prompt {
flex: 1;
min-width: 0;
margin-right: 12px;
}
.news-title {
......@@ -108,11 +117,7 @@ const handleItemClick = item => {
font-weight: 700;
color: rgba(59, 65, 75, 1);
line-height: 24px;
flex: 1;
margin-right: 12px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
}
.news-meta {
......
......@@ -190,7 +190,7 @@
>
<template #default>
<div class="box2-main">
<div class="box2-main-item" v-for="(item, index) in warningList" :key="index">
<div class="box2-main-item" v-for="(item, index) in warningList" :key="index" @click="handleToRiskSignalDetail(item)">
<div
class="item-left"
:class="{
......@@ -202,7 +202,9 @@
</div>
<div class="item-right">
<div class="text">
<CommonPrompt :content="item.title">
{{ item.title }}
</CommonPrompt>
</div>
<div class="time">{{ item.time }}</div>
</div>
......@@ -758,6 +760,18 @@ import {
getExportControlList
} from "@/api/exportControl";
// 跳转到单项制裁页面
const handleToRiskSignalDetail = item => {
const routeData = router.resolve({
path: "/exportControl/singleSanction",
query: {
id: item.sanId
}
});
// 打开新页面
window.open(routeData.href, "_blank");
};
const sanctionList = ref([]);
const techOptions = [
......@@ -797,8 +811,8 @@ import { formatAnyDateToChinese } from "./utils";
import _ from "lodash";
const handleCompClick = item => {
console.log("item", item);
if (item.entityType != 2) return;
// console.log("item", item);
// if (item.entityType != 2) return;
const route = router.resolve({
path: "/companyPages",
query: {
......@@ -1426,12 +1440,14 @@ const fetchRiskSignals = async () => {
try {
const data = await getRiskSignal();
if (data && Array.isArray(data)) {
console.log(data);
warningList.value = data.map(item => ({
...item,
title: item.signalTitle,
time: item.signalTime,
status: item.signalLevel,
id: item.signalId
id: item.signalId,
sanId:item.sanId
}));
}
} catch (err) {
......
......@@ -104,7 +104,7 @@
</div>
</div>
<div class="right-main">
<div class="right-main-title">
<div class="right-main-title" @click="handleClickOrg(publishInfo)">
<img :src="publishInfo.imageUrl" alt="" />
<div>
<div class="title-text">{{ publishInfo.orgNameZh }} ></div>
......@@ -170,10 +170,11 @@ import icon02 from "../../assets/icon02.png";
import { ArrowDown } from "@element-plus/icons-vue";
import { getEntityInfo, getPublishInfo, getPublishOrgInfo, getEntityUpdateInfo } from "@/api/exportControlV2.0.js";
// 跳转到详情页
const handleClick = item => {
// 处理点击发布机构的方法
const handleClickOrg = item => {
// console.log("点击了发布机构:", item);
const route = router.resolve({
path: "/exportControl/singleSanction",
path: "/institution",
query: {
id: item.id
}
......@@ -194,6 +195,18 @@ const handlePerClick = item => {
window.open(route.href, "_blank");
};
// 处理点击实体名称的方法
const handleClick = item => {
// console.log("点击了实体名称:", item);
const route = router.resolve({
path: "/exportControl/singleSanction",
query: {
id: item.id
}
});
window.open(route.href, "_blank");
};
const selectedDomain = ref(0);
const onlyChina = ref(false);
const domainOptions = [
......@@ -560,6 +573,7 @@ onMounted(() => {
.right-main {
padding: 7px 24px 0px 23px;
.right-main-title {
cursor: pointer;
width: 473px;
height: auto;
border-radius: 4px;
......
......@@ -66,7 +66,7 @@
>
<el-table-column label="实体名称" min-width="200">
<template #default="{ row }">
<div class="entity-name-cell">
<div class="entity-name-cell" @click="handleCompClick(row)">
<el-image
v-if="row.img"
class="avatar"
......@@ -138,12 +138,27 @@
<script setup>
import { ref, computed, onMounted, watch } from "vue";
import { useRouter } from "vue-router";
import { Search } from "@element-plus/icons-vue";
import defaultIcon from "../../../../../assets/icons/default-avatar.png";
import RuleSubsidiaryDialog from "./RuleSubsidiaryDialog.vue";
import { getExportControlList, get50PercentEntityCount } from "@/api/exportControlV2.0.js"
import CommonPrompt from '@/views/exportControl/commonPrompt/index.vue'
const router = useRouter();
// 跳转公司详情页
const handleCompClick = item => {
console.log("item", item);
const route = router.resolve({
path: "/companyPages",
query: {
id: item.id
}
});
window.open(route.href, "_blank");
};
const searchKeyword = ref("");
const onlyChina = ref(false);
const sanctionTime = ref("");
......
......@@ -16,7 +16,7 @@
<div class="label">发布机构:</div>
<div class="value link">
<img :src="title" alt="" class="icon">
<span>{{ formattedData.postOrgName }} ></span>
<span @click="handleClickDp">{{ formattedData.postOrgName }} ></span>
</div>
</div>
<div class="info-row">
......@@ -165,7 +165,7 @@
<div class="name-cell">
<div class="dot"></div>
<img :src="defaultTitle" class="company-icon" />
<span class="company-name">{{ scope.row.name }}</span>
<span class="company-name" @click="handleCompClick(scope.row)">{{ scope.row.name }}</span>
</div>
</template>
</el-table-column>
......@@ -185,7 +185,7 @@
<el-table-column prop="revenue" label="营收(亿元)" width="110" align="center" />
<el-table-column label="50%规则子企业" width="180" align="center">
<template #default="scope">
<span v-if="scope.row.subsidiaryCount" class="subsidiary-link">
<span v-if="scope.row.subsidiaryCount" class="subsidiary-link" @click="handleSubsidiaryClick(scope.row)">
{{ scope.row.subsidiaryText }} <span class="blue-text">{{ scope.row.subsidiaryCount }}家 ></span>
</span>
<span v-else>--</span>
......@@ -200,6 +200,13 @@
</div>
</div>
</div>
<!-- 50%规则子企业弹框 -->
<RuleSubsidiaryDialog
v-model="subsidiaryDialogVisible"
:company-name="currentSubsidiaryCompanyName"
:total-count="currentSubsidiaryCount"
:data-list="currentSubsidiaryList"
/>
</div>
</template>
......@@ -212,6 +219,44 @@ import title from "../../assets/title.png"
import defaultTitle from "../../assets/default-icon1.png"
import flag from "../../assets/default-icon2.png"
import { getSingleSanctionEntityCountry, getSingleSanctionBackground, getSingleSanctionOverviewList } from "@/api/exportControlV2.0";
import RuleSubsidiaryDialog from "../../../v2.0EntityList/components/sanctionsOverview/components/listPage/RuleSubsidiaryDialog.vue";
// 跳转公司详情页
const handleCompClick = item => {
console.log("item", item);
const route = router.resolve({
path: "/companyPages",
query: {
id: item.id
}
});
window.open(route.href, "_blank");
};
// 跳转发布机构详情页
const handleClickDp = () => {
// console.log("点击了发布机构:", props.data);
const route = router.resolve({
path: "/institution",
query: {
id: props.data.postOrgId
}
});
window.open(route.href, "_blank");
};
// 50%规则子企业弹框逻辑
const subsidiaryDialogVisible = ref(false);
const currentSubsidiaryCompanyName = ref("");
const currentSubsidiaryCount = ref(0);
const currentSubsidiaryList = ref([]);
const handleSubsidiaryClick = (row) => {
currentSubsidiaryCompanyName.value = row.name;
currentSubsidiaryCount.value = row.subsidiaryCount;
currentSubsidiaryList.value = row.ruleOrgList || [];
subsidiaryDialogVisible.value = true;
};
// 单次制裁-制裁概况-制裁清单
const sanctionList = ref([])
......@@ -240,6 +285,7 @@ const getSanctionOverviewList = async () => {
sanctionList.value = list.map(item => ({
reason: item.sanReason,
entities: (item.orgList || []).map(org => ({
...org,
name: org.entityNameZh || org.entityName,
fields: org.techDomains || [],
location: "--", // 接口暂无数据
......
......@@ -28,7 +28,7 @@
<span>{{ item.title }}</span>
<div class="active-line" v-if="activeIndex === index"></div>
</div>
<div class="original-text-btn">
<div class="original-text-btn" @click="handleClickOriginalText">
<img :src="icon1" alt="">
<span>实体清单原文</span>
</div>
......@@ -67,6 +67,12 @@ import icon3Active from "../assets/icons/icon3_active.png";
import { getSingleSanctionOverview } from "@/api/exportControlV2.0.js"
// 处理点击实体清单原文按钮
const handleClickOriginalText = () => {
// 打开新标签页
window.open(`/exportControl/origin?id=${sanRecordId.value}`, "_blank")
}
// 获取URL参数
const sanRecordId = ref("")
const getUrlParams = () => {
......
<template>
<div class="entity-list">
<div class="header">
<div class="header-title">
<img :src="headerTitle.img" alt="">
<div>
<div class="title">
{{ headerTitle.title }}
<!-- <span>{{ headerTitle.titleEn }}</span> -->
</div>
<div class="department">
{{ headerTitle.department }}
</div>
</div>
<!-- <div class="btn">
<img :src="icon01" alt="">切换
</div> -->
</div>
</div>
<div class="main">
<div class="pdf-container">
<iframe v-if="headerTitle.srcUrl" :src="headerTitle.srcUrl" width="100%" height="100%" frameborder="0"></iframe>
<div v-else class="no-pdf">暂无原文</div>
</div>
<div class="pdf-container">
<iframe v-if="headerTitle.transUrl" :src="headerTitle.transUrl" width="100%" height="100%" frameborder="0"></iframe>
<div v-else class="no-pdf">暂无译文</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { getSingleSanctionOverview } from "@/api/exportControlV2.0.js"
import title from "../assets/title.png"
import icon01 from "../assets/icon01.png"
// 单次制裁-制裁概况-基本信息
const singleSanctionOverview = ref({})
const getSingleSanctionOverviewData = async () => {
if (!sanRecordId.value) return
try {
const res = await getSingleSanctionOverview({
sanRecordId: sanRecordId.value
})
if (res.code === 200) {
singleSanctionOverview.value = res.data || {}
// 格式化日期
let dateStr = "";
if (singleSanctionOverview.value.postDate) {
const date = new Date(singleSanctionOverview.value.postDate);
if (!isNaN(date.getTime())) {
dateStr = `${date.getFullYear()}${date.getMonth() + 1}${date.getDate()}日`;
} else {
dateStr = singleSanctionOverview.value.postDate;
}
}
// 更新头部信息
headerTitle.value = {
...headerTitle.value,
title: `${dateStr}${singleSanctionOverview.value.sanTitleZh || singleSanctionOverview.value.sanTitle}》`,
titleEn: singleSanctionOverview.value.sanTitle || "",
department: singleSanctionOverview.value.fileCode || "",
srcUrl: singleSanctionOverview.value.srcUrl || "",
transUrl: singleSanctionOverview.value.transUrl || ""
}
}
} catch (error) {
console.error("获取制裁概况失败:", error)
}
}
const headerTitle = ref({
img: title,
})
// 获取URL参数
const sanRecordId = ref("")
const getUrlParams = () => {
const urlParams = new URLSearchParams(window.location.search);
sanRecordId.value = urlParams.get("id") || ""
}
onMounted(() => {
getUrlParams()
getSingleSanctionOverviewData()
})
</script>
<style scoped lang="scss">
* {
margin: 0;
padding: 0;
}
.entity-list{
width: 100%;
height: 100%;
.header{
width: 100%;
height: 148px;
background-color: #fff;
padding-top: 16px;
.header-title{
width: 1601px;
height: 72px;
background-color: rgba(246, 250, 255, 1);
margin: 0 auto;
border-radius: 10px;
border: 2px solid rgba(174, 214, 255, 1);
display: flex;
align-items: center;
margin-bottom: 12px;
position: relative;
img {
width: 54px;
height: 54px;
margin-left: 15px;
margin-right: 11px;
}
.title {
font-size: 20px;
font-weight: 700;
font-family: "Microsoft YaHei";
line-height: 26px;
color: rgb(59, 65, 75);
span {
font-size: 16px;
font-weight: 400;
font-family: "Microsoft YaHei";
line-height: 24px;
color: rgb(95, 101, 108);
margin-left: 11px;
}
}
.department {
font-size: 16px;
font-weight: 400;
font-family: "Microsoft YaHei";
line-height: 24px;
color: rgb(95, 101, 108);
}
.btn {
cursor: pointer;
display: flex;
align-items: center;
position: absolute;
right: 16px;
top: 25px;
font-size: 18px;
font-weight: 700;
font-family: "Microsoft YaHei";
line-height: 24px;
color: rgb(5, 95, 194);
img {
width: 20px;
height: 20px;
margin-right: 7px;
}
}
}
.header-nav {
width: 1601px;
margin: 0 auto;
height: 48px;
display: flex;
align-items: center;
.nav-item {
display: flex;
align-items: center;
height: 100%;
margin-right: 32px;
cursor: pointer;
position: relative;
font-size: 18px;
font-weight: 400;
font-family: "Microsoft YaHei";
color: rgb(59, 65, 75);
&:last-child {
margin-right: 0;
}
img {
width: 16px;
height: 16px;
margin-right: 4px;
}
&.active {
color: rgb(5, 95, 194);
font-weight: 700;
}
.active-line {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
background-color: #055fc2;
border-radius: 1.5px;
}
}
.original-text-btn {
margin-left: auto;
width: 152px;
height: 36px;
background: #FFFFFF;
border-radius: 4px;
border: 1px solid rgba(230, 231, 232, 1);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
img {
width: 16px;
height: 16px;
margin-right: 8px;
}
span {
font-size: 16px;
font-weight: 400;
color: rgb(95, 101, 108);
font-family: "Microsoft YaHei";
line-height: 24px;
}
}
}
}
.main{
width: 1601px;
height: calc(100% - 148px);
background-color: #F7F8F9;
margin: 0 auto;
display: flex;
justify-content: space-between;
padding-top: 20px;
box-sizing: border-box;
.pdf-container {
width: 790px;
height: calc(100% - 20px);
background-color: #fff;
// border: 1px solid rgba(174, 214, 255, 1);
border-radius: 4px;
overflow: hidden;
.no-pdf {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #909399;
font-size: 16px;
background-color: #fff;
}
}
}
}
</style>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论