Forráskód Böngészése

增加角色知识库页面

boweniac 5 hónapja
szülő
commit
37e027d9e4

+ 4 - 0
.gitignore

@@ -3,6 +3,8 @@ node-jiti
 .DS_Store
 .cache
 .turbo
+.pnpm-store
+v8-compile-cache-0
 
 tests/server/static
 tests/server/static/upload
@@ -36,3 +38,5 @@ pnpm-lock.yaml
 .env.development
 .env.production
 .vscode/launch.json
+
+*.log

+ 74 - 0
src/api/wechat/agentBase.ts

@@ -0,0 +1,74 @@
+import { defHttp } from '@/utils/http/axios';
+import { ErrorMessageMode } from '/#/axios';
+import { BaseDataResp, BaseListReq, BaseResp, BaseIDsReq, BaseIDReq } from '@/api/model/baseModel';
+import { AgentBaseInfo, AgentBaseListResp } from './model/agentBaseModel';
+
+enum Api {
+  CreateAgentBase = '/wechat-api/agent_base/create',
+  UpdateAgentBase = '/wechat-api/agent_base/update',
+  GetAgentBaseList = '/wechat-api/agent_base/list',
+  DeleteAgentBase = '/wechat-api/agent_base/delete',
+  GetAgentBaseById = '/wechat-api/agent_base',
+}
+
+/**
+ * @description: Get agent base list
+ */
+
+export const getAgentBaseList = (params: BaseListReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseDataResp<AgentBaseListResp>>(
+    { url: Api.GetAgentBaseList, params },
+    { errorMessageMode: mode },
+  );
+};
+
+/**
+ *  @description: Create a new agent base
+ */
+export const createAgentBase = (params: AgentBaseInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.CreateAgentBase, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Update the agent base
+ */
+export const updateAgentBase = (params: AgentBaseInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.UpdateAgentBase, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Delete agent bases
+ */
+export const deleteAgentBase = (params: BaseIDsReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.DeleteAgentBase, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Get agent base By ID
+ */
+export const getAgentBaseById = (params: BaseIDReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseDataResp<AgentBaseInfo>>(
+    { url: Api.GetAgentBaseById, params: params },
+    {
+      errorMessageMode: mode,
+    },
+  );
+};

+ 17 - 0
src/api/wechat/model/agentBaseModel.ts

@@ -0,0 +1,17 @@
+import { BaseListResp } from '@/api/model/baseModel';
+
+/**
+ *  @description: AgentBase info response
+ */
+export interface AgentBaseInfo {
+  id?: number;
+  createdAt?: number;
+  updatedAt?: number;
+  organizationId?: number;
+}
+
+/**
+ *  @description: AgentBase list response
+ */
+
+export type AgentBaseListResp = BaseListResp<AgentBaseInfo>;

+ 2 - 0
src/enums/pageEnum.ts

@@ -23,6 +23,8 @@ export enum PageEnum {
   SEND_RECORD = '/wechat/batch_msg/sendRecord',
   //聚合聊天
   WECHAT_MAIN = '/wechat/wechatMain',
+  //角色知识库
+  AGENT_BASE = '/wechat/agent/agentBase',
 }
 
 export const PageWrapperFixedHeightKey = 'PageWrapperFixedHeight';

+ 6 - 0
src/locales/lang/en/wechat.ts

@@ -132,4 +132,10 @@ export default {
     editToken: 'Edit Token',
     tokenList: 'Token List',
   },
+  agentBase: {
+    id: 'Id',
+    addAgentBase: 'Add AgentBase',
+    editAgentBase: 'Edit AgentBase',
+    agentBaseList: 'AgentBase List',
+  },
 };

+ 6 - 0
src/locales/lang/zh-CN/wechat.ts

@@ -136,4 +136,10 @@ export default {
     editToken: '编辑 Token',
     tokenList: 'Token 列表',
   },
+  agentBase: {
+    id: 'Id',
+    addAgentBase: '添加 AgentBase',
+    editAgentBase: '编辑 AgentBase',
+    agentBaseList: 'AgentBase 列表',
+  },
 };

+ 67 - 0
src/views/wechat/agent/agent_base/AgentBaseDrawer.vue

@@ -0,0 +1,67 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    @register="registerDrawer"
+    showFooter
+    :title="getTitle"
+    width="35%"
+    @ok="handleSubmit"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicDrawer>
+</template>
+<script lang="ts" setup>
+  import { ref, computed, unref } from 'vue';
+  import { BasicForm, useForm } from '@/components/Form';
+  import { formSchema } from './agentBase.data';
+  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
+  import { useI18n } from 'vue-i18n';
+
+  import { createAgentBase, updateAgentBase } from '@/api/wechat/agentBase';
+  import {useRoute} from "vue-router";
+
+  const emit = defineEmits(['success', 'register']);
+  const isUpdate = ref(true);
+  const { t } = useI18n();
+
+  const route = useRoute();
+  const collectionId = route.query.collectionId;
+
+  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+    labelWidth: 160,
+    baseColProps: { span: 24 },
+    layout: 'vertical',
+    schemas: formSchema,
+    showActionButtonGroup: false,
+  });
+
+  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
+    await resetFields();
+    setDrawerProps({ confirmLoading: false });
+
+    isUpdate.value = !!data?.isUpdate;
+
+    if (unref(isUpdate)) {
+      await setFieldsValue({
+        ...data.record,
+      });
+    }
+  });
+
+  const getTitle = computed(() =>
+    !unref(isUpdate) ? t('wechat.agentBase.addAgentBase') : t('wechat.agentBase.editAgentBase'),
+  );
+
+  async function handleSubmit() {
+    const values = await validate();
+    setDrawerProps({ confirmLoading: true });
+    values['id'] = unref(isUpdate) ? values['id'] : "0";
+    values['collectionId'] = collectionId; // Add collectionId to values
+    let result = unref(isUpdate) ? await updateAgentBase(values) : await createAgentBase(values);
+    if (result.code === 0) {
+      closeDrawer();
+      emit('success');
+    }
+    setDrawerProps({ confirmLoading: false });
+  }
+</script>

+ 50 - 0
src/views/wechat/agent/agent_base/agentBase.data.ts

@@ -0,0 +1,50 @@
+import { BasicColumn, FormSchema } from '@/components/Table';
+import { useI18n } from '@/hooks/web/useI18n';
+import { formatToDateTime } from '@/utils/dateUtil';
+
+const { t } = useI18n();
+
+export const columns: BasicColumn[] = [
+  {
+    title: '问题',
+    dataIndex: 'q',
+    width: 100,
+  },
+  {
+    title: '答案',
+    dataIndex: 'a',
+    width: 100,
+  },
+  {
+    title: t('common.createTime'),
+    dataIndex: 'createdAt',
+    width: 70,
+    customRender: ({ record }) => {
+      return formatToDateTime(record.createdAt);
+    },
+  },
+];
+
+export const searchFormSchema: FormSchema[] = [
+];
+
+export const formSchema: FormSchema[] = [
+  {
+    field: 'id',
+    label: 'ID',
+    component: 'Input',
+    show: false,
+  },
+  {
+    field: 'q',
+    label: '问题',
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'a',
+    label: '答案',
+    component: 'Input',
+    required: true,
+  },
+];

+ 141 - 0
src/views/wechat/agent/agent_base/index.vue

@@ -0,0 +1,141 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #tableTitle>
+<!--        <Button-->
+<!--          type="primary"-->
+<!--          danger-->
+<!--          preIcon="ant-design:delete-outlined"-->
+<!--          v-if="showDeleteButton"-->
+<!--          @click="handleBatchDelete"-->
+<!--        >-->
+<!--          {{ t('common.delete') }}-->
+<!--        </Button>-->
+      </template>
+      <template #toolbar>
+        <a-button type="primary" @click="handleCreate">
+          {{ t('wechat.agentBase.addAgentBase') }}
+        </a-button>
+      </template>
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'action'">
+          <TableAction
+            :actions="[
+              {
+                icon: 'clarity:note-edit-line',
+                onClick: handleEdit.bind(null, record),
+              },
+              {
+                icon: 'ant-design:delete-outlined',
+                color: 'error',
+                popConfirm: {
+                  title: t('common.deleteConfirm'),
+                  placement: 'left',
+                  confirm: handleDelete.bind(null, record),
+                },
+              },
+            ]"
+          />
+        </template>
+      </template>
+    </BasicTable>
+    <AgentBaseDrawer @register="registerDrawer" @success="handleSuccess" />
+  </div>
+</template>
+<script lang="ts" setup>
+  import { createVNode, ref } from 'vue';
+  import { Modal } from 'ant-design-vue';
+  import { ExclamationCircleOutlined } from '@ant-design/icons-vue/lib/icons';
+  import { BasicTable, useTable, TableAction } from '@/components/Table';
+  import { Button } from '@/components/Button';
+
+  import { useDrawer } from '@/components/Drawer';
+  import AgentBaseDrawer from './AgentBaseDrawer.vue';
+  import { useI18n } from 'vue-i18n';
+
+  import { columns, searchFormSchema } from './agentBase.data';
+  import { getAgentBaseList, deleteAgentBase } from '@/api/wechat/agentBase';
+
+  import { useRoute } from 'vue-router';
+
+  defineOptions({ name: 'AgentBaseManagement' });
+
+  const { t } = useI18n();
+  const selectedIds = ref<number[] | string[]>();
+  const showDeleteButton = ref<boolean>(false);
+
+  const route = useRoute();
+  const collectionId = route.query.collectionId;
+
+  const [registerDrawer, { openDrawer }] = useDrawer();
+  const [registerTable, { reload }] = useTable({
+    title: t('wechat.agentBase.agentBaseList'),
+    api: (params) => getAgentBaseList({ ...params, collectionId }),
+    columns,
+    formConfig: {
+      labelWidth: 120,
+      schemas: searchFormSchema,
+    },
+    useSearchForm: true,
+    showTableSetting: true,
+    bordered: true,
+    showIndexColumn: false,
+    clickToRowSelect: false,
+    actionColumn: {
+      width: 30,
+      title: t('common.action'),
+      dataIndex: 'action',
+      fixed: undefined,
+    },
+    rowKey: 'id',
+    rowSelection: {
+      type: 'checkbox',
+      columnWidth: 20,
+      onChange: (selectedRowKeys, _selectedRows) => {
+        selectedIds.value = selectedRowKeys as number[];
+        showDeleteButton.value = selectedRowKeys.length > 0;
+      },
+    },
+  });
+
+  function handleCreate() {
+    openDrawer(true, {
+      isUpdate: false,
+    });
+  }
+
+  function handleEdit(record: Recordable) {
+    openDrawer(true, {
+      record,
+      isUpdate: true,
+    });
+  }
+
+  async function handleDelete(record: Recordable) {
+    const result = await deleteAgentBase({ id: record.id });
+    if (result.code === 0) {
+      await reload();
+    }
+  }
+
+  async function handleBatchDelete() {
+    Modal.confirm({
+      title: t('common.deleteConfirm'),
+      icon: createVNode(ExclamationCircleOutlined),
+      async onOk() {
+        const result = await deleteAgentBase({ ids: selectedIds.value as number[] });
+        if (result.code === 0) {
+          showDeleteButton.value = false;
+          await reload();
+        }
+      },
+      onCancel() {
+        console.log('Cancel');
+      },
+    });
+  }
+
+  async function handleSuccess() {
+    await reload();
+  }
+</script>

+ 38 - 15
src/views/wechat/agent/index.vue

@@ -20,21 +20,7 @@
       <template #bodyCell="{ column, record }">
         <template v-if="column.key === 'action'">
           <TableAction
-            :actions="[
-              {
-                label: '编辑',
-                onClick: handleEdit.bind(null, record),
-              },
-              {
-                label: '删除',
-                color: 'error',
-                popConfirm: {
-                  title: t('common.deleteConfirm'),
-                  placement: 'left',
-                  confirm: handleDelete.bind(null, record),
-                },
-              },
-            ]"
+            :actions="getActions(record)"
           />
         </template>
       </template>
@@ -55,11 +41,14 @@
 
   import { columns, searchFormSchema } from './agent.data';
   import { getAgentList, deleteAgent } from '@/api/wechat/agent';
+  import {PageEnum} from "@/enums/pageEnum";
+  import {useRouter} from "vue-router";
 
   export default defineComponent({
     name: 'AgentManagement',
     components: { BasicTable, AgentDrawer, TableAction, Button },
     setup() {
+      const router = useRouter();
       const { t } = useI18n();
       const selectedIds = ref<number[] | string[]>();
       const showDeleteButton = ref<boolean>(false);
@@ -136,6 +125,38 @@
         await reload();
       }
 
+      //打开知识库
+      function handleDataBase(record: Recordable) {
+        console.log('打开知识库')
+        router.push({
+          path: PageEnum.AGENT_BASE,
+          query: { collectionId: record.collection_id }
+        });
+      }
+
+      function getActions(record: Recordable) {
+        return [
+          {
+            label: '编辑',
+            onClick: handleEdit.bind(null, record),
+          },
+          {
+            label: '删除',
+            color: 'error',
+            popConfirm: {
+              title: t('common.deleteConfirm'),
+              placement: 'left',
+              confirm: handleDelete.bind(null, record),
+            },
+          },
+          {
+            onClick: handleDataBase.bind(null, record),
+            label: '知识库',
+            ifShow: true,
+          }
+        ];
+      }
+
       return {
         t,
         registerTable,
@@ -146,6 +167,8 @@
         handleSuccess,
         handleBatchDelete,
         showDeleteButton,
+        handleDataBase,
+        getActions,
       };
     },
   });