main
han 5 months ago
parent 52137e6d81
commit b5ed379148
  1. 9
      src/api/ai-api/index.js
  2. 8
      src/assets/icons/iconfont.css
  3. BIN
      src/assets/icons/iconfont.ttf
  4. 1
      src/assets/styles/v-global.scss
  5. 605
      src/assets/styles/v-layout.scss
  6. 4
      src/router/index.js
  7. 24
      src/views/components/v-menu/index.vue
  8. 0
      src/views/pages/AI-Data-Analysis/AI数据分析.md
  9. 324
      src/views/pages/AI-Data-Analysis/dialog.vue
  10. 18
      src/views/pages/AI-Data-Analysis/images/AI.svg
  11. 30
      src/views/pages/AI-Data-Analysis/images/add-dialog.svg
  12. 1
      src/views/pages/AI-Data-Analysis/images/icon-deep-think.svg
  13. 98
      src/views/pages/AI-Date-Analysis/dialog.vue
  14. 4
      src/views/pages/AI-Document-Correction/index.vue
  15. 213
      src/views/pages/AI-Marketing-Writing/dialog.vue
  16. 23
      src/views/pages/AI-Marketing-Writing/knowledge.vue
  17. 1
      src/views/system/notice/index.vue

@ -46,7 +46,6 @@ export function getHybridStream(params) {
);
}
// AI纠错列表
export function getErrorCorrection(id) {
return request({
@ -62,6 +61,14 @@ export function getFileContent(id) {
})
}
// 获取url链接详情
export function getUrlContent(url) {
return request({
url: '/Unify-chat/getUrlContent?url='+url,
method: 'get',
})
}
// 知识库列表
export function knowledgePages(params) {
return request({

@ -1,6 +1,6 @@
@font-face {
font-family: "iconfont"; /* Project id 4926353 */
src: url('iconfont.ttf?t=1748409506357') format('truetype');
src: url('iconfont.ttf?t=1749200499233') format('truetype');
}
.iconfont {
@ -11,6 +11,10 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-select:before {
content: "\e636";
}
.icon-marketing-writing:before {
content: "\e630";
}
@ -167,7 +171,7 @@
content: "\e6ee";
}
.icon-add-knowledge-base:before {
.icon-add-knowledge:before {
content: "\e6ef";
}

Binary file not shown.

@ -175,6 +175,7 @@ a:not([href]):not([class]):hover{color:inherit;text-decoration:none}
.align-text-bottom{vertical-align:text-bottom !important}
.align-text-top{vertical-align:text-top !important}
.flex-justify-center{justify-content: center}
.flex-justify-end{justify-content: flex-end}
.flex-align-center{align-items: center}
.pointer{cursor: pointer}
.fst-italic{font-style:italic !important}

@ -5,13 +5,15 @@ $--color-font-info: #9AA1B2;
$--color-font-label: #585C66;
$--color-primary: #1060FF;
$--color-success: #13ce66;
$--color-success: #00b578;
$--color-warning: #ffba00;
$--color-danger: #ff4949;
$--border-color-light: #DAE4F7;
$--border-color-light: #f4f6fb;
$--border-color-focus: #5D9CEC;
$--box-shadow-color: #5d56a50d;
$--base-mini-font: 12px;
$--base-small-font: 14px;
$--base-nomal-font: 16px;
@ -101,12 +103,20 @@ $--base-super-radius: 24px;
font-size: $--base-small-font
}
.el-form-item__error {
font-size: 14px
}
.el-dialog__body {
padding: 20px
}
.v-button-small {
&.el-button--small {
font-size: 14px;
color: rgb(100, 116, 139);
border-radius: 8px;
border-color: rgba(0,0,0,.08);
border-color: rgba(0, 0, 0, .08);
&:hover, &:focus {
background-color: rgba($--color-primary, .05);
@ -117,6 +127,23 @@ $--base-super-radius: 24px;
}
}
.v-checkbox {
.el-checkbox__inner {
width: 16px;
height: 16px;
}
.el-checkbox__input.is-checked .el-checkbox__inner {
background-color: $--color-primary;
border-color: $--color-primary;
}
.el-checkbox__inner::after {
top: 2px;
left: 5px
}
}
.v-check-btn {
position: absolute;
bottom: 30px;
@ -665,15 +692,25 @@ $--base-super-radius: 24px;
line-height: 34px;
border-radius: 8px;
background-color: $--color-primary;
cursor: pointer;transition: all .4s;
cursor: pointer;
transition: all .4s;
&.disabled {
opacity: .25;
cursor: not-allowed;
}
&.active {
opacity: 1;
cursor: pointer
}
&.disabled{opacity:.25; cursor: not-allowed; }
&.active{opacity:1;cursor: pointer}
.iconfont {
color: #fff
}
}
.ai-voice-btn{
.ai-voice-btn {
width: 34px;
height: 34px;
text-align: center;
@ -682,8 +719,9 @@ $--base-super-radius: 24px;
font-size: 14px;
color: rgb(100, 116, 139);
border-radius: 8px;
border-color: rgba(0,0,0,.08);
border-color: rgba(0, 0, 0, .08);
}
.color-primary {
color: $--color-primary !important;
}
@ -967,17 +1005,30 @@ body {
position: absolute;
left: 10px;
bottom: 5px;
width: 80px;
width: 85px;
.el-icon-arrow-up:before {
color: $--color-primary;
color: #64748b;
}
.el-input__inner {
padding-left: 10px;
border-color: $--color-primary;
background-color: rgba($--color-primary, .05);
color: $--color-primary;
padding-right: 10px;
font-size: 14px;
color: #64748b;
height: 32px;
border-radius: 8px;
border-color: rgba(0, 0, 0, 0.08);
&:hover, &:focus {
background-color: rgba($--color-primary, .05);
border-color: $--border-color-light;
color: $--color-primary;
.el-icon-arrow-up:before {
color: $--color-primary;
}
}
}
}
@ -1025,7 +1076,7 @@ body {
position: relative;
background: #fff;
border: 1px solid #e5e6eb;
box-shadow: 0 3px 8px #5d56a50d;
box-shadow: 0 3px 8px $--box-shadow-color;
border-radius: 20px;
overflow: hidden;
@ -1034,7 +1085,10 @@ body {
border-radius: 0;
padding: $--base-nomal-space;
}
.el-textarea__inner::placeholder {font-size: 16px;}
.el-textarea__inner::placeholder {
font-size: 16px;
}
.ai-pages-input-bot {
position: absolute;
@ -1064,7 +1118,7 @@ body {
padding: $--base-small-space $--base-medium-space;
border-radius: $--base-small-radius;
border: 1px solid $--border-color-light;
box-shadow: 0 3px 8px #5d56a50d;
box-shadow: 0 3px 8px $--box-shadow-color;
transition: all .4s;
cursor: pointer;
@ -1119,7 +1173,7 @@ body {
border-radius: $--base-small-radius;
border: 1px solid #fff;
margin: $--base-small-space 0;
box-shadow: 0 3px 8px #5d56a50d;
box-shadow: 0 3px 8px $--box-shadow-color;
background-color: #fff;
overflow: hidden;
@ -1172,7 +1226,7 @@ body {
border-radius: $--base-small-radius;
border: 1px solid #fff;
margin: $--base-small-space 0;
box-shadow: 0 3px 8px #5d56a50d;
box-shadow: 0 3px 8px $--box-shadow-color;
background-color: #fff;
overflow: hidden;
@ -1208,7 +1262,7 @@ body {
border-radius: $--base-small-radius;
border: 1px solid #fff;
background-color: #fff;
box-shadow: 0 3px 8px #5d56a50d;
box-shadow: 0 3px 8px $--box-shadow-color;
overflow: hidden;
:after {
@ -1230,6 +1284,7 @@ body {
.item-content {
padding-top: $--base-small-space;
}
.title {
@ -1237,7 +1292,8 @@ body {
z-index: 9;
padding: 0 $--base-medium-space;
font-size: $--base-nomal-font;
font-weight: 500
font-weight: 500;
}
.description {
@ -1291,48 +1347,6 @@ body {
}
}
/* 公文提交 */
.ai-pages-submit-top {
height: calc(100% - 270px)
}
.ai-pages-submit-bot {
background: #FFFFFF;
padding: $--base-mini-space $--base-medium-space;
margin-bottom: $--base-mini-space;
//box-shadow: 0px 10px 20px 0px rgba(16, 96, 255, 0.1);
border-radius: 8px;
border: 1px solid $--border-color-light;
.el-form-item {
margin-bottom: 0
}
.el-form-item__label {
margin-bottom: 0;
color: $--color-font-label;
font-weight: normal
}
.noBorder {
.el-input__inner {
border: none;
background: #fff;
}
.el-input__inner::placeholder {font-size: 16px;}
}
.border {
.el-input__inner {
background: #fff;
border-radius: 4px;
color: $--color-primary;
border-color: $--border-color-light;;
height: 28px;
line-height: 28px
}
}
}
/* 页面 对话 ==========================================*/
/* 编辑页面 选择 */
@ -1489,8 +1503,72 @@ body {
}
}
.v-doc-type {
width: 16px;
height: 16px;
display: inline-block
}
.v-doc-type.doc, .v-doc-type.docx {
background: url("~@/assets/ai-images/icon_word.svg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
/* 页面 富文本编辑器 ==========================================*/
aie-footer {
display: none
}
.aie-container {
border: none !important;
}
.aie-content {
padding: 0 30px !important;
p {
line-height: 1.75;
margin-bottom: 20px;
font-family: PingFang SC, Microsoft YaHei, "sans-serif";
font-size: 15px !important;
}
img {
margin-bottom: 20px;
}
h1, h2, h3, h4, h5, h6 {
font-weight: bold
}
}
/* 页面 知识库 ==========================================*/
/* 知识库弹窗 */
.ai-knowledge-dialog {
.knowledge-search {
position: absolute;
text-align: right;
width: calc(100% - 60px);
right: 40px;
top: 20px;
.el-input-group__append, .el-input-group__prepend {
background-color: #fff;
padding: 0 10px;
border: none;
}
.el-input--medium .el-input__inner {
height: 30px;
line-height: 30px;
}
}
.knowledge-top {
.left {
color: $--color-primary;
@ -1507,22 +1585,79 @@ body {
.knowledge-header-divider {
margin: 8px 0 14px;
border-bottom: 1px solid #d7d7e6;
border-bottom: 1px solid $--border-color-light;
}
.ai-knowledge-list-item {
border-bottom: 1px solid #d7d7e6;
padding: 10px 0;
.ai-knowledge-list {
max-height: 290px;
.item-content {
.title {
color: rgba(0, 0, 0, .88);
font-size: 14px;
.item-content-end {
font-size: 14px;
color: rgba(0, 0, 0, .3);
text-align: center
}
.ai-knowledge-list-item {
border-bottom: 1px solid $--border-color-light;
padding-bottom: 10px;
margin-bottom: 10px;
.item-content {
width: 0;
.title {
position: relative;
padding: 0 20px;
color: rgba(0, 0, 0, .88);
font-size: 14px;
.icon {
position: absolute;
left: 0;
top: 50%;
transform: translate(0, -50%);
display: inline-block;
width: 16px;
height: 16px;
&.pdf {
background: url("~@/assets/ai-images/icon_pdf.svg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
&.doc {
background: url("~@/assets/ai-images/icon_doc.svg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
&.docx {
background: url("~@/assets/ai-images/icon_doc.svg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
&.txt {
background: url("~@/assets/ai-images/icon_txt.svg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
}
}
.date {
color: rgb(153, 153, 153);
font-size: 12px;
}
}
.date {
color: rgb(153, 153, 153);
font-size: 12px;
.item-select {
padding-right: 10px
}
}
}
@ -1538,26 +1673,14 @@ body {
}
}
.v-doc-type {
width: 16px;
height: 16px;
display: inline-block
}
.v-doc-type.doc, .v-doc-type.docx {
background: url("~@/assets/ai-images/icon_word.svg");
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
}
/* 页面上传 */
.ai-pages-upload {
position: relative;
background: #fff;
padding: 0 30px;
border: 1px solid #e5e6eb;
box-shadow: 0 3px 8px #5d56a50d;
box-shadow: 0 3px 8px $--box-shadow-color;
border-radius: 20px;
text-align: center;
overflow: hidden;
@ -1631,6 +1754,55 @@ body {
}
}
/* 公文 ==========================================*/
.ai-pages-article {
&.top {
height: calc(100% - 270px)
}
&.bottom {
background: #FFFFFF;
padding: $--base-mini-space $--base-medium-space;
margin-bottom: $--base-mini-space;
//box-shadow: 0px 10px 20px 0px rgba(16, 96, 255, 0.1);
border-radius: 8px;
border: 1px solid $--border-color-light;
.el-form-item {
margin-bottom: 0
}
.el-form-item__label {
margin-bottom: 0;
color: $--color-font-label;
font-weight: normal
}
.noBorder {
.el-input__inner {
border: none;
background: #fff;
}
.el-input__inner::placeholder {
font-size: 16px;
}
}
.border {
.el-input__inner {
background: #fff;
border-radius: 4px;
color: $--color-primary;
border-color: $--border-color-light;;
height: 28px;
line-height: 28px
}
}
}
}
/* 页面 纠错 ==========================================*/
/* 编辑页面 纠错 */
.ai-error-title {
font-size: $--base-small-font;
@ -1773,6 +1945,7 @@ body {
}
}
/* 页面 行文 ==========================================*/
/* 编辑页面 行文 */
.ai-mark-visit {
margin-top: $--base-medium-space;
@ -1796,7 +1969,16 @@ body {
text-align: center;
border-radius: $--base-small-radius;
background-color: #F2F3F8;
cursor: pointer;
&.disabled {
opacity: .5;
cursor: not-allowed
}
&.active {
opacity: 1;
cursor: pointer;
}
}
}
}
@ -1822,46 +2004,6 @@ body {
}
}
/* 编辑页面 Ai对话 */
.ai-dialog {
.ai-dialog-item {
.ai-dialog-ask {
display: flex;
justify-content: flex-end;
font-size: $--base-nomal-font;
.contnet {
padding: $--base-small-space $--base-medium-space;
background-color: rgba($--color-primary, .08);
border-radius: $--base-small-radius;
color: $--color-font-primary;
}
}
.ai-dialog-answer {
.icon {
img {
width: 30px;
}
}
.think {
display: inline-block;
margin-left: $--base-small-space;
font-size: 13px;
padding: $--base-mini-space $--base-medium-space;
background-color: rgba(0, 0, 0, .05);
border-radius: $--base-small-radius;
}
margin: $--base-medium-space 0;
font-size: $--base-nomal-font;
color: $--color-font-primary;
}
}
}
/* 编辑页面 对话列表 */
.ai-dialog-list {
width: 1040px;
@ -1996,10 +2138,7 @@ body {
}
}
aie-footer {
display: none
}
/* 页面 弹框 ==========================================*/
.v-dialog {
.el-dialog {
@ -2026,54 +2165,86 @@ aie-footer {
}
}
.aie-container {
border: none !important;
}
/* 页面 知识库 ==========================================*/
.ai-konwledge-box {
width: 100%;
padding-bottom: $--base-large-space;
background: #fff;
border-radius: $--base-medium-space;
box-shadow: 0 $--base-small-space $--base-medium-space $--box-shadow-color;
overflow: hidden;
/* 知识库 头部 */
.ai-konwledge-box-top {
display: flex;
justify-content: space-between;
height: 60px;
padding: 0 $--base-large-space;
background: #f4f6fb;
.aie-content {
padding: 0 30px !important;
/* 知识库 标题 */
.ai-konwledge-box-title {
position: relative;
display: inline-block;
color: #000;
font-size: $--base-medium-font;
font-weight: 500;
line-height: 24px;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 6px;
background: rgba($--color-primary, .2);
}
}
p {
line-height: 1.75;
margin-bottom: 20px;
font-family: PingFang SC, Microsoft YaHei, "sans-serif";
font-size: 15px !important;
}
/* 知识库 表单 */
.ai-konwledge-form {
.el-form-item {
margin-bottom: 0 !important;
}
img {
margin-bottom: 20px;
}
.el-button--primary {
border-radius: 10px;
box-shadow: 0 $--base-small-space $--base-small-space $--box-shadow-color;;
}
h1, h2, h3, h4, h5, h6 {
font-weight: bold
.el-input__inner {
height: 36px !important;
line-height: 36px !important;
border: none;
border-radius: 10px;
box-shadow: 0 $--base-small-space $--base-small-space $--box-shadow-color;
}
}
}
}
/* 页面 表格 ==========================================*/
.ai-table {
.status-dot {
width: 100%;
.status-dot {
display: inline-block;
width: 4px;
height: 4px;
border-radius: 50%;
&.success {
background: #00b578;
background: $--color-success;
}
&.failed {
background: #d15046;
background: $--color-danger;
}
}
}
.ai-table {
width: 100%;
.el-button--text {
font-size: 14px;
font-size: $--base-small-font;
color: $--color-primary !important;
}
@ -2087,8 +2258,13 @@ aie-footer {
display: none
}
.el-table {
.cell {
padding-left: $--base-medium-space !important;
padding-right: $--base-medium-space !important;
color: rgba(0, 0, 0, .85);
font-size: $--base-small-font;
}
/* 表格 头部 */
.el-table__header-wrapper {
@ -2100,12 +2276,12 @@ aie-footer {
background-color: transparent;
height: 60px;
}
}
.el-table__header .el-table__cell {
color: rgba(0, 0, 0, .85);
font-weight: 500;
padding: 0;
.el-table__header .el-table__cell {
color: rgba(0, 0, 0, .85);
font-weight: 500;
padding: 0;
}
}
.el-table__body-wrapper {
@ -2116,109 +2292,36 @@ aie-footer {
&::-webkit-scrollbar {
width: 6px;
}
}
/* 表格 主体 */
.el-table__body {
tr:hover {
.el-table__cell {
background-color: rgba(#f2f5fa, .6) !important;
/* 表格 主体 */
.el-table__body {
tr:hover {
.el-table__cell {
background-color: rgba(#f2f5fa, .6) !important;
}
}
}
td {
.el-table__cell {
border-bottom: 1px solid #f0f0f0;
td {
.el-table__cell {
border-bottom: 1px solid $--border-color-light;
&.is-leaf {
border-bottom: none
&.is-leaf {
border-bottom: none
}
}
}
}
}
.cell {
color: rgba(0, 0, 0, .85);
font-size: 14px;
padding-left: 20px !important;
padding-right: 20px !important;
}
}
.el-table__header-wrapper tbody td.el-table__cell {
background-color: #f2f5fa !important;
}
}
/* 页面 分页 ==========================================*/
.ai-pagination {
background-color: transparent !important;
margin-right: 30px;
margin-right: $--base-large-space;
.el-pagination.is-background .el-pager li:not(.disabled).active {
background-color: $--color-primary;
color: #FFFFFF;
}
}
.v-konwledge-form {
.el-form-item {
margin-bottom: 0 !important;
}
.el-button--primary {
border-radius: 10px;
box-shadow: 0 10px 10px rgba(77, 133, 255, .2);
}
.el-input__inner {
height: 36px !important;
line-height: 36px !important;
border: none;
box-shadow: 0 6px 10px rgba(169, 173, 204, .2);
}
}
.ai-pages-box {
background: #fff;
border-radius: 20px;
box-shadow: 0 10px 20px rgba(169, 173, 204, .2), inset 1px 1px 0 hsla(0, 0%, 100%, .5);
overflow: hidden;
width: 100%;
padding-bottom: 30px;
.ai-pages-box-top {
display: flex;
background: #f4f6fb;
height: 60px;
justify-content: space-between;
padding: 0 30px;
}
.ai-pages-box-title {
display: inline-block;
color: #000;
font-size: 18px;
font-weight: 500;
line-height: 25px;
position: relative;
&:after {
background: rgba(77, 133, 255, .2);
bottom: 0;
content: "";
height: 6px;
left: 0;
position: absolute;
right: 0;
width: 100%;
}
}
}

@ -109,8 +109,8 @@ export const constantRoutes = [
hidden: true
},
{
path: '/DateAnalysisDialog',//AI数据分析 编辑
component: (resolve) => require(['@/views/pages/AI-Date-Analysis/dialog'], resolve),
path: '/DataAnalysisDialog',//AI数据分析 编辑
component: (resolve) => require(['@/views/pages/AI-Data-Analysis/dialog'], resolve),
hidden: true
},
{

@ -8,7 +8,8 @@
<div class="v-menu-list-item">
<div class="v-menu-item-group-title">{{ item.name }}</div>
<div v-for="(cell) in item.children">
<div class="item-cell row flex-align-center" :class="[menuIndex==cell.value?'is-active':'']" @click="gotoPages(cell.url)"><i
<div class="item-cell row flex-align-center" :class="[menuIndex==cell.value?'is-active':'']"
@click="gotoPages(cell.url)"><i
class="icon iconfont" :class="'icon-'+cell.type"></i>
<div class="title">{{ cell.name }}</div>
</div>
@ -36,16 +37,23 @@ export default {
children: [
{name: "公文写作", value: 1, type: "document-writing", url: "/DocumentCorrectionIndex"},
{name: "公文纠错", value: 2, type: "document-error", url: "/DocumentWritingIndex"},
{name: "营销行文", value: 3, type: "marketing-writing", url: "/MarketingWritingnIndex"}]
{name: "营销行文", value: 3, type: "marketing-writing", url: "/MarketingWritingnIndex"}
]
},
{
name: "体验中心",
children: [
{name: "图像生成", value: 4, type: "image", url: "/ImageGeneratIndex"},
{name: "视频生成", value: 5, type: "video", url: "/VideoGeneratIndex"},
{name: "语音生成", value: 6, type: "voice", url: "/VoiceGeneratIndex"},]
{name: "语音生成", value: 6, type: "voice", url: "/VoiceGeneratIndex"}
]
},
{
name: "数据分析",
children: [
{name: "旅游数据", value: 7, type: "image", url: "/DataAnalysisDialog"}
]
}
]
}
},
@ -99,8 +107,12 @@ export default {
margin: 10px 0
}
.v-menu-item-group-title{font-size: 12px !important;
padding: 16px 0 10px 16px;color: rgba(0, 0, 0, 0.45);}
.v-menu-item-group-title {
font-size: 12px !important;
padding: 16px 0 10px 16px;
color: rgba(0, 0, 0, 0.45);
}
.item-cell {
cursor: pointer;
padding: 0 20px 0 30px;

@ -0,0 +1,324 @@
<template>
<div class="ai-pages-warp">
<div class="ai-pages-sider">
<div class="ai-pages-sider-title">AI智能体助手</div>
<div class="ai-pages-sider-btn">
<el-button class="ai-dialog-btn"><img class="img" src="@/views/pages/AI-Data-Analysis/images/add-dialog.svg"/>
开启新对话
</el-button>
</div>
<div class="ai-dialog-history-name">近期对话</div>
<div class="ai-dialog-history-list">
<div class="list-item" :class="activeHistory==index?'active':''" v-for="(item,index) in historyDialog">
{{ item.name }}
</div>
</div>
</div>
<main class="ai-pages-main col">
<div class="ai-dialog-main">
<!-- 对话主体 -->
<div class="ai-dialog">
<div class="ai-dialog-item">
<!-- 对话 提问 -->
<div class="ai-dialog-ask">
<div class="ask-contnet">前端工程师</div>
</div>
<!-- 对话 回答 -->
<div class="ai-dialog-answer">
<div class="answer-top">
<div class="answer-icon"><img class="img" src="@/views/pages/AI-Data-Analysis/images/AI.svg"/></div>
<div class="answer-think">
<img class="img m-r-mimi" src="@/views/pages/AI-Data-Analysis/images/icon-deep-think.svg"/>
<span>已思考45秒</span>
<i class="el-icon-arrow-down"></i></div>
</div>
<div class="answer-contnet">
<p>第三方是一个广泛使用的术语具体含义取决于上下文以下是不同领域中的常见解释</p>
</div>
</div>
</div>
</div>
<!-- 对话底部 -->
<div class="ai-dialog-bottom">
<el-input
type="textarea"
placeholder="给小智发消息"
v-model="textareaAsk"
:rows="4"
resize="none"
></el-input>
<div class="deep-btn row flex-align-center flex-justify-center">
<img class="img m-r-mimi" src="@/views/pages/AI-Data-Analysis/images/icon-deep-think.svg"/>深度思考
</div>
<el-button icon="el-icon-top" circle class="v-dialog-sent" @click="gotoSentMessage"></el-button>
</div>
</div>
</main>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'edit',
data() {
return {
textareaAsk: "",
historyDialog: [],
activeHistory: 0
}
},
mounted() {
this.getHistoryDialog()
},
methods: {
/** 发送信息 **/
gotoSentMessage() {
let base_url = 'http://192.168.130.155:5678/api/v3/user_share_chat_completions'
let api_key = 'cjy-dade97a59d0f4fcfa3f2bb256b77a187'
let app_code = 'fe602e3d-3b88-11f0-8d1b-00e04f309c26'
let url = `${base_url}?api_key=${api_key}&app_code=${app_code}&user_input=${this.textareaAsk}`
axios({method:'get',url:url,responseType:"blob"}).then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
},
/** 关闭 WebSocket连接 **/
getHistoryDialog() {
this.historyDialog = [
{name: "Vue项目DOCX转Markdown方案"},
{name: "列表加载完成提示方式总结"},
{name: "JS实现DOCX转HTML保留样式"},
{name: "流式Markdown转HTML方案"},
{name: "JS实现DOCX转Markdown方法"},
]
}
}
}
</script>
<style scoped lang="scss">
.ai-pages-warp {
display: flex;
height: 100vh;
background-color: #010D1F
}
/* Ai对话 侧边*/
.ai-pages-sider {
width: 300px;
height: 100vh;
flex: 0 0 300px;
background-color: #131E2D;
.ai-pages-sider-title {
text-align: center;
font-size: 18px;
height: 80px;
line-height: 80px;
font-weight: bold;
color: #fff;
}
.ai-dialog-history-name {
margin: 10px 0;
padding: 0 15px;
font-size: 13px;
color: #555;
font-weight: 600;
line-height: 18px;
}
.ai-pages-sider-btn {
margin-bottom: 30px;
padding: 0 10px;
.ai-dialog-btn {
width: 100%;
height: 44px;
background-color: #4D6BFE;
border: 1px solid #131E2D;
line-height: 22px;
border-radius: 16px;
color: #fff;
font-size: 16px;
span {
display: flex;
justify-content: center;
align-items: center;
}
.img {
position: relative;
top: -4px;
width: 24px;
}
}
}
.ai-dialog-history-list {
padding: 0 10px;
.list-item {
height: 38px;
line-height: 38px;
cursor: pointer;
border-radius: 12px;
padding: 0 10px;
font-size: 14px;
color: #fff;
&.active {
background-color: rgb(73 73 73)
}
&:hover {
background-color: rgba(73, 73,73,.5)
}
}
}
}
/* Ai对话 主体*/
.ai-dialog-main {
position: relative;
height: 100vh;
width: 800px;
margin: 0 auto;
padding: 20px 0;
.ai-dialog-bottom {
position: absolute;
width: 100%;
left: 0;
bottom: 30px;
height: 150px;
padding: 10px;
background-color: #131E2D;
box-shadow: 0px 0px 0px .5px #5d56a50d;
border-radius: 24px;
.deep-btn {
position: absolute;
left: 20px;
bottom: 10px;
height: 28px;
padding: 0 20px;
color: rgba(#fff, .5);
line-height: 26px;
border: 1px solid rgba(#fff, .5);
border-radius: 32px;
.img {
width: 16px;
opacity: .5
}
}
.v-dialog-sent {
position: absolute;
right: 10px;
bottom: 10px;
height: 32px;
width: 32px;
border-radius: 32px;
background-color: #4D6BFE !important;
border-color: #4D6BFE;
::v-deep .el-icon-top {
display: inline-block;
position: relative;
left: -7px;
top: -6px;
}
::v-deep .el-icon-top:before {
color: #fff !important;
font-size: 24px;
}
}
::v-deep .el-textarea__inner {
background-color: #131E2D !important;
border-color: #131E2D !important;
color: #fff;
font-size: 16px;
}
::v-deep .el-textarea__inner::placeholder {
font-size: 16px
}
}
}
/* 编辑页面 Ai对话 */
.ai-dialog {
.ai-dialog-item {
.ai-dialog-ask {
display: flex;
justify-content: flex-end;
.ask-contnet {
padding: 10px 20px;
background-color: #131E2D;
border-radius: 10px;
color: #fff;
font-size: 16px;
}
}
.ai-dialog-answer {
.answer-top {
display: flex;
align-items: center;
.answer-icon {
width: 34px;
height: 34px;
text-align: center;
border-radius: 34px;
border: 1px solid rgba(255, 255, 255, .2);
background-color: #131E2D;
.img {
position: relative;
top: 4px;
width: 22px;
}
}
.answer-think {
display: flex;
align-items: center;
margin-left: 10px;
font-size: 13px;
padding: 5px 20px;
background-color: #131E2D;
border-radius: 10px;
color: #fff;
.img {
width: 16px
}
}
.el-icon-arrow-down {
margin-left: 4px
}
}
.answer-contnet {
margin: 20px 0 20px 50px;
font-size: 16px;
color: #fff;
}
}
}
}
</style>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 200 200" style="enable-background:new 0 0 200 200;" xml:space="preserve">
<style type="text/css">
.st0{fill:#4D6BFE;}
</style>
<path class="st0" d="M80,89.9c-3.4,0-6.2,2.8-6.2,6.2v12.3c0.4,3.4,3.5,5.8,6.9,5.4c2.8-0.4,5-2.6,5.4-5.4V96.1
C86.1,92.7,83.4,90,80,89.9z M124,89.9c-3.4,0-6.1,2.7-6.1,6.1c0,0,0,0.1,0,0.1v12.3c0,3.4,2.7,6.1,6.1,6.1c3.4,0,6.1-2.7,6.1-6.1
V96.1c0.1-3.4-2.6-6.1-6-6.2C124,89.9,124,89.9,124,89.9z"/>
<path class="st0" d="M199.3,105.8c-0.6-7.8-6.8-14-14.6-14.7h-1.4l-1.4-1.2c-11.3-31.5-39.7-53.7-73-56.9h-2.2V21.9l1.6-0.6
c5.7-2.1,8.6-8.5,6.4-14.1c-1.6-4.2-5.5-7-10-7.1c-5.4-0.1-9.9,3.8-10.8,9.1C93,14.3,96,19.5,101,21.3l1.5,0.6v10H100
c-36.6,0.5-69.1,23.6-81.6,58l-1.7,1.5h-1.4C7.6,92,1.4,98.1,0.7,105.8v14.1c-0.1,8.2,6.1,15.2,14.3,16h1.4l0.5,1.4
c5.8,16.4,20,25.8,44,29.5l12.3,1.4l17.7,0.7h18.5v28c0,1.8,1.4,3.2,3.2,3.2c0.7,0,1.4-0.2,2-0.7l48.1-39.5c9.2-4.9,16.3-13,20-22.8
l0.6-1.4h1.4c8.3-0.6,14.7-7.5,14.8-15.8V105.8z M144.7,152.6l-3.6,0.6l-10,0.9l-30,1.8l-25.3-0.7h-6.5l-4.2-0.5l-3.9-0.6
c-24.8-4-34.4-14.4-34.4-37.1c1.3-40.5,35-72.3,75.5-71.2c39.1,0.5,70.7,32.1,71.2,71.2C174.9,134.7,162.2,150.4,144.7,152.6
L144.7,152.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 28 28" style="enable-background:new 0 0 28 28;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<path class="st0" d="M9.1,27c-0.2,0-0.3,0-0.5-0.1c-0.2-0.1-0.3-0.2-0.4-0.3c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.2-0.1-0.3-0.1-0.5
l0-2.6C7.3,23,7,22.9,6.6,22.8c-0.4-0.1-0.7-0.3-1.1-0.5c-0.3-0.2-0.7-0.4-1-0.7c-0.3-0.2-0.6-0.5-0.9-0.8c-0.3-0.3-0.5-0.6-0.7-0.9
c-0.2-0.3-0.4-0.7-0.5-1.1c-0.1-0.4-0.2-0.8-0.3-1.1C2,17.3,2,16.9,2,16.5V9.5C2,9,2,8.6,2.1,8.2C2.2,7.8,2.3,7.4,2.5,7
c0.2-0.4,0.4-0.8,0.6-1.1c0.2-0.4,0.5-0.7,0.8-1C4.3,4.6,4.6,4.3,5,4c0.4-0.2,0.8-0.4,1.2-0.6c0.4-0.2,0.8-0.3,1.3-0.4
C7.8,3,8.2,2.9,8.7,2.9h4.6c0.2,0,0.3,0,0.5,0.1c0.1,0.1,0.3,0.1,0.4,0.2c0.1,0.1,0.2,0.2,0.2,0.4c0.1,0.1,0.1,0.3,0.1,0.4
c0,0.2,0,0.3-0.1,0.5c-0.1,0.1-0.1,0.3-0.2,0.4C14,5,13.9,5.1,13.8,5.2c-0.2,0.1-0.3,0.1-0.5,0.1H8.7c-0.3,0-0.6,0-0.8,0.1
C7.5,5.4,7.3,5.5,7,5.6C6.8,5.7,6.5,5.8,6.3,6C6,6.1,5.8,6.3,5.6,6.5C5.4,6.7,5.2,6.9,5.1,7.1C4.9,7.4,4.8,7.6,4.7,7.9
C4.6,8.1,4.5,8.4,4.4,8.6C4.4,8.9,4.4,9.2,4.4,9.5v7.1c0,0.3,0,0.5,0.1,0.8c0.1,0.3,0.1,0.5,0.2,0.8s0.2,0.5,0.4,0.7
c0.2,0.2,0.3,0.4,0.6,0.6c0.2,0.2,0.4,0.4,0.7,0.5c0.2,0.2,0.5,0.3,0.8,0.4c0.3,0.1,0.5,0.2,0.8,0.2c0.3,0.1,0.6,0.1,0.9,0.1
c0.2,0,0.3,0,0.5,0.1c0.2,0.1,0.3,0.2,0.4,0.3c0.1,0.1,0.2,0.3,0.3,0.4c0.1,0.2,0.1,0.3,0.1,0.5l0,1.6l3-2.1
c0.8-0.5,1.6-0.8,2.6-0.8h3.7c0.3,0,0.6,0,0.8-0.1c0.3,0,0.5-0.1,0.8-0.2c0.3-0.1,0.5-0.2,0.8-0.4c0.2-0.1,0.5-0.3,0.7-0.5
c0.2-0.2,0.4-0.4,0.5-0.6s0.3-0.5,0.4-0.7c0.1-0.2,0.2-0.5,0.2-0.8c0.1-0.3,0.1-0.5,0.1-0.8v-3.7c0-0.1,0-0.3,0.1-0.4
c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.1,0.2-0.2,0.4-0.2c0.1-0.1,0.3-0.1,0.5-0.1c0.1,0,0.3,0,0.5,0.1c0.1,0.1,0.3,0.1,0.4,0.2
c0.1,0.1,0.2,0.2,0.3,0.4s0.1,0.3,0.1,0.4v3.7c0,0.4,0,0.9-0.1,1.3c-0.1,0.4-0.2,0.8-0.4,1.2c-0.2,0.4-0.4,0.8-0.6,1.1
c-0.2,0.4-0.5,0.7-0.8,1c-0.3,0.3-0.7,0.6-1,0.8c-0.4,0.2-0.8,0.4-1.2,0.6c-0.4,0.2-0.8,0.3-1.2,0.4c-0.4,0.1-0.9,0.1-1.3,0.1h-2.9
c-0.9,0-1.8,0.3-2.5,0.8l-3.9,2.8C9.7,26.9,9.4,27,9.1,27z"/>
<path class="st0" d="M18.5,14.8H8c-0.6,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h10.5c0.6,0,1.2-0.5,1.2-1.2S19.1,14.8,18.5,14.8z"/>
<path class="st0" d="M22.2,9.6l-0.3,0.7c-0.1,0.3-0.5,0.4-0.8,0.3c-0.1-0.1-0.3-0.2-0.3-0.3l-0.3-0.7C20,8.4,19.1,7.5,17.9,7L17,6.6
c-0.3-0.1-0.4-0.5-0.3-0.8c0.1-0.1,0.2-0.2,0.3-0.3l0.8-0.4C19,4.5,20,3.5,20.5,2.3l0.3-0.7c0.1-0.3,0.5-0.5,0.8-0.3
c0.2,0.1,0.3,0.2,0.3,0.3l0.3,0.7c0.5,1.2,1.4,2.2,2.6,2.7l0.8,0.4C26,5.6,26.1,6,25.9,6.3c-0.1,0.1-0.2,0.2-0.3,0.3L24.8,7
C23.6,7.5,22.7,8.4,22.2,9.6L22.2,9.6z"/>
<path class="st0" d="M14.5,10.5H8c-0.6,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h6.5c0.6,0,1.2-0.5,1.2-1.2S15.1,10.5,14.5,10.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1749264292195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13268" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M514.048 590.620444a76.8 76.8 0 1 0 0-153.6 76.8 76.8 0 0 0 0 153.6z" p-id="13269" fill="#ffffff"></path><path d="M131.868444 131.640889c-72.135111 72.135111-45.852444 222.947556 53.191112 380.188444-98.986667 157.240889-125.326222 307.996444-53.191112 380.131556 72.078222 72.078222 222.890667 45.795556 380.131556-53.191111 157.240889 98.986667 308.053333 125.269333 380.131556 53.191111 72.135111-72.135111 45.852444-222.890667-53.191112-380.131556 98.986667-157.240889 125.326222-308.053333 53.191112-380.188444C819.996444 59.562667 669.240889 85.902222 512 184.888889c-157.240889-98.986667-308.053333-125.269333-380.131556-53.191111z m217.884445 716.629333c-95.687111 33.962667-150.186667 20.878222-172.657778-1.592889-22.414222-22.414222-35.555556-76.913778-1.592889-172.657777 11.662222-32.938667 28.16-68.039111 49.208889-104.220445a1093.404444 1093.404444 0 0 0 106.268445 123.050667c39.936 39.936 81.351111 75.491556 122.993777 106.211555-36.124444 21.048889-71.281778 37.546667-104.163555 49.208889z m26.453333-200.704a1014.670222 1014.670222 0 0 1-114.346666-135.736889 1014.328889 1014.328889 0 0 1 114.346666-135.793777A1014.328889 1014.328889 0 0 1 512 261.688889c45.340444 31.630222 91.306667 69.916444 135.736889 114.346667 44.487111 44.430222 82.773333 90.453333 114.403555 135.793777a1014.784 1014.784 0 0 1-114.346666 135.736889A1014.784 1014.784 0 0 1 512 761.912889a1014.442667 1014.442667 0 0 1-135.793778-114.346667z m-45.226666-316.757333A1093.176889 1093.176889 0 0 0 224.711111 453.802667a625.208889 625.208889 0 0 1-49.208889-104.220445c-33.962667-95.687111-20.821333-150.186667 1.592889-172.657778 22.471111-22.471111 76.970667-35.555556 172.714667-1.592888 32.881778 11.662222 68.039111 28.16 104.163555 49.208888-41.585778 30.72-83.057778 66.275556-122.993777 106.268445z m362.040888 0a1093.404444 1093.404444 0 0 0-122.993777-106.268445c36.124444-21.048889 71.224889-37.546667 104.163555-49.208888 95.744-33.962667 150.243556-20.878222 172.657778 1.592888 22.471111 22.414222 35.612444 76.970667 1.649778 172.657778a625.095111 625.095111 0 0 1-49.208889 104.220445 1093.347556 1093.347556 0 0 0-106.268445-122.993778z m0 362.040889a1093.12 1093.12 0 0 0 106.268445-123.050667c21.048889 36.181333 37.546667 71.281778 49.208889 104.220445 33.962667 95.687111 20.821333 150.186667-1.592889 172.657777-22.471111 22.471111-76.970667 35.555556-172.714667 1.592889a624.981333 624.981333 0 0 1-104.163555-49.208889c41.585778-30.72 83.057778-66.275556 122.993777-106.211555z" p-id="13270" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -1,98 +0,0 @@
<template>
<div class="ai-pages row">
<main class="ai-pages-main">
<!-- 对话左侧 -->
<div class="ai-dialog">
<div class="ai-dialog-item">
<div class="ai-dialog-ask row">
<div class="contnet">
前端工程师
</div>
</div>
<div class="ai-dialog-answer">
<div class="icon row">
<img src="@/assets/ai-images/aie.png" class="logo"/>
<div class="think">
<i class="iconfont icon-think ai-icon-small"></i>
已思考45秒
<i class="el-icon-arrow-down"></i></div>
</div>
<div class="contnet m-t-medium">
<div class="ds-markdown ds-markdown--block" style="--ds-md-zoom: 1.143;"><p class="ds-markdown-paragraph">
第三方是一个广泛使用的术语具体含义取决于上下文以下是不同领域中的常见解释</p>
<hr>
<h3>1. <strong>通用定义</strong></h3>
<ul>
<li><p class="ds-markdown-paragraph">
指独立于两个主要参与方如买方和卖方平台与用户<strong>外部实体</strong></p></li>
<li><p class="ds-markdown-paragraph"><strong>特点</strong>通常具有中立性不直接参与核心利益关系但可能提供服务或监督
</p></li>
</ul>
<hr>
<h3>2. <strong>常见应用场景</strong></h3>
<ul>
<li><p class="ds-markdown-paragraph"><strong>商业与合同</strong></p>
<ul>
<li><p class="ds-markdown-paragraph"><strong>第三方服务商</strong>如支付处理支付宝物流顺丰认证机构等
</p></li>
<li><p class="ds-markdown-paragraph"><strong>第三方审计/评估</strong>独立机构对企业的财务合规性进行审查如会计师事务所
</p></li>
</ul>
</li>
<li><p class="ds-markdown-paragraph"><strong>科技与互联网</strong></p>
<ul>
<li><p class="ds-markdown-paragraph"><strong>第三方软件/插件</strong>非官方开发的应用程序如微信小程序Chrome扩展
</p></li>
<li><p class="ds-markdown-paragraph"><strong>第三方登录</strong>通过其他平台账号登录用Google账号登录
</p></li>
<li><p class="ds-markdown-paragraph"><strong>第三方数据共享</strong>企业将用户数据提供给外部合作方需用户授权
</p></li>
</ul>
</li>
<li><p class="ds-markdown-paragraph"><strong>法律与纠纷</strong></p>
<ul>
<li><p class="ds-markdown-paragraph"><strong>第三方调解/仲裁</strong>中立方协助解决双方争议如劳动争议仲裁委员会
</p></li>
</ul>
</li>
<li><p class="ds-markdown-paragraph"><strong>金融</strong></p>
<ul>
<li><p class="ds-markdown-paragraph"><strong>第三方存管</strong>证券交易中资金由银行托管而非券商直接持有
</p></li>
</ul>
</li>
</ul>
<hr>
<h3>3. <strong>注意事项</strong></h3>
<ul>
<li><p class="ds-markdown-paragraph"><strong>中立性风险</strong>某些情况下第三方可能受某一方影响失去公正性
</p></li>
<li><p class="ds-markdown-paragraph"><strong>数据安全</strong>使用第三方服务时如云存储需关注其隐私政策
</p></li>
<li><p class="ds-markdown-paragraph"><strong>依赖性</strong>过度依赖第三方可能导致业务风险如供应链中断
</p></li>
</ul>
<hr>
<p class="ds-markdown-paragraph">
如果需要更具体的解释如某个领域的第三方可以补充说明上下文我会进一步细化解答</p></div>
</div>
</div>
</div>
</div>
</main>
</div>
</template>
<script>
export default {
name: 'edit',
data() {
return {}
},
mounted() {
},
methods: {}
}
</script>

@ -9,7 +9,7 @@
<div class="ai-pages-title text-center">公文写作快速出稿公文处理轻松搞定</div>
</div>
<!-- 页面 文章列表 -->
<div class="ai-pages-article ai-pages-submit-top">
<div class="ai-pages-article top">
<el-row :gutter="20">
<el-col :span="16">
<div class="ai-pages-sub-title">公文写作示例</div>
@ -45,7 +45,7 @@
</el-row>
</div>
<!-- 页面 提交 -->
<div class="ai-pages-submit-bot row flex-align-center">
<div class="ai-pages-article bottom row flex-align-center">
<div class="col m-r-small border" v-if="activeTemplate==0">
<el-form ref="form" :model="form">
<el-row :gutter="20">

@ -1,7 +1,7 @@
<template>
<div class="ai-pages row">
<VMenu menuIndex="3"></VMenu>
<div class="ai-pages-back" @click="gotoBack"><i class="iconfont icon-return"></i></div>
<div class="ai-pages-back" @click="gotoPages('/MarketingWritingnIndex')"><i class="iconfont icon-return"></i></div>
<main class="ai-pages-main row">
<!-- 对话左侧 -->
<div class="ai-edit-left col m-r-large v-overflow-y">
@ -14,17 +14,14 @@
<el-skeleton :rows="1" animated/>
</div>
<div v-else class="complete row flex-align-center">
<div class="col"><i
:class="progressText?'el-icon-circle-close':'el-icon-circle-check'"></i>{{
progressText == '' ? '文章已生成' : progressText
}}
<div class="col"><i class="el-icon-circle-check"></i>文章已生成
</div>
<el-button class="v-button-small" type="primary" @click="insertEditor"
v-if="isComplete&&progressText==''">插入
<el-button type="primary" @click="insertEditor"
v-if="isComplete">插入
</el-button>
</div>
<div class="ai-editor_html v-overflow-y" ref="generatedContent" v-html="formattedText"></div>
<div class="ai-editor__tips" v-if="isComplete&&progressText==''"><i class="el-icon-warning-outline"></i>内容由AI生成请注意甄别真实性
<div class="ai-editor__tips" v-if="isComplete"><i class="el-icon-warning-outline"></i>内容由AI生成请注意甄别真实性
</div>
</div>
</div>
@ -40,7 +37,7 @@
</div>
<el-form-item label="" class="v-item-block" label-width="0">
<el-input
:disabled="isComplete"
:disabled="!isComplete"
type="textarea"
class="v-textarea"
placeholder="请输入您的创作主题..."
@ -52,7 +49,7 @@
>
</el-input>
<el-select v-model="form.isImagesNot" size="mini" placeholder="请选择" class="v-edit-image-select"
popper-class="v-select-popper small" :disabled="isComplete">
popper-class="v-select-popper small" :disabled="!isComplete">
<el-option
v-for="item in imageOptions"
:key="item.value"
@ -69,7 +66,7 @@
<!-- 参考信息 按钮 -->
<el-row :gutter="10" class="ai-mark-visit-list m-t-small">
<el-col :span="6">
<div class="ai-mark-visit-list-item" @click="openText">
<div class="ai-mark-visit-list-item" :class="!isComplete?'disabled':'active'" @click="openText">
<span class="iconfont icon-add-text"></span>
<div class="title">添加文字</div>
</div>
@ -77,21 +74,22 @@
<el-col :span="6">
<FileUpload ref="upload" :limit="1" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx']"
@input="handleAddFile">
<div class="ai-mark-visit-list-item">
<div class="ai-mark-visit-list-item" :class="!isComplete?'disabled':'active'">
<span class="iconfont icon-add-file"></span>
<div class="title">添加文件</div>
</div>
</FileUpload>
</el-col>
<el-col :span="6">
<div class="ai-mark-visit-list-item" @click="openUrl">
<div class="ai-mark-visit-list-item" :class="!isComplete?'disabled':'active'" @click="openUrl">
<span class="iconfont icon-add-URL"></span>
<div class="title">添加URL</div>
</div>
</el-col>
<el-col :span="6">
<div class="ai-mark-visit-list-item" @click="openKnowledge">
<span class="iconfont icon-add-knowledge-base"></span>
<div class="ai-mark-visit-list-item" :class="!isComplete?'disabled':'active'"
@click="openKnowledge">
<span class="iconfont icon-add-knowledge"></span>
<div class="title">添加知识库</div>
</div>
</el-col>
@ -109,8 +107,9 @@
</el-form>
</div>
<div class="ai-ecode-bot">
<el-button type="primary" size="small" style="width: 100%;" @click="generateContent">
<i class="iconfont icon-generate ai-icon-small"></i> 开始生成
<el-button :disabled="!isComplete" type="primary" size="small" style="width: 100%;"
@click="generateContent">
<i class="iconfont icon-generate ai-icon-small"></i> 重新生成
</el-button>
</div>
</div>
@ -178,31 +177,49 @@
class="v-dialog"
>
<div class="ai-knowledge-dialog">
<div class="knowledge-search">
<div class="row flex-align-center flex-justify-end text-right" v-if="!searchState" @click="searchState=true"><i class="el-icon-search m-r-mimi"></i>搜索
<el-divider direction="vertical"></el-divider>
</div>
<div v-else>
<el-input placeholder="请输入内容" v-model="input2">
<template slot="prepend"><el-button slot="append" icon="el-icon-arrow-left" @click="searchState=false"></el-button></template>
<template slot="append"> <el-button slot="append" icon="el-icon-search"></el-button></template>
</el-input>
</div>
</div>
<div class="row knowledge-top">
<div class="col left">已选<span>0</span></div>
<div class="right pointer" @click="gotoKnowledge">前往知识库</div>
<div class="col left row flex-align-center"><i
class="iconfont icon-select m-r-mimi"></i>已选<span>{{ this.form.KnowledgeBaseId.length }}</span>
</div>
<div class="right pointer row flex-align-center" @click="gotoPages('/knowledge')"><i
class="iconfont icon-add-knowledge m-r-mimi"></i>前往知识库
</div>
</div>
<div class="knowledge-header-divider"></div>
<div class="ai-knowledge-list" v-for="(item,index) in KnowledgeList" :key="index" v-if="KnowledgeList.length>0">
<div class="ai-knowledge-list-item row">
<!-- 知识库列表 -->
<div class="ai-knowledge-list v-overflow-y" v-infinite-scroll="loadKnowledgeList" v-if="KnowledgeList.length>0">
<div class="ai-knowledge-list-item row" v-for="(item,index) in KnowledgeList" :key="index">
<div class="item-content col">
<div class="title"><i class="el-icon-document m-r-mimi"></i>{{ item.fileName }}</div>
<div class="title text-truncate"><span class="icon" :class="item.format"></span>{{ item.fileName }}</div>
<div class="date">{{ parseTime(item.updateTime) }}</div>
</div>
<div class="item-select">
<el-checkbox v-model="item.check"></el-checkbox>
<el-checkbox class="v-checkbox" v-model="item.check" @change="knowledgeSelect(item)"></el-checkbox>
</div>
</div>
<div v-if="total==KnowledgeList.length" class="item-content-end">没有更多内容了</div>
</div>
<!-- 知识库列表 暂无 -->
<div class="ai-knowledge-no-data text-center" v-else>
<img src="@/assets/ai-images/track_no_data.svg"/>
<div class="text">暂无文件去知识库添加文件吧~</div>
<el-button type="primary" @click="gotoKnowledge">前往知识库</el-button>
<el-button type="primary" @click="gotoPages('/knowledge')">前往知识库</el-button>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="KnowledgeVisible = false"> </el-button>
<el-button type="primary" @click="handleAddKnowledge"> </el-button>
<el-button type="primary" @click="handleAddKnowledge"> </el-button>
</div>
</el-dialog>
</div>
@ -213,7 +230,7 @@ import FileUpload from '@/components/FileUpload2'
import VEditor from "@/views/components/v-editor/index.vue";
import * as AiApi from '@/api/ai-api'
import MarkdownIt from "markdown-it";
import {getUrlContent} from '@/api/ai-api'
export default {
name: 'MarketingWritingDialog',
@ -223,7 +240,7 @@ export default {
if (value === '') {
callback(new Error('请输入链接'));
} else {
let res = value.includes("www.xiaohongshu.com") || value.includes("www.toutiao.com")
let res = value.includes("https://www.xiaohongshu.com/") || value.includes("https://www.toutiao.com/") || value.includes("https://baijiahao.baidu.com/") || value.includes("https://mp.weixin.qq.com/")
if (!res) {
callback(new Error(' 当前仅支持微信公众号、头条号、百家号、小红书的文章链接'));
} else {
@ -242,7 +259,8 @@ export default {
isComplete: false,
progressText: undefined,
isGenerating: false,//
form: {prompt: '', isImagesNot: true},
form: {prompt: undefined, isImagesNot: true, KnowledgeBaseId: []},
unSelect: [],
markFile: [],//
TextVisible: false,//
textAdd: undefined,
@ -251,7 +269,16 @@ export default {
imageOptions: [{value: false, label: '无配图'}, {value: true, label: 'AI生图'}],
KnowledgeVisible: false,//
KnowledgeList: [],//
KnowledgeSelect: ""
KnowledgeSelect: "",
KnowledgeCheck: [],
//
total: 0,
queryParams: {
pageNo: 1,
pageSize: 5,
fileName: undefined,
},
searchState: false
}
},
computed: {
@ -266,7 +293,8 @@ export default {
} else {
this.form.prompt = localStorage.getItem('prompt')
}
this.generateContent();
this.isComplete = true
//this.generateContent();
},
methods: {
insertEditor() {
@ -279,14 +307,11 @@ export default {
} else {
this.buffer += Chunk;
}
// - Markdown
let lastNewLine
lastNewLine = this.buffer.lastIndexOf(' <br>');
if (lastNewLine === -1) return '';
const complete = this.buffer.substring(0, lastNewLine);
this.buffer = this.buffer.substring(lastNewLine);
let html
// HTML
@ -298,7 +323,6 @@ export default {
this.partialHTML += html;
return html;
},
/** 生成 页面内容 */
async generateContent(type) {
let referenceWordage = '', marketingDocumentId = '', URL = ''
@ -316,6 +340,7 @@ export default {
})
}
//
this.rawTextChunks = []
this.isGenerating = true;
this.isComplete = false;
this.progressText = ""
@ -324,11 +349,11 @@ export default {
//
const params = {
prompt: this.form.prompt, //
generateType: type,
isImagesNot: this.form.isImagesNot,//
referenceWordage: referenceWordage.substring(0, referenceWordage.length - 1),//
marketingDocumentId: marketingDocumentId.substring(0, marketingDocumentId.length - 1),//ID
url: URL.substring(0, URL.length - 1), //url
KnowledgeBaseId: this.form.KnowledgeBaseId,//id
};
try {
//
@ -426,39 +451,114 @@ export default {
}
},
/** 添加URL 确认 */
handleAddUrl() {
this.urlform.domains.forEach((item, index, arr) => {
this.markFile.push({name: item.value, url: item.value, key: Date.now(), type: "URL"})
})
this.UrlVisible = false
async handleAddUrl() {
try {
this.urlform.domains.forEach((item, index, arr) => {
getUrlContent(item.value).then(res => {
this.markFile.push({name: res.data.fileName, url: res.data.filePath, key: Date.now(), type: "URL"})
});
})
} catch (err) {
} finally {
this.UrlVisible = false
}
},
/** 打开知识库 */
async openKnowledge() {
openKnowledge() {
this.KnowledgeVisible = true
this.queryParams.pageNo = 1
this.KnowledgeList = []
this.getKnowledgeList()
},
async getKnowledgeList() {
try {
const res = await AiApi.knowledgePages()
console.log(res.data.list)
this.KnowledgeList = res.data.list.map((item, index) => {
return {...item, ...{check: false}}
const res = await AiApi.knowledgePages(this.queryParams)
res.data.list.forEach((item, index) => {
let indexOf = this.form.KnowledgeBaseId.indexOf(item.fileId);
if (indexOf !== -1) {
this.KnowledgeList.push({...item, ...{check: true}})
} else {
this.KnowledgeList.push({...item, ...{check: false}})
}
})
this.total = res.data.total
} catch (err) {
} finally {
}
},
loadKnowledgeList() {
if (this.total == this.KnowledgeList.length) return
this.queryParams.pageNo += 1
this.getKnowledgeList()
},
/** 确认添加 知识库 */
handleAddKnowledge() {
this.KnowledgeList.forEach((item, index, arr) => {
if (item.check) {
this.KnowledgeSelect += item.id + ',';
this.unSelect.forEach((item, index, arr) => {
let indexOf = -1
this.markFile.forEach((cell, i) => {
if (cell.url == item) {
indexOf = i
}
})
if (indexOf != -1) {
//
this.markFile.splice(indexOf, 1)
}
let indexID = this.form.KnowledgeBaseId.indexOf(item)
if (indexID != -1) {
this.form.KnowledgeBaseId.splice(indexID, 1)
}
})
this.KnowledgeCheck.forEach((item, index, arr) => {
let indexOf = -1
this.markFile.forEach((cell, i) => {
if (cell.url == item.fileId && cell.type == "knowledge") {
indexOf = i
}
})
if (indexOf == -1) {
//
this.markFile.push({name: item.fileName, url: item.fileId, key: Date.now(), type: "knowledge"})
}
let indexID = this.form.KnowledgeBaseId.indexOf(item.fileId)
if (indexID == -1) {
this.form.KnowledgeBaseId.push(item.fileId)
}
})
this.KnowledgeSelect = this.KnowledgeSelect.substr(0, this.KnowledgeSelect.length - 1);
this.KnowledgeVisible = false
},
/** 选择 知识库 */
knowledgeSelect(val) {
if (val.check == true) {
this.KnowledgeCheck.push(val)
let indexDel = this.unSelect.indexOf(val.fileId);
if (indexDel !== -1) {
this.unSelect.splice(indexDel, 1)
}
} else {
let indexOf = -1
this.KnowledgeCheck.forEach((item, index, arr) => {
if (val.fileId == item.fileId) {
indexOf = index;
}
})
if (indexOf !== -1) {
this.KnowledgeCheck.splice(indexOf, 1)
this.unSelect.push(val.fileId)
}
}
},
/** 删除参考信息列表 */
handleMarkDelete(item) {
let index = this.markFile.indexOf(item)
if (index !== -1) {
this.markFile.splice(index, 1)
if (item.type == "knowledge") {
let index = this.form.KnowledgeBaseId.indexOf(item.url)
this.KnowledgeCheck.splice(index, 1)
this.form.KnowledgeBaseId.splice(index, 1)
}
let indexOf = this.markFile.indexOf(item)
if (indexOf !== -1) {
this.markFile.splice(indexOf, 1)
}
},
/** 页面滚动 */
@ -468,13 +568,10 @@ export default {
container.scrollTop = container.scrollHeight;
}
},
/** 页面 返回 */
gotoBack() {
this.$router.push('/MarketingWritingnIndex');
/** 页面 跳转 */
gotoPages(val) {
this.$router.push(val);
},
gotoKnowledge() {
this.$router.push('/knowledge');
}
},
beforeDestroy() {
localStorage.removeItem('prompt');

@ -3,10 +3,10 @@
<VMenu menuIndex="3"></VMenu>
<div class="ai-pages-back" @click="gotoBack"><i class="iconfont icon-return"></i></div>
<main class="ai-pages-main">
<div class="ai-pages-box">
<div class="ai-pages-box-top flex-align-center">
<div class="ai-pages-box-title">知识库</div>
<el-form class="v-konwledge-form" :model="queryParams" ref="queryForm" size="small" :inline="true"
<div class="ai-konwledge-box">
<div class="ai-konwledge-box-top flex-align-center">
<div class="ai-konwledge-box-title">知识库</div>
<el-form class="ai-konwledge-form" :model="queryParams" ref="queryForm" size="small" :inline="true"
label-width="0">
<el-form-item label="" prop="title">
<el-select v-model="queryParams.format" multiple placeholder="选择知识库文件类型"
@ -110,27 +110,31 @@ export default {
components: {FileUploadDrag, VDefault},
data() {
return {
UploadVisible: false,
RenameVisible: false,
loading: true,
UploadVisible: false,//
RenameVisible: false,//
//
form: {
fileName: undefined
},
//
rules: {
fileName: [
{required: true, message: '文件名不能为空', trigger: 'blur'},
]
},
loading: true,
KnowledgeList: [],
upfile:"",
//
total: 0,
//
queryParams: {
pageNo: 1,
pageSize: 10,
format: undefined,
fileName: undefined,
},
//
formatOptions: [{
value: 'word',
label: 'Word'
@ -150,6 +154,7 @@ export default {
this.getKnowledgeList()
},
methods: {
/** 获取知识库 列表**/
async getKnowledgeList() {
this.loading = true
try {
@ -168,7 +173,6 @@ export default {
const res = await AiApi.knowledgeInfo(row.id)
this.form = res.data
this.form.fileName = this.form.fileName.split('.')[0]
} catch (err) {
} finally {
}
@ -217,6 +221,3 @@ export default {
}
}
</script>
<style scoped lang="scss">
</style>

@ -61,7 +61,6 @@
<pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"/>
<!-- 添加或修改公告对话框 -->
<el-dialog :title="title" :visible.sync="open" width="780px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">

Loading…
Cancel
Save