parent
e29b368c5c
commit
58774d320d
@ -0,0 +1,178 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// AI聊天消息接口
|
||||
export interface ChatMessage {
|
||||
role: 'user' | 'assistant' | 'system'
|
||||
content: string
|
||||
timestamp?: number
|
||||
}
|
||||
|
||||
// AI聊天请求参数
|
||||
export interface ChatRequest {
|
||||
messages: ChatMessage[]
|
||||
model: string
|
||||
temperature?: number
|
||||
top_p?: number
|
||||
max_tokens?: number
|
||||
stream?: boolean
|
||||
api_key?: string
|
||||
api_endpoint?: string
|
||||
}
|
||||
|
||||
// AI聊天响应
|
||||
export interface ChatResponse {
|
||||
id: string
|
||||
object: string
|
||||
created: number
|
||||
model: string
|
||||
choices: Array<{
|
||||
index: number
|
||||
message: ChatMessage
|
||||
finish_reason: string
|
||||
}>
|
||||
usage?: {
|
||||
prompt_tokens: number
|
||||
completion_tokens: number
|
||||
total_tokens: number
|
||||
}
|
||||
}
|
||||
|
||||
// 流式响应数据
|
||||
export interface StreamChunk {
|
||||
id: string
|
||||
object: string
|
||||
created: number
|
||||
model: string
|
||||
choices: Array<{
|
||||
index: number
|
||||
delta: {
|
||||
content?: string
|
||||
role?: string
|
||||
}
|
||||
finish_reason: string | null
|
||||
}>
|
||||
}
|
||||
|
||||
// 发送聊天消息(非流式)
|
||||
export function sendChatMessage(data: ChatRequest) {
|
||||
return request<ChatResponse>({
|
||||
url: '/ai/chat',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 发送聊天消息(流式)
|
||||
export function sendChatMessageStream(data: ChatRequest): ReadableStream<StreamChunk> {
|
||||
return new ReadableStream({
|
||||
start(controller) {
|
||||
const eventSource = new EventSource(`/ai/chat/stream?${new URLSearchParams({
|
||||
messages: JSON.stringify(data.messages),
|
||||
model: data.model,
|
||||
temperature: data.temperature?.toString() || '0.7',
|
||||
top_p: data.top_p?.toString() || '1',
|
||||
max_tokens: data.max_tokens?.toString() || '2048',
|
||||
api_key: data.api_key || '',
|
||||
api_endpoint: data.api_endpoint || ''
|
||||
})}`)
|
||||
|
||||
eventSource.onmessage = (event) => {
|
||||
try {
|
||||
if (event.data === '[DONE]') {
|
||||
controller.close()
|
||||
eventSource.close()
|
||||
return
|
||||
}
|
||||
|
||||
const chunk: StreamChunk = JSON.parse(event.data)
|
||||
controller.enqueue(chunk)
|
||||
} catch (error) {
|
||||
console.error('解析流式数据失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
eventSource.onerror = (error) => {
|
||||
console.error('流式请求错误:', error)
|
||||
controller.error(error)
|
||||
eventSource.close()
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 获取聊天历史
|
||||
export function getChatHistory(params?: {
|
||||
page?: number
|
||||
size?: number
|
||||
chatId?: string
|
||||
}) {
|
||||
return request<{
|
||||
total: number
|
||||
list: Array<{
|
||||
id: string
|
||||
title: string
|
||||
messages: ChatMessage[]
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}>
|
||||
}>({
|
||||
url: '/ai/chat/history',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 保存聊天记录
|
||||
export function saveChat(data: {
|
||||
title: string
|
||||
messages: ChatMessage[]
|
||||
}) {
|
||||
return request<{ id: string }>({
|
||||
url: '/ai/chat/save',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除聊天记录
|
||||
export function deleteChat(chatId: string) {
|
||||
return request({
|
||||
url: `/ai/chat/${chatId}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 更新聊天标题
|
||||
export function updateChatTitle(chatId: string, title: string) {
|
||||
return request({
|
||||
url: `/ai/chat/${chatId}/title`,
|
||||
method: 'put',
|
||||
data: { title }
|
||||
})
|
||||
}
|
||||
|
||||
// AI问答设置接口
|
||||
export interface AiChatSettings {
|
||||
welcomeIcon: string
|
||||
welcomeTitle: string
|
||||
welcomeMessage: string
|
||||
presetQuestions: string[]
|
||||
historyCount: number
|
||||
}
|
||||
|
||||
// 获取AI问答设置
|
||||
export function getAiChatSettings() {
|
||||
return request<AiChatSettings>({
|
||||
url: '/ai/chat/settings',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 保存AI问答设置
|
||||
export function saveAiChatSettings(data: AiChatSettings) {
|
||||
return request({
|
||||
url: '/ai/chat/settings',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
@ -0,0 +1,143 @@
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { AiKnowledgeBaseVO, AiKnowledgeBaseForm, AiKnowledgeBaseQuery } from '@/api/ai/skill/aiKnowledgeBase/types';
|
||||
|
||||
/**
|
||||
* 查询AI知识库列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const listAiKnowledgeBase = (query?: AiKnowledgeBaseQuery): AxiosPromise<AiKnowledgeBaseVO[]> => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询AI知识库详细
|
||||
* @param knowledgeBaseId
|
||||
*/
|
||||
export const getAiKnowledgeBase = (knowledgeBaseId: string | number): AxiosPromise<AiKnowledgeBaseVO> => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/' + knowledgeBaseId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增AI知识库
|
||||
* @param data
|
||||
*/
|
||||
export const addAiKnowledgeBase = (data: AiKnowledgeBaseForm) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改AI知识库
|
||||
* @param data
|
||||
*/
|
||||
export const updateAiKnowledgeBase = (data: AiKnowledgeBaseForm) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除AI知识库
|
||||
* @param knowledgeBaseId
|
||||
*/
|
||||
export const delAiKnowledgeBase = (knowledgeBaseId: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/' + knowledgeBaseId,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 下拉框查询AI知识库列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export function getAiKnowledgeBaseList (query) {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/getAiKnowledgeBaseList',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 知识库文件上传切分后向量化
|
||||
* @param data 知识库切片内容
|
||||
*/
|
||||
export const vectorizeKnowledgeContent = (data: FormData) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/vectorizeKnowledgeContent',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取AI知识库内容列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export function listAiKnowledgeContent (query) {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/listAiKnowledgeContent',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 删除AI知识库内容,连同向量库内容一同删除
|
||||
* @param knowledgeBaseId
|
||||
* @param knowledgeContentId
|
||||
*/
|
||||
export const delAiKnowledgeContent = (knowledgeBaseId: string | number ,knowledgeContentId: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/deleteKnowledgeContent/' + knowledgeBaseId + '/' + knowledgeContentId,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 删除知识库内容文件
|
||||
* @param knowledgeContentId
|
||||
*/
|
||||
export const removeContentFile = (knowledgeContentId: string | number) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/removeContentFile/' + knowledgeContentId,
|
||||
method: 'post'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取AI知识库内容分段列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export function getKnowledgeContentFragmentList (query) {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeBase/getKnowledgeContentFragmentList',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
@ -0,0 +1,77 @@
|
||||
import request from '@/utils/request';
|
||||
import { AxiosPromise } from 'axios';
|
||||
import { AiKnowledgeContentVO, AiKnowledgeContentForm, AiKnowledgeContentQuery } from '@/api/ai/aiKnowledgeContent/types';
|
||||
|
||||
/**
|
||||
* 查询AI知识库内容列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
|
||||
export const listAiKnowledgeContent = (query?: AiKnowledgeContentQuery): AxiosPromise<AiKnowledgeContentVO[]> => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeContent/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 查询AI知识库内容详细
|
||||
* @param knowledgeContentId
|
||||
*/
|
||||
export const getAiKnowledgeContent = (knowledgeContentId: string | number): AxiosPromise<AiKnowledgeContentVO> => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeContent/' + knowledgeContentId,
|
||||
method: 'get'
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 新增AI知识库内容
|
||||
* @param data
|
||||
*/
|
||||
export const addAiKnowledgeContent = (data: AiKnowledgeContentForm) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeContent',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改AI知识库内容
|
||||
* @param data
|
||||
*/
|
||||
export const updateAiKnowledgeContent = (data: AiKnowledgeContentForm) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeContent',
|
||||
method: 'put',
|
||||
data: data
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除AI知识库内容
|
||||
* @param knowledgeContentId
|
||||
*/
|
||||
export const delAiKnowledgeContent = (knowledgeContentId: string | number | Array<string | number>) => {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeContent/' + knowledgeContentId,
|
||||
method: 'delete'
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 下拉框查询AI知识库内容列表
|
||||
* @param query
|
||||
* @returns {*}
|
||||
*/
|
||||
export function getAiKnowledgeContentList (query) {
|
||||
return request({
|
||||
url: '/ai/aiKnowledgeContent/getAiKnowledgeContentList',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
};
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.1 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="1755589338029" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2379" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M876.407224 954.162564H185.412484a46.694369 46.694369 0 0 1-46.899168-46.557836c0-25.66825 21.026119-46.489569 46.899168-46.489569h491.929272V0H138.513316C99.737875 0 68.266962 31.266112 68.266962 69.836753v837.767975A116.735922 116.735922 0 0 0 185.412484 1023.999317h690.99474a35.020777 35.020777 0 0 0 35.15731-34.884243 35.020777 35.020777 0 0 0-35.15731-34.95251z" fill="#515B77" p-id="2380"></path><path d="M834.081919 0H730.862787v843.297571h103.219132c42.803171 0 77.482615-30.651713 77.482615-68.403154V68.334888C911.564534 30.651713 876.88509 0 834.081919 0z" fill="#515B77" p-id="2381"></path></svg>
|
||||
|
After Width: | Height: | Size: 944 B |
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
@ -0,0 +1,157 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="物料名称" prop="materialId">
|
||||
<el-input v-model="form.materialId" placeholder="请输入物料名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="物料BOM" prop="materialBomId">
|
||||
<el-input v-model="form.materialBomId" placeholder="请输入物料BOM" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="工艺路线" prop="dispatchId">
|
||||
<el-select v-model="form.dispatchId" placeholder="请选择工艺路线">
|
||||
<el-option v-for="item in dispatchOptions" :key="item.id" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="计划交货日期" prop="planDeliveryDate">
|
||||
<el-date-picker v-model="form.planDeliveryDate" type="date" placeholder="请选择计划交货日期" style="width: 100%;" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="计划开始日期" prop="planBeginTime">
|
||||
<el-date-picker v-model="form.planBeginTime" type="date" placeholder="请选择计划开始日期" style="width: 100%;" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="计划结束日期" prop="planEndTime">
|
||||
<el-date-picker v-model="form.planEndTime" type="date" placeholder="请选择计划结束日期" style="width: 100%;" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="计划数量" prop="planAmount">
|
||||
<el-input-number v-model="form.planAmount" :min="0" style="width: 100%;" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||
<el-button @click="resetForm">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, watch } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const formRef = ref()
|
||||
|
||||
|
||||
|
||||
|
||||
const dispatchOptions = [
|
||||
{ id: 'route1', name: '工艺路线A' },
|
||||
{ id: 'route2', name: '工艺路线B' },
|
||||
{ id: 'route3', name: '工艺路线C' },
|
||||
]
|
||||
|
||||
const rules = {
|
||||
materialId: [{ required: true, message: '请输入物料名称', trigger: 'blur' }],
|
||||
materialBomId: [{ required: true, message: '请输入物料BOM', trigger: 'blur' }],
|
||||
dispatchId: [{ required: true, message: '请选择工艺路线', trigger: 'change' }],
|
||||
planDeliveryDate: [{ required: true, message: '请选择计划交货日期', trigger: 'change' }],
|
||||
planBeginTime: [{ required: true, message: '请选择计划开始日期', trigger: 'change' }],
|
||||
planEndTime: [{ required: true, message: '请选择计划结束日期', trigger: 'change' }],
|
||||
planAmount: [{ required: true, message: '请输入计划数量', trigger: 'blur' }],
|
||||
}
|
||||
|
||||
function submitForm() {
|
||||
formRef.value.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
ElMessage.success('提交成功!')
|
||||
// 这里可以处理表单数据提交逻辑
|
||||
}
|
||||
})
|
||||
}
|
||||
function resetForm() {
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
interface FormData {
|
||||
materialId?: string | number
|
||||
materialBomId?: string | number
|
||||
dispatchId?: string | number
|
||||
planDeliveryDate?: string
|
||||
planBeginTime?: string
|
||||
planEndTime?: string
|
||||
planAmount?: number
|
||||
// ...其他字段
|
||||
}
|
||||
|
||||
const props = defineProps<FormData>()
|
||||
|
||||
const form = reactive<FormData>({
|
||||
materialId: '',
|
||||
materialBomId: '',
|
||||
dispatchId: '',
|
||||
planDeliveryDate: '',
|
||||
planBeginTime: '',
|
||||
planEndTime: '',
|
||||
planAmount: 0,
|
||||
// ...其他字段
|
||||
})
|
||||
|
||||
// 初始化赋值
|
||||
Object.keys(form).forEach(key => {
|
||||
if (props[key] !== undefined) {
|
||||
form[key] = props[key]
|
||||
}
|
||||
})
|
||||
|
||||
// 响应props变化
|
||||
watch(
|
||||
() => ({ ...props }),
|
||||
(newProps) => {
|
||||
Object.keys(form).forEach(key => {
|
||||
console.log("----");
|
||||
if (newProps[key] !== undefined) {
|
||||
form[key] = newProps[key]
|
||||
console.log(newProps[key]);
|
||||
}
|
||||
})
|
||||
},
|
||||
{ immediate: true, deep: true }
|
||||
)
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.app-container {
|
||||
padding: 24px;
|
||||
background: #fff;
|
||||
border-radius: 8px;
|
||||
max-width: 900px;
|
||||
margin: 32px auto;
|
||||
box-shadow: 0 2px 8px #f0f1f2;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,116 @@
|
||||
<template>
|
||||
<div class="kb-create-page">
|
||||
<!-- <div class="kb-create-title">创建知识库</div>-->
|
||||
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px" class="kb-create-form">
|
||||
<el-form-item label="知识库名称" prop="knowledgeBaseName">
|
||||
<el-input v-model="form.knowledgeBaseName" placeholder="请输入知识库名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="知识库名称" prop="knowledgeBaseName">
|
||||
<el-input v-model="form.knowledgeBaseName" placeholder="请输入知识库名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="分段长度" prop="segmentLength">
|
||||
<el-input-number v-model="form.segmentLength" :min="1" :step="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="分段重叠" prop="segmentOverlap">
|
||||
<el-input-number v-model="form.segmentOverlap" :min="0" :step="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="检索条数" prop="topK">
|
||||
<el-input-number v-model="form.topK" :min="1" :step="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="知识库类型" prop="vectorStore">
|
||||
<el-select v-model="form.vectorStore" placeholder="请选择知识库类型">
|
||||
<el-option label="vectorStoreA" value="vectorStoreA" />
|
||||
<el-option label="vectorStoreB" value="vectorStoreB" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="向量库" prop="vectorStore">
|
||||
<el-select v-model="form.vectorStore" placeholder="请选择向量库">
|
||||
<el-option label="vectorStoreA" value="vectorStoreA" />
|
||||
<el-option label="vectorStoreB" value="vectorStoreB" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="向量模型" prop="vectorModel">
|
||||
<el-select v-model="form.vectorModel" placeholder="请选择向量模型">
|
||||
<el-option label="text-embedding-ada-002" value="text-embedding-ada-002" />
|
||||
<el-option label="bge-large-zh" value="bge-large-zh" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="知识库描述" prop="description">
|
||||
<el-input v-model="form.description" type="textarea" :rows="3" placeholder="请输入描述" />
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio label="enabled">启用</el-radio>
|
||||
<el-radio label="disabled">禁用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div style="display: flex;justify-content: center">
|
||||
<el-button type="primary" @click="onSubmit">保存</el-button>
|
||||
<el-button @click="onCancel">取消</el-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, defineEmits } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const emit = defineEmits(['created', 'cancel'])
|
||||
const formRef = ref()
|
||||
const form = ref({
|
||||
name: '',
|
||||
segmentLength: 100,
|
||||
segmentOverlap: 20,
|
||||
topK: 5,
|
||||
vectorStore: '',
|
||||
vectorModel: '',
|
||||
description: '',
|
||||
status: 'enabled',
|
||||
})
|
||||
const rules = {
|
||||
name: [{ required: true, message: '请输入知识库名称', trigger: 'blur' }],
|
||||
segmentLength: [{ required: true, type: 'number' as const, min: 1, message: '请输入正整数', trigger: 'blur' }],
|
||||
segmentOverlap: [{ required: true, type: 'number' as const, min: 0, message: '请输入非负整数', trigger: 'blur' }],
|
||||
topK: [{ required: true, type: 'number' as const, min: 1, message: '请输入正整数', trigger: 'blur' }],
|
||||
vectorStore: [{ required: true, message: '请选择向量库', trigger: 'change' }],
|
||||
vectorModel: [{ required: true, message: '请选择向量模型', trigger: 'change' }],
|
||||
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
formRef.value.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
// TODO: 保存逻辑
|
||||
ElMessage.success('保存成功')
|
||||
emit('created', { ...form.value })
|
||||
}
|
||||
})
|
||||
}
|
||||
function onCancel() {
|
||||
emit('cancel')
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.kb-create-page {
|
||||
padding: 0;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.kb-create-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
.kb-create-form {
|
||||
background: #fff;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px #f0f1f2;
|
||||
padding: 0 24px 0 24px;
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in New Issue