feat(intelligent-agent): 新增智能体创建功能

- 添加智能体创建页面和相关组件
- 实现智能体名称、图标、背景色选择功能
- 增加应用类型选择功能
-优化 emoji 选择器样式
- 调整卡片布局和样式
This commit is contained in:
陈昱达
2025-04-28 15:35:48 +08:00
parent 678dd8c7d9
commit 713d6ca9cb
7 changed files with 179 additions and 19 deletions

View File

@@ -227,4 +227,21 @@
}
}
}
//&.is-active {
// background: #fff;
//}
}
.render-group {
padding: 5px 10px;
background: #f8f8f8;
& .el-radio-button {
text-align: center;
&.is-active {
background: #fff !important;
}
& .el-radio-button__inner {
padding: 2px 5px;
}
}
}

View File

@@ -39,11 +39,17 @@ Vue.component('VEditor', VueEditor)
// 富文本编辑器 可视化代码
Vue.component('MEditor', MavonEditor)
Vue.prototype.$messageBox = function(isOk, message, type, title) {
this.$confirm(message ? message : '是否确认删除当前数据', title ? title : '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: type ? type : 'error'
}).then(() => {
this.$confirm(
message ? message : '是否确认删除当前数据',
title ? title : '提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: type ? type : 'error',
confirmButtonClass: 'render-button',
cancelButtonClass: 'render-button'
}
).then(() => {
isOk('ok')
})
}

View File

@@ -61,13 +61,13 @@
</template>
<script>
import { validuserName } from '@/assets/js/utils/validate'
import { validUsername } from '@/assets/js/utils/validate.js'
// import { indexUser } from '@/api/app/user'
export default {
name: 'Login',
data() {
const validateuserName = (rule, value, callback) => {
if (!validuserName(value)) {
if (!validUsername(value)) {
callback(new Error('请输入用户名'))
} else {
callback()

View File

@@ -9,7 +9,43 @@ export default {
},
data() {
return {
chooseBack: ['#fff'],
isImage: '0',
background: '',
chooseBack: [
'rgb(255, 255, 255)',
'rgb(228, 251, 204)',
'rgb(239, 241, 245)',
'rgb(224, 234, 255)',
'rgb(254, 247, 195)',
'rgb(213, 245, 246)',
'rgb(209, 233, 255)',
'rgb(209, 224, 255)',
'rgb(213, 217, 235)',
'rgb(255, 228, 232)'
],
// 应用类型
agentType: [
{
label: '聊天助手',
value: 'knowledge'
},
{
label: '知识库+知识库',
value: 'knowledge_knowledge'
},
{
label: '知识库+知识库+知识库',
value: 'sd'
},
{
label: '知识库+知识库+知识库',
value: 'sd'
},
{
label: '知识库+知识库+知识库',
value: 'sd'
}
],
rules: {
name: [
{ required: true, message: '请输入智能体名称', trigger: 'blur' }
@@ -21,6 +57,9 @@ export default {
}
},
methods: {
chooseGround(colors) {
this.$set(this.dialog.agent, 'background', colors)
},
/**
* 提交表单
*/
@@ -61,22 +100,74 @@ export default {
<el-form-item label="名称与图标" prop="name" style="flex:1">
<el-input v-model="dialog.agent.name" size="medium" />
</el-form-item>
<el-form-item label="" prop="imageId" class="mt30 ml40">
<el-form-item label="" prop="imageId" class="mt30 ml20">
<el-popover trigger="click">
<div style="width: 28vw">
<VEmojiPicker @select="selectEmoji" class="emoji " />
<div v-if="dialog.agent.imageId">
<div></div>
<el-radio-group
v-model="isImage"
style="width: 100%;"
class="flex render-group"
>
<el-radio-button label="0" style="flex:1">表情</el-radio-button>
<el-radio-button label="1" style="flex:1">图片</el-radio-button>
</el-radio-group>
<div class="mt10" v-if="isImage === '0'">
<VEmojiPicker @select="selectEmoji" class="emoji " />
<div
v-if="dialog.agent.imageId"
class="flex mt10 back-content justify-content-b"
>
<template v-for="item in chooseBack">
<div
class="emoji-background"
:style="`background:${item}`"
@click="chooseGround(item)"
>
{{ dialog.agent.imageId }}
</div>
</template>
</div>
</div>
</div>
<div class="emoji-content" slot="reference">
<div
class="emoji-content"
slot="reference"
:style="`background:${dialog.agent.background}`"
>
{{ dialog.agent.imageId }}
</div>
</el-popover>
</el-form-item>
</div>
<el-form-item label="选择应用类型" required prop="">
<div class="card-container" style="flex-wrap: wrap;">
<el-card
v-for="item in agentType"
:key="item.value"
shadow="hover"
class="card-item"
>
<div class="flex align-items-c">
<img
src="@/assets/images/knowledge.png"
alt=""
style="width: 50px;height: 50px"
/>
<div class="ml20" style="flex:1;overflow: hidden">
<div class="ellipsis">
{{ item.label }}
</div>
<div class="ellipsis">
{{ item.label }}
</div>
</div>
</div>
</el-card>
</div>
</el-form-item>
<el-form-item label="描述" prop="description">
<el-input
size="medium"
@@ -103,10 +194,29 @@ export default {
border: 1px solid #dcdfe6;
text-align: center;
line-height: 50px;
font-size: 30px;
font-size: 20px;
cursor: pointer;
background: rgb(209, 233, 255);
}
.back-content {
flex-wrap: wrap;
}
.emoji-content + .emoji-content {
//margin-left: 2%;
}
.emoji-background {
cursor: pointer;
flex: 0 0 calc(10% - 10px);
border-radius: 8px;
height: 40px;
line-height: 40px;
font-size: 20px;
border: 1px solid #dcdfe6;
text-align: center;
//margin-left: 10px;
margin-bottom: 10px;
}
.emoji {
width: 100% !important;
height: 100%;
@@ -127,4 +237,27 @@ export default {
}
}
}
.card-container {
display: flex;
flex-wrap: wrap;
justify-content: flex-start; // 确保卡片之间有间距
}
.grid-emojis {
grid-template-columns: repeat(10, 10%) !important;
}
.card-item {
cursor: pointer;
flex: 0 0 calc(33% - 1%); // 每个卡片占据三分之一的宽度,减去间距
margin-bottom: 10px; // 卡片之间的垂直间距
margin-left: 1%;
& .el-card__body {
padding: 5px 10px;
}
& .ellipsis {
white-space: nowrap; // 确保文本不换行
overflow: hidden; // 隐藏超出部分
text-overflow: ellipsis; // 超出部分显示省略号
max-width: 100%; // 设置最大宽度以限制文本长度
}
}
</style>

View File

@@ -167,7 +167,10 @@ export default {
创建者
<div>{{ listItem.createdUser }}</div>
</div>
<div class="opacity-button">
<div
class="opacity-button flex align-items-c"
style="justify-content: flex-end"
>
<el-button
class="default "
size="medium"
@@ -195,6 +198,7 @@ export default {
:title="dialog.title"
:close-on-click-modal="false"
@confirm="infoConfirm"
width="50vw"
>
<component :is="dialog.component" ref="infoDialog" />
</r-dialog>
@@ -313,7 +317,7 @@ export default {
padding: 20px 20px 0;
display: flex;
justify-content: space-between;
align-items: start;
align-items: flex-start;
.folder-content {
display: flex;

View File

@@ -220,7 +220,7 @@ import {
} from '@/assets/js/utils/utilOptions'
import DocumentDrawer from './components/documentDetail/DocumentDrawer.vue'
import knowledgeForm from '@/views/knowledge/detail/components/knowledgeForm.vue'
import knowledgePng_1 from '@/assets/images/konwledge/konwledge-1.png'
import knowledgePng_1 from '@/assets/images/konwledge/knowledge-1.png'
import hitTest from '@/views/knowledge/detail/components/HitTest/Index.vue'
import meteData from '@/views/knowledge/detail/components/meteData/Index.vue'
import MeteData from '@/views/knowledge/detail/components/meteData/Index.vue'

View File

@@ -103,7 +103,7 @@
</div>
</template>
<script>
import { docManageDataset, datasetDelete } from '@/api/generatedApi/index'
import { docManageDataset, datasetDelete } from '@/api/generatedApi/index.js'
import knowledgeForm from '@/views/knowledge/detail/components/knowledgeForm.vue'
import knowledgePng_1 from '@/assets/images/konwledge/knowledge-1.png'
import knowledgePng_2 from '@/assets/images/konwledge/knowledge-2.png'
@@ -327,7 +327,7 @@ export default {
padding: 20px 20px 0;
display: flex;
justify-content: space-between;
align-items: start;
align-items: flex-start;
//align-items: center;