Selaa lähdekoodia

引入模型,知识库,知识库片段,知识库附件等页面

WangKang 9 kuukautta sitten
vanhempi
commit
ed4d8ae7ed

+ 63 - 0
src/api/system/knowledgeAttach/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { KnowledgeAttachVO, KnowledgeAttachForm, KnowledgeAttachQuery } from '@/api/system/knowledgeAttach/types';
+
+/**
+ * 查询知识库附件列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listKnowledgeAttach = (query?: KnowledgeAttachQuery): AxiosPromise<KnowledgeAttachVO[]> => {
+  return request({
+    url: '/system/knowledgeAttach/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询知识库附件详细
+ * @param id
+ */
+export const getKnowledgeAttach = (id: string | number): AxiosPromise<KnowledgeAttachVO> => {
+  return request({
+    url: '/system/knowledgeAttach/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增知识库附件
+ * @param data
+ */
+export const addKnowledgeAttach = (data: KnowledgeAttachForm) => {
+  return request({
+    url: '/system/knowledgeAttach',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改知识库附件
+ * @param data
+ */
+export const updateKnowledgeAttach = (data: KnowledgeAttachForm) => {
+  return request({
+    url: '/system/knowledgeAttach',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除知识库附件
+ * @param id
+ */
+export const delKnowledgeAttach = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/knowledgeAttach/' + id,
+    method: 'delete'
+  });
+};

+ 201 - 0
src/api/system/knowledgeAttach/types.ts

@@ -0,0 +1,201 @@
+export interface KnowledgeAttachVO {
+  /**
+   * 
+   */
+  id: string | number;
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode: string;
+
+  /**
+   * 文档编码
+   */
+  docCode: string;
+
+  /**
+   * 文档名称
+   */
+  docName: string;
+
+  /**
+   * 文档类型
+   */
+  docType: string;
+
+  /**
+   * 对象存储ID
+   */
+  ossId: string | number;
+
+  /**
+   * 拆解图片状态10未开始,20进行中,30已完成
+   */
+  picStatus: number;
+
+  /**
+   * 分析图片状态10未开始,20进行中,30已完成
+   */
+  picAnysStatus: number;
+
+  /**
+   * 写入向量数据库状态10未开始,20进行中,30已完成
+   */
+  vectorStatus: number;
+
+  /**
+   * 文档内容
+   */
+  content: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+  /**
+   * 文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf
+   */
+  filePath: string;
+
+  /**
+   * 可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123
+   */
+  publicUrl: string;
+
+}
+
+export interface KnowledgeAttachForm extends BaseEntity {
+  /**
+   * 
+   */
+  id?: string | number;
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode?: string;
+
+  /**
+   * 文档编码
+   */
+  docCode?: string;
+
+  /**
+   * 文档名称
+   */
+  docName?: string;
+
+  /**
+   * 文档类型
+   */
+  docType?: string;
+
+  /**
+   * 对象存储ID
+   */
+  ossId?: string | number;
+
+  /**
+   * 拆解图片状态10未开始,20进行中,30已完成
+   */
+  picStatus?: number;
+
+  /**
+   * 分析图片状态10未开始,20进行中,30已完成
+   */
+  picAnysStatus?: number;
+
+  /**
+   * 写入向量数据库状态10未开始,20进行中,30已完成
+   */
+  vectorStatus?: number;
+
+  /**
+   * 文档内容
+   */
+  content?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+  /**
+   * 文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf
+   */
+  filePath?: string;
+
+  /**
+   * 可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123
+   */
+  publicUrl?: string;
+
+}
+
+export interface KnowledgeAttachQuery extends PageQuery {
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode?: string;
+
+  /**
+   * 文档编码
+   */
+  docCode?: string;
+
+  /**
+   * 文档名称
+   */
+  docName?: string;
+
+  /**
+   * 文档类型
+   */
+  docType?: string;
+
+  /**
+   * 对象存储ID
+   */
+  ossId?: string | number;
+
+  /**
+   * 拆解图片状态10未开始,20进行中,30已完成
+   */
+  picStatus?: number;
+
+  /**
+   * 分析图片状态10未开始,20进行中,30已完成
+   */
+  picAnysStatus?: number;
+
+  /**
+   * 写入向量数据库状态10未开始,20进行中,30已完成
+   */
+  vectorStatus?: number;
+
+  /**
+   * 文档内容
+   */
+  content?: string;
+
+  /**
+   * 文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf
+   */
+  filePath?: string;
+
+  /**
+   * 可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123
+   */
+  publicUrl?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/system/knowledgeFragment/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { KnowledgeFragmentVO, KnowledgeFragmentForm, KnowledgeFragmentQuery } from '@/api/system/knowledgeFragment/types';
+
+/**
+ * 查询知识片段列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listKnowledgeFragment = (query?: KnowledgeFragmentQuery): AxiosPromise<KnowledgeFragmentVO[]> => {
+  return request({
+    url: '/system/knowledgeFragment/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询知识片段详细
+ * @param id
+ */
+export const getKnowledgeFragment = (id: string | number): AxiosPromise<KnowledgeFragmentVO> => {
+  return request({
+    url: '/system/knowledgeFragment/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增知识片段
+ * @param data
+ */
+export const addKnowledgeFragment = (data: KnowledgeFragmentForm) => {
+  return request({
+    url: '/system/knowledgeFragment',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改知识片段
+ * @param data
+ */
+export const updateKnowledgeFragment = (data: KnowledgeFragmentForm) => {
+  return request({
+    url: '/system/knowledgeFragment',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除知识片段
+ * @param id
+ */
+export const delKnowledgeFragment = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/knowledgeFragment/' + id,
+    method: 'delete'
+  });
+};

+ 111 - 0
src/api/system/knowledgeFragment/types.ts

@@ -0,0 +1,111 @@
+export interface KnowledgeFragmentVO {
+  /**
+   * 
+   */
+  id: string | number;
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode: string;
+
+  /**
+   * 文档ID
+   */
+  docCode: string;
+
+  /**
+   * 知识片段ID
+   */
+  fragmentCode: string;
+
+  /**
+   * 片段索引下标
+   */
+  idx: string | number;
+
+  /**
+   * 文档内容
+   */
+  content: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface KnowledgeFragmentForm extends BaseEntity {
+  /**
+   * 
+   */
+  id?: string | number;
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode?: string;
+
+  /**
+   * 文档ID
+   */
+  docCode?: string;
+
+  /**
+   * 知识片段ID
+   */
+  fragmentCode?: string;
+
+  /**
+   * 片段索引下标
+   */
+  idx?: string | number;
+
+  /**
+   * 文档内容
+   */
+  content?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface KnowledgeFragmentQuery extends PageQuery {
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode?: string;
+
+  /**
+   * 文档ID
+   */
+  docCode?: string;
+
+  /**
+   * 知识片段ID
+   */
+  fragmentCode?: string;
+
+  /**
+   * 片段索引下标
+   */
+  idx?: string | number;
+
+  /**
+   * 文档内容
+   */
+  content?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/system/knowledgeInfo/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { KnowledgeInfoVO, KnowledgeInfoForm, KnowledgeInfoQuery } from '@/api/system/knowledgeInfo/types';
+
+/**
+ * 查询知识库列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listKnowledgeInfo = (query?: KnowledgeInfoQuery): AxiosPromise<KnowledgeInfoVO[]> => {
+  return request({
+    url: '/system/knowledgeInfo/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询知识库详细
+ * @param id
+ */
+export const getKnowledgeInfo = (id: string | number): AxiosPromise<KnowledgeInfoVO> => {
+  return request({
+    url: '/system/knowledgeInfo/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增知识库
+ * @param data
+ */
+export const addKnowledgeInfo = (data: KnowledgeInfoForm) => {
+  return request({
+    url: '/system/knowledgeInfo',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改知识库
+ * @param data
+ */
+export const updateKnowledgeInfo = (data: KnowledgeInfoForm) => {
+  return request({
+    url: '/system/knowledgeInfo',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除知识库
+ * @param id
+ */
+export const delKnowledgeInfo = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/knowledgeInfo/' + id,
+    method: 'delete'
+  });
+};

+ 231 - 0
src/api/system/knowledgeInfo/types.ts

@@ -0,0 +1,231 @@
+export interface KnowledgeInfoVO {
+  /**
+   * 
+   */
+  id: string | number;
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode: string;
+
+  /**
+   * 知识库名称
+   */
+  knowledgeName: string;
+
+  /**
+   * 描述
+   */
+  description: string;
+
+  /**
+   * 用户ID
+   */
+  userId: string | number;
+
+  /**
+   * 是否公开知识库(0 否 1是)
+   */
+  share: number;
+
+  /**
+   * 知识分隔符
+   */
+  knowledgeSeparator: string;
+
+  /**
+   * 提问分隔符
+   */
+  questionSeparator: string;
+
+  /**
+   * 重叠字符数
+   */
+  overlapChar: number;
+
+  /**
+   * 知识库中检索的条数
+   */
+  retrieveLimit: number;
+
+  /**
+   * 文本块大小
+   */
+  textBlockSize: number;
+
+  /**
+   * 向量库
+   */
+  vectorModelName: string;
+
+  /**
+   * 向量模型
+   */
+  embeddingModelName: string;
+
+  /**
+   * 系统提示词
+   */
+  systemPrompt: string;
+
+  /**
+   * 备注
+   */
+  remark: string;
+
+}
+
+export interface KnowledgeInfoForm extends BaseEntity {
+  /**
+   * 
+   */
+  id?: string | number;
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode?: string;
+
+  /**
+   * 知识库名称
+   */
+  knowledgeName?: string;
+
+  /**
+   * 描述
+   */
+  description?: string;
+
+  /**
+   * 用户ID
+   */
+  userId?: string | number;
+
+  /**
+   * 是否公开知识库(0 否 1是)
+   */
+  share?: number;
+
+  /**
+   * 知识分隔符
+   */
+  knowledgeSeparator?: string;
+
+  /**
+   * 提问分隔符
+   */
+  questionSeparator?: string;
+
+  /**
+   * 重叠字符数
+   */
+  overlapChar?: number;
+
+  /**
+   * 知识库中检索的条数
+   */
+  retrieveLimit?: number;
+
+  /**
+   * 文本块大小
+   */
+  textBlockSize?: number;
+
+  /**
+   * 向量库
+   */
+  vectorModelName?: string;
+
+  /**
+   * 向量模型
+   */
+  embeddingModelName?: string;
+
+  /**
+   * 系统提示词
+   */
+  systemPrompt?: string;
+
+  /**
+   * 备注
+   */
+  remark?: string;
+
+}
+
+export interface KnowledgeInfoQuery extends PageQuery {
+
+  /**
+   * 知识库ID
+   */
+  knowledgeCode?: string;
+
+  /**
+   * 知识库名称
+   */
+  knowledgeName?: string;
+
+  /**
+   * 描述
+   */
+  description?: string;
+
+  /**
+   * 用户ID
+   */
+  userId?: string | number;
+
+  /**
+   * 是否公开知识库(0 否 1是)
+   */
+  share?: number;
+
+  /**
+   * 知识分隔符
+   */
+  knowledgeSeparator?: string;
+
+  /**
+   * 提问分隔符
+   */
+  questionSeparator?: string;
+
+  /**
+   * 重叠字符数
+   */
+  overlapChar?: number;
+
+  /**
+   * 知识库中检索的条数
+   */
+  retrieveLimit?: number;
+
+  /**
+   * 文本块大小
+   */
+  textBlockSize?: number;
+
+  /**
+   * 向量库
+   */
+  vectorModelName?: string;
+
+  /**
+   * 向量模型
+   */
+  embeddingModelName?: string;
+
+  /**
+   * 系统提示词
+   */
+  systemPrompt?: string;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/system/model/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ModelVO, ModelForm, ModelQuery } from '@/api/system/model/types';
+
+/**
+ * 查询模型列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listModel = (query?: ModelQuery): AxiosPromise<ModelVO[]> => {
+  return request({
+    url: '/system/model/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询模型详细
+ * @param id
+ */
+export const getModel = (id: string | number): AxiosPromise<ModelVO> => {
+  return request({
+    url: '/system/model/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增模型
+ * @param data
+ */
+export const addModel = (data: ModelForm) => {
+  return request({
+    url: '/system/model',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改模型
+ * @param data
+ */
+export const updateModel = (data: ModelForm) => {
+  return request({
+    url: '/system/model',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除模型
+ * @param id
+ */
+export const delModel = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/model/' + id,
+    method: 'delete'
+  });
+};

+ 126 - 0
src/api/system/model/types.ts

@@ -0,0 +1,126 @@
+export interface ModelVO {
+  /**
+   * 主键
+   */
+  id: string | number;
+
+  /**
+   * 模型名称
+   */
+  modelName: string;
+
+  /**
+   * 
+   */
+  network: number;
+
+  /**
+   * 公司
+   */
+  company: string;
+
+  /**
+   * 简介
+   */
+  introduce: string;
+
+  /**
+   * 0-启用;1-禁用
+   */
+  status: number;
+
+  /**
+   * 排序权重
+   */
+  sort: number;
+
+  /**
+   * 
+   */
+  remark: string;
+
+}
+
+export interface ModelForm extends BaseEntity {
+  /**
+   * 主键
+   */
+  id?: string | number;
+
+  /**
+   * 模型名称
+   */
+  modelName?: string;
+
+  /**
+   * 
+   */
+  network?: number;
+
+  /**
+   * 公司
+   */
+  company?: string;
+
+  /**
+   * 简介
+   */
+  introduce?: string;
+
+  /**
+   * 0-启用;1-禁用
+   */
+  status?: number;
+
+  /**
+   * 排序权重
+   */
+  sort?: number;
+
+  /**
+   * 
+   */
+  remark?: string;
+
+}
+
+export interface ModelQuery extends PageQuery {
+
+  /**
+   * 模型名称
+   */
+  modelName?: string;
+
+  /**
+   * 
+   */
+  network?: number;
+
+  /**
+   * 公司
+   */
+  company?: string;
+
+  /**
+   * 简介
+   */
+  introduce?: string;
+
+  /**
+   * 0-启用;1-禁用
+   */
+  status?: number;
+
+  /**
+   * 排序权重
+   */
+  sort?: number;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 63 - 0
src/api/system/project/index.ts

@@ -0,0 +1,63 @@
+import request from '@/utils/request';
+import { AxiosPromise } from 'axios';
+import { ProjectVO, ProjectForm, ProjectQuery } from '@/api/system/project/types';
+
+/**
+ * 查询项目列表
+ * @param query
+ * @returns {*}
+ */
+
+export const listProject = (query?: ProjectQuery): AxiosPromise<ProjectVO[]> => {
+  return request({
+    url: '/system/project/list',
+    method: 'get',
+    params: query
+  });
+};
+
+/**
+ * 查询项目详细
+ * @param id
+ */
+export const getProject = (id: string | number): AxiosPromise<ProjectVO> => {
+  return request({
+    url: '/system/project/' + id,
+    method: 'get'
+  });
+};
+
+/**
+ * 新增项目
+ * @param data
+ */
+export const addProject = (data: ProjectForm) => {
+  return request({
+    url: '/system/project',
+    method: 'post',
+    data: data
+  });
+};
+
+/**
+ * 修改项目
+ * @param data
+ */
+export const updateProject = (data: ProjectForm) => {
+  return request({
+    url: '/system/project',
+    method: 'put',
+    data: data
+  });
+};
+
+/**
+ * 删除项目
+ * @param id
+ */
+export const delProject = (id: string | number | Array<string | number>) => {
+  return request({
+    url: '/system/project/' + id,
+    method: 'delete'
+  });
+};

+ 146 - 0
src/api/system/project/types.ts

@@ -0,0 +1,146 @@
+export interface ProjectVO {
+  /**
+   * 主键索引
+   */
+  id: string | number;
+
+  /**
+   * 部门id
+   */
+  deptId: string | number;
+
+  /**
+   * 组织名称
+   */
+  organization: string;
+
+  /**
+   * 项目名称
+   */
+  project: string;
+
+  /**
+   * 私钥
+   */
+  privateKey: string;
+
+  /**
+   * 公钥
+   */
+  publicKey: string;
+
+  /**
+   * 模型仓库
+   */
+  modelIds: string | number;
+
+  /**
+   * 知识库仓库
+   */
+  ragIds: string | number;
+
+  /**
+   * 智能体权限
+   */
+  agentIds: string | number;
+
+}
+
+export interface ProjectForm extends BaseEntity {
+  /**
+   * 主键索引
+   */
+  id?: string | number;
+
+  /**
+   * 部门id
+   */
+  deptId?: string | number;
+
+  /**
+   * 组织名称
+   */
+  organization?: string;
+
+  /**
+   * 项目名称
+   */
+  project?: string;
+
+  /**
+   * 私钥
+   */
+  privateKey?: string;
+
+  /**
+   * 公钥
+   */
+  publicKey?: string;
+
+  /**
+   * 模型仓库
+   */
+  modelIds?: string | number;
+
+  /**
+   * 知识库仓库
+   */
+  ragIds?: string | number;
+
+  /**
+   * 智能体权限
+   */
+  agentIds?: string | number;
+
+}
+
+export interface ProjectQuery extends PageQuery {
+
+  /**
+   * 部门id
+   */
+  deptId?: string | number;
+
+  /**
+   * 组织名称
+   */
+  organization?: string;
+
+  /**
+   * 项目名称
+   */
+  project?: string;
+
+  /**
+   * 私钥
+   */
+  privateKey?: string;
+
+  /**
+   * 公钥
+   */
+  publicKey?: string;
+
+  /**
+   * 模型仓库
+   */
+  modelIds?: string | number;
+
+  /**
+   * 知识库仓库
+   */
+  ragIds?: string | number;
+
+  /**
+   * 智能体权限
+   */
+  agentIds?: string | number;
+
+    /**
+     * 日期范围参数
+     */
+    params?: any;
+}
+
+
+

+ 16 - 0
src/types/components.d.ts

@@ -18,10 +18,12 @@ declare module 'vue' {
     ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
     ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
     ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDrawer: typeof import('element-plus/es')['ElDrawer']
@@ -33,22 +35,36 @@ declare module 'vue' {
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
+    ElLink: typeof import('element-plus/es')['ElLink']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
+    ElPagination: typeof import('element-plus/es')['ElPagination']
     ElPopover: typeof import('element-plus/es')['ElPopover']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
+    ElTable: typeof import('element-plus/es')['ElTable']
+    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTabPane: typeof import('element-plus/es')['ElTabPane']
+    ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
+    ElTree: typeof import('element-plus/es')['ElTree']
+    ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
+    ElUpload: typeof import('element-plus/es')['ElUpload']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
     FlowChart: typeof import('./../components/Process/flowChart.vue')['default']
     FlowChartImg: typeof import('./../components/Process/flowChartImg.vue')['default']
     Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
+    IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
+    IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']

+ 288 - 0
src/views/system/knowledgeAttach/index.vue

@@ -0,0 +1,288 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="知识库ID" prop="knowledgeCode">
+              <el-input v-model="queryParams.knowledgeCode" placeholder="请输入知识库ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="文档编码" prop="docCode">
+              <el-input v-model="queryParams.docCode" placeholder="请输入文档编码" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="文档名称" prop="docName">
+              <el-input v-model="queryParams.docName" placeholder="请输入文档名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="对象存储ID" prop="ossId">
+              <el-input v-model="queryParams.ossId" placeholder="请输入对象存储ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf" prop="filePath">
+              <el-input v-model="queryParams.filePath" placeholder="请输入文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123" prop="publicUrl">
+              <el-input v-model="queryParams.publicUrl" placeholder="请输入可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:knowledgeAttach:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:knowledgeAttach:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:knowledgeAttach:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:knowledgeAttach:export']">导出</el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="knowledgeAttachList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="" align="center" prop="id" v-if="true" />
+        <el-table-column label="知识库ID" align="center" prop="knowledgeCode" />
+        <el-table-column label="文档编码" align="center" prop="docCode" />
+        <el-table-column label="文档名称" align="center" prop="docName" />
+        <el-table-column label="文档类型" align="center" prop="docType" />
+        <el-table-column label="对象存储ID" align="center" prop="ossId" />
+        <el-table-column label="拆解图片状态10未开始,20进行中,30已完成" align="center" prop="picStatus" />
+        <el-table-column label="分析图片状态10未开始,20进行中,30已完成" align="center" prop="picAnysStatus" />
+        <el-table-column label="写入向量数据库状态10未开始,20进行中,30已完成" align="center" prop="vectorStatus" />
+        <el-table-column label="文档内容" align="center" prop="content" />
+        <el-table-column label="备注" align="center" prop="remark" />
+        <el-table-column label="文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf" align="center" prop="filePath" />
+        <el-table-column label="可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123" align="center" prop="publicUrl" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:knowledgeAttach:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:knowledgeAttach:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改知识库附件对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="knowledgeAttachFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="知识库ID" prop="knowledgeCode">
+          <el-input v-model="form.knowledgeCode" placeholder="请输入知识库ID" />
+        </el-form-item>
+        <el-form-item label="文档编码" prop="docCode">
+          <el-input v-model="form.docCode" placeholder="请输入文档编码" />
+        </el-form-item>
+        <el-form-item label="文档名称" prop="docName">
+          <el-input v-model="form.docName" placeholder="请输入文档名称" />
+        </el-form-item>
+        <el-form-item label="对象存储ID" prop="ossId">
+          <el-input v-model="form.ossId" placeholder="请输入对象存储ID" />
+        </el-form-item>
+        <el-form-item label="文档内容">
+          <editor v-model="form.content" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+            <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf" prop="filePath">
+            <el-input v-model="form.filePath" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123" prop="publicUrl">
+            <el-input v-model="form.publicUrl" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="KnowledgeAttach" lang="ts">
+import { listKnowledgeAttach, getKnowledgeAttach, delKnowledgeAttach, addKnowledgeAttach, updateKnowledgeAttach } from '@/api/system/knowledgeAttach';
+import { KnowledgeAttachVO, KnowledgeAttachQuery, KnowledgeAttachForm } from '@/api/system/knowledgeAttach/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const knowledgeAttachList = ref<KnowledgeAttachVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const knowledgeAttachFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: KnowledgeAttachForm = {
+  id: undefined,
+  knowledgeCode: undefined,
+  docCode: undefined,
+  docName: undefined,
+  docType: undefined,
+  ossId: undefined,
+  picStatus: undefined,
+  picAnysStatus: undefined,
+  vectorStatus: undefined,
+  content: undefined,
+  remark: undefined,
+  filePath: undefined,
+  publicUrl: undefined
+}
+const data = reactive<PageData<KnowledgeAttachForm, KnowledgeAttachQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    knowledgeCode: undefined,
+    docCode: undefined,
+    docName: undefined,
+    docType: undefined,
+    ossId: undefined,
+    picStatus: undefined,
+    picAnysStatus: undefined,
+    vectorStatus: undefined,
+    content: undefined,
+    filePath: undefined,
+    publicUrl: undefined,
+    params: {
+    }
+  },
+  rules: {
+    content: [
+      { required: true, message: "文档内容不能为空", trigger: "blur" }
+    ],
+    remark: [
+      { required: true, message: "备注不能为空", trigger: "blur" }
+    ],
+    filePath: [
+      { required: true, message: "文件本地存储路径,如:D:/knowledge/files/abc123xyz_报告.pdf不能为空", trigger: "blur" }
+    ],
+    publicUrl: [
+      { required: true, message: "可访问的HTTP下载链接,如:http://xxx/api/file/download?docId=abc123不能为空", trigger: "blur" }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询知识库附件列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listKnowledgeAttach(queryParams.value);
+  knowledgeAttachList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  knowledgeAttachFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: KnowledgeAttachVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加知识库附件";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: KnowledgeAttachVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getKnowledgeAttach(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改知识库附件";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  knowledgeAttachFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateKnowledgeAttach(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addKnowledgeAttach(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: KnowledgeAttachVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除知识库附件编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delKnowledgeAttach(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/knowledgeAttach/export', {
+    ...queryParams.value
+  }, `knowledgeAttach_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 249 - 0
src/views/system/knowledgeFragment/index.vue

@@ -0,0 +1,249 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="知识库ID" prop="knowledgeCode">
+              <el-input v-model="queryParams.knowledgeCode" placeholder="请输入知识库ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="文档ID" prop="docCode">
+              <el-input v-model="queryParams.docCode" placeholder="请输入文档ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="知识片段ID" prop="fragmentCode">
+              <el-input v-model="queryParams.fragmentCode" placeholder="请输入知识片段ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="片段索引下标" prop="idx">
+              <el-input v-model="queryParams.idx" placeholder="请输入片段索引下标" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:knowledgeFragment:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:knowledgeFragment:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:knowledgeFragment:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:knowledgeFragment:export']">导出</el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="knowledgeFragmentList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="" align="center" prop="id" v-if="true" />
+        <el-table-column label="知识库ID" align="center" prop="knowledgeCode" />
+        <el-table-column label="文档ID" align="center" prop="docCode" />
+        <el-table-column label="知识片段ID" align="center" prop="fragmentCode" />
+        <el-table-column label="片段索引下标" align="center" prop="idx" />
+        <el-table-column label="文档内容" align="center" prop="content" />
+        <el-table-column label="备注" align="center" prop="remark" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:knowledgeFragment:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:knowledgeFragment:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改知识片段对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="knowledgeFragmentFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="知识库ID" prop="knowledgeCode">
+          <el-input v-model="form.knowledgeCode" placeholder="请输入知识库ID" />
+        </el-form-item>
+        <el-form-item label="文档ID" prop="docCode">
+          <el-input v-model="form.docCode" placeholder="请输入文档ID" />
+        </el-form-item>
+        <el-form-item label="知识片段ID" prop="fragmentCode">
+          <el-input v-model="form.fragmentCode" placeholder="请输入知识片段ID" />
+        </el-form-item>
+        <el-form-item label="片段索引下标" prop="idx">
+          <el-input v-model="form.idx" placeholder="请输入片段索引下标" />
+        </el-form-item>
+        <el-form-item label="文档内容">
+          <editor v-model="form.content" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+            <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="KnowledgeFragment" lang="ts">
+import { listKnowledgeFragment, getKnowledgeFragment, delKnowledgeFragment, addKnowledgeFragment, updateKnowledgeFragment } from '@/api/system/knowledgeFragment';
+import { KnowledgeFragmentVO, KnowledgeFragmentQuery, KnowledgeFragmentForm } from '@/api/system/knowledgeFragment/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const knowledgeFragmentList = ref<KnowledgeFragmentVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const knowledgeFragmentFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: KnowledgeFragmentForm = {
+  id: undefined,
+  knowledgeCode: undefined,
+  docCode: undefined,
+  fragmentCode: undefined,
+  idx: undefined,
+  content: undefined,
+  remark: undefined
+}
+const data = reactive<PageData<KnowledgeFragmentForm, KnowledgeFragmentQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    knowledgeCode: undefined,
+    docCode: undefined,
+    fragmentCode: undefined,
+    idx: undefined,
+    content: undefined,
+    params: {
+    }
+  },
+  rules: {
+    content: [
+      { required: true, message: "文档内容不能为空", trigger: "blur" }
+    ],
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询知识片段列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listKnowledgeFragment(queryParams.value);
+  knowledgeFragmentList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  knowledgeFragmentFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: KnowledgeFragmentVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加知识片段";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: KnowledgeFragmentVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getKnowledgeFragment(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改知识片段";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  knowledgeFragmentFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateKnowledgeFragment(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addKnowledgeFragment(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: KnowledgeFragmentVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除知识片段编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delKnowledgeFragment(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/knowledgeFragment/export', {
+    ...queryParams.value
+  }, `knowledgeFragment_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 321 - 0
src/views/system/knowledgeInfo/index.vue

@@ -0,0 +1,321 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="知识库ID" prop="knowledgeCode">
+              <el-input v-model="queryParams.knowledgeCode" placeholder="请输入知识库ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="知识库名称" prop="knowledgeName">
+              <el-input v-model="queryParams.knowledgeName" placeholder="请输入知识库名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="描述" prop="description">
+              <el-input v-model="queryParams.description" placeholder="请输入描述" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="用户ID" prop="userId">
+              <el-input v-model="queryParams.userId" placeholder="请输入用户ID" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="是否公开知识库" prop="share">
+              <el-input v-model="queryParams.share" placeholder="请输入是否公开知识库" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="知识分隔符" prop="knowledgeSeparator">
+              <el-input v-model="queryParams.knowledgeSeparator" placeholder="请输入知识分隔符" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="提问分隔符" prop="questionSeparator">
+              <el-input v-model="queryParams.questionSeparator" placeholder="请输入提问分隔符" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="重叠字符数" prop="overlapChar">
+              <el-input v-model="queryParams.overlapChar" placeholder="请输入重叠字符数" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="知识库中检索的条数" prop="retrieveLimit">
+              <el-input v-model="queryParams.retrieveLimit" placeholder="请输入知识库中检索的条数" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="文本块大小" prop="textBlockSize">
+              <el-input v-model="queryParams.textBlockSize" placeholder="请输入文本块大小" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="向量库" prop="vectorModelName">
+              <el-input v-model="queryParams.vectorModelName" placeholder="请输入向量库" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="向量模型" prop="embeddingModelName">
+              <el-input v-model="queryParams.embeddingModelName" placeholder="请输入向量模型" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="系统提示词" prop="systemPrompt">
+              <el-input v-model="queryParams.systemPrompt" placeholder="请输入系统提示词" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:knowledgeInfo:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:knowledgeInfo:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:knowledgeInfo:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:knowledgeInfo:export']">导出</el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="knowledgeInfoList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="" align="center" prop="id" v-if="true" />
+        <el-table-column label="知识库ID" align="center" prop="knowledgeCode" />
+        <el-table-column label="知识库名称" align="center" prop="knowledgeName" />
+        <el-table-column label="描述" align="center" prop="description" />
+        <el-table-column label="用户ID" align="center" prop="userId" />
+        <el-table-column label="是否公开知识库" align="center" prop="share" />
+        <el-table-column label="知识分隔符" align="center" prop="knowledgeSeparator" />
+        <el-table-column label="提问分隔符" align="center" prop="questionSeparator" />
+        <el-table-column label="重叠字符数" align="center" prop="overlapChar" />
+        <el-table-column label="知识库中检索的条数" align="center" prop="retrieveLimit" />
+        <el-table-column label="文本块大小" align="center" prop="textBlockSize" />
+        <el-table-column label="向量库" align="center" prop="vectorModelName" />
+        <el-table-column label="向量模型" align="center" prop="embeddingModelName" />
+        <el-table-column label="系统提示词" align="center" prop="systemPrompt" />
+        <el-table-column label="备注" align="center" prop="remark" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:knowledgeInfo:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:knowledgeInfo:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改知识库对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="knowledgeInfoFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="知识库ID" prop="knowledgeCode">
+          <el-input v-model="form.knowledgeCode" placeholder="请输入知识库ID" />
+        </el-form-item>
+        <el-form-item label="知识库名称" prop="knowledgeName">
+          <el-input v-model="form.knowledgeName" placeholder="请输入知识库名称" />
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <el-input v-model="form.description" placeholder="请输入描述" />
+        </el-form-item>
+        <el-form-item label="用户ID" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户ID" />
+        </el-form-item>
+        <el-form-item label="是否公开知识库" prop="share">
+          <el-input v-model="form.share" placeholder="请输入是否公开知识库" />
+        </el-form-item>
+        <el-form-item label="知识分隔符" prop="knowledgeSeparator">
+          <el-input v-model="form.knowledgeSeparator" placeholder="请输入知识分隔符" />
+        </el-form-item>
+        <el-form-item label="提问分隔符" prop="questionSeparator">
+          <el-input v-model="form.questionSeparator" placeholder="请输入提问分隔符" />
+        </el-form-item>
+        <el-form-item label="重叠字符数" prop="overlapChar">
+          <el-input v-model="form.overlapChar" placeholder="请输入重叠字符数" />
+        </el-form-item>
+        <el-form-item label="知识库中检索的条数" prop="retrieveLimit">
+          <el-input v-model="form.retrieveLimit" placeholder="请输入知识库中检索的条数" />
+        </el-form-item>
+        <el-form-item label="文本块大小" prop="textBlockSize">
+          <el-input v-model="form.textBlockSize" placeholder="请输入文本块大小" />
+        </el-form-item>
+        <el-form-item label="向量库" prop="vectorModelName">
+          <el-input v-model="form.vectorModelName" placeholder="请输入向量库" />
+        </el-form-item>
+        <el-form-item label="向量模型" prop="embeddingModelName">
+          <el-input v-model="form.embeddingModelName" placeholder="请输入向量模型" />
+        </el-form-item>
+        <el-form-item label="系统提示词" prop="systemPrompt">
+          <el-input v-model="form.systemPrompt" placeholder="请输入系统提示词" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+            <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="KnowledgeInfo" lang="ts">
+import { listKnowledgeInfo, getKnowledgeInfo, delKnowledgeInfo, addKnowledgeInfo, updateKnowledgeInfo } from '@/api/system/knowledgeInfo';
+import { KnowledgeInfoVO, KnowledgeInfoQuery, KnowledgeInfoForm } from '@/api/system/knowledgeInfo/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const knowledgeInfoList = ref<KnowledgeInfoVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const knowledgeInfoFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: KnowledgeInfoForm = {
+  id: undefined,
+  knowledgeCode: undefined,
+  knowledgeName: undefined,
+  description: undefined,
+  userId: undefined,
+  share: undefined,
+  knowledgeSeparator: undefined,
+  questionSeparator: undefined,
+  overlapChar: undefined,
+  retrieveLimit: undefined,
+  textBlockSize: undefined,
+  vectorModelName: undefined,
+  embeddingModelName: undefined,
+  systemPrompt: undefined,
+  remark: undefined
+}
+const data = reactive<PageData<KnowledgeInfoForm, KnowledgeInfoQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    knowledgeCode: undefined,
+    knowledgeName: undefined,
+    description: undefined,
+    userId: undefined,
+    share: undefined,
+    knowledgeSeparator: undefined,
+    questionSeparator: undefined,
+    overlapChar: undefined,
+    retrieveLimit: undefined,
+    textBlockSize: undefined,
+    vectorModelName: undefined,
+    embeddingModelName: undefined,
+    systemPrompt: undefined,
+    params: {
+    }
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询知识库列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listKnowledgeInfo(queryParams.value);
+  knowledgeInfoList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  knowledgeInfoFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: KnowledgeInfoVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加知识库";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: KnowledgeInfoVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getKnowledgeInfo(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改知识库";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  knowledgeInfoFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateKnowledgeInfo(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addKnowledgeInfo(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: KnowledgeInfoVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除知识库编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delKnowledgeInfo(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/knowledgeInfo/export', {
+    ...queryParams.value
+  }, `knowledgeInfo_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 255 - 0
src/views/system/model/index.vue

@@ -0,0 +1,255 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="模型名称" prop="modelName">
+              <el-input v-model="queryParams.modelName" placeholder="请输入模型名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="" prop="network">
+              <el-input v-model="queryParams.network" placeholder="请输入" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="公司" prop="company">
+              <el-input v-model="queryParams.company" placeholder="请输入公司" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="简介" prop="introduce">
+              <el-input v-model="queryParams.introduce" placeholder="请输入简介" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="排序权重" prop="sort">
+              <el-input v-model="queryParams.sort" placeholder="请输入排序权重" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:model:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:model:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:model:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:model:export']">导出</el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="modelList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="主键" align="center" prop="id" v-if="true" />
+        <el-table-column label="模型名称" align="center" prop="modelName" />
+        <el-table-column label="" align="center" prop="network" />
+        <el-table-column label="公司" align="center" prop="company" />
+        <el-table-column label="简介" align="center" prop="introduce" />
+        <el-table-column label="0-启用;1-禁用" align="center" prop="status" />
+        <el-table-column label="排序权重" align="center" prop="sort" />
+        <el-table-column label="" align="center" prop="remark" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:model:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:model:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改模型对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="modelFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="模型名称" prop="modelName">
+          <el-input v-model="form.modelName" placeholder="请输入模型名称" />
+        </el-form-item>
+        <el-form-item label="" prop="network">
+          <el-input v-model="form.network" placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="公司" prop="company">
+          <el-input v-model="form.company" placeholder="请输入公司" />
+        </el-form-item>
+        <el-form-item label="简介" prop="introduce">
+          <el-input v-model="form.introduce" placeholder="请输入简介" />
+        </el-form-item>
+        <el-form-item label="排序权重" prop="sort">
+          <el-input v-model="form.sort" placeholder="请输入排序权重" />
+        </el-form-item>
+        <el-form-item label="" prop="remark">
+            <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Model" lang="ts">
+import { listModel, getModel, delModel, addModel, updateModel } from '@/api/system/model';
+import { ModelVO, ModelQuery, ModelForm } from '@/api/system/model/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const modelList = ref<ModelVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const modelFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: ModelForm = {
+  id: undefined,
+  modelName: undefined,
+  network: undefined,
+  company: undefined,
+  introduce: undefined,
+  status: undefined,
+  sort: undefined,
+  remark: undefined
+}
+const data = reactive<PageData<ModelForm, ModelQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    modelName: undefined,
+    network: undefined,
+    company: undefined,
+    introduce: undefined,
+    status: undefined,
+    sort: undefined,
+    params: {
+    }
+  },
+  rules: {
+    remark: [
+      { required: true, message: "不能为空", trigger: "blur" }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询模型列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listModel(queryParams.value);
+  modelList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  modelFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: ModelVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加模型";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: ModelVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getModel(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改模型";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  modelFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateModel(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addModel(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: ModelVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除模型编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delModel(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/model/export', {
+    ...queryParams.value
+  }, `model_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList();
+});
+</script>

+ 277 - 0
src/views/system/project/index.vue

@@ -0,0 +1,277 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="部门id" prop="deptId">
+              <el-input v-model="queryParams.deptId" placeholder="请输入部门id" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="组织名称" prop="organization">
+              <el-input v-model="queryParams.organization" placeholder="请输入组织名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="项目名称" prop="project">
+              <el-input v-model="queryParams.project" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="私钥" prop="privateKey">
+              <el-input v-model="queryParams.privateKey" placeholder="请输入私钥" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="公钥" prop="publicKey">
+              <el-input v-model="queryParams.publicKey" placeholder="请输入公钥" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="模型仓库" prop="modelIds">
+              <el-input v-model="queryParams.modelIds" placeholder="请输入模型仓库" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="知识库仓库" prop="ragIds">
+              <el-input v-model="queryParams.ragIds" placeholder="请输入知识库仓库" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="智能体权限" prop="agentIds">
+              <el-input v-model="queryParams.agentIds" placeholder="请输入智能体权限" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:project:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:project:edit']">修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:project:remove']">删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:project:export']">导出</el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="projectList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="主键索引" align="center" prop="id" v-if="true" />
+        <el-table-column label="部门id" align="center" prop="deptId" />
+        <el-table-column label="组织名称" align="center" prop="organization" />
+        <el-table-column label="项目名称" align="center" prop="project" />
+        <el-table-column label="私钥" align="center" prop="privateKey" />
+        <el-table-column label="公钥" align="center" prop="publicKey" />
+        <el-table-column label="模型仓库" align="center" prop="modelIds" />
+        <el-table-column label="知识库仓库" align="center" prop="ragIds" />
+        <el-table-column label="智能体权限" align="center" prop="agentIds" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-tooltip content="修改" placement="top">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:project:edit']"></el-button>
+            </el-tooltip>
+            <el-tooltip content="删除" placement="top">
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:project:remove']"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改项目对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
+      <el-form ref="projectFormRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="部门id" prop="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入部门id" />
+        </el-form-item>
+        <el-form-item label="组织名称" prop="organization">
+            <el-input v-model="form.organization" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="项目名称" prop="project">
+            <el-input v-model="form.project" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="私钥" prop="privateKey">
+            <el-input v-model="form.privateKey" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="公钥" prop="publicKey">
+          <el-input v-model="form.publicKey" placeholder="请输入公钥" />
+        </el-form-item>
+        <el-form-item label="模型仓库" prop="modelIds">
+            <el-input v-model="form.modelIds" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="知识库仓库" prop="ragIds">
+            <el-input v-model="form.ragIds" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="智能体权限" prop="agentIds">
+            <el-input v-model="form.agentIds" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Project" lang="ts">
+import { listProject, getProject, delProject, addProject, updateProject } from '@/api/system/project';
+import { ProjectVO, ProjectQuery, ProjectForm } from '@/api/system/project/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+const projectList = ref<ProjectVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const projectFormRef = ref<ElFormInstance>();
+
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const initFormData: ProjectForm = {
+  id: undefined,
+  deptId: undefined,
+  organization: undefined,
+  project: undefined,
+  privateKey: undefined,
+  publicKey: undefined,
+  modelIds: undefined,
+  ragIds: undefined,
+  agentIds: undefined,
+}
+const data = reactive<PageData<ProjectForm, ProjectQuery>>({
+  form: {...initFormData},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    deptId: undefined,
+    organization: undefined,
+    project: undefined,
+    privateKey: undefined,
+    publicKey: undefined,
+    modelIds: undefined,
+    ragIds: undefined,
+    agentIds: undefined,
+    params: {
+    }
+  },
+  rules: {
+    ragIds: [
+      { required: true, message: "知识库仓库不能为空", trigger: "blur" }
+    ],
+    agentIds: [
+      { required: true, message: "智能体权限不能为空", trigger: "blur" }
+    ],
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询项目列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listProject(queryParams.value);
+  projectList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+}
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+}
+
+/** 表单重置 */
+const reset = () => {
+  form.value = {...initFormData};
+  projectFormRef.value?.resetFields();
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+}
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: ProjectVO[]) => {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+const handleAdd = () => {
+  reset();
+  dialog.visible = true;
+  dialog.title = "添加项目";
+}
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: ProjectVO) => {
+  reset();
+  const _id = row?.id || ids.value[0]
+  const res = await getProject(_id);
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = "修改项目";
+}
+
+/** 提交按钮 */
+const submitForm = () => {
+  projectFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateProject(form.value).finally(() =>  buttonLoading.value = false);
+      } else {
+        await addProject(form.value).finally(() =>  buttonLoading.value = false);
+      }
+      proxy?.$modal.msgSuccess("操作成功");
+      dialog.visible = false;
+      await getList();
+    }
+  });
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: ProjectVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除项目编号为"' + _ids + '"的数据项?').finally(() => loading.value = false);
+  await delProject(_ids);
+  proxy?.$modal.msgSuccess("删除成功");
+  await getList();
+}
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download('system/project/export', {
+    ...queryParams.value
+  }, `project_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList();
+});
+</script>