Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
23fb0f30
提交
23fb0f30
authored
11月 19, 2025
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update
上级
46febd14
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
946 行增加
和
25 行删除
+946
-25
index.js
src/router/index.js
+10
-1
index.vue
src/views/bill/billHome/index.vue
+21
-9
ai-avator.png
...iews/comprehensiveSearch/chat/assets/images/ai-avator.png
+0
-0
ai.png
src/views/comprehensiveSearch/chat/assets/images/ai.png
+0
-0
attach.png
src/views/comprehensiveSearch/chat/assets/images/attach.png
+0
-0
down.png
src/views/comprehensiveSearch/chat/assets/images/down.png
+0
-0
microphone.png
...ews/comprehensiveSearch/chat/assets/images/microphone.png
+0
-0
submit.png
src/views/comprehensiveSearch/chat/assets/images/submit.png
+0
-0
index.vue
src/views/comprehensiveSearch/chat/index.vue
+628
-0
index.vue
src/views/comprehensiveSearch/index.vue
+8
-1
img1.png
.../comprehensiveSearch/searchResults/assets/images/img1.png
+0
-0
img2.png
.../comprehensiveSearch/searchResults/assets/images/img2.png
+0
-0
img3.png
.../comprehensiveSearch/searchResults/assets/images/img3.png
+0
-0
index.vue
src/views/comprehensiveSearch/searchResults/index.vue
+256
-14
index.vue
src/views/decree/decreeHome/index.vue
+12
-0
index.vue
...views/marketAccessRestrictions/marketAccessHome/index.vue
+11
-0
没有找到文件。
src/router/index.js
浏览文件 @
23fb0f30
...
@@ -53,6 +53,7 @@ import Portal2 from '@/views/portals/portal2/index.vue';
...
@@ -53,6 +53,7 @@ import Portal2 from '@/views/portals/portal2/index.vue';
// 综合搜索
// 综合搜索
import
ComprehensiveSearch
from
'@/views/comprehensiveSearch/index.vue'
import
ComprehensiveSearch
from
'@/views/comprehensiveSearch/index.vue'
import
SearchResults
from
'@/views/comprehensiveSearch/searchResults/index.vue'
import
SearchResults
from
'@/views/comprehensiveSearch/searchResults/index.vue'
import
Chat
from
'@/views/comprehensiveSearch/chat/index.vue'
const
routes
=
[
const
routes
=
[
// 智能写报
// 智能写报
...
@@ -429,7 +430,7 @@ const routes = [
...
@@ -429,7 +430,7 @@ const routes = [
title
:
"综合搜索"
title
:
"综合搜索"
}
}
},
},
{
{
path
:
"/searchResults"
,
path
:
"/searchResults"
,
name
:
"searchResults"
,
name
:
"searchResults"
,
component
:
SearchResults
,
component
:
SearchResults
,
...
@@ -437,6 +438,14 @@ const routes = [
...
@@ -437,6 +438,14 @@ const routes = [
title
:
"搜索结果"
title
:
"搜索结果"
}
}
},
},
{
path
:
"/chat"
,
name
:
"chat"
,
component
:
Chat
,
meta
:
{
title
:
"智能问答"
}
},
];
];
const
router
=
createRouter
({
const
router
=
createRouter
({
...
...
src/views/bill/billHome/index.vue
浏览文件 @
23fb0f30
...
@@ -212,7 +212,7 @@
...
@@ -212,7 +212,7 @@
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/box2-footer-icon.png"
alt=
""
/>
<img
src=
"./assets/images/box2-footer-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"text"
>
{{
"
风险处理
"
}}
</div>
<div
class=
"text"
>
{{
"
查看更多
"
}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
@@ -1707,7 +1707,7 @@ onMounted(async () => {
...
@@ -1707,7 +1707,7 @@ onMounted(async () => {
height
:
100
%
;
height
:
100
%
;
}
}
.
inner
-
box
{
.
inner
-
box
{
width
:
330
px
;
width
:
100
%
;
height
:
93
px
;
height
:
93
px
;
background
:
rgba
(
10
,
18
,
30
,
0.75
);
background
:
rgba
(
10
,
18
,
30
,
0.75
);
position
:
absolute
;
position
:
absolute
;
...
@@ -1719,7 +1719,7 @@ onMounted(async () => {
...
@@ -1719,7 +1719,7 @@ onMounted(async () => {
height
:
30
px
;
height
:
30
px
;
display
:
flex
;
display
:
flex
;
.
inner
-
box
-
title
{
.
inner
-
box
-
title
{
width
:
270
px
;
flex
:
9
;
color
:
rgba
(
255
,
255
,
255
,
1
);
color
:
rgba
(
255
,
255
,
255
,
1
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
Microsoft
YaHei
;
font
-
size
:
16
px
;
font
-
size
:
16
px
;
...
@@ -1730,7 +1730,7 @@ onMounted(async () => {
...
@@ -1730,7 +1730,7 @@ onMounted(async () => {
white
-
space
:
nowrap
;
white
-
space
:
nowrap
;
}
}
.
inner
-
box
-
time
{
.
inner
-
box
-
time
{
width
:
60
px
;
flex
:
2
;
height
:
30
px
;
height
:
30
px
;
color
:
rgba
(
255
,
255
,
255
,
0.65
);
color
:
rgba
(
255
,
255
,
255
,
0.65
);
font
-
family
:
Microsoft
YaHei
;
font
-
family
:
Microsoft
YaHei
;
...
@@ -1743,7 +1743,7 @@ onMounted(async () => {
...
@@ -1743,7 +1743,7 @@ onMounted(async () => {
}
}
}
}
.
inner
-
box
-
content
{
.
inner
-
box
-
content
{
width
:
330
px
;
width
:
100
%
;
height
:
40
px
;
height
:
40
px
;
overflow
:
hidden
;
overflow
:
hidden
;
color
:
rgba
(
255
,
255
,
255
,
0.8
);
color
:
rgba
(
255
,
255
,
255
,
0.8
);
...
@@ -1757,7 +1757,7 @@ onMounted(async () => {
...
@@ -1757,7 +1757,7 @@ onMounted(async () => {
}
}
}
}
.
box2
{
.
box2
{
flex
:
1
;
width
:
520
px
;
height
:
450
px
;
height
:
450
px
;
box
-
shadow
:
0
px
0
px
15
px
0
px
rgba
(
22
,
119
,
255
,
0.1
);
box
-
shadow
:
0
px
0
px
15
px
0
px
rgba
(
22
,
119
,
255
,
0.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
...
@@ -1871,16 +1871,16 @@ onMounted(async () => {
...
@@ -1871,16 +1871,16 @@ onMounted(async () => {
}
}
.
box2
-
footer
{
.
box2
-
footer
{
position
:
absolute
;
position
:
absolute
;
left
:
4
0
px
;
left
:
3
0
px
;
bottom
:
20
px
;
bottom
:
20
px
;
width
:
4
3
0
px
;
width
:
4
6
0
px
;
height
:
42
px
;
height
:
42
px
;
display
:
flex
;
display
:
flex
;
flex
-
direction
:
row
;
flex
-
direction
:
row
;
justify
-
content
:
center
;
justify
-
content
:
center
;
align
-
items
:
center
;
align
-
items
:
center
;
border
-
radius
:
6
px
;
border
-
radius
:
6
px
;
background
:
rgba
(
22
,
119
,
255
,
1
);
background
:
var
(
--
color
-
main
-
active
);
cursor
:
pointer
;
cursor
:
pointer
;
.
icon
{
.
icon
{
width
:
16
px
;
width
:
16
px
;
...
@@ -2792,4 +2792,15 @@ onMounted(async () => {
...
@@ -2792,4 +2792,15 @@ onMounted(async () => {
}
}
}
}
}
}
:
deep
(.
el
-
input__wrapper
)
{
box
-
shadow
:
none
;
}
:
deep
(.
el
-
input__wrapper
:
hover
)
{
box
-
shadow
:
none
!
important
;
}
:
deep
(.
el
-
input__wrapper
.
is
-
focus
)
{
box
-
shadow
:
none
!
important
;
}
<
/style>
<
/style>
\ No newline at end of file
src/views/comprehensiveSearch/chat/assets/images/ai-avator.png
0 → 100644
浏览文件 @
23fb0f30
800 Bytes
src/views/comprehensiveSearch/chat/assets/images/ai.png
0 → 100644
浏览文件 @
23fb0f30
1.4 KB
src/views/comprehensiveSearch/chat/assets/images/attach.png
0 → 100644
浏览文件 @
23fb0f30
2.6 KB
src/views/comprehensiveSearch/chat/assets/images/down.png
0 → 100644
浏览文件 @
23fb0f30
590 Bytes
src/views/comprehensiveSearch/chat/assets/images/microphone.png
0 → 100644
浏览文件 @
23fb0f30
2.0 KB
src/views/comprehensiveSearch/chat/assets/images/submit.png
0 → 100644
浏览文件 @
23fb0f30
871 Bytes
src/views/comprehensiveSearch/chat/index.vue
0 → 100644
浏览文件 @
23fb0f30
<
template
>
<div
class=
"wrapper"
>
<div
class=
"header"
><span>
首页
</span>
>
<span>
综合检索
</span>
>
<span>
智能问答
</span></div>
<div
class=
"main"
>
<div
class=
"left"
>
<div
class=
"left-header"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/ai.png"
alt=
""
/>
</div>
<el-input
placeholder=
"新对话"
v-model=
"newChatTitle"
style=
"width: 220px"
/>
</div>
<div
class=
"left-main"
>
<div
class=
"left-main-title"
>
{{
"历史对话"
}}
</div>
<div
class=
"left-list"
>
<div
class=
"left-list-item"
:class=
"
{ itemActive: currentChatId === item.id }"
v-for="(item, index) in chatList"
:key="index"
>
{{
item
.
title
}}
</div>
</div>
</div>
</div>
<div
class=
"right"
>
<div
class=
"right-header"
>
{{
curChatTitle
}}
</div>
<div
class=
"right-main"
>
<div
class=
"right-main-content"
>
<div
class=
"chat-content"
ref=
"contentContainer"
>
<!-- 消息列表 -->
<div
class=
"message-list"
>
<div
v-for=
"(message, index) in messages"
:key=
"index"
>
<!-- AI 消息 -->
<div
v-if=
"message.type === 'ai'"
class=
"ai-item"
>
<div
class=
"ai-header"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/ai-avator.png"
alt=
""
/>
</div>
<div
class=
"text"
>
{{
`已深度思考(用时6秒钟)`
}}
</div>
</div>
<div
class=
"content ai-content"
v-html=
"renderMarkdown(message.content)"
></div>
</div>
<!-- 用户消息 -->
<div
v-else
class=
"user-item"
>
<div
class=
"user-bubble"
>
<div
class=
"user-content"
>
{{
message
.
content
}}
</div>
</div>
</div>
</div>
<!-- 加载状态 -->
<div
v-if=
"isLoading"
class=
"ai-item"
>
<div
class=
"ai-header"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/ai-avator.png"
alt=
""
/>
</div>
<div
class=
"text"
>
{{
`正在思考中,请稍候`
}}
</div>
</div>
<div
class=
"loading-indicator"
>
<span
class=
"dot"
></span>
<span
class=
"dot"
></span>
<span
class=
"dot"
></span>
</div>
</div>
</div>
</div>
</div>
<div
class=
"right-main-footer"
>
<el-input
type=
"textarea"
placeholder=
"发送消息"
:rows=
"4"
v-model=
"userInput"
/>
<div
class=
"input-footer"
>
<div
class=
"icon1"
>
<el-tooltip
effect=
"dark"
content=
"录音"
placement=
"top"
>
<img
src=
"./assets/images/microphone.png"
alt=
""
/>
</el-tooltip>
</div>
<div
class=
"icon2"
>
<el-tooltip
effect=
"dark"
content=
"收藏"
placement=
"top"
>
<img
src=
"./assets/images/attach.png"
alt=
""
/>
</el-tooltip>
</div>
<div
class=
"line"
></div>
<div
class=
"submit"
@
click=
"sendMessage"
>
<el-tooltip
effect=
"dark"
content=
"发送"
placement=
"top"
>
<img
src=
"./assets/images/submit.png"
alt=
""
/>
</el-tooltip>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</
template
>
<
script
setup
>
import
{
ref
,
onMounted
,
onUnmounted
}
from
"vue"
;
import
{
fetchEventSource
}
from
"@microsoft/fetch-event-source"
;
import
MarkdownIt
from
"markdown-it"
;
import
{
ElMessage
}
from
"element-plus"
;
import
{
getChat
}
from
"@/api/chat"
;
const
contentContainer
=
ref
(
null
);
const
userInput
=
ref
(
""
);
const
isLoading
=
ref
(
false
);
const
abortController
=
ref
(
null
);
// 消息数据
const
messages
=
ref
([
{
type
:
"user"
,
content
:
"你好"
},
{
type
:
"ai"
,
content
:
"您好!我是AI助手,有什么可以帮助您的吗?"
}
]);
// Markdown 渲染器
const
md
=
new
MarkdownIt
();
// 渲染 markdown
const
renderMarkdown
=
content
=>
{
return
md
.
render
(
content
);
};
// 自动滚动到底部
const
scrollToBottom
=
async
()
=>
{
await
nextTick
();
if
(
contentContainer
.
value
)
{
const
container
=
contentContainer
.
value
;
container
.
scrollTop
=
container
.
scrollHeight
;
}
};
// 添加消息
const
addMessage
=
(
type
,
content
)
=>
{
messages
.
value
.
push
({
type
,
content
,
timestamp
:
new
Date
().
getTime
()
});
scrollToBottom
();
};
// 更新最后一条 AI 消息(用于流式输出)
const
updateLastAIMessage
=
content
=>
{
const
lastMessage
=
messages
.
value
[
messages
.
value
.
length
-
1
];
if
(
lastMessage
&&
lastMessage
.
type
===
"ai"
)
{
lastMessage
.
content
=
content
;
scrollToBottom
();
}
};
// 使用 fetchEventSource 连接
const
connectSSE
=
async
question
=>
{
// 添加用户消息
addMessage
(
"user"
,
question
);
// 添加空的 AI 消息用于流式更新
addMessage
(
"ai"
,
""
);
isLoading
.
value
=
true
;
// 创建 AbortController 用于取消请求
abortController
.
value
=
new
AbortController
();
const
params
=
{
query
:
"如何检索?"
,
knowledge_base_name
:
"kb_test251112"
,
top_k
:
6
,
score_threshold
:
0.5
,
metadata
:
{
year
:
2024
}
};
try
{
await
fetchEventSource
(
"/chat/knowledge_base/search_docs"
,
{
method
:
"POST"
,
headers
:
{
"Content-Type"
:
"application/json"
},
body
:
JSON
.
stringify
(
params
),
signal
:
abortController
.
value
.
signal
,
onopen
:
async
response
=>
{
console
.
log
(
"SSE 连接已建立"
,
response
.
status
);
if
(
response
.
status
!==
200
)
{
throw
new
Error
(
`请求失败:
${
response
.
status
}
`
);
}
},
onmessage
:
event
=>
{
try
{
if
(
event
.
data
===
"[DONE]"
)
{
// 流式输出结束
isLoading
.
value
=
false
;
return
;
}
const
data
=
JSON
.
parse
(
event
.
data
);
if
(
data
.
type
===
"content"
&&
data
.
content
)
{
// 流式更新内容
updateLastAIMessage
(
prev
=>
prev
+
data
.
content
);
}
else
if
(
data
.
type
===
"error"
)
{
throw
new
Error
(
data
.
message
||
"请求失败"
);
}
}
catch
(
error
)
{
console
.
error
(
"解析 SSE 数据错误:"
,
error
);
}
},
onclose
:
()
=>
{
console
.
log
(
"SSE 连接已关闭"
);
isLoading
.
value
=
false
;
},
onerror
:
error
=>
{
console
.
error
(
"SSE 连接错误:"
,
error
);
ElMessage
.
error
(
"连接失败,请重试"
);
isLoading
.
value
=
false
;
// 不要抛出错误,否则会重试
}
});
}
catch
(
error
)
{
console
.
error
(
"SSE 请求失败:"
,
error
);
if
(
error
.
name
!==
"AbortError"
)
{
ElMessage
.
error
(
error
.
message
||
"请求失败"
);
}
isLoading
.
value
=
false
;
}
};
const
chat
=
async
()
=>
{
const
params
=
{
query
:
"如何检索?"
,
knowledge_base_name
:
"kb_test251112"
,
top_k
:
6
,
score_threshold
:
0.5
,
metadata
:
{
year
:
2024
}
};
try
{
const
res
=
await
getChat
(
params
);
console
.
log
(
"chat"
,
res
);
}
catch
(
error
)
{
console
.
error
(
error
);
}
};
// 发送消息
const
sendMessage
=
async
()
=>
{
const
question
=
userInput
.
value
.
trim
();
if
(
!
question
)
{
ElMessage
.
warning
(
"请输入问题"
);
return
;
}
if
(
isLoading
.
value
)
{
ElMessage
.
warning
(
"请等待上一条消息回复完成"
);
return
;
}
userInput
.
value
=
""
;
await
connectSSE
(
question
);
// chat();
};
const
newChatTitle
=
ref
(
""
);
// 新对话
const
curChatTitle
=
ref
(
"美国对中国制裁实体清单"
);
const
currentChatId
=
ref
(
1
);
const
chatList
=
ref
([
{
id
:
1
,
title
:
"美国对中国制裁实体清单"
},
{
id
:
2
,
title
:
"制作中国进口依赖度柱状图"
},
{
id
:
3
,
title
:
"列举 2025 年科技产品"
},
{
id
:
4
,
title
:
"获取美国国会议员名单"
},
{
id
:
5
,
title
:
"2000年以后美国金融法案列举"
},
{
id
:
6
,
title
:
"科研机构及高校仪器进口排名"
}
]);
onMounted
(()
=>
{
scrollToBottom
();
});
onUnmounted
(()
=>
{
if
(
abortController
.
value
)
{
abortController
.
value
.
abort
();
}
});
</
script
>
<
style
lang=
"scss"
scoped
>
:deep
(
.el-input__wrapper
)
{
box-shadow
:
none
;
}
:deep
(
.el-input__wrapper
:hover
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-input__wrapper.is-focus
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-input
::placeholder
)
{
color
:
var
(
--
color-main-active
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
}
:deep
(
.el-input__inner
)
{
color
:
#333
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
}
:deep
(
.el-textarea__inner
)
{
box-shadow
:
none
;
border-radius
:
20px
;
resize
:
none
;
}
:deep
(
.el-textarea__inner
:hover
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-textarea__inner.is-focus
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-textarea
::placeholder
)
{
color
:
rgba
(
132
,
136
,
142
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
}
:deep
(
.el-textarea__inner
)
{
color
:
#333
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
}
.wrapper
{
.header
{
height
:
64px
;
color
:
#fff
;
font-family
:
Microsoft
YaHei
;
font-size
:
20px
;
font-weight
:
700
;
line-height
:
26px
;
line-height
:
64px
;
background
:
url("../assets/images/header-bg.png")
;
box-sizing
:
border-box
;
padding-left
:
160px
;
}
.main
{
margin-top
:
16px
;
display
:
flex
;
justify-content
:
center
;
gap
:
16px
;
.left
{
width
:
300px
;
height
:
880px
;
border-radius
:
4px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
.left-header
{
width
:
268px
;
height
:
48px
;
margin
:
16px
auto
;
box-sizing
:
border-box
;
border
:
1px
solid
rgba
(
5
,
95
,
194
,
1
);
border-radius
:
8px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
display
:
flex
;
.icon
{
width
:
20px
;
height
:
13px
;
margin-top
:
13px
;
margin-left
:
16px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
}
.left-main
{
margin-top
:
24px
;
.left-main-title
{
margin-left
:
29px
;
width
:
64px
;
height
:
24px
;
color
:
rgba
(
132
,
136
,
142
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
24px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
.left-list
{
margin-top
:
12px
;
margin-left
:
16px
;
width
:
268px
;
height
:
720px
;
.left-list-item
{
width
:
268px
;
height
:
48px
;
border-radius
:
8px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
48px
;
box-sizing
:
border-box
;
padding
:
0
12px
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
cursor
:
pointer
;
&
:hover
{
background
:
rgba
(
246
,
250
,
255
,
1
);
}
}
.itemActive
{
background
:
rgba
(
246
,
250
,
255
,
1
);
color
:
var
(
--
color-main-active
);
font-weight
:
700
;
}
}
}
}
.right
{
width
:
1284px
;
height
:
880px
;
border-radius
:
4px
;
box-shadow
:
0px
0px
20px
0px
rgba
(
25
,
69
,
130
,
0
.1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
.right-header
{
height
:
64px
;
border-bottom
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
line-height
:
64px
;
box-sizing
:
border-box
;
padding-left
:
24px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
18px
;
font-weight
:
700
;
}
.right-main
{
.right-main-content
{
width
:
926px
;
margin-left
:
166px
;
height
:
630px
;
}
.right-main-footer
{
margin
:
10px
auto
;
width
:
900px
;
height
:
160px
;
box-sizing
:
border-box
;
border
:
1px
solid
rgba
(
230
,
231
,
232
,
1
);
border-radius
:
20px
;
background
:
rgba
(
255
,
255
,
255
,
1
);
.input-footer
{
display
:
flex
;
justify-content
:
flex-end
;
.icon1
{
margin-top
:
15px
;
width
:
24px
;
height
:
24px
;
margin-right
:
20px
;
cursor
:
pointer
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.icon2
{
margin-top
:
15px
;
width
:
24px
;
height
:
24px
;
margin-right
:
20px
;
cursor
:
pointer
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.line
{
margin-top
:
15px
;
margin-right
:
20px
;
width
:
1px
;
height
:
24px
;
background
:
rgba
(
234
,
236
,
238
,
1
);
}
.submit
{
margin-top
:
7px
;
margin-right
:
12px
;
width
:
40px
;
height
:
40px
;
border-radius
:
20px
;
background
:
#b4cfed
;
cursor
:
pointer
;
&
:hover
{
background
:
rgba
(
5
,
95
,
194
,
1
);
}
img
{
width
:
24px
;
height
:
24px
;
margin
:
8px
;
}
}
}
}
}
}
}
}
/* 对话内容区域 */
.chat-content
{
overflow-y
:
auto
;
// padding: 20px;
background
:
#fff
;
width
:
926px
;
.message-list
{
padding-bottom
:
20px
;
}
.ai-item
{
width
:
926px
;
overflow
:
hidden
;
.ai-header
{
height
:
22px
;
display
:
flex
;
.icon
{
width
:
10px
;
height
:
10px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.text
{
margin-left
:
16px
;
height
:
22px
;
color
:
rgba
(
132
,
136
,
142
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
22px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
}
.ai-content
{
margin-top
:
10px
;
width
:
900px
;
margin-left
:
26px
;
}
}
.user-item
{
margin-top
:
32px
;
height
:
42px
;
display
:
flex
;
justify-content
:
flex-end
;
.user-bubble
{
line-height
:
42px
;
border-radius
:
21px
0px
21px
21px
;
background
:
rgba
(
234
,
236
,
238
,
1
);
box-sizing
:
border-box
;
padding
:
0
20px
;
text-align
:
right
;
word-wrap
:
break-word
;
.user-content
{
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
42px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
}
}
}
/* 加载指示器 */
.loading-indicator
{
margin-left
:
26px
;
height
:
30px
;
display
:
flex
;
gap
:
4px
;
padding
:
11px
0
;
}
.dot
{
width
:
8px
;
height
:
8px
;
border-radius
:
50%
;
background
:
#999
;
animation
:
bounce
1
.4s
infinite
ease-in-out
;
}
.dot
:nth-child
(
1
)
{
animation-delay
:
-0
.32s
;
}
.dot
:nth-child
(
2
)
{
animation-delay
:
-0
.16s
;
}
</
style
>
\ No newline at end of file
src/views/comprehensiveSearch/index.vue
浏览文件 @
23fb0f30
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
<div
class=
"search"
>
<div
class=
"search"
>
<div
class=
"search-left"
>
<div
class=
"search-left"
>
<el-input
placeholder=
"搜索关键词"
style=
"width: 700px; height: 100%"
/>
<el-input
placeholder=
"搜索关键词"
style=
"width: 700px; height: 100%"
/>
<div
class=
"btn1"
>
<div
class=
"btn1"
@
click=
"handleToChat"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/ai-icon.png"
alt=
""
/>
<img
src=
"./assets/images/ai-icon.png"
alt=
""
/>
</div>
</div>
...
@@ -279,6 +279,13 @@ const box3List = ref([
...
@@ -279,6 +279,13 @@ const box3List = ref([
}
}
]);
]);
// 点击智能问答,进入智能问答页
const
handleToChat
=
()
=>
{
router
.
push
({
path
:
'/chat'
})
}
// 点击全文搜索,进入搜索结果页
// 点击全文搜索,进入搜索结果页
const
handleToSearchResults
=
()
=>
{
const
handleToSearchResults
=
()
=>
{
router
.
push
({
router
.
push
({
...
...
src/views/comprehensiveSearch/searchResults/assets/images/img1.png
0 → 100644
浏览文件 @
23fb0f30
205.2 KB
src/views/comprehensiveSearch/searchResults/assets/images/img2.png
0 → 100644
浏览文件 @
23fb0f30
139.4 KB
src/views/comprehensiveSearch/searchResults/assets/images/img3.png
0 → 100644
浏览文件 @
23fb0f30
175.3 KB
src/views/comprehensiveSearch/searchResults/index.vue
浏览文件 @
23fb0f30
...
@@ -63,7 +63,7 @@
...
@@ -63,7 +63,7 @@
<div
class=
"header-right"
>
<div
class=
"header-right"
>
<div
class=
"header-right-header"
>
{{
"关联检索"
}}
</div>
<div
class=
"header-right-header"
>
{{
"关联检索"
}}
</div>
<div
class=
"header-right-main"
>
<div
class=
"header-right-main"
>
<div
class=
"header-right-main-item"
v-for=
"
item,index
in relatedSearchList"
:key=
"index"
>
<div
class=
"header-right-main-item"
v-for=
"
(item, index)
in relatedSearchList"
:key=
"index"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/search-icon2.png"
alt=
""
/>
<img
src=
"./assets/images/search-icon2.png"
alt=
""
/>
</div>
</div>
...
@@ -72,12 +72,39 @@
...
@@ -72,12 +72,39 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"main"
>
<div
class=
"item"
v-for=
"(item, index) in searchResults"
:key=
"index"
>
<div
class=
"item-left"
v-if=
"item.img"
>
<img
:src=
"item.img"
alt=
""
>
</div>
<div
class=
"item-right"
>
<div
class=
"title"
v-html=
"renderContent(item.title)"
></div>
<div
class=
"content"
v-html=
"renderContent(item.content)"
></div>
<div
class=
"item-right-footer"
>
<div
class=
"time"
>
{{
item
.
time
}}
</div>
<div
class=
"tag"
:class=
"
{ tag1: item.tag.status === 1, tag2: item.tag.status === 2, tag3: item.tag.status === 3 }"
>
{{
item
.
tag
.
name
}}
</div>
</div>
</div>
</div>
</div>
<div
class=
"footer"
>
<el-pagination
background
layout=
"prev, pager, next"
:total=
"96"
/>
</div>
</div>
</div>
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
ref
,
onMounted
}
from
"vue"
;
import
{
ref
,
onMounted
}
from
"vue"
;
import
Img1
from
'./assets/images/img1.png'
import
Img2
from
'./assets/images/img2.png'
import
Img3
from
'./assets/images/img3.png'
const
selectTime
=
ref
(
"全部时间"
);
const
selectTime
=
ref
(
"全部时间"
);
const
selectRelation
=
ref
(
"相关度优先"
);
const
selectRelation
=
ref
(
"相关度优先"
);
...
@@ -181,13 +208,133 @@ const relationList = ref([
...
@@ -181,13 +208,133 @@ const relationList = ref([
// 关联检索
// 关联检索
const
relatedSearchList
=
ref
([
const
relatedSearchList
=
ref
([
'金融制度是如何建立的?'
,
"金融制度是如何建立的?"
,
'金融有什么用?'
,
"金融有什么用?"
,
'如何办理金融贷款?'
,
"如何办理金融贷款?"
,
'2025年美国金融法案发布情况'
,
"2025年美国金融法案发布情况"
,
'中国如何应对金融制裁'
,
"中国如何应对金融制裁"
,
'中国金融制度建立历史'
"中国金融制度建立历史"
])
]);
const
searchResults
=
ref
([
{
img
:
Img1
,
title
:
"美元 “上链”!美国联邦金融稳定币监管法案正式生效"
,
content
:
"《指导与建立美国稳定币国家创新法案》落地,要求稳定币发行方以 1:1 比例储备美元现金、短期美债等高度流动资产,建立联邦与州双轨监管体系。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
Img2
,
title
:
"划清监管边界!美国数字资产分类法案众议院高票通过"
,
content
:
"《数字资产市场清晰法案》按去中心化属性划分资产类别,明确 “数字商品” 归 CFTC 监管、“数字资产证” 归 SEC 监管。创设 “金融成熟链机制”。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"划清监管边界!美国数字资产分类法案众议院高票通过"
,
content
:
"《数字资产市场清晰法案》按去中心化属性划分资产类别,明确 “数字商品” 归 CFTC 监管、“数字资产证” 归 SEC 监管。创设 “金融成熟链机制”。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"划清监管边界!美国数字资产分类法案众议院高票通过"
,
content
:
"《数字资产市场清晰法案》按去中心化属性划分资产类别,明确 “数字商品” 归 CFTC 监管、“数字资产证” 归 SEC 监管。创设 “金融成熟链机制”。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"严管金融稳定币发行!美国《STABLE 法案》推进审议"
,
content
:
"法案禁止未授权发行稳定币,违规者将面临每日最高 10 万美元罚款,同时禁止发行方支付利息。要求发行方开展月度审计并公开储备报告,严防关联方资金占用。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"严管金融稳定币发行!美国《STABLE 法案》推进审议"
,
content
:
"法案禁止未授权发行稳定币,违规者将面临每日最高 10 万美元罚款,同时禁止发行方支付利息。要求发行方开展月度审计并公开储备报告,严防关联方资金占用。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"拒绝政府数字货币!美国众议院通过反 CBDC 监控法案"
,
content
:
"《反 CBDC 监控国家法案》以保护金融隐私为核心,拟永久禁止美联储发行数字美元,禁止其向个人直接或间接发行 CBDC,也不得将 CBDC 用于货币政策工具或开展相关。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"拒绝政府数字货币!美国众议院通过反 CBDC 监控法案"
,
content
:
"《反 CBDC 监控国家法案》以保护金融隐私为核心,拟永久禁止美联储发行数字美元,禁止其向个人直接或间接发行 CBDC,也不得将 CBDC 用于货币政策工具或开展相关。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
null
,
title
:
"拒绝政府数字货币!美国众议院通过反 CBDC 监控法案"
,
content
:
"《反 CBDC 监控国家法案》以保护金融隐私为核心,拟永久禁止美联储发行数字美元,禁止其向个人直接或间接发行 CBDC,也不得将 CBDC 用于货币政策工具或开展相关。"
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
},
{
img
:
Img3
,
title
:
"主流加密货币定调!美国 FIT-21 法案确立 “数字商品” 属性"
,
content
:
"《21 世纪金融创新与技术法案》明确比特币、以太坊等主流加密货币归类为 “数字商品”,适用 CFTC 监管框架。建立 SEC 与 CFTC 跨机构协调机制并要求联合发布分类..."
,
time
:
"通过日期:2025-10- 05"
,
tag
:
{
name
:
"科技法案"
,
status
:
3
}
}
]);
const
renderContent
=
str
=>
{
if
(
str
.
includes
(
"金融"
))
{
return
str
.
replace
(
/金融/g
,
'<span style="color: #CE4F51">金融</span>'
);
}
return
str
;
};
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
@@ -233,12 +380,12 @@ const relatedSearchList = ref([
...
@@ -233,12 +380,12 @@ const relatedSearchList = ref([
border-radius
:
20px
;
border-radius
:
20px
;
background
:
rgba
(
247
,
248
,
249
,
1
);
background
:
rgba
(
247
,
248
,
249
,
1
);
display
:
flex
;
display
:
flex
;
gap
:
8px
;
gap
:
8px
;
margin-bottom
:
8px
;
margin-bottom
:
8px
;
cursor
:
pointer
;
cursor
:
pointer
;
&
:hover
{
&
:hover
{
background
:
rgb
(
234
,
234
,
234
);
background
:
rgb
(
234
,
234
,
234
);
}
}
.icon
{
.icon
{
width
:
16px
;
width
:
16px
;
height
:
16px
;
height
:
16px
;
...
@@ -449,5 +596,99 @@ const relatedSearchList = ref([
...
@@ -449,5 +596,99 @@ const relatedSearchList = ref([
}
}
}
}
}
}
.main
{
width
:
913px
;
height
:
1464px
;
margin-top
:
36px
;
margin-left
:
264px
;
.item
{
width
:
913px
;
height
:
132px
;
margin-bottom
:
16px
;
border-bottom
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
display
:
flex
;
.item-left
{
width
:
170px
;
height
:
115px
;
img
{
width
:
100%
;
height
:
100%
;
}
}
.item-right
{
// width: 731px;
flex
:
1
;
margin-left
:
12px
;
.title
{
height
:
24px
;
width
:
731px
;
overflow
:
hidden
;
font-family
:
Microsoft
YaHei
;
font-size
:
18px
;
font-weight
:
700
;
line-height
:
24px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
.content
{
margin-top
:
10px
;
height
:
48px
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-weight
:
400
;
line-height
:
24px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
.item-right-footer
{
display
:
flex
;
.time
{
height
:
22px
;
color
:
rgba
(
132
,
136
,
142
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
22px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
.tag
{
margin-left
:
16px
;
height
:
24px
;
line-height
:
24px
;
box-sizing
:
border-box
;
padding
:
0
8px
;
border-radius
:
4px
;
}
.tag1
{
border
:
1px
solid
rgba
(
255
,
204
,
199
,
1
);
background
:
rgba
(
255
,
241
,
240
,
1
);
color
:
rgba
(
255
,
77
,
79
,
1
);
}
.tag2
{
color
:
rgba
(
250
,
173
,
20
,
1
);
border
:
1px
solid
rgba
(
255
,
241
,
184
,
1
);
background
:
rgba
(
255
,
251
,
230
,
1
);
}
.tag3
{
color
:
rgba
(
22
,
119
,
255
,
1
);
border
:
1px
solid
rgba
(
186
,
224
,
255
,
1
);
background
:
rgba
(
230
,
244
,
255
,
1
);
}
}
}
}
}
.footer
{
width
:
913px
;
margin-left
:
264px
;
height
:
107px
;
box-sizing
:
border-box
;
padding-top
:
10px
;
display
:
flex
;
justify-content
:
center
;
}
}
}
</
style
>
</
style
>
\ No newline at end of file
src/views/decree/decreeHome/index.vue
浏览文件 @
23fb0f30
...
@@ -2778,4 +2778,15 @@ onMounted(async () => {
...
@@ -2778,4 +2778,15 @@ onMounted(async () => {
.
divide
{
.
divide
{
margin
:
0
auto
;
margin
:
0
auto
;
}
}
:
deep
(.
el
-
input__wrapper
)
{
box
-
shadow
:
none
;
}
:
deep
(.
el
-
input__wrapper
:
hover
)
{
box
-
shadow
:
none
!
important
;
}
:
deep
(.
el
-
input__wrapper
.
is
-
focus
)
{
box
-
shadow
:
none
!
important
;
}
<
/style>
<
/style>
\ No newline at end of file
src/views/marketAccessRestrictions/marketAccessHome/index.vue
浏览文件 @
23fb0f30
...
@@ -1788,4 +1788,14 @@ onMounted(async () => {
...
@@ -1788,4 +1788,14 @@ onMounted(async () => {
}
}
}
}
}
}
:deep
(
.el-input__wrapper
)
{
box-shadow
:
none
;
}
:deep
(
.el-input__wrapper
:hover
)
{
box-shadow
:
none
!
important
;
}
:deep
(
.el-input__wrapper.is-focus
)
{
box-shadow
:
none
!
important
;
}
</
style
>
</
style
>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论