feat(api): 新增 MinerU相关接口并优化 PDF预览功能

- 新增 getPdfUrl 接口用于获取 PDF 预览 URL
- 新增 minerUMarkDownUpdate 接口用于更新 Markdown 内容- 优化了 RenderMinerU 组件,增加保存并处理功能
- 调整了知识库详情页面布局
- 修复了规则管理相关组件的样式问题
This commit is contained in:
陈昱达
2025-04-11 18:08:27 +08:00
parent 93dd8483e4
commit 09a9b696e5
14 changed files with 535 additions and 404 deletions

View File

@@ -3,8 +3,5 @@ NODE_ENV = 'dev' // 如果是生产环境请记得切换为production
# flag # flag
VUE_APP_FLAG='dev' VUE_APP_FLAG='dev'
#VUE_APP_ADMIN='http://39.104.123.254:7195' VUE_APP_ADMIN='http://39.104.123.254:7196'
# 子西
#VUE_APP_ADMIN='http://192.168.8.165:7196/'
# 季分
VUE_APP_ADMIN='http://192.168.2.62:7196/'

View File

@@ -37,24 +37,32 @@ export function datasetCreate(data) {
export function datasetDelete(data) { export function datasetDelete(data) {
return request({ return request({
url: getUrl(`/datasetsEx/delete?id=${data.id}`), url: getUrl(`/datasetsEx/delete?id=${data.id}`),
method: 'delete', method: 'delete'
}) })
} }
//minerU 获取bbox //minerU 获取bbox
export function minerUBbox(params) { export function minerUBbox(params) {
return request({ return request({
url:'http://192.168.8.165:7196/document/mineru/bbox_json', url: getUrl('/document/mineru/bbox_json'),
// url: getUrl('/document/mineru/bbox_json'),
method: 'get', method: 'get',
params:params params: params
}) })
} }
//minerU 获取markdown //minerU 获取markdown
export function minerUMarkDown(params) { export function minerUMarkDown(params) {
return `http://192.168.8.165:7196/document/mineru/md?documentId=${params.documentId}` return getUrl(`document/mineru/md?documentId=${params.documentId}`)
// url: getUrl('/document/mineru/md'), }
// minerU 获取pdf
export function getPdfUrl(params) {
return getUrl(`/datasetDocumentEx/preview?id=${params.documentId}`)
}
export function minerUMarkDownUpdate(data) {
return request({
url: getUrl(`/document/mineru/md/update`),
method: 'post',
data
})
} }

View File

@@ -1,8 +1,6 @@
import request from '@/assets/js/utils/request' import request from '@/assets/js/utils/request'
import getUrl from '@/assets/js/utils/get-url' import getUrl from '@/assets/js/utils/get-url'
/** /**
* 获取所有的规则列表 * 获取所有的规则列表
*/ */
@@ -59,7 +57,6 @@ export function updateSplitRule(data) {
}) })
} }
/** /**
* 提示词规则新增 * 提示词规则新增
*/ */
@@ -81,4 +78,4 @@ export function updatePromptRule(data) {
method: 'post', method: 'post',
data data
}) })
} }

View File

@@ -1,20 +1,20 @@
{ {
"ruleName": "修改题词规则", ruleName: '修改题词规则',
"ruleType": 2, ruleType: 2,
"ruleList": [ ruleList: [
{ {
"attribute": "属性1-1", attribute: '属性1-1',
"attributeDesc": "秒送", attributeDesc: '秒送',
"keyword": "keyword", keyword: 'keyword',
"example": "example", example: 'example',
"prompt": "prompt" prompt: 'prompt'
}, },
{ {
"attribute": "属性22", attribute: '属性22',
"attributeDesc": "秒送", attributeDesc: '秒送',
"keyword": "keyword", keyword: 'keyword',
"example": "example", example: 'example',
"prompt": "prompt" prompt: 'prompt'
} }
] ]
} }

View File

@@ -1,16 +1,16 @@
{ {
"ruleName": "规则-修改", ruleName: '规则-修改',
"ruleType": 1, ruleType: 1,
"ruleList": [ ruleList: [
{ {
"titleLevel": 1, titleLevel: 1,
"ruleRegex": "规则1", ruleRegex: '规则1',
"description": "描述22" description: '描述22'
}, },
{ {
"titleLevel": 3, titleLevel: 3,
"ruleRegex": "规则2", ruleRegex: '规则2',
"description": "新增" description: '新增'
} }
] ]
} }

View File

@@ -264,9 +264,10 @@ body .el-collapse-item__wrap {
.view-body { .view-body {
text-align: left; text-align: left;
font-size: 14px; font-size: 14px;
div{ padding: 10px;
outline: unset;
div {
outline: unset;
} }
/* 添加一些基本的样式以美化 Markdown 内容 */ /* 添加一些基本的样式以美化 Markdown 内容 */
@@ -277,14 +278,20 @@ body .el-collapse-item__wrap {
margin-bottom: 16px; margin-bottom: 16px;
} }
h1, h2, h3, h4, h5, h6 { h1,
h2,
h3,
h4,
h5,
h6 {
margin-top: 24px; margin-top: 24px;
margin-bottom: 12px; margin-bottom: 12px;
border-bottom: 1px dashed #cecece; border-bottom: 1px dashed #cecece;
padding:5px; padding: 5px;
} }
ul, ol { ul,
ol {
margin: 16px 0; margin: 16px 0;
padding-left: 32px; padding-left: 32px;
} }
@@ -294,7 +301,7 @@ body .el-collapse-item__wrap {
} }
a { a {
color: #007BFF; color: #007bff;
text-decoration: none; text-decoration: none;
} }
@@ -328,12 +335,14 @@ body .el-collapse-item__wrap {
table { table {
border: 1px solid #f9f9f9; border: 1px solid #f9f9f9;
width: 100%; //width: 100%;
margin: 5px;
border-collapse: collapse; border-collapse: collapse;
background: linear-gradient(to bottom, #ffffff, #f9f9f9); background: linear-gradient(to bottom, #ffffff, #f9f9f9);
} }
th, td { th,
td {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 8px; padding: 8px;
text-align: left; text-align: left;
@@ -348,3 +357,27 @@ body .el-collapse-item__wrap {
background-color: #f9fafc; background-color: #f9fafc;
} }
} }
.m-view {
position: relative;
padding: 10px;
// 离开后还原
&:after {
content: '';
position: absolute;
width: calc(100% + 10px);
height: calc(100% + 10px);
top: -5px;
left: -5px;
background: rgba(201, 203, 255, 0.3);
transition: all 0.3s ease-in-out;
opacity: 0; // 初始状态下透明
border: 2px solid rgb(201, 203, 255);
border-radius: 5px;
overflow: hidden;
}
&:hover:after {
opacity: 1; // 悬停时显示
}
}

View File

@@ -1,6 +1,10 @@
<template> <template>
<div style="height: 100%;"> <div style="height: 100%;">
<div class="flex" style="height:calc(100% - 20px);flex:1"> <div class="mv10 mh20 text-right">
<el-button type="primary" size="medium" @click="saveMarkDown">保存并处理</el-button>
<el-button size="medium">取消</el-button>
</div>
<div class="flex" style="height:calc(100% - 35px);flex:1">
<iframe <iframe
id="iframe" id="iframe"
:src="`${iframeSrc}/pdfjs-dist/web/viewer.html?file=${encodeURIComponent(prdUrl)}`" :src="`${iframeSrc}/pdfjs-dist/web/viewer.html?file=${encodeURIComponent(prdUrl)}`"
@@ -9,7 +13,7 @@
<div style="flex:1;max-width: 800px;" class="mh20 miner-u-md"> <div style="flex:1;max-width: 800px;" class="mh20 miner-u-md">
<el-tabs type="border-card" style="height: 100%;overflow: hidden" @tab-click="changeTab"> <el-tabs type="border-card" style="height: 100%;overflow: hidden" @tab-click="changeTab">
<el-tab-pane label="预览" style="overflow:scroll;"> <el-tab-pane label="预览" style="overflow:scroll;">
<div v-html="markdownHtml" class="view-body"></div> <div v-html="markdownHtml" class="view-body" id="viewBody" ref="viewBody"></div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="编辑"> <el-tab-pane label="编辑">
<div class="lineH25" contenteditable id="md-editor" @blur="emitMarkDown">{{ markdown }}</div> <div class="lineH25" contenteditable id="md-editor" @blur="emitMarkDown">{{ markdown }}</div>
@@ -20,34 +24,109 @@
</div> </div>
</template> </template>
<script> <script>
import { minerUBbox, minerUMarkDown } from '@/api/generatedApi/index' import { getPdfUrl, minerUBbox, minerUMarkDown, minerUMarkDownUpdate } from '@/api/generatedApi/index'
import { DEFAULT_COLOR_SECTION, PDF_COLOR_PICKER } from './pdf-color' import { DEFAULT_COLOR_SECTION, PDF_COLOR_PICKER } from './pdf-color'
import MarkdownIt from 'markdown-it' import MarkdownIt from 'markdown-it'
import markdownItKatex from 'markdown-it-katex' import markdownItKatex from 'markdown-it-katex'
const md = new MarkdownIt({ const md = new MarkdownIt({
html: true html: true
}).use(markdownItKatex) }).use(markdownItKatex)
export default { export default {
name: 'index', name: 'index',
data() { data() {
return { return {
prdUrl: ``, prdUrl: ``,
iframeSrc: window.location.href, iframeSrc: window.location.origin,
bboxList: [], bboxList: [],
markdown: '', markdown: '',
md, md,
markdownHtml: '' markdownHtml: '',
page: 1
}
},
props: {
documentId: {
type: String,
default: '1359571867133448192'
} }
}, },
props: {},
watch: {}, watch: {},
components: {}, components: {},
filters: {}, filters: {},
methods: { methods: {
// 生成视觉模型
viewHtmlModel() {
// 创建一个唯一的按钮容器
const buttonContainer = document.createElement('div')
buttonContainer.style.position = 'absolute'
buttonContainer.style.pointerEvents = 'none'
// document.body.appendChild(buttonContainer)
// 当鼠标滑动view-body下的table 时 增加浮层按钮
window.addEventListener('mouseover', e => {
// 检查是否在 viewBody 内部
const viewBody = document.getElementById('viewBody')
if (viewBody.contains(e.target)) {
// 检查目标元素是否为 table 或其子元素
const tableElement = e.target.closest('table')
if (tableElement) {
// 清除之前的按钮
// buttonContainer.innerHTML = ''
//
// // 在这里添加浮层按钮的逻辑
// console.log('Mouse over table or TD element inside viewBody')
// // 生成两个按钮
// const button = document.createElement('button')
// button.innerText = '标注'
// button.style.position = 'absolute'
// // 按钮位置在表格正中间浮动
// // 设置按钮位置在鼠标位置
// const rect = tableElement.getBoundingClientRect()
// console.log(rect)
// // 按钮s生成在鼠标位置
// button.style.left = `-10px`
// button.style.top = `-10px`
//
// button.style.backgroundColor = 'transparent'
// button.style.border = 'none'
// button.style.cursor = 'pointer'
// button.style.padding = '0'
// button.style.fontSize = '16px'
// button.style.zIndex = '9999'
// button.style.pointerEvents = 'auto'
// button.addEventListener('click', () => {
// alert(1)
// })
// buttonContainer.appendChild(button)
// tableElement.appendChild(buttonContainer)
}
}
})
// 当鼠标离开 view-body 下的 table 时 删除按钮
window.addEventListener('mouseout', e => {
// 检查是否在 viewBody 内部
const viewBody = document.getElementById('viewBody')
if (!viewBody.contains(e.target) || !e.target.closest('table')) {
buttonContainer.innerHTML = ''
}
})
},
// 导出
emitMarkDown() { emitMarkDown() {
let pre = document.getElementById('md-editor').innerText let pre = document.getElementById('md-editor').innerText
this.$emit('getMarkDownIt', { innerText: pre }) this.$emit('getMarkDownIt', { innerText: pre })
}, },
saveMarkDown() {
let pre = document.getElementById('md-editor').innerText
minerUMarkDownUpdate({
documentId: this.documentId,
newMd: pre
})
},
// 给文件增加色块
formatJson(data) { formatJson(data) {
return data.map(item => { return data.map(item => {
let bboxes = [] let bboxes = []
@@ -80,19 +159,24 @@ export default {
}, },
// bbox 解析 传递 颜色 // bbox 解析 传递 颜色
getPDFDetailBbox() { getPDFDetailBbox() {
minerUBbox({ documentId: 1 }).then(res => { minerUBbox({ documentId: this.documentId }).then(res => {
this.bboxList = this.formatJson(JSON.parse(JSON.stringify(res.content.content))) this.bboxList = this.formatJson(JSON.parse(JSON.stringify(res.content.content)))
}) })
}, },
changeTab() { changeTab() {
let pre = document.getElementById('md-editor').innerText let pre = document.getElementById('md-editor').innerText
this.markdownHtml = md.render(pre)
let copyMdHtml = md.render(pre)
console.log(copyMdHtml)
// 给 copyMdHtml 里面的table 增加 class m-view
copyMdHtml = copyMdHtml.replace(/<table/g, '<table class="m-view"')
this.markdownHtml = copyMdHtml
}, },
async getPDFDetailMarkDown() { async getPDFDetailMarkDown() {
const response = await fetch(minerUMarkDown({ documentId: 1 })) const response = await fetch(minerUMarkDown({ documentId: this.documentId }))
this.markdown = await response.text() this.markdown = await response.text()
this.markdownHtml = this.md.render(this.markdown) this.markdownHtml = this.md.render(this.markdown).replace(/<table/g, '<table class="m-view"')
}, },
// 向 iframe 发送消息 // 向 iframe 发送消息
sendMessageToIframe(type, message) { sendMessageToIframe(type, message) {
@@ -113,12 +197,15 @@ export default {
created() { created() {
this.getPDFDetailBbox() this.getPDFDetailBbox()
this.getPDFDetailMarkDown() this.getPDFDetailMarkDown()
this.prdUrl = getPdfUrl({ documentId: this.documentId })
console.log(this.prdUrl)
}, },
mounted() { mounted() {
// 监听 iframe 的 postMessage 事件 // 监听 iframe 的 postMessage 事件
window.addEventListener('message', event => { window.addEventListener('message', event => {
// 检查消息来源是否合法 // 检查消息来源是否合法
if (event.origin + '/' === process.env.BASE_URL) { if (event.origin === window.location.origin) {
// 根据消息状态执行不同操作 // 根据消息状态执行不同操作
switch (event.data.status) { switch (event.data.status) {
case 'loaded': case 'loaded':
@@ -136,10 +223,12 @@ export default {
if (event.data.pageNumDetail) { if (event.data.pageNumDetail) {
const pageNumDetail = event.data.pageNumDetail || 1 const pageNumDetail = event.data.pageNumDetail || 1
this.page.value = pageNumDetail this.page = pageNumDetail
this.sendMessageToIframe('pageNumDetail', pageNumDetail) this.sendMessageToIframe('pageNumDetail', pageNumDetail)
} }
}) })
this.viewHtmlModel()
}, },
computed: {} computed: {}
} }

View File

@@ -1,78 +1,78 @@
import layout from "@/views/app/layout/index.vue"; import layout from '@/views/app/layout/index.vue'
import redirect from "@/views/app/redirect/index.vue"; import redirect from '@/views/app/redirect/index.vue'
export default [ export default [
{ {
path: "/knowledge", path: '/knowledge',
name: "home", name: 'home',
component: layout, component: layout,
redirect: "/knowledge/list", redirect: '/knowledge/list',
meta: { meta: {
title: "AI知识库", title: 'AI知识库',
icon: "el-icon-s-home", icon: 'el-icon-s-home',
affix: true affix: true
}, },
children: [ children: [
{ {
path: "/knowledge/list", path: '/knowledge/list',
name: "home", name: 'home',
component: redirect, component: redirect,
redirect: "/knowledge/list", redirect: '/knowledge/list',
meta: { meta: {
title: "知识库", title: '知识库',
icon: "el-icon-s-home", icon: 'el-icon-s-home',
affix: true affix: true
}, },
children: [ children: [
{ {
path: "/knowledge/list", path: '/knowledge/list',
name: "home", name: 'home',
component: () => import("@/views/knowledge/index.vue"), component: () => import('@/views/knowledge/index.vue'),
meta: { meta: {
breadcrumb: false, breadcrumb: false,
title: "知识库", title: '知识库',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
}, },
{ {
path: "/knowledge/detail", path: '/knowledge/detail',
name: "detail", name: 'detail',
component: redirect, component: redirect,
redirect: "/knowledge/detail", redirect: '/knowledge/detail',
hidden: true, hidden: true,
meta: { meta: {
title: "知识库详情", title: '知识库详情',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
}, },
children: [ children: [
{ {
path: "/knowledge/knowledge-create", path: '/knowledge/knowledge-create',
name: "knowledge-create", name: 'knowledge-create',
component: () => import("@/views/knowledge/detail/components/knowledgeForm.vue"), component: () => import('@/views/knowledge/detail/components/knowledgeForm.vue'),
meta: { meta: {
breadcrumb: false, breadcrumb: false,
title: "知识库详情", title: '知识库详情',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
}, },
{ {
path: "/knowledge/detail", path: '/knowledge/detail',
name: "detail", name: 'detail',
component: () => import("@/views/knowledge/detail/index.vue"), component: () => import('@/views/knowledge/detail/index.vue'),
meta: { meta: {
breadcrumb: false, breadcrumb: false,
title: "知识库详情", title: '知识库详情',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
}, },
{ {
path: "/knowledge/detail/create", path: '/knowledge/detail/create',
name: "create", name: 'create',
component: () => import("@/views/knowledge/detail/create.vue"), component: () => import('@/views/knowledge/detail/create.vue'),
meta: { meta: {
title: "知识库新增", title: '知识库新增',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
} }
] ]
@@ -80,61 +80,62 @@ export default [
] ]
}, },
{ {
path: "/knowledge/track", path: '/knowledge/track',
name: "question", name: 'question',
component: redirect, component: redirect,
redirect: "/knowledge/track", redirect: '/knowledge/track',
meta: { meta: {
title: "任务轨迹", title: '任务轨迹',
icon: "el-icon-s-home", icon: 'el-icon-s-home',
affix: true affix: true
}, },
children: [ children: [
{ {
path: "/knowledge/track", path: '/knowledge/track',
name: "track", name: 'track',
component: () => import("@/views/track/Index.vue"), component: () => import('@/views/track/Index.vue'),
meta: { meta: {
breadcrumb: false, breadcrumb: false,
title: "任务轨迹", title: '任务轨迹',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
}, },
{ {
path: "/rules", path: '/rules',
name: "rules", name: 'rules',
component: () => import("@/views/rules/Index.vue"), component: () => import('@/views/rules/Index.vue'),
hidden: true, hidden: true,
meta: { meta: {
title: "规则管理", title: '规则管理',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
} }
] ]
}, { },
path: "/knowledge/rule", {
name: "rule", path: '/knowledge/rule',
name: 'rule',
component: redirect, component: redirect,
redirect: "/knowledge/rule", redirect: '/knowledge/rule',
meta: { meta: {
title: "规则管理", title: '规则管理',
icon: "el-icon-s-home", icon: 'el-icon-s-home',
affix: true affix: true
}, },
children: [ children: [
{ {
path: "/knowledge/rule", path: '/knowledge/rule',
name: "rule", name: 'rule',
component: () => import("@/views/rules/Index.vue"), component: () => import('@/views/rules/Index.vue'),
meta: { meta: {
title: "规则管理", title: '规则管理',
icon: "el-icon-s-home" icon: 'el-icon-s-home'
} }
} }
] ]
} }
] ]
} }
]; ]

View File

@@ -27,10 +27,6 @@
</el-card> </el-card>
<el-drawer :visible.sync="visible" size="80%" title="预处理结果预览"> <el-drawer :visible.sync="visible" size="80%" title="预处理结果预览">
<div class="mv10 mh20 text-right">
<el-button type="primary" size="medium">保存并处理</el-button>
<el-button size="medium">取消</el-button>
</div>
<div style="height:calc(100% - 55px);"> <div style="height:calc(100% - 55px);">
<r-miner-u></r-miner-u> <r-miner-u></r-miner-u>
</div> </div>

View File

@@ -1,21 +1,21 @@
<script> <script>
import { deleteRule, getRuleList } from "@/api/rules/index"; import { deleteRule, getRuleList } from '@/api/rules/index'
import EditPromptRule from "./components/edit-prompt-rule/Index.vue"; import EditPromptRule from './components/edit-prompt-rule/Index.vue'
import EditSplitRule from "./components/edit-split-rule/Index.vue"; import EditSplitRule from './components/edit-split-rule/Index.vue'
import Info from "./components/info/index.vue"; import Info from './components/info/index.vue'
import { h } from "vue"; import { h } from 'vue'
import { watch } from "vue"; import { watch } from 'vue'
export default { export default {
name: "rules", name: 'rules',
data() { data() {
return { return {
columns: [], columns: [],
// 弹窗配置 // 弹窗配置
diglogOptions: { diglogOptions: {
title: "", title: '',
visible: false, visible: false,
width: "50%", width: '50%',
currentComponent: void 0, currentComponent: void 0,
currentRow: void 0 currentRow: void 0
}, },
@@ -26,16 +26,16 @@ export default {
form: { form: {
query: true, query: true,
pickerOptions: void 0, pickerOptions: void 0,
ruleType: "", ruleType: '',
ruleName: "", ruleName: '',
createdDate: [] createdDate: []
} }
}; }
}, },
provide() { provide() {
return { return {
diglogOptions: this.diglogOptions diglogOptions: this.diglogOptions
}; }
}, },
components: { components: {
EditPromptRule, EditPromptRule,
@@ -45,129 +45,127 @@ export default {
computed: { computed: {
// 当前的分页数据 // 当前的分页数据
currentTableDate() { currentTableDate() {
let filteredData; let filteredData
// 过滤 table 列表,如果 form 相关项是空的,就不过滤 // 过滤 table 列表,如果 form 相关项是空的,就不过滤
if (this.form.query) { if (this.form.query) {
// 过滤 ruleType // 过滤 ruleType
const map = { const map = {
1: "提示词规则", 1: '提示词规则',
2: "知识拆分规则" 2: '知识拆分规则'
}; }
filteredData = this.tableData.filter(item => { filteredData = this.tableData.filter(item => {
if (!this.form.ruleType) return true; if (!this.form.ruleType) return true
return map[item.ruleType] === this.form.ruleType; return map[item.ruleType] === this.form.ruleType
}); })
// 过滤 ruleName // 过滤 ruleName
filteredData = filteredData.filter(item => { filteredData = filteredData.filter(item => {
if (!this.form.ruleName) return true; if (!this.form.ruleName) return true
return item.ruleName === this.form.ruleName; return item.ruleName === this.form.ruleName
}); })
// 过滤 createdDate // 过滤 createdDate
filteredData = filteredData.filter(item => { filteredData = filteredData.filter(item => {
if (!this.form.createdDate.length) return true; if (!this.form.createdDate.length) return true
return item.createdDate >= this.form.createdDate[0] && item.createdDate <= this.form.createdDate[1]; return item.createdDate >= this.form.createdDate[0] && item.createdDate <= this.form.createdDate[1]
}); })
} else { } else {
filteredData = this.tableData; filteredData = this.tableData
} }
// TODO: 分页数据 // TODO: 分页数据
const start = (this.currentPage - 1) * 10; const start = (this.currentPage - 1) * 10
const end = this.currentPage * 10; const end = this.currentPage * 10
return filteredData.slice(start, end); return filteredData.slice(start, end)
}, },
// 查询表单的 ruleTypeOptions // 查询表单的 ruleTypeOptions
ruleTypeOptions() { ruleTypeOptions() {
const map = { const map = {
1: "提示词规则", 1: '提示词规则',
2: "知识拆分规则" 2: '知识拆分规则'
}; }
// 去重所有 ruleType 然后映射成 option // 去重所有 ruleType 然后映射成 option
const res = [...new Set(this.tableData.map(item => item.ruleType))].map(type => (map[type])); const res = [...new Set(this.tableData.map(item => item.ruleType))].map(type => map[type])
console.log(res); console.log(res)
return res; return res
}, },
// 查询表单的 ruleNameOptions // 查询表单的 ruleNameOptions
ruleNameOptions() { ruleNameOptions() {
const res = [...new Set(this.tableData.map(item => item.ruleName))]; const res = [...new Set(this.tableData.map(item => item.ruleName))]
console.log(res); console.log(res)
return res; return res
} }
}, },
watch: { watch: {
form: { form: {
handler() { handler() {},
},
deep: true deep: true
} }
}, },
beforeMount() { beforeMount() {
getRuleList().then(res => { getRuleList().then(res => {
console.log(res); console.log(res)
const { content } = res.content; const { content } = res.content
console.log(content); console.log(content)
this.tableData = content.list; this.tableData = content.list
}); })
}, },
methods: { methods: {
handleCurrentChange(val) { handleCurrentChange(val) {
console.log(`current page: ${val}`); console.log(`current page: ${val}`)
this.currentPage = val; this.currentPage = val
}, },
// 处理查看规则详情 // 处理查看规则详情
handleInfoVisiable(row) { handleInfoVisiable(row) {
this.diglogOptions.title = "查看规则详情"; this.diglogOptions.title = '查看规则详情'
this.diglogOptions.currentComponent = "Info"; this.diglogOptions.currentComponent = 'Info'
this.diglogOptions.visible = true; this.diglogOptions.visible = true
this.diglogOptions.currentRow = row; this.diglogOptions.currentRow = row
}, },
// 处理修改规则 // 处理修改规则
handleEdit(row, index) { handleEdit(row, index) {
this.diglogOptions.title = "修改规则"; this.diglogOptions.title = '修改规则'
this.diglogOptions.currentComponent = row.ruleType === 1 ? "EditSplitRule" : "EditPromptRule"; this.diglogOptions.currentComponent = row.ruleType === 1 ? 'EditSplitRule' : 'EditPromptRule'
this.diglogOptions.visible = true; this.diglogOptions.visible = true
this.diglogOptions.currentRow = row; this.diglogOptions.currentRow = row
}, },
// 处理删除规则 // 处理删除规则
handleDelete(row, index) { handleDelete(row, index) {
console.log(row, index); console.log(row, index)
deleteRule([row.id]).then(() => { deleteRule([row.id])
this.tableData.splice(index, 1); .then(() => {
}).catch(err => { this.tableData.splice(index, 1)
this.$notify.error({ })
title: "删除失败", .catch(err => {
message: h("i", { style: "color: teal" }, "删除时出现错误,稍后再试" + err) this.$notify.error({
}); title: '删除失败',
}); message: h('i', { style: 'color: teal' }, '删除时出现错误,稍后再试' + err)
})
})
}, },
// 处理查询 // 处理查询
handleQuery() { handleQuery() {
this.form.query = true; this.form.query = true
}, },
// 处理重置 // 处理重置
handleReset() { handleReset() {
this.form = { this.form = {
query: true, query: true,
pickerOptions: void 0, pickerOptions: void 0,
ruleType: "", ruleType: '',
ruleName: "", ruleName: '',
createdDate: [] createdDate: []
}; }
}, },
// 处理新增 // 处理新增
handleAdd() { handleAdd() {
console.log("handleAdd"); console.log('handleAdd')
} }
} }
}
};
</script> </script>
<template> <template>
@@ -186,8 +184,7 @@ export default {
<el-col :span="8"> <el-col :span="8">
<el-form-item label="规则类型"> <el-form-item label="规则类型">
<el-select v-model="form.ruleType" placeholder="请选择规则类型"> <el-select v-model="form.ruleType" placeholder="请选择规则类型">
<el-option v-for="item in ruleTypeOptions" :key="item" :label="item" :value="item"> <el-option v-for="item in ruleTypeOptions" :key="item" :label="item" :value="item"> </el-option>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -195,16 +192,22 @@ export default {
<el-col :span="8"> <el-col :span="8">
<el-form-item label="规则名称"> <el-form-item label="规则名称">
<el-select v-model="form.ruleName" placeholder="请选择规则名称"> <el-select v-model="form.ruleName" placeholder="请选择规则名称">
<el-option v-for="item in ruleNameOptions" :key="item" :label="item" :value="item"> <el-option v-for="item in ruleNameOptions" :key="item" :label="item" :value="item"> </el-option>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 创建时间 --> <!-- 创建时间 -->
<el-col :span="8"> <el-col :span="8">
<el-form-item label="创建时间"> <el-form-item label="创建时间">
<el-date-picker v-model="form.createdDate" type="daterange" unlink-panels range-separator="至" <el-date-picker
start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="form.pickerOptions"> v-model="form.createdDate"
type="daterange"
unlink-panels
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="form.pickerOptions"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -227,14 +230,13 @@ export default {
<el-table-column prop="ruleName" label="规则名称"></el-table-column> <el-table-column prop="ruleName" label="规则名称"></el-table-column>
<el-table-column prop="ruleType" label="规则类型"> <el-table-column prop="ruleType" label="规则类型">
<template #default="scope"> <template #default="scope">
{{ scope.row.ruleType && scope.row.ruleType === 1 ? "提示词规则" : "知识拆分规则" }} {{ scope.row.ruleType && scope.row.ruleType === 1 ? '提示词规则' : '知识拆分规则' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createdDate" label="创建时间"></el-table-column> <el-table-column prop="createdDate" label="创建时间"></el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template #default="scope"> <template #default="scope">
<el-button type="primary" size="mini" plain @click="handleInfoVisiable(scope.row)">查看规则详情 <el-button type="primary" size="mini" plain @click="handleInfoVisiable(scope.row)">查看规则详情 </el-button>
</el-button>
<el-button type="primary" size="mini" plain @click="handleEdit(scope.row, scope.$index)">修改</el-button> <el-button type="primary" size="mini" plain @click="handleEdit(scope.row, scope.$index)">修改</el-button>
<el-button type="danger" size="mini" plain @click="handleDelete(scope.row, scope.$index)">删除</el-button> <el-button type="danger" size="mini" plain @click="handleDelete(scope.row, scope.$index)">删除</el-button>
</template> </template>
@@ -244,8 +246,14 @@ export default {
<!-- 分页 --> <!-- 分页 -->
<el-row> <el-row>
<el-col :span="24" class="flex" style="justify-content: right;"> <el-col :span="24" class="flex" style="justify-content: right;">
<el-pagination background layout="prev, pager, next" @current-change="handleCurrentChange" <el-pagination
:current-page="currentPage" :hide-on-single-page="true" :total="tableData.length"> background
layout="prev, pager, next"
@current-change="handleCurrentChange"
:current-page="currentPage"
:hide-on-single-page="true"
:total="tableData.length"
>
</el-pagination> </el-pagination>
</el-col> </el-col>
</el-row> </el-row>
@@ -253,8 +261,13 @@ export default {
<!-- 规则详情弹窗 --> <!-- 规则详情弹窗 -->
<el-drawer :visible.sync="diglogOptions.visible" size="50%" :title="diglogOptions.title"> <el-drawer :visible.sync="diglogOptions.visible" size="50%" :title="diglogOptions.title">
<!-- diglog 弹窗内容组件 --> <!-- diglog 弹窗内容组件 -->
<component v-if="diglogOptions.visible" :is="diglogOptions.currentComponent" :data="tableData" :columns="columns" <component
:currentRow="diglogOptions.currentRow" /> v-if="diglogOptions.visible"
:is="diglogOptions.currentComponent"
:data="tableData"
:columns="columns"
:currentRow="diglogOptions.currentRow"
/>
</el-drawer> </el-drawer>
</div> </div>
</template> </template>

View File

@@ -1,6 +1,6 @@
<script> <script>
import { getRuleDetail } from "@/api/rules/index"; import { getRuleDetail } from '@/api/rules/index'
import { updatePromptRule } from "@/api/rules/index"; import { updatePromptRule } from '@/api/rules/index'
export default { export default {
name: 'EditPromptRule', name: 'EditPromptRule',
@@ -25,50 +25,54 @@ export default {
keyword: '', keyword: '',
example: '', example: '',
prompt: '' prompt: ''
}; }
this.form.ruleList.push(payload); this.form.ruleList.push(payload)
}, },
handleDelete() { handleDelete() {
if (this.form.ruleList.length > 0) { if (this.form.ruleList.length > 0) {
this.form.ruleList.pop(); this.form.ruleList.pop()
} }
}, },
save() { save() {
console.log('save this form ',this.form); console.log('save this form ', this.form)
updatePromptRule(this.form).then(() => { updatePromptRule(this.form)
console.log('update prompt rule success'); .then(() => {
this.diglogOptions.visible = false; console.log('update prompt rule success')
// 可以添加成功提示 this.diglogOptions.visible = false
this.$message && this.$message.success('保存成功'); // 可以添加成功提示
}).catch(err => { this.$message && this.$message.success('保存成功')
console.error(`update prompt rule failed: ${err}`); })
// 可以添加错误提示 .catch(err => {
this.$message && this.$message.error('保存失败'); console.error(`update prompt rule failed: ${err}`)
}); // 可以添加错误提示
this.$message && this.$message.error('保存失败')
})
} }
}, },
beforeMount() { beforeMount() {
// 获取当前行数据 // 获取当前行数据
const { currentRow } = this.diglogOptions; const { currentRow } = this.diglogOptions
// 获取规则详情 // 获取规则详情
getRuleDetail(currentRow.id).then(res => { getRuleDetail(currentRow.id)
const { content } = res.content; .then(res => {
console.log('origin query request', content); const { content } = res.content
console.log('origin query request', content)
// 一次性设置表单数据,确保响应式更新 // 一次性设置表单数据,确保响应式更新
this.form = { this.form = {
id: content.id || currentRow.id, id: content.id || currentRow.id,
ruleType: content.ruleType, ruleType: content.ruleType,
ruleName: content.ruleName, ruleName: content.ruleName,
createdDate: content.createdDate, createdDate: content.createdDate,
ruleList: Array.isArray(content.ruleList) ? content.ruleList : [] ruleList: Array.isArray(content.ruleList) ? content.ruleList : []
}; }
}).catch(err => { })
console.error('获取规则详情失败:', err); .catch(err => {
}); console.error('获取规则详情失败:', err)
})
} }
} }
</script> </script>
@@ -113,4 +117,4 @@ export default {
</div> </div>
</template> </template>
<style lang="css" scoped></style> <style lang="css" scoped></style>

View File

@@ -1,108 +1,112 @@
<script> <script>
import { getRuleDetail } from "@/api/rules/index"; import { getRuleDetail } from '@/api/rules/index'
import { updateSplitRule } from "@/api/rules/index"; import { updateSplitRule } from '@/api/rules/index'
export default { export default {
name: 'sEditSplitRule', name: 'sEditSplitRule',
data() { data() {
return { return {
// 表单数据有:规则名称、样式、提示词、备注 // 表单数据有:规则名称、样式、提示词、备注
form: { form: {
id: '', id: '',
ruleName: '', ruleName: '',
ruleType: '', ruleType: '',
ruleList: [] ruleList: []
}
} }
}, }
inject: ['diglogOptions'], },
beforeMount() { inject: ['diglogOptions'],
// 获取当前行数据 beforeMount() {
const { currentRow } = this.diglogOptions; // 获取当前行数据
const { currentRow } = this.diglogOptions
// 获取规则详情 // 获取规则详情
getRuleDetail(currentRow.id).then(res => { getRuleDetail(currentRow.id)
const { content } = res.content; .then(res => {
console.log('origin query request', content); const { content } = res.content
console.log('origin query request', content)
// 一次性设置表单数据,确保响应式更新 // 一次性设置表单数据,确保响应式更新
this.form = { this.form = {
id: content.id, id: content.id,
ruleName: content.ruleName, ruleName: content.ruleName,
ruleType: content.ruleType, ruleType: content.ruleType,
ruleList: Array.isArray(content.ruleList) ? content.ruleList : [] ruleList: Array.isArray(content.ruleList) ? content.ruleList : []
};
}).catch(err => {
console.error('获取规则详情失败:', err);
});
},
methods: {
handleAdd() {
// TODO: 新增数据到后端
const payload = {
titleLevel: '',
ruleRegex: '',
description: ''
};
// 使用数组方法添加元素,确保响应式更新
this.form.ruleList.push(payload);
},
handleDelete() {
// TODO: 删除数据到后端
if (this.form.ruleList.length > 0) {
this.form.ruleList.pop();
} }
}, })
handleSave() { .catch(err => {
// 使用正确的API保存数据到后端 console.error('获取规则详情失败:', err)
console.log(`this.form`,this.form); })
},
updateSplitRule(this.form).then(() => { methods: {
console.log('update split rule success'); handleAdd() {
this.diglogOptions.visible = false; // TODO: 新增数据到后端
// 可以添加成功提示 const payload = {
this.$message && this.$message.success('保存成功'); titleLevel: '',
}).catch(err => { ruleRegex: '',
console.error(`update split rule failed: ${err}`); description: ''
// 可以添加错误提示
this.$message && this.$message.error('保存失败');
});
} }
// 使用数组方法添加元素,确保响应式更新
this.form.ruleList.push(payload)
},
handleDelete() {
// TODO: 删除数据到后端
if (this.form.ruleList.length > 0) {
this.form.ruleList.pop()
}
},
handleSave() {
// 使用正确的API保存数据到后端
console.log(`this.form`, this.form)
updateSplitRule(this.form)
.then(() => {
console.log('update split rule success')
this.diglogOptions.visible = false
// 可以添加成功提示
this.$message && this.$message.success('保存成功')
})
.catch(err => {
console.error(`update split rule failed: ${err}`)
// 可以添加错误提示
this.$message && this.$message.error('保存失败')
})
} }
} }
}
</script> </script>
<template> <template>
<div> <div>
<el-form :model="form" label-width="100px"> <el-form :model="form" label-width="100px">
<el-form-item label="规则名称"> <el-form-item label="规则名称">
<el-input v-model="form.ruleName"></el-input> <el-input v-model="form.ruleName"></el-input>
</el-form-item>
<el-card v-for="(item, index) in form.ruleList" :key="index">
<el-form-item label="样式">
<el-input v-model="item.titleLevel"></el-input>
</el-form-item> </el-form-item>
<el-card v-for="(item, index) in form.ruleList" :key="index"> <el-form-item label="规则">
<el-form-item label="样式"> <el-input v-model="item.ruleRegex"></el-input>
<el-input v-model="item.titleLevel"></el-input> </el-form-item>
</el-form-item> <el-form-item label="备注">
<el-form-item label="规则"> <el-input type="textarea" v-model="item.description"></el-input>
<el-input v-model="item.ruleRegex"></el-input> </el-form-item>
</el-form-item> </el-card>
<el-form-item label="备注"> </el-form>
<el-input type="textarea" v-model="item.description"></el-input> <div slot="footer" class="dialog-footer flex" style="justify-content: space-between;">
</el-form-item> <!-- 只有当点击保存的时候才能和服务端通信新增和删除 -->
</el-card> <div>
</el-form> <el-button type="primary" @click="handleAdd">+ 新增拆分</el-button>
<div slot="footer" class="dialog-footer flex" style="justify-content: space-between;"> <el-button type="info" @click="handleDelete">- 删除拆分</el-button>
<!-- 只有当点击保存的时候才能和服务端通信新增和删除 --> </div>
<div> <div>
<el-button type="primary" @click="handleAdd">+ 新增拆分</el-button> <el-button @click="diglogOptions.visible = false"> </el-button>
<el-button type="info" @click="handleDelete">- 删除拆分</el-button> <el-button type="primary" @click="handleSave"> </el-button>
</div>
<div>
<el-button @click="diglogOptions.visible = false"> </el-button>
<el-button type="primary" @click="handleSave"> </el-button>
</div>
</div> </div>
</div> </div>
</template> </div>
</template>
<style lang="css" scoped></style> <style lang="css" scoped></style>

View File

@@ -1,5 +1,5 @@
<script> <script>
import { getRuleDetail } from "@/api/rules/index"; import { getRuleDetail } from '@/api/rules/index'
export default { export default {
name: 'Info', name: 'Info',
@@ -28,29 +28,23 @@ export default {
} }
}, },
methods: { methods: {
save() { save() {}
}
}, },
beforeMount() { beforeMount() {
// 获取规则详情 // 获取规则详情
getRuleDetail(this.diglogOptions.currentRow.id).then(res => { getRuleDetail(this.diglogOptions.currentRow.id).then(res => {
const { content } = res.content; const { content } = res.content
console.log('origin query request', content); console.log('origin query request', content)
// 设置表单数据 // 设置表单数据
this.form.ruleName = content.ruleName; this.form.ruleName = content.ruleName
this.form.createdDate = content.createdDate; this.form.createdDate = content.createdDate
// 设置表格数据 // 设置表格数据
this.tableDate.data = content.ruleList; this.tableDate.data = content.ruleList
// 设置表格列, 有两种方式 // 设置表格列, 有两种方式
// 1. 是 提示词规则 // 1. 是 提示词规则
if (content.ruleType.toString() === '1') { if (content.ruleType.toString() === '1') {
this.tableDate.columns = [ this.tableDate.columns = [{ prop: 'titleLevel', key: '样式' }, { prop: 'ruleRegex', key: '提示词' }, { prop: 'description', key: '备注' }]
{ prop: 'titleLevel', key: '样式' },
{ prop: 'ruleRegex', key: '提示词' },
{ prop: 'description', key: '备注' }
]
} }
// 2. 是 拆分规则 // 2. 是 拆分规则
else if (content.ruleType.toString() === '2') { else if (content.ruleType.toString() === '2') {
@@ -87,4 +81,4 @@ export default {
</div> </div>
</template> </template>
<style lang="css" scoped></style> <style lang="css" scoped></style>

View File

@@ -1,6 +1,6 @@
<script> <script>
import { getDocByPage } from "@/api/knowledge/task-page"; import { getDocByPage } from '@/api/knowledge/task-page'
import KnowledgeInfo from "@/views/track/views/knowledge-info/Index.vue"; import KnowledgeInfo from '@/views/track/views/knowledge-info/Index.vue'
export default { export default {
components: { components: {
@@ -13,13 +13,13 @@ export default {
tabList: [], tabList: [],
currentPage: 1, currentPage: 1,
form: { form: {
knowledge: "", knowledge: '',
knowledgeName: "", knowledgeName: '',
uploadUser: "", uploadUser: '',
taskStatus: "", taskStatus: '',
taskTime: "" taskTime: ''
} }
}; }
}, },
computed: {}, computed: {},
methods: { methods: {
@@ -27,26 +27,26 @@ export default {
const payload = { const payload = {
page: this.currentPage, page: this.currentPage,
pageSize: 10, pageSize: 10,
docId: "" docId: ''
}; }
getDocByPage(payload).then(res => { getDocByPage(payload).then(res => {
this.tabList = res.content.content.list ? res.content.content.list : []; this.tabList = res.content.content.list ? res.content.content.list : []
console.log(res.content.content.list ? res.content.content.list : []); console.log(res.content.content.list ? res.content.content.list : [])
}); })
}, },
handleActiveInfo(scope) { handleActiveInfo(scope) {
this.infoDialogVisible = true; this.infoDialogVisible = true
console.log(scope.row); console.log(scope.row)
this.activeForm = scope.row; this.activeForm = scope.row
} }
}, },
beforeMount() { beforeMount() {
console.log(`onMounted`); console.log(`onMounted`)
this.getTableData(); this.getTableData()
} }
}; }
</script> </script>
<template> <template>
@@ -57,35 +57,37 @@ export default {
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="知识库"> <el-form-item label="知识库">
<el-select v-model="form.knowledge"> <el-select v-model="form.knowledge"> </el-select>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="知识文件名称"> <el-form-item label="知识文件名称">
<el-select v-model="form.knowledgeName"> <el-select v-model="form.knowledgeName"> </el-select>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="上传用户"> <el-form-item label="上传用户">
<el-select v-model="form.uploadUser"> <el-select v-model="form.uploadUser"> </el-select>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="任务状态"> <el-form-item label="任务状态">
<el-select v-model="form.taskStatus"> <el-select v-model="form.taskStatus"> </el-select>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="任务时间"> <el-form-item label="任务时间">
<el-date-picker v-model="form.taskTime" type="daterange" unlink-panels range-separator="至" <el-date-picker
start-placeholder="开始日期" end-placeholder="结束日期"> v-model="form.taskTime"
type="daterange"
unlink-panels
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
>
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -95,18 +97,12 @@ export default {
<!-- 任务列表 --> <!-- 任务列表 -->
<div> <div>
<el-table :data="tabList" style="width: 100%"> <el-table :data="tabList" style="width: 100%">
<el-table-column prop="taskCode" label="任务号" width="180"> <el-table-column prop="taskCode" label="任务号" width="180"> </el-table-column>
</el-table-column> <el-table-column prop="docTypeName" label="知识库" width="180"> </el-table-column>
<el-table-column prop="docTypeName" label="知识库" width="180"> <el-table-column prop="fileName" label="知识文件名称"> </el-table-column>
</el-table-column> <el-table-column prop="processStatus" label="上传状态"> </el-table-column>
<el-table-column prop="fileName" label="知识文件名称"> <el-table-column prop="createdUser" label="上传用户"> </el-table-column>
</el-table-column> <el-table-column prop="uploadDate" label="上传时间"> </el-table-column>
<el-table-column prop="processStatus" label="上传状态">
</el-table-column>
<el-table-column prop="createdUser" label="上传用户">
</el-table-column>
<el-table-column prop="uploadDate" label="上传时间">
</el-table-column>
<el-table-column prop="processStatus" label="操作"> <el-table-column prop="processStatus" label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" size="mini" @click="handleActiveInfo(scope)">查看详情</el-button> <el-button type="primary" size="mini" @click="handleActiveInfo(scope)">查看详情</el-button>
@@ -114,8 +110,7 @@ export default {
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 弹出提示框 里面是各种详情内容 --> <!-- 弹出提示框 里面是各种详情内容 -->
<el-dialog title="上传任务详情" :visible.sync="infoDialogVisible" width="50%" <el-dialog title="上传任务详情" :visible.sync="infoDialogVisible" width="50%" :before-close="() => (infoDialogVisible = false)">
:before-close="() => infoDialogVisible = false">
<knowledge-info :form="activeForm"></knowledge-info> <knowledge-info :form="activeForm"></knowledge-info>
</el-dialog> </el-dialog>
</div> </div>