Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
ad82f0ce
提交
ad82f0ce
authored
3月 12, 2026
作者:
刘宇琪
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
刘宇琪 科技人物观点 概览页
上级
e370ef79
全部展开
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
138 行增加
和
13 行删除
+138
-13
PersonTable.vue
src/views/technologyFigures/component/PersonTable.vue
+5
-3
SourceLibrary.vue
src/views/technologyFigures/component/SourceLibrary.vue
+5
-3
TimelineMap.vue
src/views/technologyFigures/component/TimelineMap.vue
+0
-0
speechStance.vue
src/views/technologyFigures/component/speechStance.vue
+58
-7
index.vue
src/views/technologyFigures/index.vue
+0
-0
useCharacterNav.js
src/views/technologyFigures/utils/useCharacterNav.js
+70
-0
没有找到文件。
src/views/technologyFigures/component/PersonTable.vue
浏览文件 @
ad82f0ce
...
...
@@ -20,7 +20,7 @@
</div>
</div>
</div>
<div
class=
"person-info"
>
<div
class=
"person-info"
@
click=
"handleClickToCharacter(item.personId)"
>
<div
class=
"person-name"
>
{{
item
.
name
}}
</div>
<div
class=
"person-position"
>
{{
item
.
position
}}
</div>
</div>
...
...
@@ -49,7 +49,8 @@
import
{
ref
,
onMounted
,
defineProps
,
watch
}
from
"vue"
;
import
personData
from
"../json/personData.json"
;
// 引入JSON数据
import
{
getMainCharactersView
}
from
"@/api/technologyFigures/technologyFigures"
;
import
{
useCharacterNav
}
from
"../utils/useCharacterNav"
;
const
{
handleClickToCharacter
}
=
useCharacterNav
();
const
props
=
defineProps
({
persontypeid
:
{
type
:
String
,
...
...
@@ -86,7 +87,8 @@ const handlegetMainCharactersViewFn = async () => {
position
:
item
.
positionTitle
,
tags
:
[
"1"
,
"2"
],
chinaRelatedCount
:
item
.
remarksCount
,
mediaQuoteCount
:
item
.
remarksCount
mediaQuoteCount
:
item
.
remarksCount
,
personId
:
item
.
personId
}
});
...
...
src/views/technologyFigures/component/SourceLibrary.vue
浏览文件 @
ad82f0ce
...
...
@@ -77,7 +77,7 @@ watch(
const
router
=
useRouter
();
const
total
=
ref
(
0
);
const
pageSize
=
ref
(
16
);
const
pageSize
=
ref
(
20
);
const
loading
=
ref
(
false
);
const
abortController
=
ref
(
null
);
const
currentPage
=
ref
(
1
);
...
...
@@ -145,9 +145,10 @@ const handleClcikToCharacter = async id => {
const
params
=
{
personId
:
id
}
;
try
{
const
res
=
await
getPersonSummaryInfo
(
params
);
console
.
log
(
"人物全局信息"
,
res
);
console
.
log
(
"人物全局信息
2
"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
arr
=
personTypeList
.
filter
(
item
=>
{
return
item
.
typeId
===
res
.
data
.
personType
;
...
...
@@ -158,7 +159,7 @@ const handleClcikToCharacter = async id => {
personTypeName
=
arr
[
0
].
typeName
;
console
.
log
(
"personTypeName"
,
personTypeName
);
if
(
personTypeName
===
"科技企业领袖"
)
{
if
(
personTypeName
===
"科技企业领袖"
||
personTypeName
===
'政府官员'
)
{
type
=
1
;
}
else
if
(
personTypeName
===
"国会议员"
)
{
type
=
2
;
...
...
@@ -208,6 +209,7 @@ const handlePageChange = p => {
width
:
1600
px
;
display
:
grid
;
grid
-
template
-
columns
:
repeat
(
4
,
1
fr
);
grid
-
template
-
rows
:
repeat
(
5
,
1
fr
);
gap
:
16
px
16
px
;
}
...
...
src/views/technologyFigures/component/TimelineMap.vue
浏览文件 @
ad82f0ce
差异被折叠。
点击展开。
src/views/technologyFigures/component/speechStance.vue
浏览文件 @
ad82f0ce
...
...
@@ -3,16 +3,16 @@
<div
class=
"speech-stance-container"
>
<div
class=
"speech-stance-grid"
>
<div
v-for=
"(item, index) in PersonRelation"
:key=
"index"
class=
"speech-stance-card"
>
<div
class=
"speech-stance-avatar-wrapper"
>
<div
class=
"speech-stance-avatar-wrapper"
@
click=
"handleClcikToCharacter(item.personId)"
>
<img
:src=
"item.personImage"
alt=
""
class=
"speech-stance-avatar"
/>
</div>
<div
class=
"speech-stance-text-content"
>
<div
class=
"speech-stance-text-content"
@
click=
"handleClcikToCharacter(item.personId)"
>
<div
style=
"display: flex; width: 683px;"
>
<h3
class=
"speech-stance-name"
>
{{
item
.
personName
}}
</h3>
<p
class=
"speech-stance-title"
>
{{
item
.
positionTitle
}}
</p>
</div>
<p
class=
"speech-stance-content"
>
{{
item
.
remarks
}}
</p>
<p
class=
"speech-stance-content"
:title=
"item.remarks"
>
{{
item
.
remarks
}}
</p>
</div>
</div>
...
...
@@ -26,6 +26,9 @@ import { onMounted, ref,defineProps,watch } from "vue";
import
speechStance
from
'../json/speechStance.json'
;
import
{
getPersonRelation
}
from
"@/api/technologyFigures/technologyFigures"
import
{
getPersonSummaryInfo
}
from
"@/api/technologyFigures/technologyFigures"
;
import
{
useRouter
}
from
"vue-router"
;
const
router
=
useRouter
();
const
props
=
defineProps
({
fieldSelected
:
{
type
:
String
,
...
...
@@ -36,7 +39,59 @@ const props = defineProps({
default
:
0
}
});
// 跳转人物主页
const
handleClcikToCharacter
=
async
id
=>
{
const
personTypeList
=
JSON
.
parse
(
window
.
sessionStorage
.
getItem
(
"personTypeList"
));
let
type
=
0
;
let
personTypeName
=
""
;
const
params
=
{
personId
:
id
};
try
{
const
res
=
await
getPersonSummaryInfo
(
params
);
console
.
log
(
"人物全局信息"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
const
arr
=
personTypeList
.
filter
(
item
=>
{
return
item
.
typeId
===
res
.
data
.
personType
;
});
console
.
log
(
"arr"
,
arr
);
if
(
arr
&&
arr
.
length
>
0
)
{
personTypeName
=
arr
[
0
].
typeName
;
console
.
log
(
"personTypeName"
,
personTypeName
);
if
(
personTypeName
===
"科技企业领袖"
)
{
type
=
1
;
}
else
if
(
personTypeName
===
"国会议员"
)
{
type
=
2
;
}
else
if
(
personTypeName
===
"智库研究人员"
)
{
type
=
3
;
}
else
{
personTypeName
=
""
;
ElMessage
.
warning
(
"找不到当前人员的类型值!"
);
return
;
}
const
route
=
router
.
resolve
({
path
:
"/characterPage"
,
query
:
{
type
:
type
,
// type=1为科技企业领袖,2为国会议员,3为智库研究人员
personId
:
id
}
});
window
.
open
(
route
.
href
,
"_blank"
);
}
else
{
personTypeName
=
""
;
ElMessage
.
warning
(
"找不到当前人员的类型值!"
);
return
;
}
}
else
{
ElMessage
.
warning
(
"找不到当前人员的类型值!"
);
return
;
}
}
catch
(
error
)
{}
};
const
aId
=
ref
();
const
params
=
ref
({});
...
...
@@ -150,10 +205,7 @@ onMounted(async () => {
letter-spacing
:
0px
;
text-align
:
left
;
white-space
:
nowrap
;
/* 禁止换行 */
overflow
:
hidden
;
/* 隐藏溢出内容 */
text-overflow
:
ellipsis
;
/* 溢出部分显示省略号 */
}
</
style
>
\ No newline at end of file
src/views/technologyFigures/index.vue
浏览文件 @
ad82f0ce
差异被折叠。
点击展开。
src/views/technologyFigures/utils/useCharacterNav.js
0 → 100644
浏览文件 @
ad82f0ce
/**
* useCharacterNav - 人物跳转复用方法(Vue 3 Composable)
*
* 使用方式:
* import { useCharacterNav } from "@/hooks/useCharacterNav";
* const { handleClickToCharacter } = useCharacterNav();
* handleClickToCharacter(personId);
*/
import
{
useRouter
}
from
"vue-router"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
getPersonSummaryInfo
}
from
"@/api/technologyFigures/technologyFigures"
;
// 人物类型名称 -> type 映射
const
PERSON_TYPE_MAP
=
{
"科技企业领袖"
:
1
,
"国会议员"
:
2
,
"智库研究人员"
:
3
,
};
export
function
useCharacterNav
()
{
const
router
=
useRouter
();
/**
* 根据人物 ID 查询类型并跳转到人物详情页
* @param {string|number} id - 人物 ID
*/
const
handleClickToCharacter
=
async
(
id
)
=>
{
const
personTypeList
=
JSON
.
parse
(
window
.
sessionStorage
.
getItem
(
"personTypeList"
)
||
"[]"
);
const
params
=
{
personId
:
id
};
console
.
log
(
'dsdsdwdwf'
,
id
)
try
{
const
res
=
await
getPersonSummaryInfo
(
params
);
if
(
res
.
code
!==
200
||
!
res
.
data
)
{
ElMessage
.
warning
(
"找不到当前人员的类型值!"
);
return
;
}
const
matched
=
personTypeList
.
find
(
(
item
)
=>
item
.
typeId
===
res
.
data
.
personType
);
if
(
!
matched
)
{
ElMessage
.
warning
(
"找不到当前人员的类型值!"
);
return
;
}
const
personTypeName
=
matched
.
typeName
;
const
type
=
PERSON_TYPE_MAP
[
personTypeName
];
if
(
!
type
)
{
ElMessage
.
warning
(
"找不到当前人员的类型值!"
);
return
;
}
const
route
=
router
.
resolve
({
path
:
"/characterPage"
,
query
:
{
type
,
personId
:
id
},
});
window
.
open
(
route
.
href
,
"_blank"
);
}
catch
(
error
)
{
console
.
error
(
"查询人物信息失败:"
,
error
);
}
};
return
{
handleClickToCharacter
};
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论