提交 dc99c723 authored 作者: 朱政's avatar 朱政

Merge branch 'pre' into zz-dev

流水线 #336 已通过 于阶段
in 1 分 36 秒
...@@ -199,6 +199,7 @@ ...@@ -199,6 +199,7 @@
"resolved": "https://registry.npmmirror.com/@antv/g6/-/g6-4.8.25.tgz", "resolved": "https://registry.npmmirror.com/@antv/g6/-/g6-4.8.25.tgz",
"integrity": "sha512-8mdTnN9QMVNQZtlXmftL8fvRsa4L+GajK58Zp51wyrGLFyjeop8R0QSkCALW45DWP2TaQeZAPtjhQUU/wf5hIg==", "integrity": "sha512-8mdTnN9QMVNQZtlXmftL8fvRsa4L+GajK58Zp51wyrGLFyjeop8R0QSkCALW45DWP2TaQeZAPtjhQUU/wf5hIg==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@antv/g6-pc": "0.8.25" "@antv/g6-pc": "0.8.25"
} }
...@@ -2171,6 +2172,7 @@ ...@@ -2171,6 +2172,7 @@
"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/lodash": "*" "@types/lodash": "*"
} }
...@@ -2287,6 +2289,7 @@ ...@@ -2287,6 +2289,7 @@
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz", "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz",
"integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==", "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.3",
"@vue/compiler-core": "3.5.21", "@vue/compiler-core": "3.5.21",
...@@ -2893,6 +2896,7 @@ ...@@ -2893,6 +2896,7 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"baseline-browser-mapping": "^2.9.0", "baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759", "caniuse-lite": "^1.0.30001759",
...@@ -3251,6 +3255,7 @@ ...@@ -3251,6 +3255,7 @@
"resolved": "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.33.1.tgz", "resolved": "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.33.1.tgz",
"integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=0.10" "node": ">=0.10"
} }
...@@ -3648,6 +3653,7 @@ ...@@ -3648,6 +3653,7 @@
"resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"license": "ISC", "license": "ISC",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
...@@ -3736,6 +3742,7 @@ ...@@ -3736,6 +3742,7 @@
"version": "0.8.5", "version": "0.8.5",
"resolved": "https://registry.npmmirror.com/dagre/-/dagre-0.8.5.tgz", "resolved": "https://registry.npmmirror.com/dagre/-/dagre-0.8.5.tgz",
"integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==",
"peer": true,
"dependencies": { "dependencies": {
"graphlib": "^2.1.8", "graphlib": "^2.1.8",
"lodash": "^4.17.15" "lodash": "^4.17.15"
...@@ -3943,6 +3950,7 @@ ...@@ -3943,6 +3950,7 @@
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz", "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz",
"integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "2.3.0", "tslib": "2.3.0",
"zrender": "5.6.1" "zrender": "5.6.1"
...@@ -5334,13 +5342,15 @@ ...@@ -5334,13 +5342,15 @@
"version": "4.18.1", "version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"license": "MIT" "license": "MIT",
"peer": true
}, },
"node_modules/lodash-es": { "node_modules/lodash-es": {
"version": "4.18.1", "version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
"integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
"license": "MIT" "license": "MIT",
"peer": true
}, },
"node_modules/lodash-unified": { "node_modules/lodash-unified": {
"version": "1.0.3", "version": "1.0.3",
...@@ -5388,6 +5398,7 @@ ...@@ -5388,6 +5398,7 @@
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
"integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"argparse": "^2.0.1", "argparse": "^2.0.1",
"entities": "^4.4.0", "entities": "^4.4.0",
...@@ -6467,6 +6478,7 @@ ...@@ -6467,6 +6478,7 @@
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
...@@ -6563,6 +6575,7 @@ ...@@ -6563,6 +6575,7 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"nanoid": "^3.3.11", "nanoid": "^3.3.11",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
...@@ -6964,6 +6977,7 @@ ...@@ -6964,6 +6977,7 @@
"integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/estree": "1.0.8" "@types/estree": "1.0.8"
}, },
...@@ -8134,6 +8148,7 @@ ...@@ -8134,6 +8148,7 @@
"integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"esbuild": "^0.21.3", "esbuild": "^0.21.3",
"postcss": "^8.4.43", "postcss": "^8.4.43",
...@@ -8193,6 +8208,7 @@ ...@@ -8193,6 +8208,7 @@
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.21.tgz", "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.21.tgz",
"integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==", "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.5.21", "@vue/compiler-dom": "3.5.21",
"@vue/compiler-sfc": "3.5.21", "@vue/compiler-sfc": "3.5.21",
......
...@@ -4,7 +4,7 @@ import { ElMessage } from "element-plus"; ...@@ -4,7 +4,7 @@ import { ElMessage } from "element-plus";
const request200 = requestP => { const request200 = requestP => {
return requestP.then(data => { return requestP.then(data => {
if (data.code === 200) { if (data.code === 200) {
console.log('返回的数据结构 =>', data.data) console.log("返回的数据结构 =>", data.data);
return data.data; return data.data;
} }
ElMessage({ ElMessage({
...@@ -393,13 +393,13 @@ export function getDomainDistribution(sanctionDate = "2025-11-11") { ...@@ -393,13 +393,13 @@ export function getDomainDistribution(sanctionDate = "2025-11-11") {
* startTime: string * startTime: string
* }[]>} * }[]>}
*/ */
export function getEntitiesList(sanTypeId=1, pageNum = 1, pageSize = 10, sanctionDate = "", isCn = false) { export function getEntitiesList(sanTypeIds = ["1"], pageNum = 1, pageSize = 10, sanctionDate = "", isCn = false) {
return request200( return request200(
request({ request({
method: "POST", method: "POST",
url: "/api/sanctionList/pageQuery", url: "/api/sanctionList/pageQuery",
data: { data: {
sanTypeId, sanTypeIds,
pageNum, pageNum,
pageSize, pageSize,
sanctionDate, sanctionDate,
......
...@@ -30,7 +30,7 @@ import { http } from "./service.js"; ...@@ -30,7 +30,7 @@ import { http } from "./service.js";
/** /**
* 总次数统计 * 总次数统计
*/ */
export function getDataCount() { export function getDataCount() {
return http.get("/api/sanctionList/invFin/getTotalInfo"); return http.get("/api/sanctionList/invFin/getTotalInfo");
} }
...@@ -38,7 +38,7 @@ export function getDataCount() { ...@@ -38,7 +38,7 @@ export function getDataCount() {
/** /**
* 最新出口管制政策 * 最新出口管制政策
* url:/sanctionList/invFin/getLatestEntityListInfo * url:/sanctionList/invFin/getLatestEntityListInfo
*/ */
export function getLatestEntityListInfo() { export function getLatestEntityListInfo() {
return http.get("/api/sanctionList/invFin/getLatestEntityListInfo"); return http.get("/api/sanctionList/invFin/getLatestEntityListInfo");
} }
...@@ -46,31 +46,31 @@ export function getLatestEntityListInfo() { ...@@ -46,31 +46,31 @@ export function getLatestEntityListInfo() {
/** /**
* 风险信号 * 风险信号
* url:/commonFeature/riskSignal/{moduleId} * url:/commonFeature/riskSignal/{moduleId}
*/ */
export function getRiskSignal(moduleId='0104') { export function getRiskSignal(moduleId = "0104") {
return http.get(`/api/commonFeature/riskSignal/${moduleId}`); return http.get(`/api/commonFeature/riskSignal/${moduleId}`);
} }
/** /**
* 新闻资讯 * 新闻资讯
* url:/commonFeature/news/{moduleId} * url:/commonFeature/news/{moduleId}
*/ */
export function getNewsInfo(moduleId='0104') { export function getNewsInfo(moduleId = "0104") {
return http.get(`/api/commonFeature/news/${moduleId}`); return http.get(`/api/commonFeature/news/${moduleId}`);
} }
/** /**
* 社交媒体信息 * 社交媒体信息
* url:/commonFeature/remarks/{moduleId} * url:/commonFeature/remarks/{moduleId}
*/ */
export function getSocialMediaInfo(moduleId='0104') { export function getSocialMediaInfo(moduleId = "0104") {
return http.get(`/api/commonFeature/remarks/${moduleId}`); return http.get(`/api/commonFeature/remarks/${moduleId}`);
} }
/** /**
* 发布频度 * 发布频度
* url:/entitiesDataCount/getAnnualCount * url:/entitiesDataCount/getAnnualCount
*/ */
export function getReleaseCount(id) { export function getReleaseCount(id) {
return http.get(`/api/entitiesDataCount/getAnnualCount?sanTypeId=${id}`); return http.get(`/api/entitiesDataCount/getAnnualCount?sanTypeId=${id}`);
} }
...@@ -78,7 +78,7 @@ export function getReleaseCount(id) { ...@@ -78,7 +78,7 @@ export function getReleaseCount(id) {
/** /**
* 制裁领域分析 * 制裁领域分析
* url:/entitiesDataCount/getSanDomainCount * url:/entitiesDataCount/getSanDomainCount
*/ */
export function getSanDomainCount(sanTypeIds) { export function getSanDomainCount(sanTypeIds) {
return http.get(`/api/entitiesDataCount/getSanDomainCount?sanTypeIds=${sanTypeIds}`); return http.get(`/api/entitiesDataCount/getSanDomainCount?sanTypeIds=${sanTypeIds}`);
} }
...@@ -86,7 +86,7 @@ export function getSanDomainCount(sanTypeIds) { ...@@ -86,7 +86,7 @@ export function getSanDomainCount(sanTypeIds) {
/** /**
* 制裁清单增长趋势 * 制裁清单增长趋势
* url:/entitiesDataCount/getAnnualSanDomain * url:/entitiesDataCount/getAnnualSanDomain
*/ */
export function getAnnualSanDomain(params) { export function getAnnualSanDomain(params) {
return http.post("/api/entitiesDataCount/getAnnualSanDomain", params); return http.post("/api/entitiesDataCount/getAnnualSanDomain", params);
} }
...@@ -94,9 +94,9 @@ export function getAnnualSanDomain(params) { ...@@ -94,9 +94,9 @@ export function getAnnualSanDomain(params) {
/** /**
* 全部制裁(历史制裁过程) * 全部制裁(历史制裁过程)
* url:/entitiesDataCount/getSanctionProcess * url:/entitiesDataCount/getSanctionProcess
*/ */
export function getSanctionProcess(sanTypeIds = "1", pageNum = 1, pageSize = 10, isCn = false) { export function getSanctionProcess(sanTypeIds = "1", pageNum = 1, pageSize = 10, isCn = false) {
return http.post("/api/entitiesDataCount/getSanctionProcess",{ return http.post("/api/entitiesDataCount/getSanctionProcess", {
sanTypeIds, sanTypeIds,
// typeName: tabMap[sanTypeId], // typeName: tabMap[sanTypeId],
pageNum, pageNum,
...@@ -104,3 +104,35 @@ export function getSanctionProcess(sanTypeIds = "1", pageNum = 1, pageSize = 10, ...@@ -104,3 +104,35 @@ export function getSanctionProcess(sanTypeIds = "1", pageNum = 1, pageSize = 10,
isCn isCn
}); });
} }
/**
* 制裁实体领域数量变化情况
* url:/sanctionList/statistics/domainNum
*/
export function getDomainNum(params) {
return http.get("/api/sanctionList/statistics/domainNum", params);
}
/**
* 获取制裁实体类型分布列表
* url:/sanctionList/statistics/entityTypeId
*/
export function getEntityTypeCount(params) {
return http.get("/api/sanctionList/statistics/entityTypeId", params);
}
/**
* 新闻链接
* url:/sanctionList/invFin/getRelateNews
*/
export function getRelateNews(sanRecordId) {
return http.get(`/api/sanctionList/invFin/getRelateNews?sanRecordId=${sanRecordId}`);
}
/**
* 制裁原因及相关历史制裁
* url:/sanctionList/invFin/getReasonAndSan
*/
export function getReasonAndSan(sanRecordId) {
return http.get(`/api/sanctionList/invFin/getReasonAndSan?sanRecordId=${sanRecordId}`);
}
// 出口管制 // 出口管制
const ExportControl = () => import('@/views/exportControl/index.vue') const ExportControl = () => import("@/views/exportControl/index.vue");
const exportControlRoutes = [ const exportControlRoutes = [
// 出口管制首页 // 出口管制首页
...@@ -44,7 +44,7 @@ const exportControlRoutes = [ ...@@ -44,7 +44,7 @@ const exportControlRoutes = [
meta: { meta: {
title: "影响分析" title: "影响分析"
} }
}, }
] ]
}, },
{ {
...@@ -102,7 +102,7 @@ const exportControlRoutes = [ ...@@ -102,7 +102,7 @@ const exportControlRoutes = [
name: "singleSanction", name: "singleSanction",
component: () => import("@/views/exportControl/v2.0SingleSanction/index.vue"), component: () => import("@/views/exportControl/v2.0SingleSanction/index.vue"),
meta: { meta: {
title: "单条制裁详情", title: "单次制裁详情",
dynamicTitle: true dynamicTitle: true
} }
}, },
...@@ -110,12 +110,12 @@ const exportControlRoutes = [ ...@@ -110,12 +110,12 @@ const exportControlRoutes = [
{ {
path: "/exportControl/origin", path: "/exportControl/origin",
name: "entityListOrigin", name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue"), component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue")
// meta: { // meta: {
// title: "实体清单原文" // title: "实体清单原文"
// } // }
}, },
// V2.0全部实体清单 // V2.0商业制裁清单
{ {
path: "/exportControl/commercialControlList", path: "/exportControl/commercialControlList",
name: "commercialControlList", name: "commercialControlList",
...@@ -124,6 +124,6 @@ const exportControlRoutes = [ ...@@ -124,6 +124,6 @@ const exportControlRoutes = [
title: "商业管制清单概览" title: "商业管制清单概览"
} }
} }
] ];
export default exportControlRoutes export default exportControlRoutes;
\ No newline at end of file
// 投融资限制 // 投融资限制
const Finance = () => import('@/views/finance/index.vue') const Finance = () => import("@/views/finance/index.vue");
const financeRoutes = [ const financeRoutes = [
// 投融资限制 // 投融资限制
...@@ -12,7 +12,43 @@ const financeRoutes = [ ...@@ -12,7 +12,43 @@ const financeRoutes = [
isShowHeader: true isShowHeader: true
} }
}, },
// SDN制裁清单概览
{
path: "/finance/sdnlistoverview",
name: "sdnlistOverview",
component: () => import("@/views/finance/v2.0EntityList/index.vue"),
meta: {
title: "SDN制裁清单概览"
}
},
// V2.0单条制裁详情
{
path: "/finance/singleSanction",
name: "singleSanction",
component: () => import("@/views/finance/v2.0SingleSanction/index.vue"),
meta: {
title: "单条制裁详情",
dynamicTitle: true
}
},
// V2.0单条制裁详情-实体清单原文
{
path: "/exportControl/origin",
name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue")
// meta: {
// title: "实体清单原文"
// }
},
// V2.0商业制裁清单
{
path: "/finance/cmccontrolList",
name: "cmccontrolList",
component: () => import("@/views/finance/v2.0CommercialControlList/index.vue"),
meta: {
title: "涉军企业清单概览"
}
}
];
] export default financeRoutes;
export default financeRoutes
\ No newline at end of file
...@@ -267,6 +267,7 @@ const resetModal = () => { ...@@ -267,6 +267,7 @@ const resetModal = () => {
}; };
onMounted(() => { onMounted(() => {
console.log("出口管制-单次制裁");
getUrlParams(); getUrlParams();
getSingleSanctionOverviewData(); getSingleSanctionOverviewData();
}); });
......
...@@ -1045,7 +1045,7 @@ const handleToEntityList = item => { ...@@ -1045,7 +1045,7 @@ const handleToEntityList = item => {
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目》" entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目》"
); );
const routeData = router.resolve({ const routeData = router.resolve({
path: "/exportControl/singleSanction", path: "/finance/singleSanction",
query: { query: {
id, id,
sanTypeId sanTypeId
...@@ -1057,19 +1057,18 @@ const handleToEntityList = item => { ...@@ -1057,19 +1057,18 @@ const handleToEntityList = item => {
// 跳转到V2.0实体清单无ID // 跳转到V2.0实体清单无ID
const handleToEntityListNoId = item => { const handleToEntityListNoId = item => {
console.log("这是什么数据 =>", item); if (item.id == allSanTypeIds.value[0]) {
if (item.nameZh == "实体清单") {
const routeData = router.resolve({ const routeData = router.resolve({
path: "/exportControl/entityList", path: "/finance/sdnlistoverview",
query: { query: {
sanTypeId: item.id sanTypeId: item.id
} }
}); });
// 打开一个新页面 // 打开一个新页面
window.open(routeData.href, "_blank"); window.open(routeData.href, "_blank");
} else if (item.nameZh == "商业管制清单") { } else if (item.id == allSanTypeIds.value[1]) {
const routeData = router.resolve({ const routeData = router.resolve({
path: "/exportControl/commercialControlList", path: "/finance/cmccontrolList",
query: { query: {
sanTypeId: item.id sanTypeId: item.id
} }
...@@ -1378,7 +1377,7 @@ watch( ...@@ -1378,7 +1377,7 @@ watch(
const fetchEntitiesList = async (page = 1, size = 10) => { const fetchEntitiesList = async (page = 1, size = 10) => {
try { try {
console.log("activeResourceTabItem.value.id", activeResourceTabItem.value.id); console.log("activeResourceTabItem.value.id", activeResourceTabItem.value.id);
const res = await getEntitiesList(activeResourceTabItem.value.id.join(","), page, size); const res = await getEntitiesList(activeResourceTabItem.value.id, page, size);
if (res) { if (res) {
entitiesList.value = res.content.map(item => ({ entitiesList.value = res.content.map(item => ({
...item, ...item,
...@@ -1781,6 +1780,7 @@ onMounted(async () => { ...@@ -1781,6 +1780,7 @@ onMounted(async () => {
// 获取出口管制制裁措施 // 获取出口管制制裁措施
await fetchSanctionList(); await fetchSanctionList();
} catch (err) { } catch (err) {
console.log("此处报错?");
console.log(err); console.log(err);
} }
handleGetHylyList(); handleGetHylyList();
......
...@@ -104,19 +104,8 @@ ...@@ -104,19 +104,8 @@
</div> </div>
</div> </div>
</template> </template>
<!-- <div class="echarts" ref="sanctionCountChartRef"></div> -->
<EChart :option="sanctionCountChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" /> <EChart :option="sanctionCountChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<!-- <div class="bottom">
<div class="ai">
<div class="left">
<img :src="ai" alt="" class="icon1" />
<div class="text">美国对中国的制裁近年来呈现显著增长趋势。</div>
</div>
<div class="right">
<img :src="right" alt="" class="icon2" />
</div>
</div>
</div> -->
<div class="data-origin-box"> <div class="data-origin-box">
<div class="data-origin-icon"> <div class="data-origin-icon">
<img :src="tipsIcon" alt="" /> <img :src="tipsIcon" alt="" />
...@@ -129,7 +118,7 @@ ...@@ -129,7 +118,7 @@
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div>
<div class="main-item"> <!-- <div class="main-item">
<AnalysisBox title="制裁实体各省分布情况"> <AnalysisBox title="制裁实体各省分布情况">
<template #header-btn> <template #header-btn>
<el-select v-model="regionTime" class="time-select" placeholder="请选择" @change="getRegionCountData"> <el-select v-model="regionTime" class="time-select" placeholder="请选择" @change="getRegionCountData">
...@@ -155,17 +144,6 @@ ...@@ -155,17 +144,6 @@
</div> </div>
</div> </div>
</div> </div>
<!-- <div class="bottom">
<div class="ai">
<div class="left">
<img :src="ai" alt="" class="icon1" />
<div class="text">我国被制裁实体多分布于沿海经济活跃省份。</div>
</div>
<div class="right">
<img :src="right" alt="" class="icon2" />
</div>
</div>
</div> -->
<div class="data-origin-box"> <div class="data-origin-box">
<div class="data-origin-icon"> <div class="data-origin-icon">
<img :src="tipsIcon" alt="" /> <img :src="tipsIcon" alt="" />
...@@ -177,7 +155,7 @@ ...@@ -177,7 +155,7 @@
<AiPane :aiContent="rankChart.interpretation" /> <AiPane :aiContent="rankChart.interpretation" />
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div> -->
<div class="main-item"> <div class="main-item">
<AnalysisBox title="制裁实体领域分布情况"> <AnalysisBox title="制裁实体领域分布情况">
<template #header-btn> <template #header-btn>
...@@ -185,19 +163,47 @@ ...@@ -185,19 +163,47 @@
<el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</template> </template>
<!-- <div class="echarts" ref="domainChartRef"></div> -->
<EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" /> <EChart :option="domainChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<!-- <div class="bottom">
<div class="ai"> <div class="data-origin-box">
<div class="left"> <div class="data-origin-icon">
<img :src="ai" alt="" class="icon1" /> <img :src="tipsIcon" alt="" />
<div class="text">美国对中国的制裁集中在半导体、人工智能等领域。</div>
</div> </div>
<div class="right"> <div class="data-origin-text">进入实体清单的中国实体领域分布情况,数据来源:美国商务部官网</div>
<img :src="right" alt="" class="icon2" /> </div>
<div class="ai-pane">
<AiButton />
<AiPane :aiContent="domainChart.interpretation" />
</div> </div>
</AnalysisBox>
</div> </div>
</div> --> <div class="main-item">
<AnalysisBox title="制裁实体领域数量变化情况">
<!-- <template #header-btn>
<el-select v-model="domainTime" class="time-select" placeholder="请选择" @change="getDomainCountData">
<el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template> -->
<template #header-btn>
<div class="toggle-btns">
<div
class="t-btn"
:class="{ active: activeDomainTab === 'year' }"
@click="handleDomainTabChange('year')"
>
按年度
</div>
<div
class="t-btn"
:class="{ active: activeDomainTab === 'sanction' }"
@click="handleDomainTabChange('sanction')"
>
按制裁
</div>
</div>
</template>
<EChart :option="domainNumChartOption" autoresize :style="{ height: '300px', padding: '0 20px' }" />
<div class="data-origin-box"> <div class="data-origin-box">
<div class="data-origin-icon"> <div class="data-origin-icon">
<img :src="tipsIcon" alt="" /> <img :src="tipsIcon" alt="" />
...@@ -206,7 +212,7 @@ ...@@ -206,7 +212,7 @@
</div> </div>
<div class="ai-pane"> <div class="ai-pane">
<AiButton /> <AiButton />
<AiPane :aiContent="domainChart.interpretation" /> <AiPane :aiContent="domainNumChart.interpretation" />
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div>
...@@ -259,6 +265,8 @@ import { ...@@ -259,6 +265,8 @@ import {
getTechDomainCount, getTechDomainCount,
getEntityTypeCount getEntityTypeCount
} from "@/api/exportControlV2.0"; } from "@/api/exportControlV2.0";
import { getDomainNum } from "@/api/finance";
import getMultiLineChart from "@/views/ZMOverView/components/fourSuppress/components/addDomain/multiLineChart";
import EChart from "@/components/Chart/index.vue"; import EChart from "@/components/Chart/index.vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import tipsIcon from "../../../assets/icons/info-icon.png"; import tipsIcon from "../../../assets/icons/info-icon.png";
...@@ -267,6 +275,7 @@ import AiPane from "@/components/base/Ai/AiPane/index.vue"; ...@@ -267,6 +275,7 @@ import AiPane from "@/components/base/Ai/AiPane/index.vue";
import { useChartInterpretation } from "@/views/exportControl/utils/common"; import { useChartInterpretation } from "@/views/exportControl/utils/common";
const sanctionCountChart = useChartInterpretation(); const sanctionCountChart = useChartInterpretation();
const domainChart = useChartInterpretation(); const domainChart = useChartInterpretation();
const domainNumChart = useChartInterpretation();
const typeChart = useChartInterpretation(); const typeChart = useChartInterpretation();
const rankChart = useChartInterpretation(); const rankChart = useChartInterpretation();
...@@ -285,14 +294,15 @@ const getTypeCountData = async () => { ...@@ -285,14 +294,15 @@ const getTypeCountData = async () => {
try { try {
const res = await getEntityTypeCount(param); const res = await getEntityTypeCount(param);
console.log("制裁实体类型分布情况", res.data);
if (res && res.code === 200) { if (res && res.code === 200) {
const data = res.data || []; const data = res.data || [];
typeData.value = data.map(item => ({ typeData.value = data.map(item => ({
name: item.name, name: item.name,
value: item.count || item.value value: item.count || item.value
})); }));
typeChart.interpret({ type: "饼图", name: "制裁实体类型分布情况", data: data });
updateTypeChart(); updateTypeChart();
typeChart.interpret({ type: "饼图", name: "制裁实体类型分布情况", data: data });
} }
} catch (error) { } catch (error) {
console.error("获取实体清单-数据统计-制裁实体类型分布情况失败:", error); console.error("获取实体清单-数据统计-制裁实体类型分布情况失败:", error);
...@@ -365,6 +375,35 @@ const getRegionCountData = async () => { ...@@ -365,6 +375,35 @@ const getRegionCountData = async () => {
} }
}; };
// 实体清单-数据统计- 制裁实体领域数量变化趋势
const domainNumChartOption = ref({});
const activeDomainTab = ref("year");
const handleDomainTabChange = tab => {
activeDomainTab.value = tab;
getDomainNumData();
};
const getDomainNumData = async () => {
// 参数
const param = {
IDsanTypeId: activeDomainTab.value === "year" ? "year" : "record",
type: sanTypeId.value
};
try {
const res = await getDomainNum(param);
if (res && res.code === 200) {
domainNumChartOption.value = getMultiLineChart({
data: res.data || [],
xAxis: res.xAxis || [],
yAxis: res.yAxis || [],
title: "制裁实体领域数量变化趋势",
xAxisName: "时间",
yAxisName: "数量"
});
}
} catch (error) {
console.error("获取实体清单-数据统计-制裁实体领域数量变化趋势失败:", error);
}
};
// 实体清单-数据统计-制裁实体数量变化情况 // 实体清单-数据统计-制裁实体数量变化情况
const sanctionCountChange = ref([]); const sanctionCountChange = ref([]);
// 获取实体清单-数据统计-制裁实体数量变化情况 // 获取实体清单-数据统计-制裁实体数量变化情况
...@@ -967,12 +1006,6 @@ const typeChartOption = ref({ ...@@ -967,12 +1006,6 @@ const typeChartOption = ref({
] ]
}); });
const updateTypeChart = () => { const updateTypeChart = () => {
// if (!typeChartRef.value) return;
// let chart = echarts.getInstanceByDom(typeChartRef.value);
// if (!chart) {
// chart = echarts.init(typeChartRef.value);
// }
let data = typeData.value.length let data = typeData.value.length
? [...typeData.value] ? [...typeData.value]
: [ : [
...@@ -989,7 +1022,7 @@ const updateTypeChart = () => { ...@@ -989,7 +1022,7 @@ const updateTypeChart = () => {
totalValue = data.reduce((sum, item) => sum + (item.value || 0), 0); totalValue = data.reduce((sum, item) => sum + (item.value || 0), 0);
} }
if (data.length > TOP_N) { // if (data.length > TOP_N) {
const topData = data.slice(0, TOP_N); const topData = data.slice(0, TOP_N);
const otherData = data.slice(TOP_N); const otherData = data.slice(TOP_N);
const otherValue = otherData.reduce((sum, item) => sum + (item.value || 0), 0); const otherValue = otherData.reduce((sum, item) => sum + (item.value || 0), 0);
...@@ -1002,7 +1035,7 @@ const updateTypeChart = () => { ...@@ -1002,7 +1035,7 @@ const updateTypeChart = () => {
// }); // });
// } // }
typeChartOption.value.series[0].data = topData; typeChartOption.value.series[0].data = topData;
} // }
// const option = { // const option = {
// tooltip: { // tooltip: {
...@@ -1117,15 +1150,12 @@ onMounted(() => { ...@@ -1117,15 +1150,12 @@ onMounted(() => {
getDomainCountData(); getDomainCountData();
// 获取实体清单-数据统计-制裁实体类型分布情况 // 获取实体清单-数据统计-制裁实体类型分布情况
getTypeCountData(); getTypeCountData();
// 获取实体清单-数据统计-制裁实体领域数量变化趋势
getDomainNumData();
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
* {
margin: 0;
padding: 0;
}
.data-statistics { .data-statistics {
width: 1601px; width: 1601px;
margin: 0 auto; margin: 0 auto;
......
...@@ -565,7 +565,7 @@ onMounted(async () => { ...@@ -565,7 +565,7 @@ onMounted(async () => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 16px;
display: none;
.tab-item { .tab-item {
cursor: pointer; cursor: pointer;
padding: 4px 20px; padding: 4px 20px;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
</div> </div>
</div> </div>
<industrial-impact v-if="activeIndex === 0"></industrial-impact> <industrial-impact v-if="activeIndex === 0"></industrial-impact>
<research-impact v-if="activeIndex === 1"></research-impact> <!-- <research-impact v-if="activeIndex === 1"></research-impact> -->
</div> </div>
</template> </template>
...@@ -23,7 +23,8 @@ import { ref } from "vue"; ...@@ -23,7 +23,8 @@ import { ref } from "vue";
import industrialImpact from "./components/industrialImpact/index.vue"; import industrialImpact from "./components/industrialImpact/index.vue";
import researchImpact from "./components/researchImpact/index.vue"; import researchImpact from "./components/researchImpact/index.vue";
const activeTab = ref(["对华产业影响", "对华科研影响"]); // const activeTab = ref(["对华产业影响", "对华科研影响"]);
const activeTab = ref(["对华产业影响"]);
const activeIndex = ref(0); const activeIndex = ref(0);
</script> </script>
...@@ -44,6 +45,7 @@ const activeIndex = ref(0); ...@@ -44,6 +45,7 @@ const activeIndex = ref(0);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 16px;
display: none;
.tab-item { .tab-item {
cursor: pointer; cursor: pointer;
padding: 4px 20px; padding: 4px 20px;
......
...@@ -16,18 +16,18 @@ ...@@ -16,18 +16,18 @@
<div class="label">发布时间:</div> <div class="label">发布时间:</div>
<div class="value">{{ formattedData.postDate }}</div> <div class="value">{{ formattedData.postDate }}</div>
</div> </div>
<div class="info-row"> <!-- <div class="info-row">
<div class="label">生效时间:</div> <div class="label">生效时间:</div>
<div class="value">{{ formattedData.effectiveDate }}</div> <div class="value">{{ formattedData.effectiveDate }}</div>
</div> </div> -->
<div class="info-row"> <div class="info-row">
<div class="label">发布文件:</div> <div class="label">发布文件:</div>
<div class="value">{{ formattedData.fileCode }}</div> <div class="value">{{ formattedData.fileCode }}</div>
</div> </div>
<div class="info-row"> <!-- <div class="info-row">
<div class="label">案卷号:</div> <div class="label">案卷号:</div>
<div class="value">{{ formattedData.administrativeOrderId }}</div> <div class="value">{{ formattedData.administrativeOrderId }}</div>
</div> </div> -->
<div class="info-row"> <div class="info-row">
<div class="label">发布人:</div> <div class="label">发布人:</div>
<div class="value link"> <div class="value link">
...@@ -42,6 +42,15 @@ ...@@ -42,6 +42,15 @@
</div> </div>
</div> </div>
</div> </div>
<div class="left-top-content">
<div class="content-title">新闻链接:</div>
<div class="distribution-list">
<div class="list-item news-item" v-for="item in newsList" :key="item.newsId">
<div class="item-title">{{ item.newsTitle }}</div>
<img :src="openIcon" class="flag" />
</div>
</div>
</div>
<div class="left-top-content"> <div class="left-top-content">
<div class="content-title">制裁实体分布:</div> <div class="content-title">制裁实体分布:</div>
<div class="distribution-list"> <div class="distribution-list">
...@@ -158,7 +167,7 @@ ...@@ -158,7 +167,7 @@
<el-table-column label="实体名称" min-width="280"> <el-table-column label="实体名称" min-width="280">
<template #default="scope"> <template #default="scope">
<div class="name-cell"> <div class="name-cell">
<div class="dot"></div> <!-- <div class="dot"></div> -->
<img :src="defaultTitle" class="company-icon" /> <img :src="defaultTitle" class="company-icon" />
<span class="company-name" @click="handleCompClick(scope.row)">{{ <span class="company-name" @click="handleCompClick(scope.row)">{{
scope.row.name scope.row.name
...@@ -187,7 +196,22 @@ ...@@ -187,7 +196,22 @@
</el-table-column> </el-table-column>
<el-table-column prop="location" label="上市地点" width="90" align="center" /> <el-table-column prop="location" label="上市地点" width="90" align="center" />
<el-table-column prop="date" label="制裁时间" width="150" align="center" /> <el-table-column prop="date" label="制裁时间" width="150" align="center" />
<el-table-column prop="revenue" label="营收(亿元)" width="110" align="center" /> <el-table-column prop="entityTypeId" label="类型" width="120" align="center">
<template #default="scope">
<div style="display: flex; gap: 4px; justify-content: center">
<AreaTag
:tagName="
scope.row.entityType === 1
? '个人'
: scope.row.entityType === 2
? '实体'
: '公司'
"
/>
</div>
</template>
</el-table-column>
<!-- <el-table-column prop="revenue" label="营收(亿元)" width="110" align="center" /> -->
<el-table-column label="50%规则子企业" width="180" align="center"> <el-table-column label="50%规则子企业" width="180" align="center">
<template #default="scope"> <template #default="scope">
<span <span
...@@ -209,6 +233,8 @@ ...@@ -209,6 +233,8 @@
</div> </div>
</div> </div>
</AnalysisBox> </AnalysisBox>
<div :style="{ height: '20px' }"></div>
<AnalysisBox title="制裁原因及相关历史制裁" :showAllBtn="false"></AnalysisBox>
</div> </div>
</div> </div>
<!-- 50%规则子企业弹框 --> <!-- 50%规则子企业弹框 -->
...@@ -231,11 +257,13 @@ import { debounce } from "lodash"; ...@@ -231,11 +257,13 @@ import { debounce } from "lodash";
import title from "../../assets/title.png"; import title from "../../assets/title.png";
import defaultTitle from "../../assets/default-icon1.png"; import defaultTitle from "../../assets/default-icon1.png";
import flag from "../../assets/default-icon2.png"; import flag from "../../assets/default-icon2.png";
import openIcon from "../../../assets/icons/icon-open.png";
import { import {
getSingleSanctionEntityCountry, getSingleSanctionEntityCountry,
getSingleSanctionBackground, getSingleSanctionBackground,
getSingleSanctionOverviewList getSingleSanctionOverviewList
} from "@/api/exportControlV2.0"; } from "@/api/exportControlV2.0";
import { getRelateNews } from "@/api/finance";
import RuleSubsidiaryDialog from "../../../v2.0EntityList/components/sanctionsOverview/components/listPage/RuleSubsidiaryDialog.vue"; import RuleSubsidiaryDialog from "../../../v2.0EntityList/components/sanctionsOverview/components/listPage/RuleSubsidiaryDialog.vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
...@@ -420,6 +448,19 @@ const getEntityCountry = async () => { ...@@ -420,6 +448,19 @@ const getEntityCountry = async () => {
} }
}; };
const newsList = ref([]);
// 调用新闻链接接口
const getNewsList = async () => {
try {
const res = await getRelateNews(sanRecordId.value);
console.log("res --:", res);
newsList.value = res;
} catch (error) {
console.log(error);
}
};
const props = defineProps({ const props = defineProps({
data: { data: {
type: Object, type: Object,
...@@ -562,6 +603,8 @@ onMounted(() => { ...@@ -562,6 +603,8 @@ onMounted(() => {
getUrlParams(); getUrlParams();
// 单次制裁-制裁概况-制裁实体国家分布 // 单次制裁-制裁概况-制裁实体国家分布
getEntityCountry(); getEntityCountry();
// 新闻链接
getNewsList();
// 单次制裁-制裁概况-制裁背景 // 单次制裁-制裁概况-制裁背景
getSanctionBackground(); getSanctionBackground();
// 单次制裁-制裁概况-制裁清单 // 单次制裁-制裁概况-制裁清单
...@@ -751,6 +794,35 @@ onMounted(() => { ...@@ -751,6 +794,35 @@ onMounted(() => {
} }
} }
} }
.news-item {
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 20px;
width: 460px;
background-color: rgb(246, 250, 255);
padding: 5px 15px;
font-size: 14px;
height: 36px;
cursor: pointer;
.item-title {
font-size: 14px;
font-weight: 400;
color: rgba(5, 95, 194, 1);
font-family: Source Han Sans CN;
line-height: 24px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 90%;
}
.flag {
width: 16px;
height: 16px;
margin-right: 0px;
}
}
} }
} }
} }
...@@ -1015,10 +1087,10 @@ onMounted(() => { ...@@ -1015,10 +1087,10 @@ onMounted(() => {
:deep(.el-table__header-wrapper) { :deep(.el-table__header-wrapper) {
th { th {
background-color: var(--color-primary-100) !important; // background-color: var(--color-primary-100) !important;
height: 48px; height: 48px;
padding: 0; padding: 0;
color: #fff; color: rgb(34, 41, 52);
font-weight: 700; font-weight: 700;
font-size: 16px; font-size: 16px;
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
...@@ -1079,7 +1151,7 @@ onMounted(() => { ...@@ -1079,7 +1151,7 @@ onMounted(() => {
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 24px; line-height: 24px;
font-family: "Microsoft YaHei"; font-family: "Source Han Sans CN";
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
cursor: pointer; cursor: pointer;
} }
......
...@@ -273,15 +273,12 @@ onMounted(() => { ...@@ -273,15 +273,12 @@ onMounted(() => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
* {
margin: 0;
padding: 0;
}
.entity-list { .entity-list {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
padding-bottom: 50px; padding-bottom: 10px;
background: #f7f8f9;
.header { .header {
width: 100%; width: 100%;
height: 148px; height: 148px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论