Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
1
合并请求
1
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
f921faf1
提交
f921faf1
authored
4月 08, 2026
作者:
张伊明
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'liuyuqi' 到 'pre'
Liuyuqi 查看合并请求
!313
上级
83444d70
0a485467
流水线
#353
已通过 于阶段
in 2 分 21 秒
变更
29
流水线
1
隐藏空白字符变更
内嵌
并排
正在显示
29 个修改的文件
包含
1765 行增加
和
953 行删除
+1765
-953
billHome.js
src/api/bill/billHome.js
+12
-30
characterPage.js
src/api/characterPage/characterPage.js
+14
-0
bill.js
src/router/modules/bill.js
+11
-12
ruleRestrictions.js
src/router/modules/ruleRestrictions.js
+10
-1
ActionButtons.vue
...l/influence/ProgressForecast/components/ActionButtons.vue
+20
-7
FilterSection.vue
...l/influence/ProgressForecast/components/FilterSection.vue
+40
-14
PageHeader.vue
...bill/influence/ProgressForecast/components/PageHeader.vue
+7
-1
Step1FilterCondition.vue
...ence/ProgressForecast/components/Step1FilterCondition.vue
+7
-0
Step2FilterBills.vue
...nfluence/ProgressForecast/components/Step2FilterBills.vue
+20
-10
Step3PredictionAnalysis.vue
...e/ProgressForecast/components/Step3PredictionAnalysis.vue
+2
-0
index.vue
src/views/bill/influence/ProgressForecast/index.vue
+77
-205
BillCard.vue
...ess/components/historicalProposal/components/BillCard.vue
+7
-0
BillList.vue
...ess/components/historicalProposal/components/BillList.vue
+45
-12
DocumentPreview.vue
...ponents/historicalProposal/components/DocumentPreview.vue
+9
-1
index.vue
...views/characterPage/components/memberOfCongress/index.vue
+361
-311
index.vue
src/views/characterPage/components/techLeader/index.vue
+358
-220
NewsPagination.vue
...mponents/historicalProposal/components/NewsPagination.vue
+1
-1
NewsTopBar.vue
...n/components/historicalProposal/components/NewsTopBar.vue
+5
-3
NewsTracker.vue
.../components/historicalProposal/components/NewsTracker.vue
+70
-13
index.vue
src/views/characterPage/components/thinkTankPerson/index.vue
+39
-3
index.vue
src/views/characterPage/index.vue
+1
-0
index.vue
src/views/ruleRestriction/alliance/index.vue
+403
-0
newsDetail.js
src/views/ruleRestriction/alliance/mock/newsDetail.js
+81
-0
index.vue
src/views/ruleRestriction/components/resLib/index.vue
+119
-79
PersonTable.vue
src/views/technologyFigures/component/PersonTable.vue
+1
-1
SourceLibrary.vue
src/views/technologyFigures/component/SourceLibrary.vue
+39
-24
index.vue
src/views/technologyFigures/index.vue
+2
-2
multiLineChart.js
src/views/technologyFigures/utils/multiLineChart.js
+3
-1
HomeMainFooterSurvey.vue
src/views/thinkTank/components/HomeMainFooterSurvey.vue
+1
-2
没有找到文件。
src/api/bill/billHome.js
浏览文件 @
f921faf1
...
@@ -259,26 +259,7 @@ export async function getHistoryBillListWithStage(personId, params = {}) {
...
@@ -259,26 +259,7 @@ export async function getHistoryBillListWithStage(personId, params = {}) {
}
}
}
}
// /**
// * 获取潜在提案举措分析
// * GET /api/personHomepage/historyBill/clause/{personId}
// * @param {string} personId - 人物ID
// * @param {Object} params - 查询参数
// */
// export async function getPotentialClauseAnalysis(personId, params = {}) {
// const queryString = Object.entries(params)
// .filter(([, value]) => value !== undefined && value !== null && value !== '')
// .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
// .join('&')
// const url = queryString
// ? `/api/personHomepage/historyBill/clause/${personId}?${queryString}`
// : `/api/personHomepage/historyBill/clause/${personId}`
// return request(url, {
// method: 'GET',
// })
// }
/**
/**
* 获取排序选项
* 获取排序选项
...
@@ -331,31 +312,32 @@ export function getProgressPrediction(billId) {
...
@@ -331,31 +312,32 @@ export function getProgressPrediction(billId) {
})
})
}
}
/**
/**
* 获取相似法案列表
* 获取相似法案列表
* @param {Object} params - 查询参数
* @param {Object} params - 查询参数
* @param {string} params.billIds - 当前法案的ID
* @param {string} params.billIds - 当前法案的ID
* @param {string[]} params.domains - 领域名称列表
* @param {string} params.domains - 领域名称,多个用逗号拼接
* @param {string} params.patternType - 政府结构类型,如 "统一政府"/"分裂政府"/"微弱多数"
* @param {string} params.patternType - 政府结构类型
* @param {string} params.proposalType - 提案类型,如 "两党共同提案"/"单政党提案(共和党提案)"/"单政党提案(民主党提案)"
* @param {string} params.proposalType - 提案类型
* @param {string} params.timeFrame - 时间范围(单个字符串)
* @param {number} params.maxNum - 返回最大数量
* @returns {Promise<Object>} 相似法案列表
* @returns {Promise<Object>} 相似法案列表
*/
*/
export
function
getSimiBills
(
params
=
{})
{
export
function
getSimiBills
(
params
=
{})
{
// domains 如果是数组则用逗号拼接
const
domains
=
Array
.
isArray
(
params
.
domains
)
?
params
.
domains
.
join
(
','
)
:
params
.
domains
return
request
(
'/api/BillProgressPrediction/simiBills'
,
{
return
request
(
'/api/BillProgressPrediction/simiBills'
,
{
method
:
'GET'
,
method
:
'GET'
,
params
:
{
params
:
{
billIds
:
params
.
billIds
,
billIds
:
params
.
billIds
,
domains
:
domains
,
domains
:
params
.
domains
,
patternType
:
params
.
patternType
,
patternType
:
params
.
patternType
,
proposalType
:
params
.
proposalType
proposalType
:
params
.
proposalType
,
timeFrame
:
params
.
timeFrame
,
maxNum
:
params
.
maxNum
||
50
}
}
})
})
}
}
/**
/**
* 格式化日期 YYYY-MM-DD -> YYYY年M月D日
* 格式化日期 YYYY-MM-DD -> YYYY年M月D日
* @param {string} dateStr - 日期字符串
* @param {string} dateStr - 日期字符串
...
...
src/api/characterPage/characterPage.js
浏览文件 @
f921faf1
...
@@ -201,3 +201,16 @@ export async function getSubjectList(params) {
...
@@ -201,3 +201,16 @@ export async function getSubjectList(params) {
params
params
})
})
}
}
/**
* 获取调研项目列表
* @param {string} personId
* @param {Object} params
*/
export
function
getInvestigationProject
(
personId
,
params
)
{
return
request
({
method
:
'GET'
,
url
:
`/api/personHomepage/investigationProject/
${
personId
}
`
,
params
,
})
}
\ No newline at end of file
src/router/modules/bill.js
浏览文件 @
f921faf1
...
@@ -123,19 +123,9 @@ const billRoutes = [
...
@@ -123,19 +123,9 @@ const billRoutes = [
component
:
BillInfluenceScientificResearch
,
component
:
BillInfluenceScientificResearch
,
// meta: { title: "对华科研影响" }
// meta: { title: "对华科研影响" }
},
},
// {
// path: "ProgressForecast",
// name: "BillProgressForecast",
// component: BillProgressForecast,
// // meta: { title: "对华科研影响" }
// }
]
]
},
{
},
path
:
"ProgressForecast/:id"
,
name
:
"BillProgressForecast"
,
component
:
BillProgressForecast
,
// meta: { title: "对华科研影响" }
},
{
{
path
:
"relevantCircumstance"
,
path
:
"relevantCircumstance"
,
...
@@ -155,6 +145,14 @@ const billRoutes = [
...
@@ -155,6 +145,14 @@ const billRoutes = [
}
}
]
]
},
},
{
path
:
"ProgressForecast/:id"
,
name
:
"BillProgressForecast"
,
component
:
BillProgressForecast
,
meta
:
{
title
:
"法案预测"
}
},
]
]
export
default
billRoutes
export
default
billRoutes
\ No newline at end of file
src/router/modules/ruleRestrictions.js
浏览文件 @
f921faf1
// 规则限制
// 规则限制
const
RuleRestriction
=
()
=>
import
(
'@/views/ruleRestriction/index.vue'
)
const
RuleRestriction
=
()
=>
import
(
'@/views/ruleRestriction/index.vue'
)
const
RuleRestrictionDetail
=
()
=>
import
(
'@/views/ruleRestriction/detail/index.vue'
)
const
RuleRestrictionDetail
=
()
=>
import
(
'@/views/ruleRestriction/detail/index.vue'
)
const
RuleRestrictionsAlliance
=
()
=>
import
(
'@/views/ruleRestriction/alliance/index.vue'
)
const
ruleRestrictionsRoutes
=
[
const
ruleRestrictionsRoutes
=
[
// 规则限制
// 规则限制
{
{
...
@@ -22,6 +23,14 @@ const ruleRestrictionsRoutes = [
...
@@ -22,6 +23,14 @@ const ruleRestrictionsRoutes = [
title
:
"规则限制详情"
,
title
:
"规则限制详情"
,
dynamicTitle
:
true
dynamicTitle
:
true
}
}
},
{
path
:
"/ruleRestrictions/alliance"
,
name
:
"RuleRestrictionsAlliance"
,
component
:
RuleRestrictionsAlliance
,
meta
:
{
title
:
"规则限制联盟详情"
,
dynamicTitle
:
true
}
},
},
]
]
...
...
src/views/bill/influence/ProgressForecast/components/ActionButtons.vue
浏览文件 @
f921faf1
<
template
>
<
template
>
<div
class=
"action-buttons"
>
<div
class=
"action-buttons"
>
<button
class=
"btn-secondary"
@
click=
"emit('reset')"
>
<div
class=
"action-left"
>
<svg
class=
"icon"
viewBox=
"0 0 24 24"
fill=
"none"
stroke=
"currentColor"
stroke-width=
"2"
>
<button
class=
"btn-secondary"
@
click=
"emit('reset')"
>
<path
d=
"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"
/>
<svg
class=
"icon"
viewBox=
"0 0 24 24"
fill=
"none"
stroke=
"currentColor"
stroke-width=
"2"
>
<path
d=
"M3 3v5h5"
/>
<path
d=
"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"
/>
</svg>
<path
d=
"M3 3v5h5"
/>
<span>
重置筛选条件
</span>
</svg>
</button>
<span>
重置筛选条件
</span>
</button>
<button
v-if=
"showSetAsCurrent"
class=
"btn-secondary"
@
click=
"emit('setAsCurrent')"
>
<span>
设置为当前提案
</span>
</button>
</div>
<div
class=
"action-right"
>
<div
class=
"action-right"
>
<button
<button
v-if=
"showPrevious"
v-if=
"showPrevious"
...
@@ -36,12 +41,14 @@ defineProps<{
...
@@ -36,12 +41,14 @@ defineProps<{
previousText
?:
string
previousText
?:
string
nextText
?:
string
nextText
?:
string
nextDisabled
?:
boolean
nextDisabled
?:
boolean
showSetAsCurrent
?:
boolean
}
>
()
}
>
()
const
emit
=
defineEmits
<
{
const
emit
=
defineEmits
<
{
reset
:
[]
reset
:
[]
previous
:
[]
previous
:
[]
next
:
[]
next
:
[]
setAsCurrent
:
[]
}
>
()
}
>
()
</
script
>
</
script
>
...
@@ -53,6 +60,12 @@ const emit = defineEmits<{
...
@@ -53,6 +60,12 @@ const emit = defineEmits<{
padding-top
:
24px
;
padding-top
:
24px
;
}
}
.action-left
{
display
:
flex
;
align-items
:
center
;
gap
:
12px
;
}
.action-right
{
.action-right
{
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
...
...
src/views/bill/influence/ProgressForecast/components/FilterSection.vue
浏览文件 @
f921faf1
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
<img
src=
"../assets/fitller.svg"
/>
<img
src=
"../assets/fitller.svg"
/>
<h2
class=
"section-title text-title-3-bold"
>
核心相似度维度筛选
</h2>
<h2
class=
"section-title text-title-3-bold"
>
核心相似度维度筛选
</h2>
</div>
</div>
<button
class=
"btn-outline"
@
click=
"setAsCurrent"
>
设置为当前提案
</button>
</div>
</div>
<div
class=
"divider"
/>
<div
class=
"divider"
/>
<div
class=
"fields-grid"
>
<div
class=
"fields-grid"
>
...
@@ -62,6 +62,7 @@
...
@@ -62,6 +62,7 @@
<div
class=
"field-content"
>
<div
class=
"field-content"
>
<el-select
<el-select
v-model=
"localValues.oppositionProposer"
v-model=
"localValues.oppositionProposer"
multiple
placeholder=
"请选择"
placeholder=
"请选择"
style=
"width: 420px"
style=
"width: 420px"
@
change=
"handleChange"
@
change=
"handleChange"
...
@@ -109,21 +110,21 @@ const props = defineProps<{
...
@@ -109,21 +110,21 @@ const props = defineProps<{
defaultFilters
?:
Record
<
string
,
string
[]
>
defaultFilters
?:
Record
<
string
,
string
[]
>
}
>
()
}
>
()
// 本地 v-model 值
// 本地 v-model 值
(proposalTime 为单选,用 string)
const
localValues
=
ref
({
const
localValues
=
ref
({
policyArea
:
[]
as
string
[],
policyArea
:
[]
as
string
[],
governmentType
:
[]
as
string
[],
governmentType
:
[]
as
string
[],
oppositionProposer
:
''
as
string
,
oppositionProposer
:
[]
as
string
[]
,
proposalTime
:
''
as
string
,
proposalTime
:
''
as
string
,
})
})
// 根据 proposalInfo 计算初始筛选值(即"设置为当前提案"的目标状态)
// 根据 proposalInfo 计算初始筛选值(即"设置为当前提案"的目标状态)
function
buildInitialValues
(
info
?:
ProposalInfo
|
null
)
:
Record
<
string
,
string
[]
|
string
>
{
function
buildInitialValues
(
info
?:
ProposalInfo
|
null
)
{
if
(
!
info
)
return
{
policyArea
:
[],
governmentType
:
[],
oppositionProposer
:
''
,
proposalTime
:
''
}
if
(
!
info
)
return
{
policyArea
:
[],
governmentType
:
[],
oppositionProposer
:
[]
,
proposalTime
:
''
}
return
{
return
{
policyArea
:
info
.
defaultDomains
?.
length
?
[...
info
.
defaultDomains
]
:
[...(
info
.
areas
||
[])],
policyArea
:
info
.
defaultDomains
?.
length
?
[...
info
.
defaultDomains
]
:
[...(
info
.
areas
||
[])],
governmentType
:
info
.
patternType
?
[
info
.
patternType
]
:
[],
governmentType
:
info
.
patternType
?
[
info
.
patternType
]
:
[],
oppositionProposer
:
''
,
oppositionProposer
:
[]
,
proposalTime
:
''
,
proposalTime
:
''
,
}
}
}
}
...
@@ -142,7 +143,7 @@ function reset() {
...
@@ -142,7 +143,7 @@ function reset() {
localValues
.
value
=
{
localValues
.
value
=
{
policyArea
:
[],
policyArea
:
[],
governmentType
:
[],
governmentType
:
[],
oppositionProposer
:
''
,
oppositionProposer
:
[]
,
proposalTime
:
''
,
proposalTime
:
''
,
}
}
}
}
...
@@ -152,14 +153,39 @@ function setAsCurrent() {
...
@@ -152,14 +153,39 @@ function setAsCurrent() {
Object
.
assign
(
localValues
.
value
,
buildInitialValues
(
props
.
proposalInfo
))
Object
.
assign
(
localValues
.
value
,
buildInitialValues
(
props
.
proposalInfo
))
}
}
defineExpose
({
reset
,
setAsCurrent
,
getValues
:
()
=>
localValues
.
value
})
defineExpose
({
reset
,
setAsCurrent
,
getValues
:
()
=>
({
...
localValues
.
value
,
// proposalTime 单选,包装为数组保持传值一致
proposalTime
:
localValues
.
value
.
proposalTime
?
[
localValues
.
value
.
proposalTime
]
:
[]
})
})
// 固定的政策领域选项(15个)
const
policyAreaOptions
=
[
{
value
:
'人工智能'
,
label
:
'人工智能'
},
{
value
:
'生物科技'
,
label
:
'生物科技'
},
{
value
:
'新一代通信网络'
,
label
:
'新一代通信网络'
},
{
value
:
'量子科技'
,
label
:
'量子科技'
},
{
value
:
'新能源'
,
label
:
'新能源'
},
{
value
:
'集成电路'
,
label
:
'集成电路'
},
{
value
:
'海洋'
,
label
:
'海洋'
},
{
value
:
'先进制造'
,
label
:
'先进制造'
},
{
value
:
'新材料'
,
label
:
'新材料'
},
{
value
:
'航空航天'
,
label
:
'航空航天'
},
{
value
:
'太空'
,
label
:
'太空'
},
{
value
:
'深海'
,
label
:
'深海'
},
{
value
:
'极地'
,
label
:
'极地'
},
{
value
:
'核'
,
label
:
'核'
},
{
value
:
'其他'
,
label
:
'其他'
}
]
// 固定的字段配置
,options 由 proposalInfo 动态注入
// 固定的字段配置
const
fields
=
computed
(()
=>
{
const
fields
=
computed
(()
=>
{
const
billDomain
=
props
.
proposalInfo
?.
billDomain
const
domainOptions
=
Array
.
isArray
(
billDomain
)
?
billDomain
.
map
(
d
=>
({
value
:
d
,
label
:
d
}))
:
[]
return
{
return
{
policyArea
:
{
options
:
domain
Options
},
policyArea
:
{
options
:
policyArea
Options
},
governmentType
:
{
governmentType
:
{
options
:
[
options
:
[
{
value
:
'统一政府'
,
label
:
'统一政府'
},
{
value
:
'统一政府'
,
label
:
'统一政府'
},
...
@@ -177,9 +203,9 @@ const fields = computed(() => {
...
@@ -177,9 +203,9 @@ const fields = computed(() => {
},
},
proposalTime
:
{
proposalTime
:
{
options
:
[
options
:
[
{
value
:
'近三年'
,
label
:
'近三年'
},
{
value
:
'近五年'
,
label
:
'近五年'
},
{
value
:
'近五年'
,
label
:
'近五年'
},
{
value
:
'近十年'
,
label
:
'近十年'
},
{
value
:
'近十年'
,
label
:
'近十年'
}
{
value
:
'全部'
,
label
:
'全部'
}
]
]
}
}
}
}
...
...
src/views/bill/influence/ProgressForecast/components/PageHeader.vue
浏览文件 @
f921faf1
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
<div
class=
"header-content"
>
<div
class=
"header-content"
>
<div
class=
"header-left"
>
<div
class=
"header-left"
>
<div
class=
"text-title-2-bold"
>
科技法案立法进展预测
</div>
<div
class=
"text-title-2-bold"
>
科技法案立法进展预测
</div>
<div
class=
"text-tip-2 text-primary-65-clor"
>
H.R.1-大而美法案(2025年5月20日)
</div>
<div
class=
"text-tip-2 text-primary-65-clor"
v-if=
"props.proposalInfo"
>
{{
props
.
proposalInfo
.
title
+
"("
+
props
.
proposalInfo
.
date
+
")"
}}
</div>
</div>
</div>
<div
class=
"header-actions"
>
<div
class=
"header-actions"
>
<button
class=
"action-btn"
>
<button
class=
"action-btn"
>
...
@@ -30,6 +30,11 @@
...
@@ -30,6 +30,11 @@
</
template
>
</
template
>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
type
{
ProposalInfo
}
from
'../api'
const
props
=
defineProps
<
{
proposalInfo
?:
ProposalInfo
|
null
defaultFilters
?:
Record
<
string
,
string
[]
>
}
>
()
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
...
@@ -45,6 +50,7 @@
...
@@ -45,6 +50,7 @@
background
:
#ffffff
;
background
:
#ffffff
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0.1
);
margin-bottom
:
16px
;
margin-bottom
:
16px
;
margin-left
:
0px
;
}
}
.header-content
{
.header-content
{
...
...
src/views/bill/influence/ProgressForecast/components/Step1FilterCondition.vue
浏览文件 @
f921faf1
...
@@ -13,7 +13,9 @@
...
@@ -13,7 +13,9 @@
/>
/>
</div>
</div>
<ActionButtons
<ActionButtons
show-set-as-current
@
reset=
"handleReset"
@
reset=
"handleReset"
@
set-as-current=
"handleSetAsCurrent"
@
next=
"handleNext"
@
next=
"handleNext"
/>
/>
</
template
>
</
template
>
...
@@ -65,6 +67,11 @@ function handleReset() {
...
@@ -65,6 +67,11 @@ function handleReset() {
filterSectionRef
.
value
?.
reset
()
filterSectionRef
.
value
?.
reset
()
}
}
// 设置为当前提案:恢复初始状态
function
handleSetAsCurrent
()
{
filterSectionRef
.
value
?.
setAsCurrent
()
}
// 下一步:获取已选的筛选条件并传给父组件
// 下一步:获取已选的筛选条件并传给父组件
function
handleNext
()
{
function
handleNext
()
{
const
selectedFilters
=
filterSectionRef
.
value
?.
getValues
()
||
{}
const
selectedFilters
=
filterSectionRef
.
value
?.
getValues
()
||
{}
...
...
src/views/bill/influence/ProgressForecast/components/Step2FilterBills.vue
浏览文件 @
f921faf1
...
@@ -122,26 +122,27 @@ const selectedCount = computed(() => {
...
@@ -122,26 +122,27 @@ const selectedCount = computed(() => {
async
function
loadData
()
{
async
function
loadData
()
{
loading
.
value
=
true
loading
.
value
=
true
try
{
try
{
//
使用真实 API,传入 billIds、domains、patternType、proposalType
//
标准 API 参数格式
const
params
=
{
const
params
=
{
billIds
:
filterParams
?.
value
.
billIds
,
billIds
:
filterParams
?.
value
.
billIds
,
domains
:
filterParams
?.
value
.
domains
||
[]
,
domains
:
(
filterParams
?.
value
.
domains
||
[]).
join
(
','
)
,
patternType
:
filterParams
?.
value
.
patternType
||
'统一政府'
,
patternType
:
filterParams
?.
value
.
patternType
||
'统一政府'
,
proposalType
:
filterParams
?.
value
.
proposalType
||
'两党共同提案'
proposalType
:
filterParams
?.
value
.
proposalType
||
'两党共同提案'
,
timeFrame
:
filterParams
?.
value
.
timeFrame
?.[
0
]
||
''
,
maxNum
:
50
}
}
const
response
=
await
getSimiBills
(
params
)
const
response
=
await
getSimiBills
(
params
)
if
(
response
&&
response
.
data
)
{
if
(
response
&&
response
.
data
)
{
// 保存原始数据
(新 API 返回结构中 simi_bills 是法案数组)
// 保存原始数据
rawBillsData
.
value
=
response
.
data
.
simi_bills
||
[]
rawBillsData
.
value
=
response
.
data
const
{
stats
:
apiStats
,
bills
:
apiBills
}
=
transformSimiBillsData
(
response
)
const
{
stats
:
apiStats
,
bills
:
apiBills
}
=
transformSimiBillsData
(
response
)
stats
.
value
=
apiStats
stats
.
value
=
apiStats
bills
.
value
=
apiBills
bills
.
value
=
apiBills
}
else
{
}
else
{
stats
.
value
=
null
stats
.
value
=
null
bills
.
value
=
[]
bills
.
value
=
[]
rawBillsData
.
value
=
[]
}
}
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
error
(
'获取相似法案失败:'
,
error
)
console
.
error
(
'获取相似法案失败:'
,
error
)
...
@@ -187,8 +188,9 @@ function handleBack() {
...
@@ -187,8 +188,9 @@ function handleBack() {
function
handleStartAnalysis
()
{
function
handleStartAnalysis
()
{
// 获取用户勾选的法案ID列表
// 获取用户勾选的法案ID列表
const
selectedIds
=
bills
.
value
.
filter
(
b
=>
b
.
selected
).
map
(
b
=>
b
.
id
)
const
selectedIds
=
bills
.
value
.
filter
(
b
=>
b
.
selected
).
map
(
b
=>
b
.
id
)
// 从原始数据中筛选出用户勾选的法案
// 从原始数据中筛选出用户勾选的法案(确保 rawBillsData 是数组)
const
selectedBills
=
rawBillsData
.
value
.
filter
(
b
=>
selectedIds
.
includes
(
b
.
bill_id
))
const
rawData
=
Array
.
isArray
(
rawBillsData
.
value
)
?
rawBillsData
.
value
:
[]
const
selectedBills
=
rawData
.
filter
(
b
=>
selectedIds
.
includes
(
b
.
bill_id
))
emit
(
'next'
,
selectedBills
)
emit
(
'next'
,
selectedBills
)
}
}
</
script
>
</
script
>
...
@@ -210,12 +212,16 @@ function handleStartAnalysis() {
...
@@ -210,12 +212,16 @@ function handleStartAnalysis() {
.content-wrapper
{
.content-wrapper
{
flex
:
1
;
flex
:
1
;
overflow
:
auto
;
overflow-y
:
auto
;
display
:
flex
;
flex-direction
:
column
;
min-height
:
0
;
}
}
.stats-section
{
.stats-section
{
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
height
:
100%
;
}
}
.stats-header
{
.stats-header
{
...
@@ -333,6 +339,10 @@ function handleStartAnalysis() {
...
@@ -333,6 +339,10 @@ function handleStartAnalysis() {
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
gap
:
16px
;
gap
:
16px
;
flex
:
1
;
overflow-y
:
auto
;
min-height
:
0
;
padding-bottom
:
16px
;
}
}
.action-footer
{
.action-footer
{
...
...
src/views/bill/influence/ProgressForecast/components/Step3PredictionAnalysis.vue
浏览文件 @
f921faf1
...
@@ -31,6 +31,8 @@
...
@@ -31,6 +31,8 @@
<div
class=
"highlight-wave text-regular"
></div>
<div
class=
"highlight-wave text-regular"
></div>
<div
class=
"highlight-content text-regular"
>
<div
class=
"highlight-content text-regular"
>
<p
class=
"highlight-title text-regular"
>
该法案的通过概率为
{{
predictionData
?.
overallProbability
||
'—'
}}
。
</p>
<p
class=
"highlight-title text-regular"
>
该法案的通过概率为
{{
predictionData
?.
overallProbability
||
'—'
}}
。
</p>
<!--
{{
predictionData
.
factorAnalysis
}}
-->
<p
class=
"highlight-text text-regular"
v-for=
"value in predictionData.factorAnalysis"
:key=
"value"
>
{{
'*'
+
value
}}
</p>
<p
class=
"highlight-text text-regular"
>
{{
predictionData
?.
highlightText
}}
</p>
<p
class=
"highlight-text text-regular"
>
{{
predictionData
?.
highlightText
}}
</p>
</div>
</div>
</div>
</div>
...
...
src/views/bill/influence/ProgressForecast/index.vue
浏览文件 @
f921faf1
...
@@ -107,7 +107,8 @@ onMounted(async () => {
...
@@ -107,7 +107,8 @@ onMounted(async () => {
billIds
:
billId
.
value
,
billIds
:
billId
.
value
,
domains
:
proposalInfo
.
value
.
areas
||
[],
domains
:
proposalInfo
.
value
.
areas
||
[],
patternType
:
proposalInfo
.
value
.
patternType
||
'统一政府'
,
patternType
:
proposalInfo
.
value
.
patternType
||
'统一政府'
,
proposalType
:
'两党共同提案'
proposalType
:
'两党共同提案'
,
timeFrame
:
[]
}
}
}
}
}
}
...
@@ -123,11 +124,14 @@ function goToNextStep() {
...
@@ -123,11 +124,14 @@ function goToNextStep() {
}
}
}
}
// Step1 下一步:更新筛选参数中的 domains
// Step1 下一步:更新筛选参数中的 domains
和 timeFrame
function
handleStep1Next
(
selectedFilters
:
Record
<
string
,
string
[]
>
)
{
function
handleStep1Next
(
selectedFilters
:
Record
<
string
,
string
[]
>
)
{
// 用已选的
政策领域
更新 currentFilterParams
// 用已选的
筛选条件
更新 currentFilterParams
if
(
currentFilterParams
.
value
)
{
if
(
currentFilterParams
.
value
)
{
currentFilterParams
.
value
.
domains
=
selectedFilters
.
policyArea
||
[]
currentFilterParams
.
value
.
domains
=
selectedFilters
.
policyArea
||
[]
currentFilterParams
.
value
.
patternType
=
selectedFilters
.
governmentType
?.[
0
]
||
'统一政府'
currentFilterParams
.
value
.
proposalType
=
selectedFilters
.
oppositionProposer
?.[
0
]
||
'两党共同提案'
currentFilterParams
.
value
.
timeFrame
=
selectedFilters
.
proposalTime
||
[]
}
}
// 进入下一步
// 进入下一步
goToNextStep
()
goToNextStep
()
...
@@ -144,195 +148,56 @@ async function handleStep2Next(selectedBills: any[]) {
...
@@ -144,195 +148,56 @@ async function handleStep2Next(selectedBills: any[]) {
try
{
try
{
// TODO: 暂行版本 - 使用固定参数,等后端接口完善后替换为真实数据
// TODO: 暂行版本 - 使用固定参数,等后端接口完善后替换为真实数据
// 真实参数应从 rawProposalData 和 selectedBills 获取
// 真实参数应从 rawProposalData 和 selectedBills 获取
const
params
=
{
const
params
=
{
"bill_name"
:
"《人工智能监督法案》(AI OVERWATCH Act)"
,
bill_name
:
'《人工智能监督法案》(AI OVERWATCH Act)'
,
"bill_actions"
:
[
bill_actions
:
[
{
{
"action_date"
:
"2025-12-18"
,
action_date
:
'2025-12-18'
,
"action_type"
:
"IntroReferral"
,
action_type
:
'IntroReferral'
,
"org_name"
:
"House floor actions"
,
org_name
:
'House floor actions'
,
"action_content"
:
"Referred to the House Committee on Foreign Affairs."
action_content
:
'Referred to the House Committee on Foreign Affairs.'
},
},
{
{
"action_date"
:
"2025-12-18"
,
action_date
:
'2025-12-18'
,
"action_type"
:
"IntroReferral"
,
action_type
:
'IntroReferral'
,
"org_name"
:
"Library of Congress"
,
org_name
:
'Library of Congress'
,
"action_content"
:
"Introduced in House"
action_content
:
'Introduced in House'
},
{
"action_date"
:
"2025-12-18"
,
"action_type"
:
"IntroReferral"
,
"org_name"
:
"Library of Congress"
,
"action_content"
:
"Introduced in House"
}
}
],
],
"bill_sponsors"
:
[
bill_sponsors
:
[
{
"person_name"
:
"Moolenaar, John R."
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Huizenga, Bill"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"LaHood, Darin"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Mast, Brian J."
,
"sponsor_type"
:
"提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Kim, Young"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Crawford, Eric A. "Rick""
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Self, Keith"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"McCaul, Michael T."
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Davidson, Warren"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Kean, Thomas H."
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Baird, James R."
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Moylan, James C."
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Fine, Randy"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Moran, Nathaniel"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Miller, Max L."
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Lawler, Michael"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
{
"person_name"
:
"Meeks, Gregory W."
,
person_name
:
'Moolenaar, John R.'
,
"sponsor_type"
:
"共同提案人"
,
sponsor_type
:
'共同提案人'
,
"party_name"
:
"民主党"
party_name
:
'共和党'
},
{
"person_name"
:
"Kamlager-Dove, Sydney"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"民主党"
},
{
"person_name"
:
"Sherman, Brad"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"民主党"
},
{
"person_name"
:
"Newhouse, Dan"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Biggs, Sheri"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Salazar, Maria Elvira"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Nunn, Zachary"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
},
{
"person_name"
:
"Radewagen, Aumua Amata Coleman"
,
"sponsor_type"
:
"共同提案人"
,
"party_name"
:
"共和党"
}
}
],
],
"bill_proposal_type"
:
"两党共同提案"
,
bill_proposal_type
:
'两党共同提案'
,
"poli_pattern_type"
:
"统一政府"
,
poli_pattern_type
:
'统一政府'
,
"poli_pattern_desc"
:
"2025年12月18日,美国处于统一政府:共和党籍总统就职,共和党在参议院以53席对47席掌握多数,在众议院以220席对215席占据多数。"
,
poli_pattern_desc
:
'2025年12月18日,美国处于统一政府:共和党籍总统就职,共和党在参议院以53席对47席掌握多数,在众议院以220席对215席占据多数。'
,
"simi_bills"
:
[
simi_bills
:
[
{
{
"bill_name"
:
"2025年NASA过渡授权法案"
,
bill_name
:
'2025年NASA过渡授权法案'
,
"bill_actions"
:
[
bill_actions
:
[
{
{
"action_date"
:
"2025-03-11"
,
action_date
:
'2025-03-11'
,
"action_type"
:
"IntroReferral"
,
action_type
:
'IntroReferral'
,
"org_name"
:
"Senate"
,
org_name
:
'Senate'
,
"action_content"
:
"Read twice and referred to the Committee on Commerce, Science, and Transportation."
action_content
:
'Read twice and referred to the Committee on Commerce, Science, and Transportation.'
},
},
{
{
"action_date"
:
"2025-03-11"
,
action_date
:
'2025-03-11'
,
"action_type"
:
"IntroReferral"
,
action_type
:
'IntroReferral'
,
"org_name"
:
"Library of Congress"
,
org_name
:
'Library of Congress'
,
"action_content"
:
"Introduced in Senate"
action_content
:
'Introduced in Senate'
},
}
{
],
"action_date"
:
"2025-03-11"
,
bill_proposal_type
:
'两党共同提案'
,
"action_type"
:
"IntroReferral"
,
bill_proposal_desc
:
'两党共同提案'
,
"org_name"
:
"Senate"
,
poli_pattern_type
:
'统一政府'
,
"action_content"
:
"Read twice and referred to the Committee on Commerce, Science, and Transportation."
poli_pattern_desc
:
'2025-03-11,共和党总统唐纳德·特朗普执政;参议院共和党53席、民主党47席;众议院共和党220席、民主党215席(含空缺)。'
},
{
"action_date"
:
"2025-03-11"
,
"action_type"
:
"IntroReferral"
,
"org_name"
:
"Library of Congress"
,
"action_content"
:
"Introduced in Senate"
},
{
"action_date"
:
"2026-03-04"
,
"action_type"
:
"Committee"
,
"org_name"
:
"Senate"
,
"action_content"
:
"Committee on Commerce, Science, and Transportation. Ordered to be reported with an amendment in the nature of a substitute favorably."
}
],
"bill_proposal_type"
:
"两党共同提案"
,
"bill_proposal_desc"
:
"两党共同提案"
,
"poli_pattern_type"
:
"统一政府"
,
"poli_pattern_desc"
:
"2025-03-11,共和党总统唐纳德·特朗普执政;参议院共和党53席、民主党47席;众议院共和党220席、民主党215席(含空缺)。"
}
}
]
]
}
}
const
response
=
await
getPassProd
(
params
)
const
response
=
await
getPassProd
(
params
)
...
@@ -368,28 +233,26 @@ function transformPredictionResult(data: any) {
...
@@ -368,28 +233,26 @@ function transformPredictionResult(data: any) {
const
overall
=
data
?.
overall_analysis
||
{}
const
overall
=
data
?.
overall_analysis
||
{}
const
stages
=
data
?.
stage_analysis
||
[]
const
stages
=
data
?.
stage_analysis
||
[]
const
factors
=
data
?.
factor_analysis
||
[]
const
factors
=
data
?.
factor_analysis
||
[]
// 转换阶段分析
const
chineseNum
=
[
'一'
,
'二'
,
'三'
,
'四'
,
'五'
,
'六'
,
'七'
,
'八'
,
'九'
,
'十'
]
const
phases
=
stages
.
map
((
stage
:
any
,
index
:
number
)
=>
({
// 转换阶段分析
id
:
index
+
1
,
const
phases
=
stages
.
map
((
stage
:
any
,
index
:
number
)
=>
({
title
:
`阶段
${
chineseNum
[
index
]
||
index
+
1
}
:
${
stage
.
stage
}
`
,
id
:
index
+
1
,
description
:
stage
.
stage
,
title
:
`阶段
${
index
+
1
}
:
${
stage
.
stage
}
`
,
riskLevel
:
probabilityToRisk
(
stage
.
predicted_pass_probability
),
description
:
stage
.
stage
,
progressLevel
:
probabilityToProgressLevel
(
stage
.
predicted_pass_probability
),
riskLevel
:
probabilityToRisk
(
stage
.
predicted_pass_probability
),
estimatedDays
:
`预计耗时
${
stage
.
predicted_passing_time
}
天`
,
progressLevel
:
probabilityToProgressLevel
(
stage
.
predicted_pass_probability
),
modelInputs
:
[
stage
.
analysis
],
estimatedDays
:
`预计耗时
${
stage
.
predicted_passing_time
}
天`
,
supportingFacts
:
{
modelInputs
:
[
stage
.
analysis
],
title
:
'通过性预测依据'
,
supportingFacts
:
{
basedOn
:
'此阶段预测基于以下观点'
,
title
:
'通过性预测依据'
,
stats
:
[
basedOn
:
'此阶段预测基于以下观点'
,
{
value
:
`
${
stage
.
predicted_pass_probability
}
`
,
label
:
'通过概率'
},
stats
:
[
{
value
:
`
${
stage
.
predicted_passing_time
}
天`
,
label
:
'预计耗时'
}
{
value
:
`
${
stage
.
predicted_pass_probability
}
`
,
label
:
'通过概率'
},
]
{
value
:
`
${
stage
.
predicted_passing_time
}
天`
,
label
:
'预计耗时'
}
},
]
predictionBasis
:
stage
.
prediction_basis
},
}))
predictionBasis
:
stage
.
prediction_basis
}))
return
{
return
{
title
:
'立法进展阶段预测分析'
,
title
:
'立法进展阶段预测分析'
,
...
@@ -424,6 +287,14 @@ function handleRepredict() {
...
@@ -424,6 +287,14 @@ function handleRepredict() {
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
background-color
:
var
(
--bg-black-2
);
background-color
:
var
(
--bg-black-2
);
overflow-y
:
auto
;
overflow-x
:
hidden
;
white-space
:
pre-line
;
max-height
:
calc
(
100vh
-
80px
);
overflow-y
:
auto
;
overflow-x
:
hidden
;
white-space
:
pre-line
;
box-sizing
:
border-box
;
}
}
.layout-main-center
{
.layout-main-center
{
...
@@ -431,6 +302,7 @@ function handleRepredict() {
...
@@ -431,6 +302,7 @@ function handleRepredict() {
flex
:
1
;
flex
:
1
;
padding-bottom
:
32px
;
padding-bottom
:
32px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
margin-left
:
475px
;
}
}
.content-card
{
.content-card
{
...
...
src/views/characterPage/components/memberOfCongress/components/historicalProposal/components/BillCard.vue
浏览文件 @
f921faf1
...
@@ -22,6 +22,12 @@
...
@@ -22,6 +22,12 @@
<span
class=
"meta-value sponsor-name"
:title=
"allSponsorNames"
>
<span
class=
"meta-value sponsor-name"
:title=
"allSponsorNames"
>
{{
firstSponsorName
}}
{{
firstSponsorName
}}
</span>
</span>
</div>
<div
class=
"meta-row"
>
<span
class=
"meta-label"
>
委员会:
</span>
<span
class=
"meta-value sponsor-name"
:title=
"allSponsorNames"
>
{{
firstSponsorName
}}
</span>
</div>
</div>
<div
class=
"meta-row"
>
<div
class=
"meta-row"
>
<span
class=
"meta-label"
>
相关领域:
</span>
<span
class=
"meta-label"
>
相关领域:
</span>
...
@@ -114,6 +120,7 @@ const currentStageIndex = computed(() => {
...
@@ -114,6 +120,7 @@ const currentStageIndex = computed(() => {
gap
:
13px
;
gap
:
13px
;
align-items
:
center
;
align-items
:
center
;
height
:
100%
;
height
:
100%
;
margin
:
15px
1px
}
}
.bill-card-preview
{
.bill-card-preview
{
...
...
src/views/characterPage/components/memberOfCongress/components/historicalProposal/components/BillList.vue
浏览文件 @
f921faf1
...
@@ -23,9 +23,10 @@
...
@@ -23,9 +23,10 @@
<template
v-else
>
<template
v-else
>
<BillCard
<BillCard
v-for=
"bill in bills"
v-for=
"bill in bills"
:key=
"bill.
i
d"
:key=
"bill.
billI
d"
:bill=
"bill"
:bill=
"bill"
:progress-stages=
"progressStages"
:progress-stages=
"progressStages"
@
click=
"handleBillMoreClick(bill.billId)"
/>
/>
<div
v-if=
"total > 0"
class=
"bill-pagination"
>
<div
v-if=
"total > 0"
class=
"bill-pagination"
>
...
@@ -46,7 +47,10 @@
...
@@ -46,7 +47,10 @@
<
script
setup
>
<
script
setup
>
import
BillCard
from
'./BillCard.vue'
import
BillCard
from
'./BillCard.vue'
import
{
useRouter
}
from
"vue-router"
;
const
router
=
useRouter
();
import
{
useRoute
}
from
"vue-router"
;
const
route
=
useRoute
();
defineProps
({
defineProps
({
bills
:
{
type
:
Array
,
required
:
true
},
bills
:
{
type
:
Array
,
required
:
true
},
loading
:
{
type
:
Boolean
,
default
:
false
},
loading
:
{
type
:
Boolean
,
default
:
false
},
...
@@ -56,27 +60,45 @@ defineProps({
...
@@ -56,27 +60,45 @@ defineProps({
progressStages
:
{
type
:
Array
,
default
:
()
=>
[
'提出'
,
'众议院通过'
,
'参议院通过'
,
'分歧协调'
,
'提交总统'
,
'法案通过'
]
},
progressStages
:
{
type
:
Array
,
default
:
()
=>
[
'提出'
,
'众议院通过'
,
'参议院通过'
,
'分歧协调'
,
'提交总统'
,
'法案通过'
]
},
})
})
defineEmits
([
'page-change'
])
defineEmits
([
'page-change'
])
/** 政策建议关联法案:新标签页打开法案介绍页,billId 随接口 id 变化 */
const
handleBillMoreClick
=
(
bill
)
=>
{
const
billId
=
bill
;
// debugger
if
(
!
billId
)
{
return
;
}
const
route
=
router
.
resolve
({
path
:
"/billLayout/bill/introduction"
,
query
:
{
billId
:
String
(
billId
)
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
</
script
>
</
script
>
<
style
scoped
>
<
style
scoped
>
/* Bill List */
.bill-list
{
.bill-list
{
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
gap
:
16px
;
gap
:
16px
;
}
}
.bill-list-loading
{
.bill-list-loading
{
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
gap
:
16px
;
gap
:
16px
;
}
}
.bill-list-skeleton
{
.bill-list-skeleton
{
display
:
flex
;
display
:
flex
;
gap
:
24px
;
gap
:
24px
;
background
:
#fff
;
background
:
var
(
--bg-white-100
)
;
border
:
1px
solid
#ebedf0
;
border
-radius
:
10px
;
bo
rder-radius
:
8px
;
bo
x-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0.1
)
;
padding
:
24px
;
padding
:
24px
;
}
}
.skeleton-left
{
.skeleton-left
{
width
:
120px
;
width
:
120px
;
height
:
190px
;
height
:
190px
;
...
@@ -84,30 +106,35 @@ defineEmits(['page-change'])
...
@@ -84,30 +106,35 @@ defineEmits(['page-change'])
border-radius
:
4px
;
border-radius
:
4px
;
animation
:
pulse
1.5s
ease-in-out
infinite
;
animation
:
pulse
1.5s
ease-in-out
infinite
;
}
}
.skeleton-right
{
.skeleton-right
{
flex
:
1
;
flex
:
1
;
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
gap
:
12px
;
gap
:
12px
;
}
}
.skeleton-line
{
.skeleton-line
{
height
:
16px
;
height
:
16px
;
background
:
#f0f0f0
;
background
:
#f0f0f0
;
border-radius
:
4px
;
border-radius
:
4px
;
animation
:
pulse
1.5s
ease-in-out
infinite
;
animation
:
pulse
1.5s
ease-in-out
infinite
;
}
}
.skeleton-line.w30
{
width
:
30%
;
}
.skeleton-line.w30
{
width
:
30%
;
}
.skeleton-line.w40
{
width
:
40%
;
}
.skeleton-line.w40
{
width
:
40%
;
}
.skeleton-line.w50
{
width
:
50%
;
}
.skeleton-line.w50
{
width
:
50%
;
}
.skeleton-line.w60
{
width
:
60%
;
}
.skeleton-line.w60
{
width
:
60%
;
}
.skeleton-divider
{
.skeleton-divider
{
height
:
1px
;
height
:
1px
;
background
:
#e
bedf0
;
background
:
#e
aeced
;
}
}
.bill-list-empty
{
.bill-list-empty
{
background
:
#fff
;
background
:
var
(
--bg-white-100
)
;
border
:
1px
solid
#ebedf0
;
border
-radius
:
10px
;
bo
rder-radius
:
8px
;
bo
x-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0.1
)
;
padding
:
48px
;
padding
:
48px
;
text-align
:
center
;
text-align
:
center
;
color
:
#bfbfbf
;
color
:
#bfbfbf
;
...
@@ -117,6 +144,7 @@ defineEmits(['page-change'])
...
@@ -117,6 +144,7 @@ defineEmits(['page-change'])
align-items
:
center
;
align-items
:
center
;
gap
:
12px
;
gap
:
12px
;
}
}
@keyframes
pulse
{
@keyframes
pulse
{
0
%,
100
%
{
opacity
:
1
;
}
0
%,
100
%
{
opacity
:
1
;
}
50
%
{
opacity
:
0.5
;
}
50
%
{
opacity
:
0.5
;
}
...
@@ -129,6 +157,7 @@ defineEmits(['page-change'])
...
@@ -129,6 +157,7 @@ defineEmits(['page-change'])
justify-content
:
space-between
;
justify-content
:
space-between
;
padding
:
16px
0
0
;
padding
:
16px
0
0
;
}
}
.bill-pagination-total
{
.bill-pagination-total
{
font-size
:
14px
;
font-size
:
14px
;
font-family
:
'Microsoft YaHei'
,
sans-serif
;
font-family
:
'Microsoft YaHei'
,
sans-serif
;
...
@@ -139,10 +168,11 @@ defineEmits(['page-change'])
...
@@ -139,10 +168,11 @@ defineEmits(['page-change'])
/* Override el-pagination to match design */
/* Override el-pagination to match design */
.bill-pagination
:deep
(
.el-pagination
)
{
.bill-pagination
:deep
(
.el-pagination
)
{
--el-pagination-bg-color
:
#fff
;
--el-pagination-bg-color
:
var
(
--bg-white-100
)
;
--el-pagination-hover-color
:
rgba
(
5
,
95
,
194
,
1
);
--el-pagination-hover-color
:
rgba
(
5
,
95
,
194
,
1
);
padding
:
0
;
padding
:
0
;
}
}
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-prev
),
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-prev
),
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-next
),
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-next
),
.bill-pagination
:deep
(
.el-pagination.is-background
.el-pager
li
)
{
.bill-pagination
:deep
(
.el-pagination.is-background
.el-pager
li
)
{
...
@@ -151,20 +181,23 @@ defineEmits(['page-change'])
...
@@ -151,20 +181,23 @@ defineEmits(['page-change'])
line-height
:
32px
;
line-height
:
32px
;
border-radius
:
4px
;
border-radius
:
4px
;
border
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
border
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
background
:
#fff
;
background
:
var
(
--bg-white-100
)
;
color
:
rgba
(
59
,
65
,
75
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
font-size
:
14px
;
font-size
:
14px
;
font-family
:
'Microsoft YaHei'
,
sans-serif
;
font-family
:
'Microsoft YaHei'
,
sans-serif
;
margin
:
0
3px
;
margin
:
0
3px
;
}
}
.bill-pagination
:deep
(
.el-pagination.is-background
.el-pager
li
:not
(
.is-disabled
)
.is-active
)
{
.bill-pagination
:deep
(
.el-pagination.is-background
.el-pager
li
:not
(
.is-disabled
)
.is-active
)
{
background
:
#fff
;
background
:
var
(
--bg-white-100
)
;
color
:
rgba
(
5
,
95
,
194
,
1
);
color
:
rgba
(
5
,
95
,
194
,
1
);
border-color
:
rgba
(
5
,
95
,
194
,
1
);
border-color
:
rgba
(
5
,
95
,
194
,
1
);
}
}
.bill-pagination
:deep
(
.el-pagination.is-background
.el-pager
li
:not
(
.is-disabled
)
:hover
)
{
.bill-pagination
:deep
(
.el-pagination.is-background
.el-pager
li
:not
(
.is-disabled
)
:hover
)
{
color
:
rgba
(
5
,
95
,
194
,
1
);
color
:
rgba
(
5
,
95
,
194
,
1
);
}
}
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-prev
:hover
),
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-prev
:hover
),
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-next
:hover
)
{
.bill-pagination
:deep
(
.el-pagination.is-background
.btn-next
:hover
)
{
color
:
rgba
(
5
,
95
,
194
,
1
);
color
:
rgba
(
5
,
95
,
194
,
1
);
...
...
src/views/characterPage/components/memberOfCongress/components/historicalProposal/components/DocumentPreview.vue
浏览文件 @
f921faf1
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
</div>
</div>
<div
class=
"doc-info"
>
<div
class=
"doc-info"
>
<div
class=
"doc-number"
>
{{
billNumber
}}
</div>
<div
class=
"doc-number"
>
{{
billNumber
}}
</div>
<div
class=
"doc-serial"
>
{{
billSerial
}}
</div>
<div
class=
"doc-serial"
:title=
"billSerial"
>
{{
billSerial
}}
</div>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
...
@@ -147,5 +147,13 @@ defineProps({
...
@@ -147,5 +147,13 @@ defineProps({
color
:
rgba
(
95
,
101
,
108
,
1
);
color
:
rgba
(
95
,
101
,
108
,
1
);
line-height
:
24px
;
line-height
:
24px
;
text-align
:
center
;
text-align
:
center
;
width
:
15em
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
padding
:
6px
10px
;
font-size
:
14px
;
cursor
:
pointer
;
}
}
</
style
>
</
style
>
src/views/characterPage/components/memberOfCongress/index.vue
浏览文件 @
f921faf1
...
@@ -46,7 +46,7 @@
...
@@ -46,7 +46,7 @@
</div>
</div>
</AnalysisBox>
</AnalysisBox>
<AnalysisBox
title=
"
金钱
来源"
width=
"1064px"
height=
"512px"
:show-all-btn=
"false"
class=
"left-center"
>
<AnalysisBox
title=
"
资金
来源"
width=
"1064px"
height=
"512px"
:show-all-btn=
"false"
class=
"left-center"
>
<
template
#
header-btn
>
<
template
#
header-btn
>
<div
class=
"input"
>
<div
class=
"input"
>
<el-select
v-model=
"selectedOption"
placeholder=
"请选择"
class=
"select"
:teleported=
"true"
>
<el-select
v-model=
"selectedOption"
placeholder=
"请选择"
class=
"select"
:teleported=
"true"
>
...
@@ -80,12 +80,12 @@
...
@@ -80,12 +80,12 @@
background
@
current-change=
"handleFundPageChange"
/>
background
@
current-change=
"handleFundPageChange"
/>
</div>
</div>
</div>
</div>
<div
class=
"bottom"
>
<
!-- <
div class="bottom">
<img src="./assets/ai.png" alt="" class="icon">
<img src="./assets/ai.png" alt="" class="icon">
<div class="text1">
<div class="text1">
</div>
</div>
<img src="./assets/right.png" alt="" class="icon1">
<img src="./assets/right.png" alt="" class="icon1">
</div>
</div>
-->
</AnalysisBox>
</AnalysisBox>
<AnalysisBox
title=
"最新动态"
width=
"1064px"
height=
"1330px"
:show-all-btn=
"false"
class=
"left-bottom"
>
<AnalysisBox
title=
"最新动态"
width=
"1064px"
height=
"1330px"
:show-all-btn=
"false"
class=
"left-bottom"
>
<
template
#
header-btn
>
<
template
#
header-btn
>
...
@@ -375,6 +375,19 @@ import img5 from "./assets/img5.png";
...
@@ -375,6 +375,19 @@ import img5 from "./assets/img5.png";
import
DefaultIcon1
from
'@/assets/icons/default-icon1.png'
import
DefaultIcon1
from
'@/assets/icons/default-icon1.png'
import
DefaultIcon2
from
'@/assets/icons/default-icon2.png'
import
DefaultIcon2
from
'@/assets/icons/default-icon2.png'
/** 政策建议关联法案:新标签页打开法案介绍页,billId 随接口 id 变化 */
const
handleBillMoreClick
=
(
bill
)
=>
{
const
billId
=
bill
?.
id
;
if
(
!
billId
)
{
return
;
}
const
route
=
router
.
resolve
({
path
:
"/billLayout/bill/introduction"
,
query
:
{
billId
:
String
(
billId
)
}
});
window
.
open
(
route
.
href
,
"_blank"
);
};
import
{
useRoute
}
from
'vue-router'
;
import
{
useRoute
}
from
'vue-router'
;
const
route
=
useRoute
();
const
route
=
useRoute
();
const
personId
=
ref
(
route
.
query
.
personId
||
"Y000064"
);
const
personId
=
ref
(
route
.
query
.
personId
||
"Y000064"
);
...
@@ -1119,358 +1132,367 @@ const handleClickTag = async (tag) => {
...
@@ -1119,358 +1132,367 @@ const handleClickTag = async (tag) => {
}
}
.left-bottom
{
.left-bottom
{
width
:
100%
;
width
:
100%
;
height
:
1330px
;
height
:
100%
;
background-color
:
rgba
(
255
,
255
,
255
,
1
);
background-color
:
rgba
(
255
,
255
,
255
,
1
);
border-radius
:
10px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
rgba
(
25
,
69
,
130
,
0
.1
);
display
:
flex
;
flex-direction
:
column
;
overflow
:
hidden
;
:deep
(
.wrapper-header
)
{
:deep
(
.wrapper-header
)
{
position
:
relative
;
position
:
relative
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
height
:
56px
;
height
:
56px
;
/* 根据设计图调整 */
padding
:
0
24px
;
padding
:
0
24px
;
flex-shrink
:
0
;
}
}
:deep
(
.header-btn
)
{
top
:
16px
;
}
.title
{
width
:
100%
;
height
:
85px
;
display
:
flex
;
align-items
:
center
;
padding
:
14px
12px
45px
0
;
position
:
relative
;
.box
{
:deep
(
.header-btn
)
{
width
:
8px
;
top
:
16px
;
height
:
20px
;
}
background-color
:
rgb
(
5
,
95
,
194
);
border-bottom-right-radius
:
4px
;
border-top-right-radius
:
4px
;
margin-right
:
14px
;
}
.text
{
.title
{
font-size
:
20px
;
width
:
100%
;
font-weight
:
700
;
height
:
85px
;
font-family
:
"Microsoft YaHei"
;
display
:
flex
;
line-height
:
26px
;
align-items
:
center
;
color
:
rgb
(
5
,
95
,
194
);
padding
:
14px
12px
45px
0
;
}
position
:
relative
;
flex-shrink
:
0
;
.box
{
width
:
8px
;
height
:
20px
;
background-color
:
rgb
(
5
,
95
,
194
);
border-bottom-right-radius
:
4px
;
border-top-right-radius
:
4px
;
margin-right
:
14px
;
}
.btn
{
.text
{
width
:
60px
;
font-size
:
20px
;
height
:
28px
;
font-weight
:
700
;
margin-left
:
auto
;
font-family
:
"Microsoft YaHei"
;
line-height
:
26px
;
color
:
rgb
(
5
,
95
,
194
);
}
img
{
.btn
{
width
:
28px
;
width
:
60px
;
height
:
28px
;
height
:
28px
;
cursor
:
pointer
;
margin-left
:
auto
;
}
img
:first-child
{
img
{
margin-right
:
4px
;
width
:
28px
;
}
height
:
28px
;
}
cursor
:
pointer
;
}
.input
{
img
:first-child
{
position
:
absolute
;
margin-right
:
4px
;
top
:
50%
;
}
transform
:
translateY
(
-50%
);
}
right
:
120px
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
132
,
136
,
142
);
display
:
flex
;
align-items
:
center
;
gap
:
8px
;
input
[
type
=
"checkbox"
]
{
.input
{
width
:
16px
;
position
:
absolute
;
height
:
16px
;
top
:
50%
;
accent-color
:
#1890ff
;
transform
:
translateY
(
-50%
);
right
:
120px
;
cursor
:
pointer
;
font-size
:
16px
;
margin
:
0
;
font-weight
:
400
;
}
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
132
,
136
,
142
);
display
:
flex
;
align-items
:
center
;
gap
:
8px
;
input
[
type
=
"checkbox"
]
{
width
:
16px
;
height
:
16px
;
accent-color
:
#1890ff
;
cursor
:
pointer
;
margin
:
0
;
}
span
{
span
{
margin-left
:
0
!
important
;
margin-left
:
0
!
important
;
}
}
}
}
}
}
.main
{
.main
{
width
:
1064px
;
width
:
1064px
;
height
:
1133px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
padding
:
0
50px
0
0
;
padding-right
:
50px
;
position
:
relative
;
position
:
relative
;
z-index
:
1
;
z-index
:
110
;
.main-item
{
height
:
calc
(
100%
-
5px
-
76px
);
width
:
1014px
;
min-height
:
0
;
margin-bottom
:
40px
;
overflow-y
:
auto
;
display
:
flex
;
overflow-x
:
hidden
;
flex
:
0
0
auto
;
flex-direction
:
row
;
align-items
:
flex-start
;
.main-item
{
margin-bottom
:
20px
;
width
:
1014px
;
position
:
relative
;
display
:
flex
;
.time
{
flex-direction
:
row
;
width
:
77px
;
align-items
:
flex-start
;
box-sizing
:
border-box
;
margin-bottom
:
20px
;
margin-right
:
20px
;
padding-bottom
:
20px
;
display
:
flex
;
position
:
relative
;
flex-direction
:
column
;
align-items
:
flex-end
;
.time
{
width
:
77px
;
.year
{
box-sizing
:
border-box
;
font-size
:
16px
;
margin-right
:
20px
;
font-weight
:
700
;
display
:
flex
;
font-family
:
"Microsoft YaHei"
;
flex-direction
:
column
;
color
:
rgb
(
5
,
95
,
194
);
align-items
:
flex-end
;
line-height
:
24px
;
flex-shrink
:
0
;
}
.year
{
.date
{
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
700
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
5
,
95
,
194
);
color
:
rgb
(
5
,
95
,
194
);
line-height
:
24px
;
line-height
:
24px
;
}
}
}
.image
{
margin-right
:
20px
;
img
{
width
:
24px
;
height
:
24px
;
}
}
.content
{
width
:
873px
;
.content-type1
{
background-color
:
rgba
(
246
,
250
,
255
,
1
);
border-radius
:
10px
;
border
:
1px
solid
rgb
(
234
,
236
,
238
);
padding
:
12px
14px
12px
15px
;
.content-title1
{
font-size
:
16px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
line-height
:
24px
;
padding-bottom
:
12px
;
border-bottom
:
1px
solid
rgb
(
234
,
236
,
238
);
cursor
:
pointer
;
}
.content-title-en
{
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
line-height
:
24px
;
padding-top
:
12px
;
cursor
:
pointer
;
}
}
.content-type2
{
.content-title2
{
font-size
:
20px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
line-height
:
26px
;
padding-bottom
:
8px
;
cursor
:
pointer
;
}
}
.content-contentcontent
{
.date
{
display
:
-
webkit-box
;
font-size
:
16px
;
-webkit-box-orient
:
vertical
;
font-weight
:
700
;
-webkit-line-clamp
:
3
;
font-family
:
"Microsoft YaHei"
;
overflow
:
hidden
;
color
:
rgb
(
5
,
95
,
194
);
text-overflow
:
ellipsis
;
line-height
:
24px
;
font-size
:
16px
;
}
font-weight
:
400
;
}
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
95
,
101
,
108
);
line-height
:
24px
;
margin-bottom
:
8px
;
cursor
:
pointer
;
}
.content-tag
{
.image
{
width
:
873px
;
margin-right
:
20px
;
display
:
flex
;
flex-shrink
:
0
;
justify-content
:
space-between
;
.tag
{
img
{
font-size
:
14px
;
width
:
24px
;
font-weight
:
400
;
height
:
24px
;
font-family
:
"Microsoft YaHei"
;
}
line-height
:
20px
;
}
margin-right
:
8px
;
padding
:
1px
10px
;
border-radius
:
4px
;
border
:
1px
solid
;
cursor
:
pointer
;
}
.dl1
{
background-color
:
rgba
(
230
,
255
,
251
,
1
);
color
:
rgba
(
19
,
168
,
168
,
1
);
border-color
:
rgba
(
135
,
232
,
222
,
1
);
}
.dl2
{
.content
{
background-color
:
rgba
(
255
,
241
,
240
,
1
);
width
:
873px
;
color
:
rgb
(
206
,
79
,
81
);
min-width
:
0
;
border-color
:
rgba
(
255
,
163
,
158
,
1
);
}
.dl3
{
.content-type1
{
background-color
:
rgba
(
255
,
247
,
230
,
1
);
background-color
:
rgba
(
246
,
250
,
255
,
1
);
color
:
rgba
(
250
,
140
,
22
,
1
)
;
border-radius
:
10px
;
border-color
:
rgba
(
255
,
213
,
145
,
1
);
border
:
1px
solid
rgb
(
234
,
236
,
238
);
}
padding
:
12px
14px
12px
15px
;
.dl4
{
.content-title1
{
background-color
:
rgba
(
249
,
240
,
255
,
1
);
font-size
:
16px
;
color
:
rgba
(
114
,
46
,
209
,
1
);
font-weight
:
700
;
border-color
:
rgba
(
211
,
173
,
247
,
1
);
font-family
:
"Microsoft YaHei"
;
}
color
:
rgb
(
59
,
65
,
75
);
line-height
:
24px
;
padding-bottom
:
12px
;
border-bottom
:
1px
solid
rgb
(
234
,
236
,
238
);
cursor
:
pointer
;
}
.origin
{
.content-title-en
{
font-size
:
14px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
line-height
:
22px
;
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
132
,
136
,
142
);
line-height
:
24px
;
cursor
:
pointer
;
padding-top
:
12px
;
}
cursor
:
pointer
;
}
}
}
}
.
main-item
:
:
after
{
}
content
:
''
;
position
:
absolute
;
.content-type2
{
left
:
109px
;
/* 与圆点对齐 */
.content-title2
{
top
:
24px
;
/* 从圆点下方开始 */
font-size
:
20px
;
bottom
:
-20px
;
/* 延伸到下一个 item */
font-weight
:
700
;
width
:
1px
;
font-family
:
"Microsoft YaHei"
;
background-color
:
rgb
(
230
,
231
,
232
);
color
:
rgb
(
59
,
65
,
75
);
z-index
:
-1
;
line-height
:
26px
;
}
padding-bottom
:
8px
;
.line-test
{
cursor
:
pointer
;
position
:
absolute
;
top
:
10px
;
left
:
109px
;
border
:
1px
solid
rgb
(
230
,
231
,
232
);
z-index
:
-1
;
position
:
absolute
;
bottom
:
10px
;
}
}
}
}
.line
{
.content-contentcontent
{
width
:
100%
;
display
:
-
webkit-box
;
height
:
1px
;
-webkit-box-orient
:
vertical
;
background-color
:
rgb
(
234
,
236
,
238
);
-webkit-line-clamp
:
3
;
margin-top
:
30px
;
overflow
:
hidden
;
border
:
none
;
text-overflow
:
ellipsis
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
95
,
101
,
108
);
line-height
:
24px
;
margin-bottom
:
8px
;
cursor
:
pointer
;
}
}
.pagination
{
.content-tag
{
width
:
100%
;
width
:
873px
;
height
:
76px
;
margin
:
20px
auto
;
display
:
flex
;
display
:
flex
;
padding
:
0
31px
0
36px
;
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
center
;
gap
:
12px
;
border-top
:
1px
solid
rgb
(
234
,
236
,
238
);
.t
otal
{
.t
ag
{
font-size
:
1
6
px
;
font-size
:
1
4
px
;
font-weight
:
400
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
line-height
:
20px
;
margin-right
:
8px
;
padding
:
1px
10px
;
border-radius
:
4px
;
border
:
1px
solid
;
cursor
:
pointer
;
}
}
:deep
(
.custom-pagination
)
{
.dl1
{
display
:
flex
;
background-color
:
rgba
(
230
,
255
,
251
,
1
);
align-items
:
center
;
color
:
rgba
(
19
,
168
,
168
,
1
);
border-color
:
rgba
(
135
,
232
,
222
,
1
);
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
)
{
.dl2
{
min-width
:
32px
;
background-color
:
rgba
(
255
,
241
,
240
,
1
);
height
:
32px
;
color
:
rgb
(
206
,
79
,
81
);
line-height
:
32px
;
border-color
:
rgba
(
255
,
163
,
158
,
1
);
border-radius
:
6px
;
margin
:
0
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-active
)
{
.dl3
{
background-color
:
#fff
;
background-color
:
rgba
(
255
,
247
,
230
,
1
)
;
color
:
rgba
(
2
2
,
119
,
255
,
1
);
color
:
rgba
(
2
50
,
140
,
22
,
1
);
border-color
:
rgba
(
2
2
,
119
,
25
5
,
1
);
border-color
:
rgba
(
2
55
,
213
,
14
5
,
1
);
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-ellipsis
)
{
.dl4
{
border
:
none
;
background-color
:
rgba
(
249
,
240
,
255
,
1
);
background-color
:
transparent
;
color
:
rgba
(
114
,
46
,
209
,
1
);
color
:
rgb
(
95
,
101
,
108
);
border-color
:
rgba
(
211
,
173
,
247
,
1
);
min-width
:
16px
;
margin
:
0
6px
;
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev
),
.origin
{
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next
)
{
font-size
:
14px
;
min-width
:
32px
;
font-weight
:
400
;
height
:
32px
;
border-radius
:
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
margin
:
0
6px
;
line-height
:
22px
;
}
color
:
rgb
(
132
,
136
,
142
);
cursor
:
pointer
;
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev.is-disabled
),
white-space
:
nowrap
;
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next.is-disabled
)
{
color
:
rgba
(
95
,
101
,
108
,
0
.45
);
border-color
:
rgb
(
235
,
238
,
242
);
background-color
:
#fff
;
}
}
}
}
}
}
}
}
.
main-item
:
:
after
{
content
:
""
;
position
:
absolute
;
left
:
109px
;
top
:
24px
;
height
:
calc
(
100%
-
24px
);
width
:
1px
;
background-color
:
rgb
(
230
,
231
,
232
);
z-index
:
0
;
}
.main-item
:last-child::after
{
display
:
none
;
}
.line-test
{
display
:
none
;
}
}
.pagination
{
width
:
100%
;
height
:
76px
;
margin
:
0
;
display
:
flex
;
padding
:
0
31px
0
36px
;
justify-content
:
space-between
;
align-items
:
center
;
border-top
:
1px
solid
rgb
(
234
,
236
,
238
);
position
:
relative
;
z-index
:
3
;
background
:
#fff
;
flex-shrink
:
0
;
.total
{
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
}
:deep
(
.custom-pagination
)
{
display
:
flex
;
align-items
:
center
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
)
{
min-width
:
32px
;
height
:
32px
;
line-height
:
32px
;
border-radius
:
6px
;
margin
:
0
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-active
)
{
background-color
:
#fff
;
color
:
rgba
(
22
,
119
,
255
,
1
);
border-color
:
rgba
(
22
,
119
,
255
,
1
);
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-ellipsis
)
{
border
:
none
;
background-color
:
transparent
;
color
:
rgb
(
95
,
101
,
108
);
min-width
:
16px
;
margin
:
0
6px
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev
),
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next
)
{
min-width
:
32px
;
height
:
32px
;
border-radius
:
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-family
:
"Microsoft YaHei"
;
margin
:
0
6px
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev.is-disabled
),
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next.is-disabled
)
{
color
:
rgba
(
95
,
101
,
108
,
0
.45
);
border-color
:
rgb
(
235
,
238
,
242
);
background-color
:
#fff
;
}
}
}
}
.right
{
.right
{
width
:
520px
;
width
:
520px
;
height
:
100%
;
height
:
100%
;
...
@@ -1734,7 +1756,7 @@ const handleClickTag = async (tag) => {
...
@@ -1734,7 +1756,7 @@ const handleClickTag = async (tag) => {
.content-item
{
.content-item
{
width
:
454px
;
width
:
454px
;
margin-bottom
:
60px
;
//
margin-bottom: 60px;
margin-left
:
26px
;
margin-left
:
26px
;
position
:
relative
;
position
:
relative
;
...
@@ -2080,4 +2102,32 @@ const handleClickTag = async (tag) => {
...
@@ -2080,4 +2102,32 @@ const handleClickTag = async (tag) => {
color
:
rgba
(
170
,
173
,
177
,
1
);
color
:
rgba
(
170
,
173
,
177
,
1
);
font-size
:
14px
;
font-size
:
14px
;
}
}
.baseInfo-item
{
display
:
flex
;
align-items
:
flex-start
;
}
.baseInfo-item-title
{
flex
:
0
0
88px
;
/* 固定左侧宽度 */
font-size
:
16px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
white-space
:
nowrap
;
/* 左侧不换行 */
}
.baseInfo-item-content
{
flex
:
1
;
min-width
:
0
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
display
:
flex
;
flex-wrap
:
wrap
;
/* 右侧满了再换行 */
gap
:
8px
12px
;
/* 行列间距可调 */
}
.education-item
{
white-space
:
nowrap
;
/* 每个学校+专业作为一个整体不拆行 */
}
</
style
>
</
style
>
src/views/characterPage/components/techLeader/index.vue
浏览文件 @
f921faf1
...
@@ -109,11 +109,18 @@
...
@@ -109,11 +109,18 @@
<div
class=
"baseInfo-item-content"
>
{{ characterBasicInfo.country }}
</div>
<div
class=
"baseInfo-item-content"
>
{{ characterBasicInfo.country }}
</div>
</div>
</div>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item-title"
>
教育背景:
</div>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item-content"
v-for=
"value in characterBasicInfo.educationList"
<div
class=
"baseInfo-item-title"
>
教育背景:
</div>
:key=
"value.school"
>
<div
class=
"baseInfo-item-content"
>
{{ value.school + "(" + value.major + ")" }}
<span
</div>
class=
"education-item"
v-for=
"value in characterBasicInfo.educationList"
:key=
"value.school"
>
{{ value.school + "(" + value.major + ")" }}
</span>
</div>
</div>
</div>
</div>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item-title"
>
净资产:
</div>
<div
class=
"baseInfo-item-title"
>
净资产:
</div>
...
@@ -832,264 +839,367 @@ onMounted(() => {
...
@@ -832,264 +839,367 @@ onMounted(() => {
}
}
.left-bottom
{
.left-bottom
{
.check-input
{
width
:
100%
;
font-size
:
16px
;
height
:
100%
;
font-weight
:
400
;
background-color
:
rgba
(
255
,
255
,
255
,
1
);
font-family
:
"Microsoft YaHei"
;
border-radius
:
10px
;
line-height
:
24px
;
box-shadow
:
0px
0px
20px
rgba
(
25
,
69
,
130
,
0
.1
);
color
:
rgb
(
132
,
136
,
142
);
display
:
flex
;
flex-direction
:
column
;
overflow
:
hidden
;
input
{
:deep
(
.wrapper-header
)
{
margin-right
:
8px
;
position
:
relative
;
}
display
:
flex
;
}
align-items
:
center
;
height
:
56px
;
padding
:
0
24px
;
flex-shrink
:
0
;
}
.main
{
:deep
(
.header-btn
)
{
width
:
1064px
;
top
:
16px
;
height
:
1357px
;
}
box-sizing
:
border-box
;
padding-right
:
50px
;
position
:
relative
;
z-index
:
110
;
margin-top
:
10px
;
.main-item
{
width
:
1014px
;
display
:
flex
;
flex-direction
:
row
;
align-items
:
flex-start
;
margin-bottom
:
20px
;
position
:
relative
;
.time
{
width
:
77px
;
box-sizing
:
border-box
;
margin-right
:
20px
;
display
:
flex
;
flex-direction
:
column
;
align-items
:
flex-end
;
.year
,
.title
{
.date
{
width
:
100%
;
font-size
:
16px
;
height
:
85px
;
font-weight
:
700
;
display
:
flex
;
font-family
:
"Microsoft YaHei"
;
align-items
:
center
;
color
:
rgb
(
5
,
95
,
194
);
padding
:
14px
12px
45px
0
;
line-height
:
24px
;
position
:
relative
;
}
flex-shrink
:
0
;
}
.box
{
width
:
8px
;
height
:
20px
;
background-color
:
rgb
(
5
,
95
,
194
);
border-bottom-right-radius
:
4px
;
border-top-right-radius
:
4px
;
margin-right
:
14px
;
}
.image
{
.text
{
margin-right
:
20px
;
font-size
:
20px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
26px
;
color
:
rgb
(
5
,
95
,
194
);
}
img
{
.btn
{
width
:
24px
;
width
:
60px
;
height
:
24px
;
height
:
28px
;
}
margin-left
:
auto
;
}
.content
{
img
{
width
:
873px
;
width
:
28px
;
height
:
28px
;
cursor
:
pointer
;
}
.content-type1
{
img
:first-child
{
background-color
:
rgba
(
246
,
250
,
255
,
1
);
margin-right
:
4px
;
border-radius
:
10px
;
}
border
:
1px
solid
rgb
(
234
,
236
,
238
);
}
padding
:
12px
14px
12px
15px
;
.content-title1
{
.input
{
font-size
:
16px
;
position
:
absolute
;
font-weight
:
700
;
top
:
50%
;
font-family
:
"Microsoft YaHei"
;
transform
:
translateY
(
-50%
);
color
:
rgb
(
59
,
65
,
75
);
right
:
120px
;
line-height
:
24px
;
font-size
:
16px
;
padding-bottom
:
12px
;
font-weight
:
400
;
border-bottom
:
1px
solid
rgb
(
234
,
236
,
238
);
font-family
:
"Microsoft YaHei"
;
cursor
:
pointer
;
line-height
:
24px
;
}
color
:
rgb
(
132
,
136
,
142
);
display
:
flex
;
align-items
:
center
;
gap
:
8px
;
input
[
type
=
"checkbox"
]
{
width
:
16px
;
height
:
16px
;
accent-color
:
#1890ff
;
cursor
:
pointer
;
margin
:
0
;
}
.content-title-en
{
span
{
font-size
:
16px
;
margin-left
:
0
!
important
;
font-weight
:
400
;
}
font-family
:
"Microsoft YaHei"
;
}
color
:
rgb
(
59
,
65
,
75
);
}
line-height
:
24px
;
padding-top
:
12px
;
cursor
:
pointer
;
}
}
.content-type2
{
.main
{
.content-title2
{
width
:
1064px
;
font-size
:
20px
;
box-sizing
:
border-box
;
font-weight
:
700
;
padding
:
0
50px
0
0
;
font-family
:
"Microsoft YaHei"
;
position
:
relative
;
color
:
rgb
(
59
,
65
,
75
);
z-index
:
1
;
line-height
:
26px
;
padding-bottom
:
8px
;
height
:
calc
(
100%
-
5px
-
76px
);
cursor
:
pointer
;
min-height
:
0
;
}
overflow-y
:
auto
;
}
overflow-x
:
hidden
;
flex
:
0
0
auto
;
.main-item
{
width
:
1014px
;
display
:
flex
;
flex-direction
:
row
;
align-items
:
flex-start
;
margin-bottom
:
20px
;
padding-bottom
:
20px
;
position
:
relative
;
.time
{
width
:
77px
;
box-sizing
:
border-box
;
margin-right
:
20px
;
display
:
flex
;
flex-direction
:
column
;
align-items
:
flex-end
;
flex-shrink
:
0
;
.content-contentcontent
{
.year
{
display
:
-
webkit-box
;
font-size
:
16px
;
-webkit-box-orient
:
vertical
;
font-weight
:
700
;
-webkit-line-clamp
:
3
;
font-family
:
"Microsoft YaHei"
;
overflow
:
hidden
;
color
:
rgb
(
5
,
95
,
194
);
text-overflow
:
ellipsis
;
line-height
:
24px
;
font-size
:
16px
;
}
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
95
,
101
,
108
);
line-height
:
24px
;
margin-bottom
:
8px
;
cursor
:
pointer
;
}
.content-tag
{
.date
{
width
:
873px
;
font-size
:
16px
;
display
:
flex
;
font-weight
:
700
;
justify-content
:
space-between
;
font-family
:
"Microsoft YaHei"
;
margin-top
:
10px
;
color
:
rgb
(
5
,
95
,
194
);
line-height
:
24px
;
}
}
.tag
{
.image
{
font-size
:
14px
;
margin-right
:
20px
;
font-weight
:
400
;
flex-shrink
:
0
;
font-family
:
"Microsoft YaHei"
;
line-height
:
20px
;
margin-right
:
8px
;
padding
:
1px
10px
;
border-radius
:
4px
;
border
:
1px
solid
;
cursor
:
pointer
;
}
.dl1
{
img
{
background-color
:
rgba
(
230
,
255
,
251
,
1
)
;
width
:
24px
;
color
:
rgba
(
19
,
168
,
168
,
1
)
;
height
:
24px
;
border-color
:
rgba
(
135
,
232
,
222
,
1
);
}
}
}
.dl2
{
.content
{
background-color
:
rgba
(
255
,
241
,
240
,
1
);
width
:
873px
;
color
:
rgb
(
206
,
79
,
81
);
min-width
:
0
;
border-color
:
rgba
(
255
,
163
,
158
,
1
);
}
.dl3
{
.content-type1
{
background-color
:
rgba
(
255
,
247
,
230
,
1
);
background-color
:
rgba
(
246
,
250
,
255
,
1
);
color
:
rgba
(
250
,
140
,
22
,
1
)
;
border-radius
:
10px
;
border-color
:
rgba
(
255
,
213
,
145
,
1
);
border
:
1px
solid
rgb
(
234
,
236
,
238
);
}
padding
:
12px
14px
12px
15px
;
.dl4
{
.content-title1
{
background-color
:
rgba
(
249
,
240
,
255
,
1
);
font-size
:
16px
;
color
:
rgba
(
114
,
46
,
209
,
1
);
font-weight
:
700
;
border-color
:
rgba
(
211
,
173
,
247
,
1
);
font-family
:
"Microsoft YaHei"
;
}
color
:
rgb
(
59
,
65
,
75
);
line-height
:
24px
;
padding-bottom
:
12px
;
border-bottom
:
1px
solid
rgb
(
234
,
236
,
238
);
cursor
:
pointer
;
}
.origin
{
.content-title-en
{
font-size
:
14px
;
font-size
:
16px
;
font-weight
:
400
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
line-height
:
22px
;
color
:
rgb
(
59
,
65
,
75
);
color
:
rgb
(
132
,
136
,
142
);
line-height
:
24px
;
cursor
:
pointer
;
padding-top
:
12px
;
}
cursor
:
pointer
;
}
}
}
}
.
main-item
:
:
after
{
}
content
:
''
;
position
:
absolute
;
.content-type2
{
left
:
109px
;
.content-title2
{
top
:
24px
;
font-size
:
20px
;
bottom
:
-20px
;
font-weight
:
700
;
width
:
1px
;
font-family
:
"Microsoft YaHei"
;
background-color
:
rgb
(
230
,
231
,
232
);
color
:
rgb
(
59
,
65
,
75
);
z-index
:
-1
;
line-height
:
26px
;
}
padding-bottom
:
8px
;
.line-test
{
cursor
:
pointer
;
position
:
absolute
;
top
:
10px
;
left
:
109px
;
height
:
1300px
;
border
:
1px
solid
rgb
(
230
,
231
,
232
);
z-index
:
-1
;
}
}
}
}
.pagination
{
.content-contentcontent
{
width
:
100%
;
display
:
-
webkit-box
;
height
:
76px
;
-webkit-box-orient
:
vertical
;
margin
:
20px
auto
;
-webkit-line-clamp
:
3
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
95
,
101
,
108
);
line-height
:
24px
;
margin-bottom
:
8px
;
cursor
:
pointer
;
}
.content-tag
{
width
:
873px
;
display
:
flex
;
display
:
flex
;
padding
:
0
31px
0
36px
;
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
center
;
gap
:
12px
;
border-top
:
1px
solid
rgb
(
234
,
236
,
238
);
.t
otal
{
.t
ag
{
font-size
:
1
6
px
;
font-size
:
1
4
px
;
font-weight
:
400
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
line-height
:
20px
;
margin-right
:
8px
;
padding
:
1px
10px
;
border-radius
:
4px
;
border
:
1px
solid
;
cursor
:
pointer
;
}
}
:deep
(
.custom-pagination
)
{
.dl1
{
display
:
flex
;
background-color
:
rgba
(
230
,
255
,
251
,
1
);
align-items
:
center
;
color
:
rgba
(
19
,
168
,
168
,
1
);
border-color
:
rgba
(
135
,
232
,
222
,
1
);
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
)
{
.dl2
{
min-width
:
32px
;
background-color
:
rgba
(
255
,
241
,
240
,
1
);
height
:
32px
;
color
:
rgb
(
206
,
79
,
81
);
line-height
:
32px
;
border-color
:
rgba
(
255
,
163
,
158
,
1
);
border-radius
:
6px
;
margin
:
0
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-active
)
{
.dl3
{
background-color
:
#fff
;
background-color
:
rgba
(
255
,
247
,
230
,
1
)
;
color
:
rgba
(
2
2
,
119
,
255
,
1
);
color
:
rgba
(
2
50
,
140
,
22
,
1
);
border-color
:
rgba
(
2
2
,
119
,
25
5
,
1
);
border-color
:
rgba
(
2
55
,
213
,
14
5
,
1
);
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-ellipsis
)
{
.dl4
{
border
:
none
;
background-color
:
rgba
(
249
,
240
,
255
,
1
);
background-color
:
transparent
;
color
:
rgba
(
114
,
46
,
209
,
1
);
color
:
rgb
(
95
,
101
,
108
);
border-color
:
rgba
(
211
,
173
,
247
,
1
);
min-width
:
16px
;
margin
:
0
6px
;
}
}
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev
),
.origin
{
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next
)
{
font-size
:
14px
;
min-width
:
32px
;
font-weight
:
400
;
height
:
32px
;
border-radius
:
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-family
:
"Microsoft YaHei"
;
font-family
:
"Microsoft YaHei"
;
margin
:
0
6px
;
line-height
:
22px
;
}
color
:
rgb
(
132
,
136
,
142
);
cursor
:
pointer
;
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev.is-disabled
),
white-space
:
nowrap
;
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next.is-disabled
)
{
color
:
rgba
(
95
,
101
,
108
,
0
.45
);
border-color
:
rgb
(
235
,
238
,
242
);
background-color
:
#fff
;
}
}
}
}
}
}
}
}
.
main-item
:
:
after
{
content
:
""
;
position
:
absolute
;
left
:
109px
;
top
:
24px
;
height
:
calc
(
100%
-
24px
);
width
:
1px
;
background-color
:
rgb
(
230
,
231
,
232
);
z-index
:
0
;
}
.main-item
:last-child::after
{
display
:
none
;
}
.line-test
{
display
:
none
;
}
}
.pagination
{
width
:
100%
;
height
:
76px
;
margin
:
0
;
display
:
flex
;
padding
:
0
31px
0
36px
;
justify-content
:
space-between
;
align-items
:
center
;
border-top
:
1px
solid
rgb
(
234
,
236
,
238
);
position
:
relative
;
z-index
:
3
;
background
:
#fff
;
flex-shrink
:
0
;
.total
{
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
color
:
rgb
(
59
,
65
,
75
);
}
:deep
(
.custom-pagination
)
{
display
:
flex
;
align-items
:
center
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
)
{
min-width
:
32px
;
height
:
32px
;
line-height
:
32px
;
border-radius
:
6px
;
margin
:
0
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-active
)
{
background-color
:
#fff
;
color
:
rgba
(
22
,
119
,
255
,
1
);
border-color
:
rgba
(
22
,
119
,
255
,
1
);
}
:deep
(
.custom-pagination.el-pagination.is-background
.el-pager
li
.is-ellipsis
)
{
border
:
none
;
background-color
:
transparent
;
color
:
rgb
(
95
,
101
,
108
);
min-width
:
16px
;
margin
:
0
6px
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev
),
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next
)
{
min-width
:
32px
;
height
:
32px
;
border-radius
:
6px
;
border
:
1px
solid
rgba
(
0
,
0
,
0
,
0
.15
);
background-color
:
#fff
;
color
:
rgb
(
95
,
101
,
108
);
font-size
:
16px
;
font-family
:
"Microsoft YaHei"
;
margin
:
0
6px
;
}
:deep
(
.custom-pagination.el-pagination.is-background
.btn-prev.is-disabled
),
:deep
(
.custom-pagination.el-pagination.is-background
.btn-next.is-disabled
)
{
color
:
rgba
(
95
,
101
,
108
,
0
.45
);
border-color
:
rgb
(
235
,
238
,
242
);
background-color
:
#fff
;
}
}
}
}
.right
{
.right
{
width
:
520px
;
width
:
520px
;
height
:
100%
;
height
:
100%
;
...
@@ -1468,4 +1578,32 @@ onMounted(() => {
...
@@ -1468,4 +1578,32 @@ onMounted(() => {
.tab-select
{
.tab-select
{
width
:
120px
;
width
:
120px
;
}
}
.baseInfo-item
{
display
:
flex
;
align-items
:
flex-start
;
}
.baseInfo-item-title
{
flex
:
0
0
88px
;
/* 固定左侧宽度 */
font-size
:
16px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
white-space
:
nowrap
;
/* 左侧不换行 */
}
.baseInfo-item-content
{
flex
:
1
;
min-width
:
0
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
display
:
flex
;
flex-wrap
:
wrap
;
/* 右侧满了再换行 */
gap
:
8px
12px
;
/* 行列间距可调 */
}
.education-item
{
white-space
:
nowrap
;
/* 每个学校+专业作为一个整体不拆行 */
}
</
style
>
</
style
>
src/views/characterPage/components/thinkTankPerson/components/historicalProposal/components/NewsPagination.vue
浏览文件 @
f921faf1
<
template
>
<
template
>
<div
class=
"news-pagination-bar"
>
<div
class=
"news-pagination-bar"
v-if=
"total>1"
>
<span
class=
"news-pagination-total"
>
共
{{
total
}}
篇新闻报告
</span>
<span
class=
"news-pagination-total"
>
共
{{
total
}}
篇新闻报告
</span>
<div
class=
"news-pagination"
>
<div
class=
"news-pagination"
>
<button
class=
"pg-btn"
:disabled=
"currentPage
<
=
1
"
@
click=
"$emit('update:currentPage', currentPage - 1)"
>
<button
class=
"pg-btn"
:disabled=
"currentPage
<
=
1
"
@
click=
"$emit('update:currentPage', currentPage - 1)"
>
...
...
src/views/characterPage/components/thinkTankPerson/components/historicalProposal/components/NewsTopBar.vue
浏览文件 @
f921faf1
...
@@ -20,11 +20,11 @@
...
@@ -20,11 +20,11 @@
<button
<button
:class=
"['news-tab',
{ active: activeTab === 'local' }]"
:class=
"['news-tab',
{ active: activeTab === 'local' }]"
@click="$emit('update:activeTab', 'local')"
@click="$emit('update:activeTab', 'local')"
>
智库
报告
</button>
>
报告
</button>
<button
<button
:class=
"['news-tab',
{ active: activeTab === 'capital' }]"
:class=
"['news-tab',
{ active: activeTab === 'capital' }]"
@click="$emit('update:activeTab', 'capital')"
@click="$emit('update:activeTab', 'capital')"
>
调查
项目
</button>
>
项目
</button>
</div>
</div>
<div
class=
"news-sort"
ref=
"sortDropdownRef"
>
<div
class=
"news-sort"
ref=
"sortDropdownRef"
>
...
@@ -172,9 +172,10 @@ onUnmounted(() => document.removeEventListener('click', handleClickOutside))
...
@@ -172,9 +172,10 @@ onUnmounted(() => document.removeEventListener('click', handleClickOutside))
margin-left
:
auto
;
margin-left
:
auto
;
position
:
relative
;
position
:
relative
;
flex-shrink
:
0
;
flex-shrink
:
0
;
margin-right
:
10px
;
}
}
.news-sort-btn
{
.news-sort-btn
{
width
:
1
2
0px
;
width
:
1
5
0px
;
height
:
32px
;
height
:
32px
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
...
@@ -185,6 +186,7 @@ onUnmounted(() => document.removeEventListener('click', handleClickOutside))
...
@@ -185,6 +186,7 @@ onUnmounted(() => document.removeEventListener('click', handleClickOutside))
background
:
rgba
(
255
,
255
,
255
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
cursor
:
pointer
;
cursor
:
pointer
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
margin-top
:
15px
;
}
}
.news-sort-btn
:hover
{
.news-sort-btn
:hover
{
border-color
:
rgba
(
5
,
95
,
194
,
0.4
);
border-color
:
rgba
(
5
,
95
,
194
,
0.4
);
...
...
src/views/characterPage/components/thinkTankPerson/components/historicalProposal/components/NewsTracker.vue
浏览文件 @
f921faf1
...
@@ -18,13 +18,13 @@
...
@@ -18,13 +18,13 @@
<div
class=
"news-main"
>
<div
class=
"news-main"
>
<div
class=
"news-grid"
>
<div
class=
"news-grid"
>
<NewsCard
<NewsCard
v-for=
"item in
newsList
"
v-for=
"item in
(activeTab === 'local' ? newsList : projectList)
"
:key=
"item.reportId"
:key=
"item.reportId"
:item=
"item"
:item=
"item"
/>
/>
</div>
</div>
<NewsPagination
<NewsPagination
:total=
"
totalNew
s"
:total=
"
activeTab === 'local' ? totalNews : totalProject
s"
v-model:current-page=
"currentPage"
v-model:current-page=
"currentPage"
:page-size=
"pageSize"
:page-size=
"pageSize"
/>
/>
...
@@ -41,7 +41,7 @@ import NewsSidebar from './NewsSidebar.vue'
...
@@ -41,7 +41,7 @@ import NewsSidebar from './NewsSidebar.vue'
import
NewsCard
from
'./NewsCard.vue'
import
NewsCard
from
'./NewsCard.vue'
import
NewsPagination
from
'./NewsPagination.vue'
import
NewsPagination
from
'./NewsPagination.vue'
import
{
getIndustryKeyList
}
from
'@/api/bill/billHome.js'
import
{
getIndustryKeyList
}
from
'@/api/bill/billHome.js'
import
{
getFindingsReport
}
from
'@/api/characterPage/characterPage.js'
import
{
getFindingsReport
,
getInvestigationProject
}
from
'@/api/characterPage/characterPage.js'
const
route
=
useRoute
()
const
route
=
useRoute
()
const
personId
=
computed
(()
=>
route
.
params
.
personId
||
route
.
query
.
personId
||
''
)
const
personId
=
computed
(()
=>
route
.
params
.
personId
||
route
.
query
.
personId
||
''
)
...
@@ -51,7 +51,9 @@ const activeTab = ref('local')
...
@@ -51,7 +51,9 @@ const activeTab = ref('local')
const
currentPage
=
ref
(
1
)
const
currentPage
=
ref
(
1
)
const
pageSize
=
12
const
pageSize
=
12
const
totalNews
=
ref
(
0
)
const
totalNews
=
ref
(
0
)
const
totalProjects
=
ref
(
0
)
const
newsList
=
ref
([])
const
newsList
=
ref
([])
const
projectList
=
ref
([])
const
loading
=
ref
(
false
)
const
loading
=
ref
(
false
)
const
sortBy
=
ref
(
'publishTimeDesc'
)
const
sortBy
=
ref
(
'publishTimeDesc'
)
...
@@ -79,17 +81,16 @@ async function loadFilterOptions() {
...
@@ -79,17 +81,16 @@ async function loadFilterOptions() {
]
]
}
}
function
buildParams
()
{
function
buildParams
(
{
includeSearchText
=
false
}
=
{}
)
{
const
params
=
{
const
params
=
{
currentPage
:
currentPage
.
value
-
1
,
currentPage
:
currentPage
.
value
-
1
,
pageSize
,
pageSize
,
sortFun
:
sortBy
.
value
===
'publishTimeAsc'
,
sortFun
:
sortBy
.
value
===
'publishTimeAsc'
,
industryIds
:
selectedDomains
.
value
.
includes
(
'all'
)
?
''
:
JSON
.
stringify
(
selectedDomains
.
value
),
years
:
selectedTimes
.
value
.
includes
(
'all'
)
?
''
:
JSON
.
stringify
(
selectedTimes
.
value
),
}
}
if
(
!
selectedDomains
.
value
.
includes
(
'all'
))
{
if
(
includeSearchText
)
{
params
.
industryIds
=
selectedDomains
.
value
params
.
searchText
=
searchText
.
value
}
if
(
!
selectedTimes
.
value
.
includes
(
'all'
))
{
params
.
years
=
selectedTimes
.
value
}
}
return
params
return
params
}
}
...
@@ -97,14 +98,18 @@ function buildParams() {
...
@@ -97,14 +98,18 @@ function buildParams() {
function
updateSort
(
value
)
{
function
updateSort
(
value
)
{
sortBy
.
value
=
value
sortBy
.
value
=
value
currentPage
.
value
=
1
currentPage
.
value
=
1
loadNews
()
if
(
activeTab
.
value
===
'local'
)
{
loadNews
()
}
else
{
loadProjects
()
}
}
}
async
function
loadNews
()
{
async
function
loadNews
()
{
if
(
!
personId
.
value
)
return
if
(
!
personId
.
value
)
return
loading
.
value
=
true
loading
.
value
=
true
try
{
try
{
const
params
=
buildParams
()
const
params
=
buildParams
(
{
includeSearchText
:
true
}
)
const
res
=
await
getFindingsReport
(
personId
.
value
,
params
)
const
res
=
await
getFindingsReport
(
personId
.
value
,
params
)
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
newsList
.
value
=
res
.
data
.
content
||
[]
newsList
.
value
=
res
.
data
.
content
||
[]
...
@@ -118,6 +123,32 @@ async function loadNews() {
...
@@ -118,6 +123,32 @@ async function loadNews() {
}
}
}
}
async
function
loadProjects
()
{
if
(
!
personId
.
value
)
return
loading
.
value
=
true
try
{
const
params
=
buildParams
()
const
res
=
await
getInvestigationProject
(
personId
.
value
,
params
)
if
(
res
.
code
===
200
&&
res
.
data
)
{
projectList
.
value
=
(
res
.
data
.
content
||
[]).
map
(
item
=>
({
reportId
:
item
.
projectId
,
title
:
item
.
name
,
content
:
item
.
description
,
imageUrl
:
item
.
imageUrl
,
time
:
item
.
time
,
sourceName
:
item
.
sourceName
,
industryList
:
item
.
industryList
,
}))
totalProjects
.
value
=
res
.
data
.
totalElements
||
0
}
else
{
projectList
.
value
=
[]
totalProjects
.
value
=
0
}
}
finally
{
loading
.
value
=
false
}
}
function
toggleDomain
(
id
)
{
function
toggleDomain
(
id
)
{
if
(
id
===
'all'
)
{
if
(
id
===
'all'
)
{
selectedDomains
.
value
=
[
'all'
]
selectedDomains
.
value
=
[
'all'
]
...
@@ -142,17 +173,43 @@ function toggleTime(id) {
...
@@ -142,17 +173,43 @@ function toggleTime(id) {
}
}
}
}
watch
(
searchText
,
()
=>
{
currentPage
.
value
=
1
if
(
activeTab
.
value
===
'local'
)
{
loadNews
()
}
else
{
loadProjects
()
}
})
watch
(
activeTab
,
(
val
)
=>
{
currentPage
.
value
=
1
if
(
val
===
'local'
)
{
loadNews
()
}
else
{
loadProjects
()
}
})
watch
(
watch
(
()
=>
[
selectedDomains
.
value
,
selectedTimes
.
value
],
()
=>
[
selectedDomains
.
value
,
selectedTimes
.
value
],
()
=>
{
()
=>
{
currentPage
.
value
=
1
currentPage
.
value
=
1
loadNews
()
if
(
activeTab
.
value
===
'local'
)
{
loadNews
()
}
else
{
loadProjects
()
}
},
},
{
deep
:
true
}
{
deep
:
true
}
)
)
watch
(
currentPage
,
()
=>
{
watch
(
currentPage
,
()
=>
{
loadNews
()
if
(
activeTab
.
value
===
'local'
)
{
loadNews
()
}
else
{
loadProjects
()
}
})
})
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
...
...
src/views/characterPage/components/thinkTankPerson/index.vue
浏览文件 @
f921faf1
...
@@ -104,10 +104,17 @@
...
@@ -104,10 +104,17 @@
<div
class=
"baseInfo-item-content"
>
{{ characterBasicInfo.country }}
</div>
<div
class=
"baseInfo-item-content"
>
{{ characterBasicInfo.country }}
</div>
</div>
</div>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item-title"
>
教育背景:
</div>
<div
class=
"baseInfo-item-title"
>
教育背景:
</div>
<div
class=
"baseInfo-item-content long"
<div
class=
"baseInfo-item-content"
>
v-for=
"item in characterBasicInfo.educationList"
>
<span
{{ item.school + '--' + item.major }}
<br>
class=
"education-item"
v-for=
"value in characterBasicInfo.educationList"
:key=
"value.school"
>
{{ value.school + "(" + value.major + ")" }}
</span>
</div>
</div>
</div>
</div>
</div>
<div
class=
"baseInfo-item"
>
<div
class=
"baseInfo-item"
>
...
@@ -1220,4 +1227,32 @@ const companyList = ref([
...
@@ -1220,4 +1227,32 @@ const companyList = ref([
color
:
rgba
(
170
,
173
,
177
,
1
);
color
:
rgba
(
170
,
173
,
177
,
1
);
font-size
:
14px
;
font-size
:
14px
;
}
}
.baseInfo-item
{
display
:
flex
;
align-items
:
flex-start
;
}
.baseInfo-item-title
{
flex
:
0
0
88px
;
/* 固定左侧宽度 */
font-size
:
16px
;
font-weight
:
700
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
white-space
:
nowrap
;
/* 左侧不换行 */
}
.baseInfo-item-content
{
flex
:
1
;
min-width
:
0
;
font-size
:
16px
;
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgb
(
59
,
65
,
75
);
display
:
flex
;
flex-wrap
:
wrap
;
/* 右侧满了再换行 */
gap
:
8px
12px
;
/* 行列间距可调 */
}
.education-item
{
white-space
:
nowrap
;
/* 每个学校+专业作为一个整体不拆行 */
}
</
style
>
</
style
>
\ No newline at end of file
src/views/characterPage/index.vue
浏览文件 @
f921faf1
...
@@ -39,6 +39,7 @@ const getCharacterGlobalInfoFn = async () => {
...
@@ -39,6 +39,7 @@ const getCharacterGlobalInfoFn = async () => {
const
res
=
await
getCharacterGlobalInfo
(
params
);
const
res
=
await
getCharacterGlobalInfo
(
params
);
if
(
res
.
code
===
200
)
{
if
(
res
.
code
===
200
)
{
console
.
log
(
"人物全局信息111"
,
res
);
console
.
log
(
"人物全局信息111"
,
res
);
document
.
title
=
res
.
data
.
name
if
(
res
.
data
)
{
if
(
res
.
data
)
{
characterInfo
.
value
=
res
.
data
;
characterInfo
.
value
=
res
.
data
;
const
personType
=
characterInfo
.
value
.
personType
;
const
personType
=
characterInfo
.
value
.
personType
;
...
...
src/views/ruleRestriction/alliance/index.vue
0 → 100644
浏览文件 @
f921faf1
<
template
>
<div
class=
"page-wrap"
>
<div
class=
"page-inner"
>
<div
class=
"news-header background-as-card"
>
<div
class=
"header-icon-box flex-display-center"
>
<span
class=
"header-icon-text"
>
新闻资讯
</span>
</div>
<div
class=
"header-info"
>
<h1
class=
"text-title-1-bold header-title"
>
{{
newsDetail
.
title
}}
</h1>
<p
class=
"text-tip-1 text-primary-65-clor header-sub"
>
{{
newsDetail
.
subTitle
}}
</p>
<div
class=
"flex-display header-tags"
>
<AreaTag
v-for=
"(tag, index) in newsDetail.tags"
:key=
"index"
:tagName=
"tag"
:tagClass=
"index === 0 ? 'tag3' : 'tag1'"
/>
</div>
</div>
</div>
<div
class=
"flex-display content-row"
>
<div
class=
"left-col"
>
<AnalysisBox
title=
"打压动态"
:showAllBtn=
"false"
>
<div
class=
"news-list-wrap"
>
<div
class=
"news-scroll-area"
>
<div
v-for=
"item in newsList"
:key=
"item.id"
class=
"news-item flex-display mouse-hover"
@
click=
"handleNewsClick(item)"
>
<div
class=
"item-thumb flex-display-center"
>
<span
class=
"item-thumb-text"
>
新闻资讯
</span>
</div>
<div
class=
"item-body"
>
<p
class=
"text-tip-1-bold text-primary-80-clor item-title"
>
{{
item
.
title
}}
</p>
<p
class=
"text-tip-2 text-primary-65-clor item-content"
>
{{
item
.
content
}}
</p>
</div>
<div
class=
"item-meta flex-display"
>
<span
class=
"text-tip-2 text-primary-50-clor"
>
{{
item
.
date
}}
</span>
<span
class=
"text-tip-2 text-primary-50-clor meta-sep"
>
·
</span>
<span
class=
"text-tip-2 text-primary-50-clor"
>
{{
item
.
source
}}
</span>
</div>
</div>
</div>
<div
class=
"pagination-row flex-display"
>
<span
class=
"text-tip-2 text-primary-65-clor"
>
共
{{
pagination
.
total
}}
项动态
</span>
<div
class=
"flex-display pagination-btns"
>
<button
class=
"page-btn"
:disabled=
"pagination.page === 1"
@
click=
"changePage(pagination.page - 1)"
>
<
</button>
<button
class=
"page-btn"
:class=
"
{ active: pagination.page === 1 }" @click="changePage(1)">1
</button>
<span
v-if=
"pagination.page > 3"
class=
"page-ellipsis text-primary-50-clor"
>
...
</span>
<button
v-for=
"p in visiblePages"
:key=
"p"
class=
"page-btn"
:class=
"
{ active: p === pagination.page }"
@click="changePage(p)"
>
{{
p
}}
</button>
<span
v-if=
"pagination.page
<
pagination
.
totalPages
-
2
"
class=
"page-ellipsis text-primary-50-clor"
>
...
</span>
<button
class=
"page-btn"
:class=
"
{ active: pagination.page === pagination.totalPages }" @click="changePage(pagination.totalPages)">
{{
pagination
.
totalPages
}}
</button>
<button
class=
"page-btn"
:disabled=
"pagination.page === pagination.totalPages"
@
click=
"changePage(pagination.page + 1)"
>
>
</button>
</div>
</div>
</div>
</AnalysisBox>
</div>
<div
class=
"right-col"
>
<AnalysisBox
title=
"联盟简介"
:showAllBtn=
"false"
>
<div
class=
"intro-wrap"
>
<div
class=
"intro-row flex-display"
>
<span
class=
"text-tip-2-bold text-primary-80-clor intro-label"
>
时间:
</span>
<span
class=
"text-tip-2 text-primary-65-clor"
>
{{
newsDetail
.
time
}}
</span>
</div>
<div
class=
"intro-row"
>
<span
class=
"text-tip-2-bold text-primary-80-clor intro-label"
>
背景:
</span>
<p
class=
"text-tip-2 text-primary-65-clor intro-bg-text"
>
{{
newsDetail
.
background
}}
</p>
</div>
<div
class=
"intro-row intro-row--last"
>
<span
class=
"text-tip-2-bold text-primary-80-clor intro-label"
>
相关国家:
</span>
<div
class=
"country-grid"
>
<div
v-for=
"(country, index) in newsDetail.countries"
:key=
"index"
class=
"country-item flex-display"
>
<span
class=
"country-dot"
:style=
"
{ background: countryColors[index % countryColors.length] }">
</span>
<span
class=
"text-tip-2 text-primary-80-clor"
>
{{
country
.
name
}}
</span>
</div>
</div>
</div>
</div>
</AnalysisBox>
</div>
</div>
</div>
</div>
</
template
>
<
script
setup
>
import
{
ref
,
computed
,
onMounted
}
from
'vue'
import
{
useRoute
,
useRouter
}
from
'vue-router'
import
AnalysisBox
from
'@/components/base/boxBackground/analysisBox.vue'
import
AreaTag
from
'@/components/base/AreaTag/index.vue'
import
{
getNewsDetail
,
getNewsList
}
from
'./mock/newsDetail'
const
route
=
useRoute
()
const
router
=
useRouter
()
const
countryColors
=
[
'#4A7BF7'
,
'#CE4F51'
,
'#E8BD0B'
,
'#218139'
,
'#FF954D'
]
const
newsId
=
computed
(()
=>
route
.
query
.
id
||
'1'
)
const
newsDetail
=
ref
({
title
:
''
,
subTitle
:
''
,
tags
:
[],
time
:
''
,
background
:
''
,
countries
:
[]
})
const
newsList
=
ref
([])
const
pagination
=
ref
({
page
:
5
,
pageSize
:
10
,
total
:
153
,
totalPages
:
16
})
const
visiblePages
=
computed
(()
=>
{
const
pages
=
[]
const
current
=
pagination
.
value
.
page
const
total
=
pagination
.
value
.
totalPages
let
start
=
Math
.
max
(
2
,
current
-
1
)
let
end
=
Math
.
min
(
total
-
1
,
current
+
1
)
if
(
current
<=
3
)
end
=
Math
.
min
(
4
,
total
-
1
)
if
(
current
>=
total
-
2
)
start
=
Math
.
max
(
total
-
3
,
2
)
for
(
let
i
=
start
;
i
<=
end
;
i
++
)
{
if
(
i
>
1
&&
i
<
total
)
pages
.
push
(
i
)
}
return
pages
})
const
loadNewsDetail
=
()
=>
{
newsDetail
.
value
=
getNewsDetail
(
newsId
.
value
)
}
const
loadNewsList
=
(
page
=
1
)
=>
{
const
data
=
getNewsList
(
page
,
pagination
.
value
.
pageSize
)
newsList
.
value
=
data
.
list
pagination
.
value
.
page
=
data
.
page
pagination
.
value
.
total
=
data
.
total
pagination
.
value
.
totalPages
=
data
.
totalPages
}
const
changePage
=
(
page
)
=>
{
if
(
page
<
1
||
page
>
pagination
.
value
.
totalPages
)
return
loadNewsList
(
page
)
}
const
handleNewsClick
=
(
item
)
=>
{
router
.
push
({
path
:
'/news/detail'
,
query
:
{
id
:
item
.
id
}
})
}
onMounted
(()
=>
{
loadNewsDetail
()
loadNewsList
(
pagination
.
value
.
page
)
})
</
script
>
<
style
lang=
"scss"
scoped
>
.page-wrap
{
width
:
100%
;
min-height
:
100vh
;
background
:
#f7f8f9
;
display
:
flex
;
justify-content
:
center
;
padding
:
20px
0
;
}
.page-inner
{
width
:
1600px
;
}
.news-header
{
display
:
flex
;
align-items
:
center
;
gap
:
20px
;
padding
:
20px
24px
;
margin-bottom
:
16px
;
}
.header-icon-box
{
width
:
100px
;
height
:
76px
;
border-radius
:
8px
;
background
:
linear-gradient
(
135deg
,
#4a7bf7
0%
,
#6b8cff
100%
);
flex-shrink
:
0
;
flex-direction
:
column
;
}
.header-icon-text
{
color
:
#fff
;
font-size
:
14px
;
font-weight
:
600
;
}
.header-title
{
margin
:
0
0
6px
0
;
}
.header-sub
{
margin
:
0
0
10px
0
;
}
.header-tags
{
gap
:
8px
;
}
.content-row
{
gap
:
16px
;
align-items
:
flex-start
;
}
.left-col
{
width
:
1064px
;
height
:
1284px
;
flex-shrink
:
0
;
}
.right-col
{
width
:
522px
;
height
:
auto
;
flex-shrink
:
0
;
}
.news-list-wrap
{
display
:
flex
;
flex-direction
:
column
;
height
:
calc
(
100%
-
48px
);
padding
:
0
20px
;
}
.news-scroll-area
{
flex
:
1
;
min-height
:
0
;
overflow-y
:
auto
;
}
.news-item
{
gap
:
16px
;
padding
:
16px
0
;
border-bottom
:
1px
solid
#eaecee
;
align-items
:
flex-start
;
cursor
:
pointer
;
transition
:
background
0
.15s
;
&
:last-child
{
border-bottom
:
none
;
}
}
.item-thumb
{
width
:
100px
;
height
:
70px
;
border-radius
:
6px
;
background
:
linear-gradient
(
135deg
,
#4a7bf7
0%
,
#6b8cff
100%
);
flex-shrink
:
0
;
}
.item-thumb-text
{
color
:
#fff
;
font-size
:
12px
;
}
.item-body
{
flex
:
1
;
min-width
:
0
;
}
.item-title
{
margin
:
0
0
6px
0
;
overflow
:
hidden
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
}
.item-content
{
margin
:
0
;
overflow
:
hidden
;
display
:
-
webkit-box
;
-webkit-line-clamp
:
3
;
-webkit-box-orient
:
vertical
;
}
.item-meta
{
flex-shrink
:
0
;
align-items
:
center
;
gap
:
4px
;
white-space
:
nowrap
;
}
.meta-sep
{
margin
:
0
2px
;
}
.pagination-row
{
justify-content
:
space-between
;
align-items
:
center
;
padding
:
14px
0
;
border-top
:
1px
solid
#eaecee
;
flex-shrink
:
0
;
}
.pagination-btns
{
gap
:
4px
;
align-items
:
center
;
}
.page-ellipsis
{
padding
:
0
4px
;
font-size
:
14px
;
}
.page-btn
{
min-width
:
32px
;
height
:
32px
;
padding
:
0
8px
;
border
:
1px
solid
#e6e7e8
;
background
:
#fff
;
border-radius
:
4px
;
font-size
:
14px
;
color
:
#3b414b
;
cursor
:
pointer
;
transition
:
all
0
.15s
;
font-family
:
inherit
;
&
:hover:not
(
:disabled
)
{
border-color
:
#055fc2
;
color
:
#055fc2
;
}
&
.active
{
background
:
#055fc2
;
border-color
:
#055fc2
;
color
:
#fff
;
}
&
:disabled
{
opacity
:
0
.4
;
cursor
:
not
-
allowed
;
}
}
.intro-wrap
{
padding
:
16px
20px
;
}
.intro-row
{
padding-bottom
:
16px
;
margin-bottom
:
16px
;
border-bottom
:
1px
solid
#eaecee
;
&
.intro-row--last
{
border-bottom
:
none
;
margin-bottom
:
0
;
padding-bottom
:
0
;
}
}
.intro-label
{
white-space
:
nowrap
;
margin-right
:
4px
;
}
.intro-bg-text
{
margin
:
8px
0
0
0
;
line-height
:
1
.7
;
}
.country-grid
{
display
:
grid
;
grid-template-columns
:
repeat
(
2
,
1fr
);
gap
:
10px
16px
;
margin-top
:
10px
;
}
.country-item
{
align-items
:
center
;
gap
:
8px
;
}
.country-dot
{
width
:
12px
;
height
:
12px
;
border-radius
:
50%
;
flex-shrink
:
0
;
}
</
style
>
src/views/ruleRestriction/alliance/mock/newsDetail.js
0 → 100644
浏览文件 @
f921faf1
const
generateDate
=
()
=>
{
const
date
=
new
Date
()
const
year
=
date
.
getFullYear
()
const
month
=
String
(
date
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
)
const
day
=
String
(
date
.
getDate
()).
padStart
(
2
,
'0'
)
return
`
${
year
}
年
${
month
}
月
${
day
}
日`
}
const
generateMonthDay
=
()
=>
{
const
date
=
new
Date
()
const
month
=
String
(
date
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
)
const
day
=
String
(
date
.
getDate
()).
padStart
(
2
,
'0'
)
return
`
${
month
}
-
${
day
}
`
}
const
sources
=
[
'华盛顿邮报'
,
'福克斯新闻网'
,
'纽约时报'
,
'CNN'
,
'BBC'
]
const
getRandomSource
=
()
=>
sources
[
Math
.
floor
(
Math
.
random
()
*
sources
.
length
)]
export
const
getNewsDetail
=
(
id
)
=>
{
return
{
id
:
id
||
'1'
,
title
:
'新闻介绍'
,
subTitle
:
'news'
,
tags
:
[
'新闻介绍'
,
'推荐新闻'
],
coverImage
:
'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxMjAiIGhlaWdodD0iOTAiIGZpbGw9IiM0YTdiZjciLz48L3N2Zz4='
,
time
:
generateDate
(),
background
:
'住建部联合多部门发布新政,全国 27 个试点城市全面启动老旧小区加装电梯工作,政府补贴比例提至 60%,简化审批流程至 15 个工作日。预计年内完成超 5000 部加装,解决高层老人出行难题。同步完善无障碍配套,提升民居住幸福感。'
,
countries
:
[
{
name
:
'美国'
,
flag
:
'🇺🇸'
},
{
name
:
'日本'
,
flag
:
'🇯🇵'
},
{
name
:
'韩国'
,
flag
:
'🇰🇷'
},
{
name
:
'中国台湾'
,
flag
:
'🇨🇳'
}
]
}
}
export
const
getNewsList
=
(
page
=
1
,
pageSize
=
10
)
=>
{
const
total
=
153
const
list
=
[]
for
(
let
i
=
0
;
i
<
pageSize
;
i
++
)
{
const
id
=
(
page
-
1
)
*
pageSize
+
i
+
1
list
.
push
({
id
:
id
,
title
:
`多地启动老旧小区电梯加装 - 第
${
id
}
条`
,
content
:
'住建部联合多部门发布新政,全国 27 个试点城市全面启动老旧小区加装电梯工作,政府补贴比例提至 60%,简化审批流程至 15 个工作日。预计年内完成超 5000 部加装,解决高层老人出行难题,同步完善无障碍配套,提升居民居住幸福感。'
,
date
:
generateMonthDay
(),
source
:
getRandomSource
(),
image
:
'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxMjAiIGhlaWdodD0iOTAiIGZpbGw9IiM0YTdiZjciLz48L3N2Zz4='
})
}
return
{
list
,
total
,
page
,
pageSize
,
totalPages
:
Math
.
ceil
(
total
/
pageSize
)
}
}
export
const
getNewsById
=
(
id
)
=>
{
return
{
id
:
id
,
title
:
`多地启动老旧小区电梯加装`
,
content
:
'住建部联合多部门发布新政,全国 27 个试点城市全面启动老旧小区加装电梯工作,政府补贴比例提至 60%,简化审批流程至 15 个工作日。预计年内完成超 5000 部加装,解决高层老人出行难题,同步完善无障碍配套,提升居民居住幸福感。'
,
date
:
generateDate
(),
source
:
getRandomSource
(),
image
:
'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxMjAiIGhlaWdodD0iOTAiIGZpbGw9IiM0YTdiZjciLz48L3N2Zz4='
,
background
:
'住建部联合多部门发布新政,全国 27 个试点城市全面启动老旧小区加装电梯工作,政府补贴比例提至 60%,简化审批流程至 15 个工作日。预计年内完成超 5000 部加装,解决高层老人出行难题。同步完善无障碍配套,提升民居住幸福感。'
,
countries
:
[
{
name
:
'美国'
,
flag
:
'🇺🇸'
},
{
name
:
'日本'
,
flag
:
'🇯🇵'
},
{
name
:
'韩国'
,
flag
:
'🇰🇷'
},
{
name
:
'中国台湾'
,
flag
:
'🇨🇳'
}
]
}
}
src/views/ruleRestriction/components/resLib/index.vue
浏览文件 @
f921faf1
...
@@ -44,7 +44,7 @@
...
@@ -44,7 +44,7 @@
</div>
</div>
<div
class=
"right-main"
>
<div
class=
"right-main"
>
<div
class=
"main-content"
>
<div
class=
"main-content"
>
<div
v-for=
"item in mainDataList"
:key=
"item.id"
class=
"main-item"
>
<div
v-for=
"item in mainDataList"
:key=
"item.id"
class=
"main-item"
@
click=
"handleClick(item)"
>
<div
class=
"date"
>
{{
getDate
(
item
)
}}
</div>
<div
class=
"date"
>
{{
getDate
(
item
)
}}
</div>
<img
:src=
"item.ORGPICTURE"
alt
class=
"img"
/>
<img
:src=
"item.ORGPICTURE"
alt
class=
"img"
/>
<div
class=
"box"
>
<div
class=
"box"
>
...
@@ -117,7 +117,8 @@
...
@@ -117,7 +117,8 @@
</div>
</div>
<div
class=
"right-unshow"
>
<div
class=
"right-unshow"
>
<div
class=
"top"
>
<div
class=
"top"
>
<div
v-for=
"item in unionDataList"
:key=
"item.id"
class=
"top-item"
>
<div
v-for=
"item in unionDataList"
:key=
"item.id"
class=
"top-item"
@
click=
"handleAllianceClick(item)"
>
<div
class=
"title"
>
<div
class=
"title"
>
<div
class=
"img-list"
>
<div
class=
"img-list"
>
<img
class=
"img-style"
:src=
"ele.COUNTRYIMAGE"
v-for=
"ele in item.countries"
alt
/>
<img
class=
"img-style"
:src=
"ele.COUNTRYIMAGE"
v-for=
"ele in item.countries"
alt
/>
...
@@ -186,6 +187,15 @@ const handleClick = item => {
...
@@ -186,6 +187,15 @@ const handleClick = item => {
});
});
};
};
const
handleAllianceClick
=
item
=>
{
router
.
push
({
path
:
"/ruleRestrictions/alliance"
,
query
:
{
id
:
item
.
ACTAID
}
});
};
const
isShow
=
ref
(
true
);
const
isShow
=
ref
(
true
);
const
navList
=
ref
([
"规则限制政令"
,
"排华科技联盟"
]);
const
navList
=
ref
([
"规则限制政令"
,
"排华科技联盟"
]);
const
activeItem
=
ref
(
"规则限制政令"
);
const
activeItem
=
ref
(
"规则限制政令"
);
...
@@ -632,12 +642,14 @@ const handlePageChangeACTA = p => {
...
@@ -632,12 +642,14 @@ const handlePageChangeACTA = p => {
display
:
flex
;
display
:
flex
;
.left
{
.left
{
width
:
300px
;
width
:
300px
;
height
:
4
29
px
;
height
:
4
80
px
;
margin-right
:
16px
;
margin-right
:
16px
;
border-radius
:
10px
;
border-radius
:
10px
;
background-color
:
#fff
;
background-color
:
#fff
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
position
:
relative
;
position
:
relative
;
padding
:
16px
0
24px
0
;
box-sizing
:
border-box
;
.left-ti1
{
.left-ti1
{
width
:
8px
;
width
:
8px
;
height
:
16px
;
height
:
16px
;
...
@@ -669,57 +681,64 @@ const handlePageChangeACTA = p => {
...
@@ -669,57 +681,64 @@ const handlePageChangeACTA = p => {
}
}
.left-content
{
.left-content
{
width
:
253px
;
width
:
253px
;
// height: 132px;
height
:
auto
;
height
:
auto
;
margin-left
:
25px
;
margin-left
:
25px
;
margin-top
:
13px
;
margin-top
:
13px
;
display
:
flex
;
display
:
flex
;
flex-direction
:
row
;
flex-wrap
:
wrap
;
flex-wrap
:
wrap
;
gap
:
8px
4px
;
align-content
:
flex-start
;
.el-checkbox
{
:deep
(
.el-checkbox
)
{
width
:
50%
;
width
:
calc
(
50%
-
2px
)
;
margin-right
:
0
;
margin-right
:
0
;
margin-bottom
:
4px
;
margin-bottom
:
0
;
font-size
:
16px
;
display
:
flex
;
font-weight
:
400
;
align-items
:
center
;
font-family
:
"Microsoft YaHei"
;
gap
:
8px
;
line-height
:
24px
;
flex-shrink
:
0
;
color
:
rgb
(
95
,
101
,
108
);
height
:
auto
;
}
.el-checkbox__input
{
.left-item
{
.el-checkbox__inner
{
width
:
120px
;
width
:
14px
;
height
:
30px
;
height
:
14px
;
margin-bottom
:
4px
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
font-size
:
16px
;
border-radius
:
4px
;
font-weight
:
400
;
background
:
#fff
;
font-family
:
"Microsoft YaHei"
;
box-sizing
:
border-box
;
line-height
:
24px
;
&
:
:
after
{
color
:
rgb
(
95
,
101
,
108
);
display
:
none
;
input
[
type
=
"checkbox"
]
{
}
-webkit-appearance
:
none
;
}
appearance
:
none
;
&
.is-checked
.el-checkbox__inner
{
width
:
14px
;
background-color
:
#055FC2
;
height
:
14px
;
border-color
:
#055FC2
;
margin-right
:
8px
;
&
:
:
after
{
border
:
1px
solid
rgb
(
200
,
204
,
210
);
display
:
block
;
border-radius
:
4px
;
content
:
""
;
background-color
:
#fff
;
width
:
4px
;
vertical-align
:
middle
;
height
:
8px
;
left
:
4px
;
top
:
1px
;
border
:
1
.5px
solid
#fff
;
border-top
:
none
;
border-left
:
none
;
transform
:
rotate
(
45deg
);
}
}
}
}
input
[
type
=
"checkbox"
]
:checked
{
.el-checkbox__label
{
background-color
:
rgb
(
5
,
95
,
194
);
font-size
:
16px
;
border-color
:
rgb
(
5
,
95
,
194
);
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
white-space
:
nowrap
;
padding-left
:
0
;
}
}
input
[
type
=
"checkbox"
]
:checked::after
{
&
.is-checked
.el-checkbox__label
{
content
:
""
;
color
:
rgba
(
95
,
101
,
108
,
1
);
display
:
block
;
width
:
4px
;
height
:
8px
;
margin
:
1px
auto
0
;
border
:
2px
solid
#fff
;
border-top
:
none
;
border-left
:
none
;
transform
:
rotate
(
45deg
);
}
}
}
}
}
}
...
@@ -936,12 +955,14 @@ const handlePageChangeACTA = p => {
...
@@ -936,12 +955,14 @@ const handlePageChangeACTA = p => {
}
}
.left-unshow
{
.left-unshow
{
width
:
300px
;
width
:
300px
;
height
:
654
px
;
height
:
750
px
;
margin-right
:
16px
;
margin-right
:
16px
;
border-radius
:
10px
;
border-radius
:
10px
;
background-color
:
#fff
;
background-color
:
#fff
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
position
:
relative
;
position
:
relative
;
padding
:
16px
0
24px
0
;
box-sizing
:
border-box
;
.left-ti1
{
.left-ti1
{
width
:
8px
;
width
:
8px
;
height
:
16px
;
height
:
16px
;
...
@@ -983,45 +1004,63 @@ const handlePageChangeACTA = p => {
...
@@ -983,45 +1004,63 @@ const handlePageChangeACTA = p => {
}
}
.left-content
{
.left-content
{
width
:
253px
;
width
:
253px
;
// height: 132px;
margin-left
:
25px
;
margin-left
:
25px
;
margin-top
:
13px
;
margin-top
:
13px
;
display
:
flex
;
display
:
flex
;
flex-direction
:
row
;
flex-wrap
:
wrap
;
flex-wrap
:
wrap
;
.left-item
{
gap
:
8px
4px
;
width
:
120px
;
align-content
:
flex-start
;
height
:
30px
;
margin-bottom
:
4px
;
:deep
(
.el-checkbox
)
{
font-size
:
16px
;
width
:
calc
(
50%
-
2px
);
font-weight
:
400
;
margin-right
:
0
;
font-family
:
"Microsoft YaHei"
;
margin-bottom
:
0
;
line-height
:
24px
;
display
:
flex
;
color
:
rgb
(
95
,
101
,
108
);
align-items
:
center
;
input
[
type
=
"checkbox"
]
{
gap
:
8px
;
-webkit-appearance
:
none
;
flex-shrink
:
0
;
appearance
:
none
;
height
:
auto
;
width
:
14px
;
.el-checkbox__input
{
height
:
14px
;
.el-checkbox__inner
{
margin-right
:
8px
;
width
:
14px
;
border
:
1px
solid
rgb
(
200
,
204
,
210
);
height
:
14px
;
border-radius
:
4px
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
background-color
:
#fff
;
border-radius
:
4px
;
vertical-align
:
middle
;
background
:
#fff
;
box-sizing
:
border-box
;
&
:
:
after
{
display
:
none
;
}
}
&
.is-checked
.el-checkbox__inner
{
background-color
:
#055FC2
;
border-color
:
#055FC2
;
&
:
:
after
{
display
:
block
;
content
:
""
;
width
:
4px
;
height
:
8px
;
left
:
4px
;
top
:
1px
;
border
:
1
.5px
solid
#fff
;
border-top
:
none
;
border-left
:
none
;
transform
:
rotate
(
45deg
);
}
}
}
}
input
[
type
=
"checkbox"
]
:checked
{
.el-checkbox__label
{
background-color
:
rgb
(
5
,
95
,
194
);
font-size
:
16px
;
border-color
:
rgb
(
5
,
95
,
194
);
font-weight
:
400
;
font-family
:
"Microsoft YaHei"
;
line-height
:
24px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
white-space
:
nowrap
;
padding-left
:
0
;
}
}
input
[
type
=
"checkbox"
]
:checked::after
{
&
.is-checked
.el-checkbox__label
{
content
:
""
;
color
:
rgba
(
95
,
101
,
108
,
1
);
display
:
block
;
width
:
4px
;
height
:
8px
;
margin
:
1px
auto
0
;
border
:
2px
solid
#fff
;
border-top
:
none
;
border-left
:
none
;
transform
:
rotate
(
45deg
);
}
}
}
}
}
}
...
@@ -1050,6 +1089,7 @@ const handlePageChangeACTA = p => {
...
@@ -1050,6 +1089,7 @@ const handlePageChangeACTA = p => {
border-radius
:
10px
;
border-radius
:
10px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
padding
:
18px
33px
18px
26px
;
padding
:
18px
33px
18px
26px
;
cursor
:
pointer
;
.title
{
.title
{
width
:
574px
;
width
:
574px
;
height
:
72px
;
height
:
72px
;
...
...
src/views/technologyFigures/component/PersonTable.vue
浏览文件 @
f921faf1
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
<div
class=
"row-col col-person"
>
<div
class=
"row-col col-person"
>
<div
style=
"margin: 7px 12px 7px 24px;"
>
<div
style=
"margin: 7px 12px 7px 24px;"
>
<img
:src=
"item.avatar"
class=
"avatar"
alt=
"avatar"
/>
<img
:src=
"item.avatar"
class=
"avatar"
alt=
"avatar"
/>
<div
class=
"person-tags"
>
<div
class=
"person-tags"
>
<div
class=
"person-tag-bg"
v-for=
"(tag, tIdx) in item.tags"
:key=
"tIdx"
>
<div
class=
"person-tag-bg"
v-for=
"(tag, tIdx) in item.tags"
:key=
"tIdx"
>
<img
:src=
"getTagIconUrl(tag)"
class=
"tag-icon"
alt=
"tag"
/>
<img
:src=
"getTagIconUrl(tag)"
class=
"tag-icon"
alt=
"tag"
/>
</div>
</div>
...
...
src/views/technologyFigures/component/SourceLibrary.vue
浏览文件 @
f921faf1
...
@@ -7,33 +7,23 @@
...
@@ -7,33 +7,23 @@
:key=
"index"
:key=
"index"
class=
"source-library-card"
class=
"source-library-card"
@
click=
"handleClcikToCharacter(item.id)"
@
click=
"handleClcikToCharacter(item.id)"
>
>
<div
class=
"source-library-avatar-wrapper"
>
<div
class=
"source-library-avatar-wrapper"
>
<img
:src=
"item.avatar"
alt=
""
class=
"source-library-avatar"
/>
<img
:src=
"item.avatar"
alt=
""
class=
"source-library-avatar"
/>
</div>
</div>
<div
class=
"source-library-text-content"
>
<div
class=
"source-library-text-content"
>
<div
style=
"width: 240px; height: 120px; display: flex; flex-direction: column"
>
<div
class=
"card-main"
:class=
"
{ 'no-title': !item.title }">
<h3
class=
"source-library-name"
>
{{
item
.
name
}}
</h3>
<h3
class=
"source-library-name"
>
{{
item
.
name
}}
</h3>
<p
class=
"source-library-title"
>
{{
item
.
title
}}
</p>
<p
class=
"source-library-title"
v-if=
"item.title"
>
{{
item
.
title
}}
</p>
<div
class=
"taglist"
>
<div
class=
"taglist"
>
<p
<AreaTag
class=
"source-library-tag"
v-for=
"(value, index) in item.tag"
v-for=
"(value, index) in item.tag"
:key=
"index"
:key=
"index"
:tagName=
"value.typeName"
:class=
"
{
/>
tag1: value.typeId === '001',
</div>
tag2: value.typeId === '002',
</div>
tag3: value.typeId === '003',
</div>
tag4: value.typeId === '004',
tag5: value.typeId === '005',
tag6: value.typeId === '006'
}"
>
{{
value
.
typeName
}}
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"page"
>
<div
class=
"page"
>
...
@@ -57,7 +47,7 @@ import { ref, onMounted, watch } from "vue";
...
@@ -57,7 +47,7 @@ import { ref, onMounted, watch } from "vue";
import
{
useRouter
}
from
"vue-router"
;
import
{
useRouter
}
from
"vue-router"
;
import
DefaultIcon1
from
"@/assets/icons/default-icon1.png"
;
import
DefaultIcon1
from
"@/assets/icons/default-icon1.png"
;
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
import
DefaultIcon2
from
"@/assets/icons/default-icon2.png"
;
import
AreaTag
from
'@/components/base/AreaTag/index.vue'
import
{
getPersonResource
,
getPersonSummaryInfo
}
from
"@/api/technologyFigures/technologyFigures"
;
import
{
getPersonResource
,
getPersonSummaryInfo
}
from
"@/api/technologyFigures/technologyFigures"
;
const
props
=
defineProps
({
const
props
=
defineProps
({
...
@@ -298,6 +288,7 @@ const handlePageChange = p => {
...
@@ -298,6 +288,7 @@ const handlePageChange = p => {
gap
:
10
px
;
gap
:
10
px
;
margin
-
top
:
auto
;
margin
-
top
:
auto
;
margin
-
bottom
:
0
px
;
margin
-
bottom
:
0
px
;
flex
-
wrap
:
wrap
;
}
}
.
source
-
library
-
tag
{
.
source
-
library
-
tag
{
...
@@ -424,4 +415,27 @@ const handlePageChange = p => {
...
@@ -424,4 +415,27 @@ const handlePageChange = p => {
border
-
color
:
rgb
(
235
,
238
,
242
);
border
-
color
:
rgb
(
235
,
238
,
242
);
background
-
color
:
#
fff
;
background
-
color
:
#
fff
;
}
}
.
card
-
main
{
width
:
240
px
;
min
-
height
:
120
px
;
/* 原来固定 height 改为 min-height */
display
:
flex
;
flex
-
direction
:
column
;
}
.
source
-
library
-
title
{
margin
:
11
px
0
0
0
;
}
.
taglist
{
display
:
flex
;
gap
:
10
px
;
flex
-
wrap
:
wrap
;
margin
-
top
:
auto
;
margin
-
bottom
:
0
;
}
/* title 为空时,让标签更靠上 */
.
card
-
main
.
no
-
title
.
taglist
{
margin
-
top
:
10
px
;
/* 不再 auto 顶到底部 */
}
<
/style>
<
/style>
\ No newline at end of file
src/views/technologyFigures/index.vue
浏览文件 @
f921faf1
...
@@ -234,7 +234,7 @@
...
@@ -234,7 +234,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"box5-main"
><WordCloudChart
v-if=
"WordLoading"
:data=
"CharacterOpinionWordCloud"
/></div>
<div
class=
"box5-main"
><WordCloudChart
width=
"790px"
v-if=
"WordLoading"
:data=
"CharacterOpinionWordCloud"
/></div>
</div>
</div>
<div
class=
"box6"
>
<div
class=
"box6"
>
<div
class=
"box6-header"
style=
"width: 790px"
>
<div
class=
"box6-header"
style=
"width: 790px"
>
...
@@ -1817,7 +1817,7 @@ onMounted(async () => {
...
@@ -1817,7 +1817,7 @@ onMounted(async () => {
background
:
rgba
(
20
,
89
,
187
,
0
);
background
:
rgba
(
20
,
89
,
187
,
0
);
margin-right
:
20px
;
margin-right
:
20px
;
cursor
:
pointer
;
cursor
:
pointer
;
white-space
:
nowrap
;
&
:hover
{
&
:hover
{
background
:
rgba
(
20
,
89
,
187
,
0
.1
);
background
:
rgba
(
20
,
89
,
187
,
0
.1
);
}
}
...
...
src/views/technologyFigures/utils/multiLineChart.js
浏览文件 @
f921faf1
...
@@ -12,7 +12,7 @@ const getMultiLineChart = (dataX, dataY1, dataY2, dataY3, dataY4, dataY5, dataY6
...
@@ -12,7 +12,7 @@ const getMultiLineChart = (dataX, dataY1, dataY2, dataY3, dataY4, dataY5, dataY6
}
}
},
},
grid
:
{
grid
:
{
top
:
"
15
px"
,
top
:
"
50
px"
,
right
:
"50px"
,
right
:
"50px"
,
bottom
:
"0px"
,
bottom
:
"0px"
,
left
:
"40px"
,
left
:
"40px"
,
...
@@ -21,6 +21,8 @@ const getMultiLineChart = (dataX, dataY1, dataY2, dataY3, dataY4, dataY5, dataY6
...
@@ -21,6 +21,8 @@ const getMultiLineChart = (dataX, dataY1, dataY2, dataY3, dataY4, dataY5, dataY6
legend
:
{
legend
:
{
data
:
[
"人工智能"
,
"集成电路"
,
"量子科技"
,
"生物科技"
,
"通信网络"
,
"能源"
],
data
:
[
"人工智能"
,
"集成电路"
,
"量子科技"
,
"生物科技"
,
"通信网络"
,
"能源"
],
show
:
true
,
show
:
true
,
top
:
"0px"
,
left
:
"center"
,
textStyle
:
{
textStyle
:
{
color
:
"rgba(95, 101, 108, 1)"
,
color
:
"rgba(95, 101, 108, 1)"
,
fontFamily
:
"Microsoft YaHei"
,
fontFamily
:
"Microsoft YaHei"
,
...
...
src/views/thinkTank/components/HomeMainFooterSurvey.vue
浏览文件 @
f921faf1
<
template
>
<
template
>
<!-- 调查项目:与智库报告相同的「全部」互斥逻辑 -->
<div
class=
"home-main-footer-main"
>
<div
class=
"home-main-footer-main"
>
<div
class=
"left"
>
<div
class=
"left"
>
<div
class=
"select-box"
>
<div
class=
"select-box"
>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论