提交 30acf543 authored 作者: 张伊明's avatar 张伊明

法案、政令、清单、智库新增写报跳转,写报修改样式

上级 463ca4d8
...@@ -3,63 +3,60 @@ ...@@ -3,63 +3,60 @@
<!-- 导航菜单 --> <!-- 导航菜单 -->
<div class="layout-main"> <div class="layout-main">
<div class="header-main"> <div class="header-main">
<div class="layout-main-header"> <div class="layout-main-header">
<div class="layout-main-header-left-box"> <div class="layout-main-header-left-box">
<div class="left-box-top"> <div class="left-box-top">
<div class="icon">
<img :src="billInfoGlobal.imageUrl || USALogo" alt="" />
</div>
<div class="info">
<div class="info-box1">{{ billInfoGlobal.billName }}</div>
<div class="info-box2">
{{ billInfoGlobal.description }} {{ billInfoGlobal.billNameEn }}
</div>
</div>
</div>
<div class="left-box-bottom">
<div
class="left-box-bottom-item"
:class="{ leftBoxBottomItemActive: activeTitle === item.name }"
v-for="(item, index) in mainHeaderBtnList"
:key="index"
@click="handleClickMainHeaderBtn(item)"
>
<div class="icon"> <div class="icon">
<img v-if="activeTitle === item.name" :src="item.activeIcon" alt="" /> <img :src="billInfoGlobal.imageUrl || USALogo" alt="" />
<img v-else :src="item.icon" alt="" />
</div> </div>
<div class="name" :class="{ nameActive: activeTitle === item.name }"> <div class="info">
{{ item.name }} <div class="info-box1">{{ billInfoGlobal.billName }}</div>
<div class="info-box2">{{ billInfoGlobal.description }} {{ billInfoGlobal.billNameEn }}</div>
</div> </div>
</div> </div>
</div> <div class="left-box-bottom">
</div> <div
<div class="layout-main-header-right-box"> class="left-box-bottom-item"
<div class="right-box-top"> :class="{ leftBoxBottomItemActive: activeTitle === item.name }"
<div class="time">{{ billInfoGlobal.introductionDate }}</div> v-for="(item, index) in mainHeaderBtnList"
<div class="name">{{ billInfoGlobal.tarName }}</div> :key="index"
</div> @click="handleClickMainHeaderBtn(item)"
<div class="right-box-bottom"> >
<div class="btn1" @click="handleSwitchActiveName('法案原文')"> <div class="icon">
<div class="icon"> <img v-if="activeTitle === item.name" :src="item.activeIcon" alt="" />
<img src="./assets/icons/btn-icon1.png" alt="" /> <img v-else :src="item.icon" alt="" />
</div>
<div class="name" :class="{ nameActive: activeTitle === item.name }">
{{ item.name }}
</div>
</div> </div>
<div class="text">{{ "法案原文" }}</div>
</div> </div>
<!-- <div class="btn2"> </div>
<div class="layout-main-header-right-box">
<div class="right-box-top">
<div class="time">{{ billInfoGlobal.introductionDate }}</div>
<div class="name">{{ billInfoGlobal.tarName }}</div>
</div>
<div class="right-box-bottom">
<div class="btn1" @click="handleSwitchActiveName('法案原文')">
<div class="icon">
<img src="./assets/icons/btn-icon1.png" alt="" />
</div>
<div class="text">{{ "法案原文" }}</div>
</div>
<!-- <div class="btn2">
<div class="icon"> <div class="icon">
<img src="./assets/icons/btn-icon2.png" alt="" /> <img src="./assets/icons/btn-icon2.png" alt="" />
</div> </div>
<div class="text">{{ "查看官网" }}</div> <div class="text">{{ "查看官网" }}</div>
</div> --> </div> -->
<div class="btn3"> <div class="btn3" @click="handleAnalysisClick">
<div class="icon"> <div class="icon">
<img src="./assets/icons/btn-icon3.png" alt="" /> <img src="./assets/icons/btn-icon3.png" alt="" />
</div>
<div class="text">{{ "分析报告" }}</div>
</div> </div>
<div class="text">{{ "分析报告" }}</div> <!-- <div class="btn4">
</div>
<!-- <div class="btn4">
<div class="icon"> <div class="icon">
<img src="./assets/icons/btn-icon4.png" alt="" /> <img src="./assets/icons/btn-icon4.png" alt="" />
</div> </div>
...@@ -68,11 +65,11 @@ ...@@ -68,11 +65,11 @@
<img src="./assets/icons/btn-icon5.png" alt="" /> <img src="./assets/icons/btn-icon5.png" alt="" />
</div> </div>
</div> --> </div> -->
</div>
</div> </div>
</div> </div>
</div>
</div> </div>
<div class="layout-main-center"> <div class="layout-main-center">
<router-view /> <router-view />
</div> </div>
...@@ -150,7 +147,6 @@ import icon4 from "./assets/icons/icon4.svg"; ...@@ -150,7 +147,6 @@ import icon4 from "./assets/icons/icon4.svg";
import icon4Active from "./assets/icons/icon4_active.svg"; import icon4Active from "./assets/icons/icon4_active.svg";
import USALogo from "./assets/images/USA-logo.png"; import USALogo from "./assets/images/USA-logo.png";
// 法案原文 // 法案原文
const billFullText = ref(""); const billFullText = ref("");
const getBillFullTextFn = async () => { const getBillFullTextFn = async () => {
...@@ -213,7 +209,7 @@ const mainHeaderBtnList = ref([ ...@@ -213,7 +209,7 @@ const mainHeaderBtnList = ref([
activeIcon: icon2Active, activeIcon: icon2Active,
name: "深度挖掘", name: "深度挖掘",
path: "/billLayout/deepDig" path: "/billLayout/deepDig"
}, }
// { // {
// icon: icon3, // icon: icon3,
// activeIcon: icon3Active, // activeIcon: icon3Active,
...@@ -241,6 +237,16 @@ const handleClickMainHeaderBtn = item => { ...@@ -241,6 +237,16 @@ const handleClickMainHeaderBtn = item => {
}); });
}; };
const handleAnalysisClick = () => {
router.push({
path: "/writtingAsstaint",
query: {
topic: "法案",
fileId: route.query.billId
}
});
};
onMounted(() => { onMounted(() => {
getBillInfoGlobalFn(); getBillInfoGlobalFn();
if (window.sessionStorage.getItem("activeTitle")) { if (window.sessionStorage.getItem("activeTitle")) {
...@@ -375,12 +381,11 @@ onMounted(() => { ...@@ -375,12 +381,11 @@ onMounted(() => {
// margin-right: 150px; // margin-right: 150px;
// margin-top: 19px; // margin-top: 19px;
.right-box-top { .right-box-top {
height: 64px; height: 64px;
display: flex; display: flex;
align-items: right; align-items: right;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
.time { .time {
// height: 24px; // height: 24px;
// line-height: 24px; // line-height: 24px;
......
...@@ -3,23 +3,29 @@ ...@@ -3,23 +3,29 @@
<!-- 导航菜单 --> <!-- 导航菜单 -->
<div class="layout-main"> <div class="layout-main">
<div class="header-main"> <div class="header-main">
<div class="layout-main-header"> <div class="layout-main-header">
<div class="layout-main-header-container"> <div class="layout-main-header-container">
<div class="layout-main-header-left-box"> <div class="layout-main-header-left-box">
<div class="left-box-top"> <div class="left-box-top">
<div class="icon"> <div class="icon">
<img
<img v-if="summaryInfo.imageUrl" :src="summaryInfo.imageUrl" alt="" style="height: 40px;margin-top: 12px;"/> v-if="summaryInfo.imageUrl"
:src="summaryInfo.imageUrl"
alt=""
style="height: 40px; margin-top: 12px"
/>
<img v-else :src="USALogo" alt="" /> <img v-else :src="USALogo" alt="" />
</div> </div>
<div class="info"> <div class="info">
<div class="info-box1">{{ summaryInfo.name }}</div> <div class="info-box1">{{ summaryInfo.name }}</div>
<div class="info-box2"> <div class="info-box2">
<div class="info-box2-item item1" v-if="summaryInfo.order">{{ summaryInfo.order +" | "}}</div> <div class="info-box2-item item1" v-if="summaryInfo.order">
{{ summaryInfo.order + " | " }}
<div class="info-box2-item item2" v-if="summaryInfo.type">{{ summaryInfo.type + " | " }}</div> </div>
<div class="info-box2-item item2" v-if="summaryInfo.type">
{{ summaryInfo.type + " | " }}
</div>
<div class="info-box2-item item3" v-if="summaryInfo.ename">{{ summaryInfo.ename }}</div> <div class="info-box2-item item3" v-if="summaryInfo.ename">{{ summaryInfo.ename }}</div>
</div> </div>
</div> </div>
...@@ -54,7 +60,7 @@ ...@@ -54,7 +60,7 @@
</div> </div>
<div class="text">{{ "政令原文" }}</div> <div class="text">{{ "政令原文" }}</div>
</div> </div>
<div class="btn-active"> <div class="btn-active" @click="handleAnalysisClick">
<div class="icon-active"> <div class="icon-active">
<img src="./assets/icons/edit-icon.png" alt="" /> <img src="./assets/icons/edit-icon.png" alt="" />
</div> </div>
...@@ -265,6 +271,16 @@ const handleShowReport = () => { ...@@ -265,6 +271,16 @@ const handleShowReport = () => {
window.open(curRoute.href, "_blank"); window.open(curRoute.href, "_blank");
}; };
const handleAnalysisClick = () => {
router.push({
path: "/writtingAsstaint",
query: {
topic: "政令",
fileId: route.query.id
}
});
};
onMounted(() => { onMounted(() => {
handleGetSummary(); handleGetSummary();
console.log(route.path); console.log(route.path);
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
</div> </div>
<div class="text">{{ "文档下载" }}</div> <div class="text">{{ "文档下载" }}</div>
</div> </div>
<div class="btn btn1"> <div class="btn btn1" @click="handleAnalysisClick">
<div class="icon"> <div class="icon">
<img src="./images/btn-icon4.png" alt="" /> <img src="./images/btn-icon4.png" alt="" />
</div> </div>
...@@ -79,8 +79,9 @@ import { ref, onMounted } from "vue"; ...@@ -79,8 +79,9 @@ import { ref, onMounted } from "vue";
import ReportAnalysis from "./reportAnalysis/index.vue"; import ReportAnalysis from "./reportAnalysis/index.vue";
import PolicyTracking from "./policyTracking/index.vue"; import PolicyTracking from "./policyTracking/index.vue";
import { getThinkTankReportSummary } from "@/api/thinkTank/overview"; import { getThinkTankReportSummary } from "@/api/thinkTank/overview";
import { useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
const router = useRouter(); const router = useRouter();
const route = useRoute();
const reportUrl = ref(""); const reportUrl = ref("");
const thinkInfo = ref({}); const thinkInfo = ref({});
...@@ -113,6 +114,16 @@ const tabActiveName = ref("报告分析"); ...@@ -113,6 +114,16 @@ const tabActiveName = ref("报告分析");
const switchTab = name => { const switchTab = name => {
tabActiveName.value = name; tabActiveName.value = name;
}; };
const handleAnalysisClick = () => {
router.push({
path: "/writtingAsstaint",
query: {
topic: "智库",
fileId: router.currentRoute._value.params.id
}
});
};
onMounted(async () => { onMounted(async () => {
handleGetThinkTankReportSummary(); handleGetThinkTankReportSummary();
}); });
......
...@@ -81,7 +81,10 @@ ...@@ -81,7 +81,10 @@
<div class="template-box"> <div class="template-box">
<div <div
class="template" class="template"
:class="{ tempActive: tempActiveIndex === index }" :class="{
tempActive: tempActiveIndex === index,
disableTemplate: tempActiveIndex !== index && Object.keys(route.query).length > 0
}"
v-for="(temp, index) in tempList" v-for="(temp, index) in tempList"
:key="index" :key="index"
@click="handleClickTemp(temp, index)" @click="handleClickTemp(temp, index)"
...@@ -113,8 +116,13 @@ ...@@ -113,8 +116,13 @@
ref="upload" ref="upload"
:on-change="handleFileChange" :on-change="handleFileChange"
:file-list="uploadFileList" :file-list="uploadFileList"
:disabled="Object.keys(route.query).length !== 0"
> >
<el-button class="sider-upload-btn" type="primary"> <el-button
class="sider-upload-btn"
type="primary"
:disabled="Object.keys(route.query).length !== 0"
>
<el-icon class="sider-upload-btn-text"> <el-icon class="sider-upload-btn-text">
<Upload /> <Upload />
</el-icon> </el-icon>
...@@ -184,14 +192,61 @@ import "@kangc/v-md-editor/lib/theme/style/vuepress.css"; ...@@ -184,14 +192,61 @@ import "@kangc/v-md-editor/lib/theme/style/vuepress.css";
import Prism from "prismjs"; import Prism from "prismjs";
import { ElButton, ElIcon, ElInput, ElMessage, ElUpload, genFileId } from "element-plus"; import { ElButton, ElIcon, ElInput, ElMessage, ElUpload, genFileId } from "element-plus";
VMdEditor.use(vuepressTheme, { import { useRoute } from "vue-router";
Prism const route = useRoute();
});
const isGenerating = ref(false); const isGenerating = ref(false);
const isShowProcess = ref(false); const isShowProcess = ref(false);
const uploadFileList = ref([]); const uploadFileList = ref([]);
const upload = ref(); const upload = ref();
// 流程
const scrollProcessContainer = ref(null);
const processContent = ref("");
// 报文
const scrollContainer = ref(null);
const reportContent = ref("");
const curTempTitle = ref("政令");
const abortController = ref(null);
// 当前调用工具
const curAgentTool = ref("");
const writtingTitle = ref("");
const descText = ref("");
const tabList = ref([
{
name: "写报",
active: true
},
{
name: "收藏",
active: false
},
{
name: "问答",
active: false
}
]);
const tempList = ref([
{
title: "政令",
desc: "基于政令内容生成各维度的综合分析报告"
},
{
title: "法案",
desc: "基于政令内容生成各维度的综合分析报告"
},
{
title: "智库",
desc: "基于智库内容生成各维度的综合分析报告"
},
{
title: "清单",
desc: "基于清单内容生成各维度的综合分析报告"
}
]);
const tempActiveIndex = ref(0);
VMdEditor.use(vuepressTheme, {
Prism
});
//新上传文件替换 //新上传文件替换
const handleExceed = files => { const handleExceed = files => {
...@@ -243,20 +298,9 @@ const saveToLocalStorage = text => { ...@@ -243,20 +298,9 @@ const saveToLocalStorage = text => {
localStorage.setItem("markdown-content", text); localStorage.setItem("markdown-content", text);
}; };
const abortController = ref(null);
const { renderedContent, updateContent } = useMarkdownStream(); const { renderedContent, updateContent } = useMarkdownStream();
const { renderedProcess, updateProcess } = useStream(); const { renderedProcess, updateProcess } = useStream();
// 流程
const scrollProcessContainer = ref(null);
const processContent = ref("");
// 报文
const scrollContainer = ref(null);
const reportContent = ref("");
const curTempTitle = ref("政令");
// 停止生成 // 停止生成
const handleGenerate = () => { const handleGenerate = () => {
isShowProcess.value = false; isShowProcess.value = false;
...@@ -264,28 +308,35 @@ const handleGenerate = () => { ...@@ -264,28 +308,35 @@ const handleGenerate = () => {
abortController.value.abort(); abortController.value.abort();
}; };
// 当前调用工具
const curAgentTool = ref("");
const getStreamChat = async (search, inputValue) => { const getStreamChat = async (search, inputValue) => {
if (curTempTitle.value === "政令") { if (Object.keys(route.query).length !== 0) {
if (uploadFileList.value.length === 0) {
ElMessage.error("请上传政令文件");
return;
}
const rawFile = uploadFileList.value[0].raw;
if (!rawFile) {
ElMessage.error("文件解析失败,请重新选择");
return;
}
callSseWithPdf(rawFile);
} else {
const params = { const params = {
query: writtingTitle.value, // "输出一篇报文" query: writtingTitle.value, // "输出一篇报文"
desc: descText.value, desc: descText.value,
topic: curTempTitle.value // 政令、智库、法案、清单 topic: curTempTitle.value,
fileId: route.query.fileId // 政令、智库、法案、清单
}; };
callSseWithAi(params); callSseWithAi(params);
} else {
if (curTempTitle.value === "政令") {
if (uploadFileList.value.length === 0) {
ElMessage.error("请上传政令文件");
return;
}
const rawFile = uploadFileList.value[0].raw;
if (!rawFile) {
ElMessage.error("文件解析失败,请重新选择");
return;
}
callSseWithPdf(rawFile);
} else {
const params = {
query: writtingTitle.value, // "输出一篇报文"
desc: descText.value,
topic: curTempTitle.value // 政令、智库、法案、清单
};
callSseWithAi(params);
}
} }
}; };
...@@ -480,44 +531,8 @@ const callSseWithAi = async params => { ...@@ -480,44 +531,8 @@ const callSseWithAi = async params => {
}); });
}; };
const writtingTitle = ref("");
const descText = ref("");
const tabList = ref([
{
name: "写报",
active: true
},
{
name: "收藏",
active: false
},
{
name: "问答",
active: false
}
]);
const tempList = ref([
{
title: "政令",
desc: "基于政令内容生成各维度的综合分析报告"
},
{
title: "法案",
desc: "基于政令内容生成各维度的综合分析报告"
},
{
title: "智库",
desc: "基于智库内容生成各维度的综合分析报告"
},
{
title: "清单",
desc: "基于清单内容生成各维度的综合分析报告"
}
]);
const tempActiveIndex = ref(0);
const handleClickTemp = (item, index) => { const handleClickTemp = (item, index) => {
if (Object.keys(route.query).length !== 0) return;
tempActiveIndex.value = index; tempActiveIndex.value = index;
curTempTitle.value = item.title; curTempTitle.value = item.title;
}; };
...@@ -533,7 +548,16 @@ const exportContent = () => { ...@@ -533,7 +548,16 @@ const exportContent = () => {
URL.revokeObjectURL(url); URL.revokeObjectURL(url);
}; };
onMounted(() => {}); onMounted(() => {
if (route && Object.keys(route.query).length !== 0) {
const { topic, fileId } = route.query;
if (!topic || !fileId) return;
curTempTitle.value = topic;
tempActiveIndex.value = tempList.value.findIndex((item, index) => {
return item.title === topic;
});
}
});
onUnmounted(() => { onUnmounted(() => {
if (abortController.value) { if (abortController.value) {
...@@ -892,6 +916,90 @@ onUnmounted(() => { ...@@ -892,6 +916,90 @@ onUnmounted(() => {
} }
} }
.disableTemplate {
width: 230px;
height: 120px;
box-sizing: border-box;
border: 1px solid #e4e7ed;
border-radius: 4px;
position: relative;
cursor: not-allowed;
background-color: #f5f7fa;
.active-icon {
width: 24px;
height: 24px;
position: absolute;
top: 0;
right: 0;
z-index: 99;
img {
width: 100%;
height: 100%;
}
}
.selected-icon {
width: 8px;
height: 6px;
position: absolute;
top: -4px;
right: 3px;
z-index: 100;
img {
width: 8px;
height: 6px;
}
}
.header {
display: flex;
justify-content: space-between;
height: 50px;
.title {
height: 24px;
color: #c0c4cc;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 24px;
margin-left: 15px;
margin-top: 16px;
}
.icon {
margin-top: 15px;
margin-right: 16px;
width: 30px;
height: 30px;
border-radius: 15px;
background: #f0f2f5;
img {
width: 17px;
height: 14px;
margin-top: 8px;
margin-left: 7px;
opacity: 0.5;
}
}
}
.content {
margin: 0 auto;
width: 200px;
height: 48px;
margin-top: 10px;
color: #dcdfe6;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
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);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论