Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
R
risk-monitor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
蔡建
risk-monitor
Commits
5981ec64
提交
5981ec64
authored
1月 23, 2026
作者:
coderBryanFu
浏览文件
操作
浏览文件
下载
差异文件
update
上级
3d27f2af
00694c49
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
685 行增加
和
168 行删除
+685
-168
index.js
src/api/zmOverview/allDomains/index.js
+4
-1
index.vue
...ew/components/fourSuppress/components/addDomain/index.vue
+69
-10
index.vue
...iew/components/fourSuppress/components/allUnion/index.vue
+260
-19
index.vue
src/views/writtingAsstaint/index.vue
+341
-138
vite.config.js
vite.config.js
+11
-0
没有找到文件。
src/api/zmOverview/allDomains/index.js
浏览文件 @
5981ec64
...
@@ -20,7 +20,10 @@ export function getAllDomainCount(params) {
...
@@ -20,7 +20,10 @@ export function getAllDomainCount(params) {
/**
/**
* @header token
* @header token
* @param {Object} params
* @param {Object} params
* @param {String} params.byYOrM - 按月统计或按年统计
* @param {String} params.startDate - 开始日期
* @param {String} params.endDate - 结束日期
* @param {String} params.org - 机构
* @param {String} params.sanMeasures - 制裁手段
*/
*/
export
function
getDomainContainmentTrend
(
params
)
{
export
function
getDomainContainmentTrend
(
params
)
{
return
request
({
return
request
({
...
...
src/views/ZMOverView/components/fourSuppress/components/addDomain/index.vue
浏览文件 @
5981ec64
...
@@ -39,13 +39,26 @@
...
@@ -39,13 +39,26 @@
</div>
</div>
<div
class=
"title-right"
>
<div
class=
"title-right"
>
<el-select
<el-select
v-model=
"
select1
"
v-model=
"
deptValue
"
placeholder=
"
按月统计
"
placeholder=
"
全部部门
"
class=
"custom-select"
class=
"custom-select"
@
change=
"handleGetDomainContainmentTrend"
@
change=
"handleGetDomainContainmentTrend"
>
>
<el-option
label=
"按月统计"
value=
"按月统计"
/>
<el-option
label=
"全部部门"
value=
""
/>
<el-option
label=
"按年统计"
value=
"按年统计"
/>
<el-option
v-for=
"item in departmentList"
:key=
"item.departId"
:label=
"item.departName"
:value=
"item.departId"
/>
</el-select>
<el-select
v-model=
"methodValue"
placeholder=
"全部制裁手段"
class=
"custom-select"
@
change=
"handleGetDomainContainmentTrend"
>
<el-option
v-for=
"item in methodOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
</div>
</div>
...
@@ -114,7 +127,7 @@
...
@@ -114,7 +127,7 @@
<el-option
v-for=
"item in fieldOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
<el-option
v-for=
"item in fieldOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</el-select>
</div>
</div>
<div
class=
"main-box"
>
<div
class=
"main-box"
v-loading=
"rankLoading"
element-loading-background=
"rgba(255, 255, 255, 0.5)"
>
<!-- 机构排行的原有样式 -->
<!-- 机构排行的原有样式 -->
<template
v-if=
"rankType === 'institution'"
>
<template
v-if=
"rankType === 'institution'"
>
<div
v-for=
"(item, index) in rankList"
:key=
"index"
class=
"rank-item"
>
<div
v-for=
"(item, index) in rankList"
:key=
"index"
class=
"rank-item"
>
...
@@ -264,13 +277,45 @@ import {
...
@@ -264,13 +277,45 @@ import {
getDomainContainmentRanking
,
getDomainContainmentRanking
,
getDomainContainmentTimeline
getDomainContainmentTimeline
}
from
"@/api/zmOverview/allDomains"
;
}
from
"@/api/zmOverview/allDomains"
;
import
{
getUSGovernmentLatestDynamic
}
from
"@/api/allGovernment.js"
;
import
{
getUSGovernmentLatestDynamic
,
getDepartmentList
}
from
"@/api/allGovernment.js"
;
const
router
=
useRouter
();
const
router
=
useRouter
();
const
activeDate
=
inject
(
"activeDate"
);
const
activeDate
=
inject
(
"activeDate"
);
const
select1
=
ref
(
"按月统计"
);
const
deptValue
=
ref
(
""
);
const
methodValue
=
ref
(
""
);
const
departmentList
=
ref
([]);
const
methodOptions
=
ref
([
{
label
:
"全部制裁手段"
,
value
:
""
},
{
label
:
"法案"
,
value
:
"-1"
},
{
label
:
"政令"
,
value
:
"-2"
},
{
label
:
"实体清单"
,
value
:
"1"
},
{
label
:
"特别国民指定清单"
,
value
:
"2"
},
{
label
:
"涉军企业"
,
value
:
"3"
},
{
label
:
"行业制裁识别清单"
,
value
:
"4"
},
{
label
:
"无法核实清单"
,
value
:
"5"
},
{
label
:
"军事最终用户清单"
,
value
:
"6"
},
{
label
:
"非SDN中国军工企业名单"
,
value
:
"7"
},
{
label
:
"拒绝往来人员清单"
,
value
:
"8"
},
{
label
:
"军事最终用途与最终用户规则"
,
value
:
"9"
},
{
label
:
"欧盟合并制裁清单"
,
value
:
"10"
},
{
label
:
"英国制裁清单"
,
value
:
"11"
},
{
label
:
"加拿大合并自主制裁清单"
,
value
:
"12"
},
{
label
:
"商业管制清单"
,
value
:
"13"
}
]);
const
getDepartmentListData
=
async
()
=>
{
try
{
const
res
=
await
getDepartmentList
();
if
(
res
.
code
===
200
&&
res
.
data
)
{
departmentList
.
value
=
res
.
data
;
}
}
catch
(
error
)
{
console
.
error
(
"获取部门数据失败:"
,
error
);
}
};
const
rankType
=
ref
(
"institution"
);
const
rankType
=
ref
(
"institution"
);
const
rankLoading
=
ref
(
false
);
const
selectedField
=
ref
(
""
);
const
selectedField
=
ref
(
""
);
const
selectedFieldTimeline
=
ref
(
""
);
const
selectedFieldTimeline
=
ref
(
""
);
const
timelineContainerWidth
=
1700
;
const
timelineContainerWidth
=
1700
;
...
@@ -722,9 +767,18 @@ const box5Data = ref({});
...
@@ -722,9 +767,18 @@ const box5Data = ref({});
const
handleGetDomainContainmentTrend
=
async
()
=>
{
const
handleGetDomainContainmentTrend
=
async
()
=>
{
try
{
try
{
const
res
=
await
getDomainContainmentTrend
({
const
{
startDate
,
endDate
}
=
getCalculatedDate
(
activeDate
.
value
);
byYOrM
:
select1
.
value
const
params
=
{
});
startDate
,
endDate
};
if
(
deptValue
.
value
)
{
params
.
org
=
deptValue
.
value
;
}
if
(
methodValue
.
value
)
{
params
.
sanMeasures
=
methodValue
.
value
;
}
const
res
=
await
getDomainContainmentTrend
(
params
);
console
.
log
(
"美对华领域打压遏制数量趋势"
,
res
);
console
.
log
(
"美对华领域打压遏制数量趋势"
,
res
);
if
(
res
.
code
===
200
&&
res
.
data
)
{
if
(
res
.
code
===
200
&&
res
.
data
)
{
...
@@ -847,6 +901,7 @@ const rankTypeMap = {
...
@@ -847,6 +901,7 @@ const rankTypeMap = {
// 获取领域遏制排名数据
// 获取领域遏制排名数据
const
handleGetDomainContainmentRanking
=
async
()
=>
{
const
handleGetDomainContainmentRanking
=
async
()
=>
{
rankLoading
.
value
=
true
;
rankList
.
value
=
[];
rankList
.
value
=
[];
try
{
try
{
const
res
=
await
getDomainContainmentRanking
(
const
res
=
await
getDomainContainmentRanking
(
...
@@ -863,6 +918,8 @@ const handleGetDomainContainmentRanking = async () => {
...
@@ -863,6 +918,8 @@ const handleGetDomainContainmentRanking = async () => {
console
.
error
(
"获取美对华领域打压遏制排行失败:"
,
error
);
console
.
error
(
"获取美对华领域打压遏制排行失败:"
,
error
);
// 设置默认空数组
// 设置默认空数组
rankList
.
value
=
[];
rankList
.
value
=
[];
}
finally
{
rankLoading
.
value
=
false
;
}
}
};
};
...
@@ -918,6 +975,7 @@ onMounted(() => {
...
@@ -918,6 +975,7 @@ onMounted(() => {
// let Chart = getMultiLineChart(box5Data.value);
// let Chart = getMultiLineChart(box5Data.value);
// setChart(Chart, "chartRef");
// setChart(Chart, "chartRef");
handleGetDomainContainmentTrend
();
handleGetDomainContainmentTrend
();
getDepartmentListData
();
handleGetAllDomainCount
();
handleGetAllDomainCount
();
handleGetDomainContainmentRanking
();
handleGetDomainContainmentRanking
();
...
@@ -932,6 +990,7 @@ onUnmounted(() => {
...
@@ -932,6 +990,7 @@ onUnmounted(() => {
watch
(
activeDate
,
()
=>
{
watch
(
activeDate
,
()
=>
{
handleGetAllDomainCount
();
handleGetAllDomainCount
();
handleGetDomainContainmentTrend
();
});
});
</
script
>
</
script
>
...
...
src/views/ZMOverView/components/fourSuppress/components/allUnion/index.vue
浏览文件 @
5981ec64
...
@@ -310,6 +310,189 @@ const countryNameMap = {
...
@@ -310,6 +310,189 @@ const countryNameMap = {
Jamaica
:
"Jamaica"
Jamaica
:
"Jamaica"
};
};
const
nameMap
=
{
Afghanistan
:
"阿富汗"
,
Angola
:
"安哥拉"
,
Albania
:
"阿尔巴尼亚"
,
"United Arab Emirates"
:
"阿联酋"
,
Argentina
:
"阿根廷"
,
Armenia
:
"亚美尼亚"
,
"French Southern and Antarctic Lands"
:
"法属南半球和南极领地"
,
Australia
:
"澳大利亚"
,
Austria
:
"奥地利"
,
Azerbaijan
:
"阿塞拜疆"
,
Burundi
:
"布隆迪"
,
Belgium
:
"比利时"
,
Benin
:
"贝宁"
,
"Burkina Faso"
:
"布基纳法索"
,
Bangladesh
:
"孟加拉国"
,
Bulgaria
:
"保加利亚"
,
"The Bahamas"
:
"巴哈马"
,
"Bosnia and Herzegovina"
:
"波斯尼亚和黑塞哥维那"
,
Belarus
:
"白俄罗斯"
,
Belize
:
"伯利兹"
,
Bermuda
:
"百慕大"
,
Bolivia
:
"玻利维亚"
,
Brazil
:
"巴西"
,
Brunei
:
"文莱"
,
Bhutan
:
"不丹"
,
Botswana
:
"博茨瓦纳"
,
"Central African Republic"
:
"中非共和国"
,
Canada
:
"加拿大"
,
Switzerland
:
"瑞士"
,
Chile
:
"智利"
,
China
:
"中国"
,
"Ivory Coast"
:
"科特迪瓦"
,
Cameroon
:
"喀麦隆"
,
"Democratic Republic of the Congo"
:
"刚果民主共和国"
,
"Republic of the Congo"
:
"刚果共和国"
,
Colombia
:
"哥伦比亚"
,
"Costa Rica"
:
"哥斯达黎加"
,
Cuba
:
"古巴"
,
"Northern Cyprus"
:
"北塞浦路斯"
,
Cyprus
:
"塞浦路斯"
,
"Czech Republic"
:
"捷克"
,
Germany
:
"德国"
,
Djibouti
:
"吉布提"
,
Denmark
:
"丹麦"
,
"Dominican Republic"
:
"多米尼加共和国"
,
Algeria
:
"阿尔及利亚"
,
Ecuador
:
"厄瓜多尔"
,
Egypt
:
"埃及"
,
Eritrea
:
"厄立特里亚"
,
Spain
:
"西班牙"
,
Estonia
:
"爱沙尼亚"
,
Ethiopia
:
"埃塞俄比亚"
,
Finland
:
"芬兰"
,
Fiji
:
"斐济"
,
"Falkland Islands"
:
"福克兰群岛"
,
France
:
"法国"
,
Gabon
:
"加蓬"
,
"United Kingdom"
:
"英国"
,
Georgia
:
"格鲁吉亚"
,
Ghana
:
"加纳"
,
Guinea
:
"几内亚"
,
Gambia
:
"冈比亚"
,
"Guinea Bissau"
:
"几内亚比绍"
,
"Equatorial Guinea"
:
"赤道几内亚"
,
Greece
:
"希腊"
,
Greenland
:
"格陵兰"
,
Guatemala
:
"危地马拉"
,
"French Guiana"
:
"法属圭亚那"
,
Guyana
:
"圭亚那"
,
Honduras
:
"洪都拉斯"
,
Croatia
:
"克罗地亚"
,
Haiti
:
"海地"
,
Hungary
:
"匈牙利"
,
Indonesia
:
"印度尼西亚"
,
India
:
"印度"
,
Ireland
:
"爱尔兰"
,
Iran
:
"伊朗"
,
Iraq
:
"伊拉克"
,
Iceland
:
"冰岛"
,
Israel
:
"以色列"
,
Italy
:
"意大利"
,
Jamaica
:
"牙买加"
,
Jordan
:
"约旦"
,
Japan
:
"日本"
,
Kazakhstan
:
"哈萨克斯坦"
,
Kenya
:
"肯尼亚"
,
Kyrgyzstan
:
"吉尔吉斯斯坦"
,
Cambodia
:
"柬埔寨"
,
"South Korea"
:
"韩国"
,
Korea
:
"韩国"
,
Kosovo
:
"科索沃"
,
Kuwait
:
"科威特"
,
Laos
:
"老挝"
,
Lebanon
:
"黎巴嫩"
,
Liberia
:
"利比里亚"
,
Libya
:
"利比亚"
,
"Sri Lanka"
:
"斯里兰卡"
,
Lesotho
:
"莱索托"
,
Lithuania
:
"立陶宛"
,
Luxembourg
:
"卢森堡"
,
Latvia
:
"拉脱维亚"
,
Morocco
:
"摩洛哥"
,
Moldova
:
"摩尔多瓦"
,
Madagascar
:
"马达加斯加"
,
Mexico
:
"墨西哥"
,
Macedonia
:
"马其顿"
,
Mali
:
"马里"
,
Myanmar
:
"缅甸"
,
Montenegro
:
"黑山"
,
Mongolia
:
"蒙古"
,
Mozambique
:
"莫桑比克"
,
Mauritania
:
"毛里塔尼亚"
,
Malawi
:
"马拉维"
,
Malaysia
:
"马来西亚"
,
Namibia
:
"纳米比亚"
,
"New Caledonia"
:
"新喀里多尼亚"
,
Niger
:
"尼日尔"
,
Nigeria
:
"尼日利亚"
,
Nicaragua
:
"尼加拉瓜"
,
Netherlands
:
"荷兰"
,
Norway
:
"挪威"
,
Nepal
:
"尼泊尔"
,
"New Zealand"
:
"新西兰"
,
Oman
:
"阿曼"
,
Pakistan
:
"巴基斯坦"
,
Panama
:
"巴拿马"
,
Peru
:
"秘鲁"
,
Philippines
:
"菲律宾"
,
"Papua New Guinea"
:
"巴布亚新几内亚"
,
Poland
:
"波兰"
,
"Puerto Rico"
:
"波多黎各"
,
"North Korea"
:
"朝鲜"
,
Portugal
:
"葡萄牙"
,
Paraguay
:
"巴拉圭"
,
Qatar
:
"卡塔尔"
,
Romania
:
"罗马尼亚"
,
Russia
:
"俄罗斯"
,
Rwanda
:
"卢旺达"
,
"Western Sahara"
:
"西撒哈拉"
,
"Saudi Arabia"
:
"沙特阿拉伯"
,
Sudan
:
"苏丹"
,
"South Sudan"
:
"南苏丹"
,
Senegal
:
"塞内加尔"
,
"Solomon Islands"
:
"所罗门群岛"
,
"Sierra Leone"
:
"塞拉利昂"
,
"El Salvador"
:
"萨尔瓦多"
,
"Somaliland"
:
"索马里兰"
,
Somalia
:
"索马里"
,
"Republic of Serbia"
:
"塞尔维亚"
,
Suriname
:
"苏里南"
,
Slovakia
:
"斯洛伐克"
,
Slovenia
:
"斯洛文尼亚"
,
Sweden
:
"瑞典"
,
Swaziland
:
"斯威士兰"
,
Syria
:
"叙利亚"
,
Chad
:
"乍得"
,
Togo
:
"多哥"
,
Thailand
:
"泰国"
,
Tajikistan
:
"塔吉克斯坦"
,
Turkmenistan
:
"土库曼斯坦"
,
"East Timor"
:
"东帝汶"
,
"Trinidad and Tobago"
:
"特立尼达和多巴哥"
,
Tunisia
:
"突尼斯"
,
Turkey
:
"土耳其"
,
Tanzania
:
"坦桑尼亚"
,
"United Republic of Tanzania"
:
"坦桑尼亚"
,
Uganda
:
"乌干达"
,
Ukraine
:
"乌克兰"
,
Uruguay
:
"乌拉圭"
,
"United States"
:
"美国"
,
Uzbekistan
:
"乌兹别克斯坦"
,
Venezuela
:
"委内瑞拉"
,
Vietnam
:
"越南"
,
Vanuatu
:
"瓦努阿图"
,
"West Bank"
:
"西岸"
,
Yemen
:
"也门"
,
"South Africa"
:
"南非"
,
Zambia
:
"赞比亚"
,
Zimbabwe
:
"津巴布韦"
,
Singapore
:
"新加坡"
};
const
next
=
()
=>
{
const
next
=
()
=>
{
let
arr
=
[...
carouselList
.
value
];
let
arr
=
[...
carouselList
.
value
];
if
(
startIndex
.
value
<
carouselList
.
value
.
length
-
5
)
{
if
(
startIndex
.
value
<
carouselList
.
value
.
length
-
5
)
{
...
@@ -392,6 +575,55 @@ const getColorByValue = (value, maxValue) => {
...
@@ -392,6 +575,55 @@ const getColorByValue = (value, maxValue) => {
return
`rgb(
${
r
}
,
${
g
}
,
${
b
}
)`
;
return
`rgb(
${
r
}
,
${
g
}
,
${
b
}
)`
;
};
};
/**
* 根据 value 和 maxValue 生成高饱和度但不刺眼的 RGB 颜色
* @param {number} value - 当前值(0 到 maxValue)
* @param {number} maxValue - 最大值
* @returns {string} RGB 颜色字符串,如 "rgb(255, 0, 0)"
*/
const
getColorByValueRandom
=
(
value
,
maxValue
)
=>
{
const
ratio
=
Math
.
min
(
Math
.
max
(
value
/
maxValue
,
0
),
1
);
// HSL 参数:高饱和度,中等偏暗亮度,避免太亮或黑色
let
h
=
ratio
*
360
;
// 色相:0°(红) 到 360°(循环)
h
=
h
%
360
;
// 修复:确保 h=360 映射回 0,避免黑色
const
s
=
100
;
// 饱和度 100%
const
l
=
40
;
// 亮度 40%(不亮不暗)
// HSL 到 RGB 转换
const
hslToRgb
=
(
h
,
s
,
l
)
=>
{
s
/=
100
;
l
/=
100
;
const
c
=
(
1
-
Math
.
abs
(
2
*
l
-
1
))
*
s
;
const
x
=
c
*
(
1
-
Math
.
abs
((
h
/
60
)
%
2
-
1
));
const
m
=
l
-
c
/
2
;
let
r
=
0
,
g
=
0
,
b
=
0
;
if
(
0
<=
h
&&
h
<
60
)
{
r
=
c
;
g
=
x
;
b
=
0
;
}
else
if
(
60
<=
h
&&
h
<
120
)
{
r
=
x
;
g
=
c
;
b
=
0
;
}
else
if
(
120
<=
h
&&
h
<
180
)
{
r
=
0
;
g
=
c
;
b
=
x
;
}
else
if
(
180
<=
h
&&
h
<
240
)
{
r
=
0
;
g
=
x
;
b
=
c
;
}
else
if
(
240
<=
h
&&
h
<
300
)
{
r
=
x
;
g
=
0
;
b
=
c
;
}
else
if
(
300
<=
h
&&
h
<
360
)
{
r
=
c
;
g
=
0
;
b
=
x
;
}
// 移除 else 分支(修复后无需,h 已 %360)
r
=
Math
.
round
((
r
+
m
)
*
255
);
g
=
Math
.
round
((
g
+
m
)
*
255
);
b
=
Math
.
round
((
b
+
m
)
*
255
);
return
`rgb(
${
r
}
,
${
g
}
,
${
b
}
)`
;
};
return
hslToRgb
(
h
,
s
,
l
);
}
const
chartDom
=
ref
();
const
chartDom
=
ref
();
const
myChart
=
ref
();
const
myChart
=
ref
();
function
createChart
()
{
function
createChart
()
{
...
@@ -400,12 +632,21 @@ function createChart() {
...
@@ -400,12 +632,21 @@ function createChart() {
const
maxValue
=
Math
.
max
(...
countList
.
value
.
map
(
item
=>
item
.
value
));
const
maxValue
=
Math
.
max
(...
countList
.
value
.
map
(
item
=>
item
.
value
));
// 为每个数据项计算颜色
// 为每个数据项计算颜色
const
processedData
=
countList
.
value
.
map
(
item
=>
({
const
processedData
=
countList
.
value
.
map
(
item
=>
{
...
item
,
const
color
=
getColorByValueRandom
(
item
.
value
,
maxValue
);
itemStyle
:
{
return
{
color
:
getColorByValue
(
item
.
value
,
maxValue
)
...
item
,
}
name
:
nameMap
[
item
.
name
]
||
item
.
name
,
// 将英文名转换为中文名以匹配地图区域
}));
itemStyle
:
{
color
:
color
},
emphasis
:
{
itemStyle
:
{
areaColor
:
color
// 高亮时保持原色
}
}
};
});
const
option
=
{
const
option
=
{
// geo: {
// geo: {
...
@@ -424,14 +665,9 @@ function createChart() {
...
@@ -424,14 +665,9 @@ function createChart() {
trigger
:
"item"
,
trigger
:
"item"
,
formatter
:
function
(
params
)
{
formatter
:
function
(
params
)
{
if
(
params
.
data
)
{
if
(
params
.
data
)
{
// 从数据中查找对应的中文名称
// 既然 processedData 已经匹配上了,params.data 就是正确的数据项
const
item
=
countList
.
value
.
find
(
item
=>
item
.
name
===
params
.
name
);
// 包含 value 和 zhName
console
.
log
(
item
);
return
`
${
params
.
data
.
zhName
||
params
.
name
}
:
${
params
.
data
.
value
||
0
}
`
;
if
(
item
)
{
return
`
${
item
.
zhName
}
:
${
params
.
data
.
value
||
0
}
`
;
}
else
{
return
`
${
params
.
name
}
:
${
params
.
data
.
value
||
0
}
`
;
}
}
}
return
params
.
name
;
return
params
.
name
;
}
}
...
@@ -454,16 +690,17 @@ function createChart() {
...
@@ -454,16 +690,17 @@ function createChart() {
{
{
name
:
"数据值"
,
name
:
"数据值"
,
type
:
"map"
,
type
:
"map"
,
roam
:
true
,
// 允许缩放和平移
roam
:
"move"
,
// 允许平移,禁止缩放
zoom
:
1.2
,
// 初始缩放级别
zoom
:
1.2
,
// 初始缩放级别
map
:
"world"
,
map
:
"world"
,
nameMap
:
nameMap
,
emphasis
:
{
emphasis
:
{
label
:
{
label
:
{
show
:
true
,
show
:
true
,
color
:
"#fff"
color
:
"#fff"
},
},
itemStyle
:
{
itemStyle
:
{
areaColor
:
null
,
areaColor
:
"#aaa"
,
// 无数据区域高亮颜色(灰色,避免白色看不清文字)
borderWidth
:
1
,
borderWidth
:
1
,
borderColor
:
"#fff"
borderColor
:
"#fff"
}
}
...
@@ -637,7 +874,11 @@ const initRightDonut = async () => {
...
@@ -637,7 +874,11 @@ const initRightDonut = async () => {
let
item
=
{
let
item
=
{
name
:
res
.
data
[
i
].
country
,
name
:
res
.
data
[
i
].
country
,
x
:
Math
.
random
()
*
10
,
x
:
Math
.
random
()
*
10
,
y
:
Math
.
random
()
*
10
y
:
Math
.
random
()
*
10
,
// 节点颜色
itemStyle
:
{
color
:
`rgba(
${
Math
.
floor
(
Math
.
random
()
*
256
)}
,
${
Math
.
floor
(
Math
.
random
()
*
256
)}
,
${
Math
.
floor
(
Math
.
random
()
*
256
)}
, 1)`
}
};
};
let
item1
=
{
let
item1
=
{
name
:
res
.
data
[
i
].
relationCountry
,
name
:
res
.
data
[
i
].
relationCountry
,
...
@@ -652,7 +893,7 @@ const initRightDonut = async () => {
...
@@ -652,7 +893,7 @@ const initRightDonut = async () => {
if
(
index
===
-
1
)
{
if
(
index
===
-
1
)
{
data
.
push
(
item
);
data
.
push
(
item
);
}
}
if
(
index1
===
-
1
)
{
if
(
index1
===
-
1
)
{
data
.
push
(
item1
);
data
.
push
(
item1
);
}
}
...
@@ -694,7 +935,7 @@ const initRightDonut = async () => {
...
@@ -694,7 +935,7 @@ const initRightDonut = async () => {
series
:
[
series
:
[
{
{
type
:
"graph"
,
type
:
"graph"
,
layout
:
"
none
"
,
layout
:
"
circular
"
,
symbolSize
:
50
,
symbolSize
:
50
,
roam
:
true
,
roam
:
true
,
label
:
{
label
:
{
...
...
src/views/writtingAsstaint/index.vue
浏览文件 @
5981ec64
...
@@ -31,39 +31,24 @@
...
@@ -31,39 +31,24 @@
</div>
</div>
<div
class=
"writting-main"
>
<div
class=
"writting-main"
>
<div
class=
"sider"
>
<div
class=
"sider"
>
<div
class=
"sider-box
1
"
>
<div
class=
"sider-box
"
v-if=
"false
"
>
<div
class=
"header"
>
报文主题
</div>
<div
class=
"header"
>
报文主题
</div>
<div
class=
"title-box"
>
<div
class=
"title-box"
>
<div
class=
"title"
>
主题名称
</div>
<div
class=
"title"
>
主题名称
</div>
<el-input
<el-input
:disabled=
"true"
style=
"width: 476px; height: 32px"
class=
"title-input"
style=
"width: 476px; height: 32px"
placeholder=
"输入主题名称,如:大而美法案"
v-model=
"writtingTitle"
/>
class=
"title-input"
placeholder=
"输入主题名称,如:大而美法案"
v-model=
"writtingTitle"
/>
</div>
</div>
<div
class=
"description-box"
>
<div
class=
"description-box"
>
<div
class=
"title"
>
主题描述
</div>
<div
class=
"title"
>
主题描述
</div>
<el-input
<el-input
:disabled=
"true"
class=
"description-input"
type=
"textarea"
style=
"width: 476px"
class=
"description-input"
:rows=
"8"
placeholder=
"输入报文主题描述,如:从科技领域方面分析大而美法案通过后对中国可能产生的影响"
v-model=
"descText"
/>
type=
"textarea"
style=
"width: 476px"
:rows=
"8"
placeholder=
"输入报文主题描述,如:从科技领域方面分析大而美法案通过后对中国可能产生的影响"
v-model=
"descText"
/>
</div>
</div>
</div>
</div>
<div
class=
"sider-box
2
"
>
<div
class=
"sider-box"
>
<div
class=
"header"
>
报文模板
</div>
<div
class=
"header"
>
报文模板
</div>
<div
class=
"template-box"
>
<div
class=
"template-box"
>
<div
<div
class=
"template"
:class=
"
{ tempActive: tempActiveIndex === index }"
class=
"template"
v-for="(temp, index) in tempList" :key="index" @click="handleClickTemp(temp, index)">
:class=
"
{ tempActive: tempActiveIndex === index }"
v-for="(temp, index) in tempList"
:key="index"
@click="handleClickTemp(temp, index)"
>
<div
class=
"header"
>
<div
class=
"header"
>
<div
class=
"title"
>
{{
temp
.
title
}}
</div>
<div
class=
"title"
>
{{
temp
.
title
}}
</div>
<div
class=
"icon"
>
<div
class=
"icon"
>
...
@@ -79,14 +64,32 @@
...
@@ -79,14 +64,32 @@
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"sider-box"
>
<div
class=
"header"
>
加载本地文件
</div>
<el-upload
action=
""
:auto-upload=
"false"
accept=
".pdf"
limit=
"1"
:on-exceed=
"handleExceed"
ref=
"upload"
:on-change=
"handleFileChange"
>
<el-button
class=
"sider-upload-btn"
type=
"primary"
>
<el-icon
class=
"sider-upload-btn-text"
>
<Upload
/>
</el-icon>
<span
class=
"sider-upload-btn-text"
>
上传文件
</span>
</el-button>
<template
#
tip
>
<div
class=
"sider-upload-btn-tip"
>
支持扩展名:.doc .docx .pdf
</div>
</
template
>
</el-upload>
</div>
<div
class=
"submit-btn"
@
click=
"getStreamChat"
>
<div
class=
"tips"
>
<div
class=
"tips"
>
<div
class=
"tips-icon"
>
<div
class=
"tips-icon"
>
<img
src=
"./assets/images/tips-icon.png"
alt=
""
/>
<img
src=
"./assets/images/tips-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"tips-text"
>
内容由AI生成,无法确保真实准确,仅供参考
</div>
<div
class=
"tips-text"
>
内容由AI生成,无法确保真实准确,仅供参考
</div>
</div>
</div>
</div>
<div
class=
"submit-btn"
@
click=
"getStreamChat"
>
<div
class=
"submit-icon"
>
<div
class=
"submit-icon"
>
<img
src=
"./assets/images/ai.png"
alt=
""
/>
<img
src=
"./assets/images/ai.png"
alt=
""
/>
</div>
</div>
...
@@ -95,10 +98,9 @@
...
@@ -95,10 +98,9 @@
</div>
</div>
<div
class=
"process-box"
v-if=
"isShowProcess"
>
<div
class=
"process-box"
v-if=
"isShowProcess"
>
<div
class=
"back"
@
click=
"handleBack"
>
<div
class=
"back"
@
click=
"handleBack"
>
{{
"< 返回"
}}
{{ "
<
返回"
}}
</
div
>
</div>
<div
class=
"process-main-box"
>
<div
class=
"process-main-box"
>
<!-- <div class="analysis-box">
<!--
<div
class=
"analysis-box"
>
<div class="analysis-header">
<div class="analysis-header">
<div class="icon">
<div class="icon">
<img src="./assets/images/right-arrow.png" alt="" />
<img src="./assets/images/right-arrow.png" alt="" />
...
@@ -111,55 +113,50 @@
...
@@ -111,55 +113,50 @@
}}
}}
</div>
</div>
</div> -->
</div> -->
<div
class=
"steps-box"
>
<div
class=
"steps-box"
>
<div
class=
"steps-header"
>
<div
class=
"steps-header"
>
<div
class=
"icon"
>
<div
class=
"icon"
>
<img
src=
"./assets/images/right-arrow.png"
alt=
""
/>
<img
src=
"./assets/images/right-arrow.png"
alt=
""
/>
</div>
<div
class=
"text"
>
{{ "执行步骤:" }}
</div>
</div>
<div
class=
"steps-content"
ref=
"scrollProcessContainer"
v-html=
"renderedProcess"
></div>
</div>
</div>
<div
class=
"text"
>
{{
"执行步骤:"
}}
</div>
<!-- <div class="doing-box">
</div>
<div
class=
"steps-content"
ref=
"scrollProcessContainer"
v-html=
"renderedProcess"
></div>
</div>
<!--
<div
class=
"doing-box"
>
{{ "正在执行步骤1/7:根据制图主题生成关键词" }}
{{ "正在执行步骤1/7:根据制图主题生成关键词" }}
</div> -->
</div> -->
<div
class=
"tool-box"
>
<div
class=
"tool-box"
>
<div
class=
"tool-header"
>
{{
"工具调用"
}}
</div>
<div
class=
"tool-header"
>
{{ "工具调用" }}
</div>
<div
class=
"tool-main"
>
当前智能体工具:
{{
curAgentTool
?
curAgentTool
:
"无"
}}
</div>
<div
class=
"tool-main"
>
当前智能体工具:{{ curAgentTool ? curAgentTool : "无" }}
</div>
</div>
</div>
</div>
</div>
<div
class=
"process-tips-box"
>
<div
class=
"process-tips-box"
>
<div
class=
"tips-icon"
>
<div
class=
"tips-icon"
>
<img
src=
"./assets/images/tips-icon.png"
alt=
""
/>
<img
src=
"./assets/images/tips-icon.png"
alt=
""
/>
</div>
</div>
<div
class=
"tips-text"
>
内容由AI生成,无法确保真实准确,仅供参考
</div>
<div
class=
"tips-text"
>
内容由AI生成,无法确保真实准确,仅供参考
</div>
</div>
<div
class=
"process-footer-box"
>
<div
class=
"footer-left"
>
{{ isGenerating ? "报文生成中..." : "报文已生成" }}
</div>
<div
class=
"footer-right"
>
<div
class=
"icon"
></div>
<div
class=
"text"
@
click=
"handleGenerate"
>
{{ "停止" }}
</div>
</div>
</div>
</div>
</div>
<div
class=
"process-footer-box"
>
<div
class=
"main-box"
>
<div
class=
"footer-left"
>
<div
v-if=
"isEditMode"
class=
"edit-panel"
>
{{
isGenerating
?
"报文生成中..."
:
"报文已生成"
}}
<v-md-editor
v-model=
"reportContent"
height=
"calc(100% - 40px)"
:disabled-menus=
"[]"
</div>
@
upload-image=
"handleUploadImage"
@
save=
"handleSave"
<div
class=
"footer-right"
>
left-toolbar=
"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save"
<div
class=
"icon"
></div>
right-toolbar=
"preview toc sync-scroll fullscreen"
/>
<div
class=
"text"
@
click=
"handleGenerate"
>
{{
"停止"
}}
</div>
</div>
</div>
<div
v-else
class=
"content-box"
ref=
"scrollContainer"
v-html=
"renderedContent"
></div>
</div>
</div>
</div>
</div>
<div
class=
"main-box"
>
<div
v-if=
"isEditMode"
class=
"edit-panel"
>
<v-md-editor
v-model=
"reportContent"
height=
"calc(100% - 40px)"
:disabled-menus=
"[]"
@
upload-image=
"handleUploadImage"
@
save=
"handleSave"
left-toolbar=
"undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save"
right-toolbar=
"preview toc sync-scroll fullscreen"
/>
</div>
<div
v-else
class=
"content-box"
ref=
"scrollContainer"
v-html=
"renderedContent"
></div>
</div>
</div>
</div>
</div>
</template>
</template>
<
script
setup
>
<
script
setup
>
...
@@ -175,6 +172,7 @@ import "@kangc/v-md-editor/lib/theme/style/vuepress.css";
...
@@ -175,6 +172,7 @@ import "@kangc/v-md-editor/lib/theme/style/vuepress.css";
// 引入 Prism 相关依赖
// 引入 Prism 相关依赖
import
Prism
from
"prismjs"
;
import
Prism
from
"prismjs"
;
import
{
ElButton
,
ElIcon
,
ElInput
,
ElMessage
,
ElUpload
,
genFileId
}
from
"element-plus"
;
VMdEditor
.
use
(
vuepressTheme
,
{
VMdEditor
.
use
(
vuepressTheme
,
{
Prism
Prism
...
@@ -182,6 +180,28 @@ VMdEditor.use(vuepressTheme, {
...
@@ -182,6 +180,28 @@ VMdEditor.use(vuepressTheme, {
const
isGenerating
=
ref
(
false
);
const
isGenerating
=
ref
(
false
);
const
isShowProcess
=
ref
(
false
);
const
isShowProcess
=
ref
(
false
);
const
uploadFileList
=
ref
([])
const
upload
=
ref
()
//新上传文件替换
const
handleExceed
=
(
files
)
=>
{
if
(
upload
.
value
)
{
upload
.
value
.
clearFiles
()
const
file
=
files
[
0
]
file
.
uid
=
genFileId
()
upload
.
value
.
handleStart
(
file
)
}
}
const
handleFileChange
=
(
file
,
files
)
=>
{
// 只保留最后选中的1个文件(覆盖原有文件)
if
(
files
.
length
>
1
)
{
uploadFileList
.
value
=
[
file
];
}
else
{
uploadFileList
.
value
=
files
;
}
};
const
handleBack
=
()
=>
{
const
handleBack
=
()
=>
{
isShowProcess
.
value
=
false
;
isShowProcess
.
value
=
false
;
...
@@ -219,7 +239,6 @@ const steps = [
...
@@ -219,7 +239,6 @@ const steps = [
];
];
const
isEditMode
=
ref
(
false
);
const
isEditMode
=
ref
(
false
);
const
handleSwitchMode
=
()
=>
{
const
handleSwitchMode
=
()
=>
{
isEditMode
.
value
=
!
isEditMode
.
value
;
isEditMode
.
value
=
!
isEditMode
.
value
;
if
(
!
isEditMode
.
value
)
{
if
(
!
isEditMode
.
value
)
{
...
@@ -269,14 +288,90 @@ const handleGenerate = () => {
...
@@ -269,14 +288,90 @@ const handleGenerate = () => {
const
curAgentTool
=
ref
(
"报告整体优化工具"
);
const
curAgentTool
=
ref
(
"报告整体优化工具"
);
const
getStreamChat
=
async
(
search
,
inputValue
)
=>
{
const
getStreamChat
=
async
(
search
,
inputValue
)
=>
{
const
params
=
{
if
(
uploadFileList
.
value
.
length
>
0
)
{
query
:
writtingTitle
.
value
,
// "输出一篇报文"
const
rawFile
=
uploadFileList
.
value
[
0
].
raw
;
desc
:
descText
.
value
,
if
(
!
rawFile
)
{
topic
:
curTempTitle
.
value
// 政令、智库、法案、清单
ElMessage
.
error
(
'文件解析失败,请重新选择'
);
};
return
;
}
callSseWithPdf
(
rawFile
)
}
else
{
const
params
=
{
query
:
writtingTitle
.
value
,
// "输出一篇报文"
desc
:
descText
.
value
,
topic
:
curTempTitle
.
value
// 政令、智库、法案、清单
};
callSseWithAi
(
params
)
}
};
const
callSseWithPdf
=
async
(
selectedFile
)
=>
{
abortController
.
value
=
new
AbortController
();
abortController
.
value
=
new
AbortController
();
try
{
// 构造FormData(和后端字段名保持一致)
const
formData
=
new
FormData
();
formData
.
append
(
'pdf'
,
selectedFile
);
// 调用fetchEventSource(核心:支持POST+FormData+SSE)
await
fetchEventSource
(
'/pdfSse/api/v1/order/pdf/extract/report/sse'
,
{
method
:
'POST'
,
// 关键:设置POST方法
body
:
formData
,
// 关键:传递PDF文件的FormData
signal
:
abortController
.
value
.
signal
,
// 中断信号
headers
:
{
// 禁用默认的SSE协议头(避免和文件上传冲突)
'Accept'
:
'text/event-stream'
,
'Cache-Control'
:
'no-cache'
,
'Connection'
:
'keep-alive'
},
// 禁用自动重连(可选,根据后端配置)
retry
:
0
,
// 核心:原生onmessage回调(无需手动分割/解析)
async
onopen
(
res
)
{
console
.
log
(
"流式回答开始"
,
res
);
isGenerating
.
value
=
true
;
isShowProcess
.
value
=
true
;
},
async
onmessage
(
res
)
{
const
{
data
,
event
}
=
res
const
jsonData
=
JSON
.
parse
(
data
)
switch
(
event
)
{
case
"progress"
:
processContent
.
value
+=
`
${
getFormattedTime
()}
:
${
jsonData
.
message
}
\r\n`
;
updateProcess
(
processContent
.
value
,
scrollProcessContainer
.
value
);
break
;
case
"result"
:
callSseWithAi
({
query
:
writtingTitle
.
value
,
// "输出一篇报文"
desc
:
descText
.
value
,
topic
:
"政令"
,
result
:
data
// 政令、智库、法案、清单
})
default
:
break
;
}
},
onerror
(
error
)
{
ElMessage
({
message
:
"写报生成报错!"
,
type
:
"warning"
});
abortController
.
value
.
abort
();
abortController
.
value
=
new
AbortController
();
throw
new
Error
(
error
);
}
});
}
catch
(
error
)
{
if
(
error
.
name
!==
'AbortError'
)
{
ElMessage
.
error
(
`请求失败:
${
error
.
message
}
`
);
isLoading
.
value
=
false
;
}
}
};
const
callSseWithAi
=
async
(
params
)
=>
{
abortController
.
value
=
new
AbortController
();
fetchEventSource
(
"/sseWrite/api/v1/workflow/invoke"
,
{
fetchEventSource
(
"/sseWrite/api/v1/workflow/invoke"
,
{
method
:
"POST"
,
method
:
"POST"
,
headers
:
{
headers
:
{
...
@@ -339,6 +434,14 @@ const getStreamChat = async (search, inputValue) => {
...
@@ -339,6 +434,14 @@ const getStreamChat = async (search, inputValue) => {
abortController
.
value
=
new
AbortController
();
abortController
.
value
=
new
AbortController
();
throw
new
Error
(
error
);
throw
new
Error
(
error
);
});
});
}
const
getFormattedTime
=
()
=>
{
const
now
=
new
Date
();
// 补零函数:确保单个数字补为两位(如 1 → 01,9 → 09)
const
pad
=
n
=>
n
.
toString
().
padStart
(
2
,
'0'
);
return
`
${
now
.
getFullYear
()}
-
${
pad
(
now
.
getMonth
()
+
1
)}
-
${
pad
(
now
.
getDate
())}
${
pad
(
now
.
getHours
())}
:
${
pad
(
now
.
getMinutes
())}
:
${
pad
(
now
.
getSeconds
())}
`
;
};
};
const
writtingTitle
=
ref
(
""
);
const
writtingTitle
=
ref
(
""
);
...
@@ -381,7 +484,7 @@ const tempActiveIndex = ref(0);
...
@@ -381,7 +484,7 @@ const tempActiveIndex = ref(0);
const
handleClickTemp
=
(
item
,
index
)
=>
{
const
handleClickTemp
=
(
item
,
index
)
=>
{
tempActiveIndex
.
value
=
index
;
tempActiveIndex
.
value
=
index
;
curTempTitle
.
value
=
item
.
title
;
curTempTitle
.
value
=
item
.
title
;
};
};
// 导出
// 导出
...
@@ -395,7 +498,7 @@ const exportContent = () => {
...
@@ -395,7 +498,7 @@ const exportContent = () => {
URL
.
revokeObjectURL
(
url
);
URL
.
revokeObjectURL
(
url
);
};
};
onMounted
(()
=>
{});
onMounted
(()
=>
{
});
onUnmounted
(()
=>
{
onUnmounted
(()
=>
{
if
(
abortController
.
value
)
{
if
(
abortController
.
value
)
{
...
@@ -408,6 +511,7 @@ onUnmounted(() => {
...
@@ -408,6 +511,7 @@ onUnmounted(() => {
.writting-wrapper
{
.writting-wrapper
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
.writting-header
{
.writting-header
{
height
:
60px
;
height
:
60px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
...
@@ -417,6 +521,7 @@ onUnmounted(() => {
...
@@ -417,6 +521,7 @@ onUnmounted(() => {
background
:
rgba
(
255
,
255
,
255
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
display
:
flex
;
display
:
flex
;
position
:
relative
;
position
:
relative
;
.tab-box
{
.tab-box
{
display
:
flex
;
display
:
flex
;
margin-left
:
130px
;
margin-left
:
130px
;
...
@@ -424,6 +529,7 @@ onUnmounted(() => {
...
@@ -424,6 +529,7 @@ onUnmounted(() => {
width
:
260px
;
width
:
260px
;
height
:
46px
;
height
:
46px
;
justify-content
:
space-between
;
justify-content
:
space-between
;
.tab
{
.tab
{
color
:
rgba
(
95
,
101
,
108
,
1
);
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
...
@@ -431,6 +537,7 @@ onUnmounted(() => {
...
@@ -431,6 +537,7 @@ onUnmounted(() => {
font-weight
:
400
;
font-weight
:
400
;
line-height
:
30px
;
line-height
:
30px
;
}
}
.tabActive
{
.tabActive
{
color
:
rgba
(
5
,
95
,
194
,
1
);
color
:
rgba
(
5
,
95
,
194
,
1
);
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
...
@@ -440,12 +547,14 @@ onUnmounted(() => {
...
@@ -440,12 +547,14 @@ onUnmounted(() => {
border-bottom
:
4px
solid
rgba
(
5
,
95
,
194
,
1
);
border-bottom
:
4px
solid
rgba
(
5
,
95
,
194
,
1
);
}
}
}
}
.btn-box
{
.btn-box
{
position
:
absolute
;
position
:
absolute
;
top
:
12px
;
top
:
12px
;
right
:
39px
;
right
:
39px
;
display
:
flex
;
display
:
flex
;
gap
:
12px
;
gap
:
12px
;
.btn
{
.btn
{
display
:
flex
;
display
:
flex
;
justify-content
:
center
;
justify-content
:
center
;
...
@@ -458,14 +567,17 @@ onUnmounted(() => {
...
@@ -458,14 +567,17 @@ onUnmounted(() => {
border-radius
:
6px
;
border-radius
:
6px
;
background
:
rgba
(
255
,
255
,
255
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
cursor
:
pointer
;
cursor
:
pointer
;
.icon
{
.icon
{
width
:
16px
;
width
:
16px
;
height
:
16px
;
height
:
16px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.text
{
.text
{
width
:
32px
;
width
:
32px
;
height
:
24px
;
height
:
24px
;
...
@@ -475,19 +587,23 @@ onUnmounted(() => {
...
@@ -475,19 +587,23 @@ onUnmounted(() => {
font-weight
:
400
;
font-weight
:
400
;
line-height
:
24px
;
line-height
:
24px
;
}
}
.text1
{
.text1
{
color
:
#fff
;
color
:
#fff
;
}
}
}
}
.btn1
{
.btn1
{
background
:
rgba
(
5
,
95
,
194
,
1
);
background
:
rgba
(
5
,
95
,
194
,
1
);
}
}
}
}
}
}
.writting-main
{
.writting-main
{
display
:
flex
;
display
:
flex
;
height
:
calc
(
100%
-
60px
);
height
:
calc
(
100%
-
60px
);
position
:
relative
;
position
:
relative
;
.process-box
{
.process-box
{
position
:
absolute
;
position
:
absolute
;
left
:
0
;
left
:
0
;
...
@@ -496,6 +612,7 @@ onUnmounted(() => {
...
@@ -496,6 +612,7 @@ onUnmounted(() => {
height
:
100%
;
height
:
100%
;
z-index
:
9999
;
z-index
:
9999
;
background
:
#fff
;
background
:
#fff
;
.back
{
.back
{
margin-top
:
21px
;
margin-top
:
21px
;
height
:
24px
;
height
:
24px
;
...
@@ -508,24 +625,29 @@ onUnmounted(() => {
...
@@ -508,24 +625,29 @@ onUnmounted(() => {
line-height
:
24px
;
line-height
:
24px
;
cursor
:
pointer
;
cursor
:
pointer
;
}
}
.process-main-box
{
.process-main-box
{
margin-top
:
20px
;
margin-top
:
20px
;
margin-left
:
22px
;
margin-left
:
22px
;
width
:
476px
;
width
:
476px
;
height
:
900px
;
height
:
900px
;
// background: orange;
// background: orange;
.analysis-box
{
.analysis-box
{
.analysis-header
{
.analysis-header
{
display
:
flex
;
display
:
flex
;
.icon
{
.icon
{
margin-top
:
5px
;
margin-top
:
5px
;
width
:
20px
;
width
:
20px
;
height
:
20px
;
height
:
20px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.text
{
.text
{
height
:
30px
;
height
:
30px
;
line-height
:
30px
;
line-height
:
30px
;
...
@@ -536,6 +658,7 @@ onUnmounted(() => {
...
@@ -536,6 +658,7 @@ onUnmounted(() => {
margin-left
:
5px
;
margin-left
:
5px
;
}
}
}
}
.analysis-content
{
.analysis-content
{
height
:
90px
;
height
:
90px
;
line-height
:
30px
;
line-height
:
30px
;
...
@@ -546,19 +669,24 @@ onUnmounted(() => {
...
@@ -546,19 +669,24 @@ onUnmounted(() => {
text-indent
:
32px
;
text-indent
:
32px
;
}
}
}
}
.steps-box
{
.steps-box
{
margin-top
:
20px
;
margin-top
:
20px
;
.steps-header
{
.steps-header
{
display
:
flex
;
display
:
flex
;
.icon
{
.icon
{
margin-top
:
5px
;
margin-top
:
5px
;
width
:
20px
;
width
:
20px
;
height
:
20px
;
height
:
20px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.text
{
.text
{
height
:
30px
;
height
:
30px
;
line-height
:
30px
;
line-height
:
30px
;
...
@@ -569,6 +697,7 @@ onUnmounted(() => {
...
@@ -569,6 +697,7 @@ onUnmounted(() => {
margin-left
:
5px
;
margin-left
:
5px
;
}
}
}
}
.steps-content
{
.steps-content
{
height
:
560px
;
height
:
560px
;
width
:
100%
;
width
:
100%
;
...
@@ -597,6 +726,7 @@ onUnmounted(() => {
...
@@ -597,6 +726,7 @@ onUnmounted(() => {
// }
// }
}
}
}
}
.doing-box
{
.doing-box
{
height
:
40px
;
height
:
40px
;
line-height
:
40px
;
line-height
:
40px
;
...
@@ -606,18 +736,21 @@ onUnmounted(() => {
...
@@ -606,18 +736,21 @@ onUnmounted(() => {
font-weight
:
400
;
font-weight
:
400
;
margin-left
:
20px
;
margin-left
:
20px
;
}
}
.tool-box
{
.tool-box
{
width
:
440px
;
width
:
440px
;
height
:
160px
;
height
:
160px
;
margin
:
10px
auto
;
margin
:
10px
auto
;
background
:
#f6f9fe
;
background
:
#f6f9fe
;
border-radius
:
10px
;
border-radius
:
10px
;
.tool-header
{
.tool-header
{
height
:
30px
;
height
:
30px
;
line-height
:
30px
;
line-height
:
30px
;
margin-left
:
20px
;
margin-left
:
20px
;
color
:
var
(
--
color-main-active
);
color
:
var
(
--
color-main-active
);
}
}
.tool-main
{
.tool-main
{
height
:
110px
;
height
:
110px
;
width
:
400px
;
width
:
400px
;
...
@@ -631,21 +764,25 @@ onUnmounted(() => {
...
@@ -631,21 +764,25 @@ onUnmounted(() => {
}
}
}
}
}
}
.process-tips-box
{
.process-tips-box
{
position
:
absolute
;
position
:
absolute
;
left
:
22px
;
left
:
22px
;
bottom
:
81px
;
bottom
:
81px
;
height
:
22px
;
height
:
22px
;
display
:
flex
;
display
:
flex
;
.tips-icon
{
.tips-icon
{
width
:
14px
;
width
:
14px
;
height
:
16px
;
height
:
16px
;
margin-top
:
3px
;
margin-top
:
3px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.tips-text
{
.tips-text
{
margin-left
:
8px
;
margin-left
:
8px
;
color
:
rgba
(
132
,
136
,
142
,
1
);
color
:
rgba
(
132
,
136
,
142
,
1
);
...
@@ -655,12 +792,14 @@ onUnmounted(() => {
...
@@ -655,12 +792,14 @@ onUnmounted(() => {
line-height
:
22px
;
line-height
:
22px
;
}
}
}
}
.process-footer-box
{
.process-footer-box
{
height
:
36px
;
height
:
36px
;
display
:
flex
;
display
:
flex
;
position
:
absolute
;
position
:
absolute
;
left
:
22px
;
left
:
22px
;
bottom
:
29px
;
bottom
:
29px
;
.footer-left
{
.footer-left
{
width
:
348px
;
width
:
348px
;
height
:
36px
;
height
:
36px
;
...
@@ -673,6 +812,7 @@ onUnmounted(() => {
...
@@ -673,6 +812,7 @@ onUnmounted(() => {
text-align
:
center
;
text-align
:
center
;
line-height
:
36px
;
line-height
:
36px
;
}
}
.footer-right
{
.footer-right
{
margin-left
:
8px
;
margin-left
:
8px
;
display
:
flex
;
display
:
flex
;
...
@@ -686,12 +826,14 @@ onUnmounted(() => {
...
@@ -686,12 +826,14 @@ onUnmounted(() => {
align-items
:
center
;
align-items
:
center
;
gap
:
8px
;
gap
:
8px
;
cursor
:
pointer
;
cursor
:
pointer
;
.icon
{
.icon
{
width
:
8px
;
width
:
8px
;
height
:
8px
;
height
:
8px
;
border-radius
:
2px
;
border-radius
:
2px
;
background
:
var
(
--
color-main-active
);
background
:
var
(
--
color-main-active
);
}
}
.text
{
.text
{
color
:
var
(
--
color-main-active
);
color
:
var
(
--
color-main-active
);
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
...
@@ -702,6 +844,7 @@ onUnmounted(() => {
...
@@ -702,6 +844,7 @@ onUnmounted(() => {
}
}
}
}
}
}
.sider
{
.sider
{
width
:
520px
;
width
:
520px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
...
@@ -709,62 +852,28 @@ onUnmounted(() => {
...
@@ -709,62 +852,28 @@ onUnmounted(() => {
border-top
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
border-top
:
1px
solid
rgba
(
234
,
236
,
238
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
background
:
rgba
(
255
,
255
,
255
,
1
);
position
:
relative
;
position
:
relative
;
.sider-box1
{
padding
:
21px
21px
;
margin-top
:
21px
;
display
:
flex
;
margin-left
:
22px
;
flex-direction
:
column
;
.header
{
gap
:
23px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
.sider-box
{
font-weight
:
700
;
line-height
:
24px
;
}
.title-box
{
margin-top
:
15px
;
.title
{
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
24px
;
}
.title-input
{
margin-top
:
15px
;
}
}
.description-box
{
margin-top
:
24px
;
.title
{
height
:
24px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
24px
;
}
.description-input
{
margin-top
:
12px
;
height
:
200px
;
}
}
}
.sider-box2
{
margin-top
:
24px
;
margin-left
:
22px
;
.header
{
.header
{
height
:
24px
;
color
:
rgba
(
59
,
65
,
75
,
1
);
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
700
;
font-weight
:
700
;
line-height
:
24px
;
line-height
:
24px
;
}
}
.template-box
{
.template-box
{
margin-top
:
19px
;
margin-top
:
19px
;
height
:
260px
;
height
:
260px
;
display
:
flex
;
display
:
flex
;
flex-wrap
:
wrap
;
flex-wrap
:
wrap
;
gap
:
16px
;
gap
:
16px
;
.template
{
.template
{
width
:
230px
;
width
:
230px
;
height
:
120px
;
height
:
120px
;
...
@@ -773,6 +882,7 @@ onUnmounted(() => {
...
@@ -773,6 +882,7 @@ onUnmounted(() => {
border-radius
:
4px
;
border-radius
:
4px
;
position
:
relative
;
position
:
relative
;
cursor
:
pointer
;
cursor
:
pointer
;
.active-icon
{
.active-icon
{
width
:
24px
;
width
:
24px
;
height
:
24px
;
height
:
24px
;
...
@@ -780,11 +890,13 @@ onUnmounted(() => {
...
@@ -780,11 +890,13 @@ onUnmounted(() => {
top
:
0
;
top
:
0
;
right
:
0
;
right
:
0
;
z-index
:
99
;
z-index
:
99
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.selected-icon
{
.selected-icon
{
width
:
8px
;
width
:
8px
;
height
:
6px
;
height
:
6px
;
...
@@ -792,15 +904,18 @@ onUnmounted(() => {
...
@@ -792,15 +904,18 @@ onUnmounted(() => {
top
:
-4px
;
top
:
-4px
;
right
:
3px
;
right
:
3px
;
z-index
:
100
;
z-index
:
100
;
img
{
img
{
width
:
8px
;
width
:
8px
;
height
:
6px
;
height
:
6px
;
}
}
}
}
.header
{
.header
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
height
:
50px
;
height
:
50px
;
.title
{
.title
{
height
:
24px
;
height
:
24px
;
// color: rgba(59, 65, 75, 1);
// color: rgba(59, 65, 75, 1);
...
@@ -812,6 +927,7 @@ onUnmounted(() => {
...
@@ -812,6 +927,7 @@ onUnmounted(() => {
margin-left
:
15px
;
margin-left
:
15px
;
margin-top
:
16px
;
margin-top
:
16px
;
}
}
.icon
{
.icon
{
margin-top
:
15px
;
margin-top
:
15px
;
margin-right
:
16px
;
margin-right
:
16px
;
...
@@ -819,6 +935,7 @@ onUnmounted(() => {
...
@@ -819,6 +935,7 @@ onUnmounted(() => {
height
:
30px
;
height
:
30px
;
border-radius
:
15px
;
border-radius
:
15px
;
background
:
rgba
(
231
,
243
,
255
,
1
);
background
:
rgba
(
231
,
243
,
255
,
1
);
img
{
img
{
width
:
17px
;
width
:
17px
;
height
:
14px
;
height
:
14px
;
...
@@ -827,6 +944,7 @@ onUnmounted(() => {
...
@@ -827,6 +944,7 @@ onUnmounted(() => {
}
}
}
}
}
}
.content
{
.content
{
margin
:
0
auto
;
margin
:
0
auto
;
width
:
200px
;
width
:
200px
;
...
@@ -839,24 +957,117 @@ onUnmounted(() => {
...
@@ -839,24 +957,117 @@ onUnmounted(() => {
line-height
:
24px
;
line-height
:
24px
;
}
}
}
}
.tempActive
{
.tempActive
{
border
:
1px
solid
rgba
(
5
,
95
,
194
,
1
);
border
:
1px
solid
rgba
(
5
,
95
,
194
,
1
);
background
:
rgba
(
246
,
250
,
255
,
1
);
background
:
rgba
(
246
,
250
,
255
,
1
);
}
}
}
}
.tips
{
.title-box
{
margin-top
:
15px
;
.title
{
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
24px
;
}
.title-input
{
margin-top
:
15px
;
}
}
.description-box
{
margin-top
:
24px
;
.title
{
height
:
24px
;
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-size
:
16px
;
font-weight
:
400
;
line-height
:
24px
;
}
.description-input
{
margin-top
:
12px
;
height
:
200px
;
}
}
.sider-upload-btn
{
width
:
476px
;
height
:
36px
;
box-sizing
:
border-box
;
border
:
1px
dashed
rgba
(
234
,
236
,
238
,
1
);
border-radius
:
6px
;
background
:
rgba
(
247
,
248
,
249
,
1
);
margin-top
:
19px
;
margin-top
:
19px
;
}
.sider-upload-btn-text
{
color
:
rgba
(
59
,
65
,
75
,
1
);
font-family
:
Microsoft
YaHei
;
font-style
:
Regular
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
22px
;
letter-spacing
:
0px
;
text-align
:
left
;
}
.sider-upload-btn-tip
{
color
:
rgba
(
95
,
101
,
108
,
1
);
font-family
:
Microsoft
YaHei
;
font-style
:
Regular
;
font-size
:
14px
;
font-weight
:
400
;
line-height
:
22px
;
letter-spacing
:
0px
;
text-align
:
left
;
margin-top
:
8px
;
}
}
.submit-btn
{
position
:
absolute
;
left
:
22px
;
bottom
:
13px
;
width
:
476px
;
height
:
36px
;
border-radius
:
4px
;
background
:
rgba
(
5
,
95
,
194
,
1
);
display
:
flex
;
justify-content
:
center
;
cursor
:
pointer
;
&
:hover
{
background
:
rgba
(
5
,
95
,
194
,
0
.8
);
}
.tips
{
height
:
22px
;
height
:
22px
;
display
:
flex
;
display
:
flex
;
position
:
absolute
;
top
:
-30px
;
left
:
0px
;
.tips-icon
{
.tips-icon
{
width
:
14px
;
width
:
14px
;
height
:
16px
;
height
:
16px
;
margin-top
:
3px
;
margin-top
:
3px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.tips-text
{
.tips-text
{
margin-left
:
8px
;
margin-left
:
8px
;
color
:
rgba
(
132
,
136
,
142
,
1
);
color
:
rgba
(
132
,
136
,
142
,
1
);
...
@@ -866,31 +1077,19 @@ onUnmounted(() => {
...
@@ -866,31 +1077,19 @@ onUnmounted(() => {
line-height
:
22px
;
line-height
:
22px
;
}
}
}
}
}
.submit-btn
{
position
:
absolute
;
left
:
22px
;
bottom
:
13px
;
width
:
476px
;
height
:
36px
;
border-radius
:
4px
;
background
:
rgba
(
5
,
95
,
194
,
1
);
display
:
flex
;
justify-content
:
center
;
cursor
:
pointer
;
&
:hover
{
background
:
rgba
(
5
,
95
,
194
,
0
.8
);
}
.submit-icon
{
.submit-icon
{
/* AI-logo */
/* AI-logo */
width
:
21px
;
width
:
21px
;
height
:
15px
;
height
:
15px
;
margin-top
:
10px
;
margin-top
:
10px
;
img
{
img
{
width
:
100%
;
width
:
100%
;
height
:
100%
;
height
:
100%
;
}
}
}
}
.submit-text
{
.submit-text
{
height
:
24px
;
height
:
24px
;
margin-top
:
5px
;
margin-top
:
5px
;
...
@@ -903,14 +1102,17 @@ onUnmounted(() => {
...
@@ -903,14 +1102,17 @@ onUnmounted(() => {
}
}
}
}
}
}
.main-box
{
.main-box
{
flex
:
1
;
flex
:
1
;
background
:
#f7f8f9
;
background
:
#f7f8f9
;
.edit-panel
{
.edit-panel
{
width
:
calc
(
100%
-
100px
);
width
:
calc
(
100%
-
100px
);
height
:
calc
(
100%
-
40px
);
height
:
calc
(
100%
-
40px
);
margin
:
20px
50px
;
margin
:
20px
50px
;
}
}
.content-box
{
.content-box
{
width
:
calc
(
100%
-
100px
);
width
:
calc
(
100%
-
100px
);
height
:
calc
(
100%
-
40px
);
height
:
calc
(
100%
-
40px
);
...
@@ -924,7 +1126,8 @@ onUnmounted(() => {
...
@@ -924,7 +1126,8 @@ onUnmounted(() => {
line-height
:
1
.7
;
line-height
:
1
.7
;
// font-size: 20px;
// font-size: 20px;
font-size
:
16px
;
font-size
:
16px
;
img
{
img
{
width
:
300px
;
width
:
300px
;
height
:
auto
;
height
:
auto
;
}
}
...
...
vite.config.js
浏览文件 @
5981ec64
...
@@ -80,6 +80,17 @@ export default defineConfig({
...
@@ -80,6 +80,17 @@ export default defineConfig({
target
:
'http://8.140.26.4:15000/'
,
target
:
'http://8.140.26.4:15000/'
,
changeOrigin
:
true
,
changeOrigin
:
true
,
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
temporarySearch/
,
''
)
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
temporarySearch/
,
''
)
},
'/pdfSse'
:
{
target
:
'http://8.140.26.4:10020/'
,
changeOrigin
:
true
,
rewrite
:
(
path
)
=>
path
.
replace
(
/^
\/
pdfSse/
,
''
),
configure
:
(
proxy
)
=>
{
proxy
.
on
(
'proxyReq'
,
(
proxyReq
)
=>
{
proxyReq
.
setHeader
(
'Connection'
,
'keep-alive'
);
proxyReq
.
setHeader
(
'Cache-Control'
,
'no-cache'
);
});
}
}
}
}
}
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论