From b8387f68995eeea0535cbacca0540dc96a3f2350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=B9=8F?= Date: Tue, 7 Jul 2026 18:07:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=84=E5=88=99?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E5=8F=8Aapi=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/module_rule/rule.ts | 285 +++++++++ src/config/setting.ts | 2 +- src/views/module_rule/rule_category/index.vue | 462 ++++++++++++++ .../rule_list/PromptMentionDialog.vue | 344 +++++++++++ src/views/module_rule/rule_list/RuleEdit.vue | 478 +++++++++++++++ .../module_rule/rule_list/RuleTestDrawer.vue | 328 ++++++++++ src/views/module_rule/rule_list/index.vue | 580 ++++++++++++++++++ src/views/module_rule/usePromptMention.ts | 168 +++++ src/views/module_rule/useRuleCategory.ts | 81 +++ 9 files changed, 2727 insertions(+), 1 deletion(-) create mode 100644 src/api/module_rule/rule.ts create mode 100644 src/views/module_rule/rule_category/index.vue create mode 100644 src/views/module_rule/rule_list/PromptMentionDialog.vue create mode 100644 src/views/module_rule/rule_list/RuleEdit.vue create mode 100644 src/views/module_rule/rule_list/RuleTestDrawer.vue create mode 100644 src/views/module_rule/rule_list/index.vue create mode 100644 src/views/module_rule/usePromptMention.ts create mode 100644 src/views/module_rule/useRuleCategory.ts diff --git a/src/api/module_rule/rule.ts b/src/api/module_rule/rule.ts new file mode 100644 index 0000000..b9483a0 --- /dev/null +++ b/src/api/module_rule/rule.ts @@ -0,0 +1,285 @@ +// 规则管理模块接口 +// 包含:规则分类(/rule/category)、规则列表(/rule) +import { request } from "@utils"; + +const RULE_CATEGORY_PATH = "/rule/category"; +const RULE_PATH = "/rule"; + +// ============ 规则分类 ============ + +const RuleCategoryAPI = { + /** 查询规则分类分页列表 */ + page(query?: RuleCategoryPageQuery) { + return request>>({ + url: `${RULE_CATEGORY_PATH}/list`, + method: "get", + params: query, + }); + }, + + /** 查询规则分类树 */ + tree(query?: RuleCategoryTreeQuery) { + return request>({ + url: `${RULE_CATEGORY_PATH}/tree`, + method: "get", + params: query, + }); + }, + + /** 查询规则分类详情 */ + detail(id: number) { + return request>({ + url: `${RULE_CATEGORY_PATH}/detail/${id}`, + method: "get", + }); + }, + + /** 创建规则分类 */ + create(body: RuleCategoryForm) { + return request>({ + url: `${RULE_CATEGORY_PATH}/create`, + method: "post", + data: body, + }); + }, + + /** 修改规则分类 */ + update(id: number, body: RuleCategoryForm) { + return request>({ + url: `${RULE_CATEGORY_PATH}/update/${id}`, + method: "put", + data: body, + }); + }, + + /** 删除规则分类(传 ID 数组) */ + remove(ids: number[]) { + return request({ + url: `${RULE_CATEGORY_PATH}/delete`, + method: "delete", + data: ids, + }); + }, +}; + +// ============ 规则 ============ + +const RuleAPI = { + /** 查询规则分页列表 */ + page(query: RulePageQuery) { + return request>>({ + url: `${RULE_PATH}/list`, + method: "get", + params: query, + }); + }, + + /** 查询规则详情 */ + detail(id: number) { + return request>({ + url: `${RULE_PATH}/detail/${id}`, + method: "get", + }); + }, + + /** 创建规则 */ + create(body: RuleForm) { + return request>({ + url: `${RULE_PATH}/create`, + method: "post", + data: body, + }); + }, + + /** 修改规则 */ + update(id: number, body: RuleForm) { + return request>({ + url: `${RULE_PATH}/update/${id}`, + method: "put", + data: body, + }); + }, + + /** 删除规则(传 ID 数组,软删除) */ + remove(ids: number[]) { + return request({ + url: `${RULE_PATH}/delete`, + method: "delete", + data: ids, + }); + }, + + // ---- 以下接口后端尚未提供,属于预留入口 ---- + // 接口上线后若 URL / 入参不一致,仅需在此处调整即可。 + + /** 复制规则(预留) */ + copy(id: number) { + return request({ + url: `${RULE_PATH}/copy/${id}`, + method: "post", + }); + }, + + /** 批量修改状态(预留) */ + batchStatus(ids: number[], status: RuleStatus) { + return request({ + url: `${RULE_PATH}/status/batch`, + method: "patch", + data: { ids, status }, + }); + }, + + /** 测试规则(预留) */ + test(body: RuleTestRequest) { + return request>({ + url: `${RULE_PATH}/test`, + method: "post", + data: body, + }); + }, + + /** 测试用文件上传(预留) */ + uploadTestFile(file: File) { + const formData = new FormData(); + formData.append("file", file); + return request>({ + url: `${RULE_PATH}/test/upload`, + method: "post", + data: formData, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, +}; + +export { RuleCategoryAPI, RuleAPI }; +export default { RuleCategoryAPI, RuleAPI }; + +// ============ 类型定义 ============ + +/** 规则状态:0 启用 / 1 停用 */ +export type RuleStatus = 0 | 1; + +/** 规则分类树查询参数 */ +export interface RuleCategoryTreeQuery { + name?: string; + parent_id?: number; + status?: RuleStatus; + created_time?: string[]; + updated_time?: string[]; + created_id?: number; + updated_id?: number; + tenant_id?: number; +} + +/** 规则分类分页查询参数 */ +export interface RuleCategoryPageQuery extends RuleCategoryTreeQuery { + page_no: number; + page_size: number; + order_by?: string; +} + +/** 规则分类对象(后端返回) */ +export interface RuleCategoryItem { + id: number; + uuid?: string; + name: string; + parent_id: number | null; + parent_name?: string; + order?: number; + status: RuleStatus; + description?: string; + tenant_id?: number; + created_id?: number; + created_by?: CommonType; + updated_id?: number; + updated_by?: CommonType; + created_time?: string; + updated_time?: string; + is_deleted?: boolean; +} + +/** 规则分类树节点 */ +export interface RuleCategoryNode extends RuleCategoryItem { + children?: RuleCategoryNode[]; +} + +/** 规则分类表单(新增/编辑) */ +export interface RuleCategoryForm { + id?: number; + name: string; + parent_id: number | null; + order?: number; + status?: RuleStatus; + description?: string; +} + +/** 规则分页查询参数 */ +export interface RulePageQuery { + page_no: number; + page_size: number; + order_by?: string; + name?: string; + category_id?: number; + status?: RuleStatus; + created_time?: string[]; + updated_time?: string[]; + created_id?: number; + updated_id?: number; + tenant_id?: number; +} + +/** 规则对象(后端返回) */ +export interface RuleItem { + id: number; + uuid?: string; + name: string; + category_id: number | null; + /** 分类名称快照(创建/修改时保存) */ + category_name_snapshot?: string; + /** 当前返回值等于 category_name_snapshot */ + category_name?: string; + description?: string; + prompt_template: string; + status: RuleStatus; + tenant_id?: number; + created_id?: number; + created_by?: CommonType; + updated_id?: number; + updated_by?: CommonType; + created_time?: string; + updated_time?: string; + is_deleted?: boolean; +} + +/** 规则表单(新建/编辑) */ +export interface RuleForm { + id?: number; + name: string; + category_id: number | null; + description?: string; + prompt_template: string; + status: RuleStatus; +} + +/** 规则测试请求 */ +export interface RuleTestRequest { + rule_id: number; + content?: string; + file_id?: string; +} + +/** 规则测试响应 */ +export interface RuleTestResult { + output?: string; + elapsed?: number; + tokens?: number; + raw?: any; +} + +/** 提示词模板中 @ 引用项 */ +export interface PromptMentionRef { + knowledge_id: string; + knowledge_name: string; + document_id: string; + document_name: string; +} diff --git a/src/config/setting.ts b/src/config/setting.ts index 014ec80..71fa53f 100644 --- a/src/config/setting.ts +++ b/src/config/setting.ts @@ -85,7 +85,7 @@ export const SETTING_DEFAULT_CONFIG = { /** 菜单类型 */ menuType: MenuTypeEnum.LEFT, /** 菜单展开宽度 */ - menuOpenWidth: 230, + menuOpenWidth: 280, /** 菜单是否展开 */ menuOpen: true, /** 双菜单是否显示文本 */ diff --git a/src/views/module_rule/rule_category/index.vue b/src/views/module_rule/rule_category/index.vue new file mode 100644 index 0000000..6910202 --- /dev/null +++ b/src/views/module_rule/rule_category/index.vue @@ -0,0 +1,462 @@ + + + + + + diff --git a/src/views/module_rule/rule_list/PromptMentionDialog.vue b/src/views/module_rule/rule_list/PromptMentionDialog.vue new file mode 100644 index 0000000..c3bd87b --- /dev/null +++ b/src/views/module_rule/rule_list/PromptMentionDialog.vue @@ -0,0 +1,344 @@ + + + + + + diff --git a/src/views/module_rule/rule_list/RuleEdit.vue b/src/views/module_rule/rule_list/RuleEdit.vue new file mode 100644 index 0000000..d8d18ab --- /dev/null +++ b/src/views/module_rule/rule_list/RuleEdit.vue @@ -0,0 +1,478 @@ + +