Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
wu.jifen
2025-04-24 18:40:32 +08:00
13 changed files with 726 additions and 216 deletions

View File

@@ -5,4 +5,4 @@
"printWidth": 80,
"endOfLine": "auto",
"singleAttributePerLine": true
}
}

View File

@@ -49,10 +49,18 @@ export function changeUserStatus(params) {
params: params
})
}
// 重置密码
// 修改密码
export function updatePassword(data) {
return request({
url: getUrl(`/sysUser/updatePassword`),
url: getUrl(`/sysUserEx/updatePassword`),
method: 'post',
data
})
}
// 重置密码
export function resetPassword(data) {
return request({
url: getUrl(`/sysUserEx/resetPassword`),
method: 'post',
data
})

View File

@@ -16,28 +16,33 @@
首页
</el-dropdown-item>
</router-link>
<a target="_blank" href="http://www.ebiz-interactive.com/">
<el-dropdown-item>关于</el-dropdown-item>
</a>
<el-dropdown-item divided>
<span style="display:block;" @click="resetPassword">修改密码</span>
</el-dropdown-item>
<el-dropdown-item divided>
<span style="display:block;" @click="logout">退出</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<reset-password-dialog
:visible.sync="resetPasswordVisible"
></reset-password-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import url from '@/assets/images/active.png'
import ResetPasswordDialog from '@/views/system/user/components/ResetPasswordDialog.vue'
export default {
components: {},
components: { ResetPasswordDialog },
data() {
return {
circleUrl: url,
size: 40
size: 40,
resetPasswordVisible: false
}
},
computed: {
@@ -56,6 +61,9 @@ export default {
await this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
})
},
resetPassword() {
this.resetPasswordVisible = true
}
}
}

View File

@@ -1,6 +1,10 @@
<template>
<div class="app-wrapper">
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<div
v-if="device === 'mobile' && sidebar.opened"
class="drawer-bg"
@click="handleClickOutside"
/>
<sidebar class="sidebar-container" />
<div class="main-container">
<app-main />

View File

@@ -1,5 +1,9 @@
<script>
import { agentList, agentDelete, agentDetail } from '@/api/intelligent-agent/list'
import {
agentList,
agentDelete,
agentDetail
} from '@/api/intelligent-agent/list'
import Info from '@/views/intelligent-agent/components/info'
export default {
@@ -83,14 +87,25 @@ export default {
<!-- header 头部 -->
<nav v-if="true">
<div class="flex align-items-c justify-content-b">
<el-input placeholder="输入智能体名称" clearable v-model="searchOption.nameLike" size="medium" class="underBorder"
@keydown.enter.native="searchOption.handleSearch">
<el-input
placeholder="输入智能体名称"
clearable
v-model="searchOption.nameLike"
size="medium"
class="underBorder"
@keydown.enter.native="searchOption.handleSearch"
>
<template slot="prepend">
<el-button slot="append" icon="el-icon-search"></el-button>
</template>
</el-input>
<el-button size="medium" class="line-button pv8 ph10" icon="el-icon-plus"
@click="createdIntelligentAgent()">创建智能体</el-button>
<el-button
size="medium"
class="line-button pv8 ph10"
icon="el-icon-plus"
@click="createdIntelligentAgent()"
>创建智能体</el-button
>
</div>
<h3>智能体</h3>
</nav>
@@ -98,10 +113,20 @@ export default {
<!-- 智能体的列表 -->
<article>
<el-row class="agent-item" :gutter="10">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" v-for="listItem in list" :key="listItem.id">
<el-col
:xs="24"
:sm="12"
:md="8"
:lg="6"
:xl="4"
v-for="listItem in list"
:key="listItem.id"
>
<el-card>
<section class="agent-item__info">
<el-avatar shape="square" :src="listItem.url">{{ listItem.name[0] }}</el-avatar>
<el-avatar shape="square" :src="listItem.url">{{
listItem.name[0]
}}</el-avatar>
<span>
<h4>{{ listItem.name }}</h4>
<p class="dataset-desc">{{ listItem.description }}</p>
@@ -109,10 +134,21 @@ export default {
</section>
<el-row type="flex" justify="end">
<el-button class="default render-button" size="small" icon="el-icon-delete"
@click.stop="handleDeleteAgent(listItem.id)">删除</el-button>
<el-button class="render-button line-button" size="small" icon="el-icon-edit"
@click.stop="handleEditAgent(listItem.id)" type="primary">修改</el-button>
<el-button
class="default render-button"
size="small"
icon="el-icon-delete"
@click.stop="handleDeleteAgent(listItem.id)"
>删除</el-button
>
<el-button
class="render-button line-button"
size="small"
icon="el-icon-edit"
@click.stop="handleEditAgent(listItem.id)"
type="primary"
>修改</el-button
>
</el-row>
</el-card>
</el-col>
@@ -120,7 +156,11 @@ export default {
</article>
<!-- dialog 内容 现在主要是编辑 -->
<el-dialog :visible.sync="dialog.visible" :title="dialog.title" :close-on-click-modal="false">
<el-dialog
:visible.sync="dialog.visible"
:title="dialog.title"
:close-on-click-modal="false"
>
<component :is="dialog.component" />
</el-dialog>
</div>
@@ -136,17 +176,17 @@ export default {
}
.agent-item {
&>.el-col {
& > .el-col {
margin: 7px auto;
}
&__info {
display: flex;
&>span:nth-child(2) {
& > span:nth-child(2) {
margin-left: 15px;
&>p {
& > p {
margin-top: 10px;
font-size: 12px;
}

View File

@@ -6,7 +6,7 @@ export default {
paramsConfig: {
visible: false,
searchMode: 'vector', // 默认选择向量检索
similarity: 0.600, // 默认相似度
similarity: 0.6, // 默认相似度
topK: 5 // 默认引用分段数
},
inputMessage: '',
@@ -26,7 +26,8 @@ export default {
{
id: 1,
title: '-',
content: '黄金可以作为投资者的资产配置1把黄金作为储备资产的投资者2被保险人投资在黄金的抵押品或非标资产债券的担保3或者是投资者的避险资产。',
content:
'黄金可以作为投资者的资产配置1把黄金作为储备资产的投资者2被保险人投资在黄金的抵押品或非标资产债券的担保3或者是投资者的避险资产。',
score: 0.709,
file: '北京人寿的准备金样表版_有关项.pdf'
},
@@ -40,7 +41,8 @@ export default {
{
id: 3,
title: '北京人寿承诺服务各项指标',
content: '第二代保人寿保险营业执照人及行政管理人天津后勤保障处5.第三代保人寿保险公司承诺为公司客户方案服力及运营提供客户服务力6...',
content:
'第二代保人寿保险营业执照人及行政管理人天津后勤保障处5.第三代保人寿保险公司承诺为公司客户方案服力及运营提供客户服务力6...',
score: 0.703,
file: '北京人寿承诺服务各项指标有效版102026.pdf'
},
@@ -48,7 +50,7 @@ export default {
id: 4,
title: '-',
content: '# 黄金的分:年金',
score: 0.700,
score: 0.7,
file: 'loma.md'
},
{
@@ -75,13 +77,13 @@ export default {
content: this.inputMessage,
time: new Date()
})
// 清空输入框
this.inputMessage = ''
// 模拟加载状态
this.loading = true
// 模拟API请求延迟
setTimeout(() => {
this.loading = false
@@ -90,12 +92,15 @@ export default {
},
getTableData() {
// 根据之前的记忆修复getTableData函数确保正确返回Promise
return this.$api.getDocByPage(this.queryParams).then(res => {
return res.data
}).catch(err => {
console.error('获取数据失败:', err)
return []
})
return this.$api
.getDocByPage(this.queryParams)
.then(res => {
return res.data
})
.catch(err => {
console.error('获取数据失败:', err)
return []
})
},
formatScore(score) {
return score.toFixed(3)
@@ -106,7 +111,6 @@ export default {
<template>
<div class="hit-test-container">
<!-- 中间内容区域 -->
<div class="content-area">
<div class="empty-state" v-if="messages.length === 0">
@@ -114,7 +118,12 @@ export default {
<p>这里会显示命中测试的记录</p>
</div>
<div class="messages" v-else>
<div v-for="message in messages" :key="message.id" class="message-item" :class="message.type">
<div
v-for="message in messages"
:key="message.id"
class="message-item"
:class="message.type"
>
<!-- 问题消息 -->
<div v-if="message.type === 'question'" class="question-message">
<div class="message-header">
@@ -125,7 +134,7 @@ export default {
</div>
<div class="message-content">{{ message.content }}</div>
</div>
<!-- 回答消息 -->
<div v-else-if="message.type === 'answer'" class="answer-message">
<div class="message-header">
@@ -135,14 +144,23 @@ export default {
</div>
</div>
<div class="message-content">{{ message.content }}</div>
<!-- 引用内容 -->
<div class="references" v-if="message.references && message.references.length">
<div v-for="(ref, index) in message.references" :key="index" class="reference-item">
<div
class="references"
v-if="message.references && message.references.length"
>
<div
v-for="(ref, index) in message.references"
:key="index"
class="reference-item"
>
<div class="reference-header">
<div class="reference-index">{{ index + 1 }}</div>
<div class="reference-title">{{ ref.title }}</div>
<div class="reference-score">{{ formatScore(ref.score) }}</div>
<div class="reference-score">
{{ formatScore(ref.score) }}
</div>
</div>
<div class="reference-content">{{ ref.content }}</div>
<div class="reference-footer">
@@ -154,12 +172,15 @@ export default {
</div>
</div>
</div>
<!-- 加载状态 -->
<div v-if="loading" class="loading-message">
<el-skeleton style="width: 100%" animated>
<template slot="template">
<el-skeleton-item variant="p" style="width: 100%; height: 60px;" />
<el-skeleton-item
variant="p"
style="width: 100%; height: 60px;"
/>
<el-skeleton-item variant="p" style="width: 90%; height: 20px;" />
<el-skeleton-item variant="p" style="width: 80%; height: 20px;" />
</template>
@@ -175,48 +196,102 @@ export default {
<div class="search-params-container">
<h3>检索模式</h3>
<el-radio-group v-model="paramsConfig.searchMode" class="search-mode-options">
<div class="search-mode-option" :class="{ active: paramsConfig.searchMode === 'vector' }">
<el-radio v-model="paramsConfig.searchMode" label="vector">向量检索</el-radio>
<p class="option-desc">向量检索是一种基于向量相似度的检索方式适用于知识库中的大数据量场景</p>
<el-radio-group
v-model="paramsConfig.searchMode"
class="search-mode-options"
>
<div
class="search-mode-option"
:class="{ active: paramsConfig.searchMode === 'vector' }"
>
<el-radio v-model="paramsConfig.searchMode" label="vector"
>向量检索</el-radio
>
<p class="option-desc">
向量检索是一种基于向量相似度的检索方式适用于知识库中的大数据量场景
</p>
</div>
<div class="search-mode-option" :class="{ active: paramsConfig.searchMode === 'fulltext' }">
<el-radio v-model="paramsConfig.searchMode" label="fulltext">全文检索</el-radio>
<p class="option-desc">全文检索是一种基于文本相似度的检索方式适用于知识库中的小数据量场景</p>
<div
class="search-mode-option"
:class="{ active: paramsConfig.searchMode === 'fulltext' }"
>
<el-radio v-model="paramsConfig.searchMode" label="fulltext"
>全文检索</el-radio
>
<p class="option-desc">
全文检索是一种基于文本相似度的检索方式适用于知识库中的小数据量场景
</p>
</div>
<div class="search-mode-option" :class="{ active: paramsConfig.searchMode === 'hybrid' }">
<el-radio v-model="paramsConfig.searchMode" label="hybrid">混合检索</el-radio>
<p class="option-desc">混合检索是一种基于向量和文本相似度的检索方式适用于知识库中的中等数据量场景</p>
<div
class="search-mode-option"
:class="{ active: paramsConfig.searchMode === 'hybrid' }"
>
<el-radio v-model="paramsConfig.searchMode" label="hybrid"
>混合检索</el-radio
>
<p class="option-desc">
混合检索是一种基于向量和文本相似度的检索方式适用于知识库中的中等数据量场景
</p>
</div>
</el-radio-group>
<div class="params-settings">
<div class="param-item">
<span class="param-label">相似度高于</span>
<el-input-number v-model="paramsConfig.similarity" :precision="3" :step="0.001" :min="0" :max="1"
size="small" controls-position="right"></el-input-number>
<el-input-number
v-model="paramsConfig.similarity"
:precision="3"
:step="0.001"
:min="0"
:max="1"
size="small"
controls-position="right"
></el-input-number>
</div>
<div class="param-item">
<span class="param-label">引用分段数 TOP</span>
<el-input-number v-model="paramsConfig.topK" :min="1" :max="20" size="small"
controls-position="right"></el-input-number>
<el-input-number
v-model="paramsConfig.topK"
:min="1"
:max="20"
size="small"
controls-position="right"
></el-input-number>
</div>
</div>
<div class="action-buttons">
<el-button size="small" @click="paramsConfig.visible = false">取消</el-button>
<el-button type="primary" size="small" @click="paramsConfig.visible = false">确定</el-button>
<el-button size="small" @click="paramsConfig.visible = false"
>取消</el-button
>
<el-button
type="primary"
size="small"
@click="paramsConfig.visible = false"
>确定</el-button
>
</div>
</div>
<el-button icon="el-icon-setting" size="small" slot="reference">参数设置</el-button>
<el-button icon="el-icon-setting" size="small" slot="reference"
>参数设置</el-button
>
</el-popover>
<el-input v-model="inputMessage" placeholder="请输入" class="message-input" @keyup.enter.native="sendMessage">
<el-input
v-model="inputMessage"
placeholder="请输入"
class="message-input"
@keyup.enter.native="sendMessage"
>
<template slot="append">
<el-button icon="el-icon-s-promotion" @click="sendMessage" size="small"></el-button>
<el-button
icon="el-icon-s-promotion"
@click="sendMessage"
size="small"
></el-button>
</template>
</el-input>
</div>
@@ -259,99 +334,99 @@ export default {
margin-bottom: 20px;
}
}
.messages {
display: flex;
flex-direction: column;
gap: 20px;
.message-item {
display: flex;
flex-direction: column;
&.question {
align-items: flex-end;
.question-message {
background-color: #ecf5ff;
border-radius: 8px 0 8px 8px;
padding: 12px;
max-width: 80%;
.message-header {
display: flex;
align-items: center;
margin-bottom: 8px;
.message-info {
margin-left: 8px;
}
.message-title {
font-weight: 500;
font-size: 14px;
color: #409EFF;
color: #409eff;
}
}
.message-content {
word-break: break-word;
}
}
}
&.answer {
align-items: flex-start;
.answer-message {
background-color: #fff;
border-radius: 0 8px 8px 8px;
padding: 12px;
max-width: 90%;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
.message-header {
display: flex;
align-items: center;
margin-bottom: 8px;
.message-info {
margin-left: 8px;
}
.message-title {
font-weight: 500;
font-size: 14px;
color: #67c23a;
}
}
.message-content {
margin-bottom: 16px;
word-break: break-word;
}
.references {
display: flex;
flex-direction: column;
gap: 12px;
.reference-item {
border: 1px solid #ebeef5;
border-radius: 4px;
padding: 12px;
background-color: #fafafa;
.reference-header {
display: flex;
align-items: center;
margin-bottom: 8px;
.reference-index {
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #409EFF;
background-color: #409eff;
color: #fff;
display: flex;
align-items: center;
@@ -359,25 +434,25 @@ export default {
font-size: 12px;
margin-right: 8px;
}
.reference-title {
flex: 1;
font-weight: 500;
}
.reference-score {
color: #409EFF;
color: #409eff;
font-weight: 500;
}
}
.reference-content {
margin-bottom: 8px;
font-size: 13px;
color: #606266;
line-height: 1.5;
}
.reference-footer {
display: flex;
justify-content: flex-start;
@@ -387,7 +462,7 @@ export default {
}
}
}
.loading-message {
padding: 12px;
background-color: #fff;
@@ -436,7 +511,7 @@ export default {
margin-bottom: 10px;
&.active {
border-color: #409EFF;
border-color: #409eff;
background-color: #ecf5ff;
}
@@ -474,4 +549,4 @@ export default {
}
}
}
</style>
</style>

View File

@@ -7,14 +7,36 @@
<div class="mr20 header" v-if="!editKnowledge">
{{ knowledgeName }}
</div>
<el-input class="mr20 w400" size="small" v-else v-model="copyKnowledgeName">{{ knowledgeName }}</el-input>
<el-icon class="fs16 el-icon-edit-outline cursor-pointer" @click.native="editKnowledgeName"
v-if="!editKnowledge" />
<el-input
class="mr20 w400"
size="small"
v-else
v-model="copyKnowledgeName"
>{{ knowledgeName }}</el-input
>
<el-icon
class="fs16 el-icon-edit-outline cursor-pointer"
@click.native="editKnowledgeName"
v-if="!editKnowledge"
/>
<div v-else>
<el-button type="primary" size="medium" class="render-button" @click="saveKnowledgeName">保存</el-button>
<el-button size="medium" class="render-button" @click="cancelKnowledgeName">取消</el-button>
<el-button
type="primary"
size="medium"
class="render-button"
@click="saveKnowledgeName"
>保存</el-button
>
<el-button
size="medium"
class="render-button"
@click="cancelKnowledgeName"
>取消</el-button
>
</div>
<span class="segment-content">{{ segmentedMode | filterSegmentedMode }}</span>
<span class="segment-content">{{
segmentedMode | filterSegmentedMode
}}</span>
</div>
<p class="mt10 fs14" style="line-height: 20px">
描述{{ knowledgeDesc }}
@@ -24,33 +46,70 @@
<div>
<!-- <el-button type="primary" size="medium" class="normal-button" @click="jumpEditKnowledge">修改知识库</el-button>-->
<el-button type="primary" size="medium" icon="el-icon-edit-outline" class="primary-button"
@click="jumpEditKnowledge">修改知识库</el-button>
<el-button type="primary" size="medium" icon="el-icon-plus" class="primary-button"
@click="jumpAddKnowledge">上传知识</el-button>
<el-button type="primary" icon="el-icon-s-promotion" size="medium" class="line-button"
@click="handleHitTestClick">命中测试</el-button>
<el-button
type="primary"
size="medium"
icon="el-icon-edit-outline"
class="primary-button"
@click="jumpEditKnowledge"
>修改知识库</el-button
>
<el-button
type="primary"
size="medium"
icon="el-icon-plus"
class="primary-button"
@click="jumpAddKnowledge"
>上传知识</el-button
>
<el-button
type="primary"
icon="el-icon-s-promotion"
size="medium"
class="line-button"
@click="handleHitTestClick"
>命中测试</el-button
>
</div>
</div>
<div class="mt20 card-body">
<el-empty v-if="!hasList">
<div class="mt20">
<el-button type="primary" size="medium" class="fs14" @click="jumpAddKnowledge">立即添加</el-button>
<el-button
type="primary"
size="medium"
class="fs14"
@click="jumpAddKnowledge"
>立即添加</el-button
>
</div>
</el-empty>
<div class="table-container" v-else>
<div class="flex align-items-c justify-content-b">
<el-form :model="form" label-width="100px" label-position="top" inline>
<el-form
:model="form"
label-width="100px"
label-position="top"
inline
>
<el-form-item label="知识文件名称" prop="fileName">
<el-input v-model="form.knowledgeNameLike" size="medium" placeholder="请输入知识文件名称"
@keydown.enter.native="search"></el-input>
<el-input
v-model="form.knowledgeNameLike"
size="medium"
placeholder="请输入知识文件名称"
@keydown.enter.native="search"
></el-input>
</el-form-item>
<el-form-item label="知识文件来源" prop="documentSource">
<el-select v-model="form.documentSource" size="medium">
<el-option label="全部" value=""></el-option>
<el-option v-for="item in documentSourceOptions" :label="item.label" :value="item.value"
:key="item.value"></el-option>
<el-option
v-for="item in documentSourceOptions"
:label="item.label"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="上传用户" prop="createdUserLike">
@@ -59,30 +118,65 @@
</el-select>
</el-form-item>
<el-form-item label="关键字">
<el-input v-model="form.name" placeholder="请输入关键字/敏感词" disabled size="medium"></el-input>
<el-input
v-model="form.name"
placeholder="请输入关键字/敏感词"
disabled
size="medium"
></el-input>
</el-form-item>
<el-form-item label="上传时间" prop="times">
<el-date-picker size="medium" style="width:100%" v-model="form.times" value-format="yyyy-MM-dd"
start-placeholder="开始时间" end-placeholder="结束时间" type="daterange"></el-date-picker>
<el-date-picker
size="medium"
style="width:100%"
v-model="form.times"
value-format="yyyy-MM-dd"
start-placeholder="开始时间"
end-placeholder="结束时间"
type="daterange"
></el-date-picker>
</el-form-item>
</el-form>
<div class="mt15 flex align-items-c justify-content-b">
<el-button size="medium" type="primary" @click="search">查询</el-button>
<el-button size="medium" type="primary" @click="search"
>查询</el-button
>
<el-button size="medium" @click="reset">重置</el-button>
</div>
</div>
<r-table :columns="columns" :data="list" :deletion="false" :total="total" @page-change="pageChange"
@current-change="currentChange" :current-page="page" :page-size="pageSize"></r-table>
<r-table
:columns="columns"
:data="list"
:deletion="false"
:total="total"
@page-change="pageChange"
@current-change="currentChange"
:current-page="page"
:page-size="pageSize"
></r-table>
</div>
</div>
<document-drawer :visible.sync="drawer" :descriptions="descriptions" :document-detail="documentDetail"
:active-segment="activeSegment" @update:visible="val => (drawer = val)" />
<document-drawer
:visible.sync="drawer"
:descriptions="descriptions"
:document-detail="documentDetail"
:active-segment="activeSegment"
@update:visible="val => (drawer = val)"
/>
<knowledgeForm :visible.sync="drawerForm" :datasetId="$route.query.datasetId" @update:visible="getKnowledgeDetail">
<knowledgeForm
:visible.sync="drawerForm"
:datasetId="$route.query.datasetId"
@update:visible="getKnowledgeDetail"
>
</knowledgeForm>
<!-- 命中测试抽屉弹窗 -->
<el-drawer :title="hitTestConfig.title" :visible.sync="hitTestConfig.visible" size="60%">
<el-drawer
:title="hitTestConfig.title"
:visible.sync="hitTestConfig.visible"
size="60%"
>
<hitTest></hitTest>
</el-drawer>
</div>
@@ -103,7 +197,7 @@ import {
import DocumentDrawer from './components/documentDetail/DocumentDrawer.vue'
import knowledgeForm from '@/views/knowledge/detail/components/knowledgeForm.vue'
import knowledgePng_1 from '@/assets/images/konwledge/konwledge-1.png'
import hitTest from "@/views/knowledge/detail/components/HitTest/Index.vue"
import hitTest from '@/views/knowledge/detail/components/HitTest/Index.vue'
export default {
name: 'index',
@@ -363,7 +457,7 @@ export default {
return item ? item.label : '否'
}
},
created() { },
created() {},
async mounted() {
this.getKnowledgeDetail()
// 获取知识库文件列表

View File

@@ -2,12 +2,26 @@
<div class="department-manage render-container">
<div class="filter-container">
<div class="flex align-items-c justify-content-b">
<el-form :model="queryParams" label-width="100px" label-position="top" ref="queryParams" inline>
<el-form
:model="queryParams"
label-width="100px"
label-position="top"
ref="queryParams"
inline
>
<el-form-item label="菜单编码" prop="menuCodeLike">
<el-input v-model="queryParams.menuCodeLike" size="medium" placeholder="请输入菜单编码"></el-input>
<el-input
v-model="queryParams.menuCodeLike"
size="medium"
placeholder="请输入菜单编码"
></el-input>
</el-form-item>
<el-form-item label="菜单名称" prop="menuNameLike">
<el-input v-model="queryParams.menuNameLike" size="medium" placeholder="请输入菜单名称"></el-input>
<el-input
v-model="queryParams.menuNameLike"
size="medium"
placeholder="请输入菜单名称"
></el-input>
</el-form-item>
<el-form-item label="菜单类型" prop="type">
<el-select v-model="queryParams.type" size="medium">
@@ -18,19 +32,36 @@
</el-form-item>
</el-form>
<div class="mt15 flex align-items-c justify-content-b">
<el-button size="medium" type="primary" @click="handleQuery">查询</el-button>
<el-button size="medium" type="primary" @click="handleQuery"
>查询</el-button
>
<el-button size="medium" @click="resetQuery">重置</el-button>
<el-button size="medium" type="primary" @click="handleAdd">新增</el-button>
<el-button size="medium" type="primary" @click="handleAdd"
>新增</el-button
>
</div>
</div>
</div>
<r-table :columns="tableConfig.columns" :data="tableData" :deletion="false" :total="tableConfig.total"
@currentChange="handleCurrentChange" @sizeChange="handleSizeChange" :currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize" />
<r-table
:columns="tableConfig.columns"
:data="tableData"
:deletion="false"
:total="tableConfig.total"
@currentChange="handleCurrentChange"
@sizeChange="handleSizeChange"
:currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize"
/>
<!-- 菜单新增 编辑 弹窗 -->
<menu-dialog :visible.sync="dialogVisible" :title="dialogTitle" :is-edit="isEdit" :is-view="isView"
:menu-data="currentMenuData" @submit="handleSubmit" />
<menu-dialog
:visible.sync="dialogVisible"
:title="dialogTitle"
:is-edit="isEdit"
:is-view="isView"
:menu-data="currentMenuData"
@submit="handleSubmit"
/>
</div>
</template>

View File

@@ -3,40 +3,90 @@
<section>
<div class="filter-container">
<div class="flex align-items-c justify-content-b">
<el-form :model="queryParams" label-width="100px" label-position="top" ref="queryParams" inline>
<el-form
:model="queryParams"
label-width="100px"
label-position="top"
ref="queryParams"
inline
>
<el-form-item label="角色名称">
<el-input v-model="queryParams.roleNameLike" placeholder="请输入角色名称" clearable size="small" />
<el-input
v-model="queryParams.roleNameLike"
placeholder="请输入角色名称"
clearable
size="small"
/>
</el-form-item>
<el-form-item label="角色编码">
<el-input v-model="queryParams.roleCodeLike" placeholder="请输入角色编码" clearable size="small" />
<el-input
v-model="queryParams.roleCodeLike"
placeholder="请输入角色编码"
clearable
size="small"
/>
</el-form-item>
</el-form>
<div class="mt15 flex align-items-c justify-content-b">
<el-button type="primary" size="medium" @click="handleQuery">查询</el-button>
<el-button type="primary" plain size="medium" @click="resetQuery">重置</el-button>
<el-button type="primary" plain size="medium" @click="handleAdd">新增</el-button>
<el-button type="primary" size="medium" @click="handleQuery"
>查询</el-button
>
<el-button type="primary" plain size="medium" @click="resetQuery"
>重置</el-button
>
<el-button type="primary" plain size="medium" @click="handleAdd"
>新增</el-button
>
</div>
</div>
</div>
<r-table :columns="tableConfig.columns" :data="tableData" :deletion="false" :total="tableConfig.total"
@currentChange="handleCurrentChange" @sizeChange="handleSizeChange" :currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize" />
<r-table
:columns="tableConfig.columns"
:data="tableData"
:deletion="false"
:total="tableConfig.total"
@currentChange="handleCurrentChange"
@sizeChange="handleSizeChange"
:currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize"
/>
</section>
<!-- 角色新增弹窗 -->
<role-dialog :visible.sync="dialogVisible" :title="dialogTitle" :is-edit="isEdit" :is-view="isView"
:role-data="currentRoleData" @submit="handleSubmit" />
<role-dialog
:visible.sync="dialogVisible"
:title="dialogTitle"
:is-edit="isEdit"
:is-view="isView"
:role-data="currentRoleData"
@submit="handleSubmit"
/>
<!-- 角色权限 抽屉 -->
<el-drawer :visible.sync="permissionDrawer.visible" :title="permissionDrawer.title" size="60%">
<el-tree ref="menuTreeRef" :data="menuTree" show-checkbox node-key="id" default-expand-all :props="defaultProps"
@check="handleCheckChange">
<el-drawer
:visible.sync="permissionDrawer.visible"
:title="permissionDrawer.title"
size="60%"
>
<el-tree
ref="menuTreeRef"
:data="menuTree"
show-checkbox
node-key="id"
default-expand-all
:props="defaultProps"
@check="handleCheckChange"
>
</el-tree>
<el-row>
<el-col :span="6">
<el-button type="primary" size="medium" @click="handleOnSave">确定</el-button>
<el-button type="primary" plain size="medium" @click="handleOnClose">取消</el-button>
<el-button type="primary" size="medium" @click="handleOnSave"
>确定</el-button
>
<el-button type="primary" plain size="medium" @click="handleOnClose"
>取消</el-button
>
</el-col>
</el-row>
</el-drawer>

View File

@@ -1,18 +1,57 @@
<template>
<el-dialog title="重置密码" :visible.sync="visible" width="500px" append-to-body @close="handleClose">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" status-icon>
<el-dialog
title="修改密码"
:visible.sync="visible"
width="500px"
append-to-body
@close="handleClose"
>
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="120px"
status-icon
>
<el-form-item label="旧密码" prop="userPassword">
<el-input v-model="form.userPassword" placeholder="请输入旧密码" type="password" show-password clearable size="small" />
<el-input
v-model="form.userPassword"
placeholder="请输入旧密码"
type="password"
show-password
clearable
size="small"
/>
</el-form-item>
<el-form-item label="新密码" prop="newPassword">
<el-input v-model="form.newPassword" placeholder="请输入新密码" type="password" show-password clearable size="small" />
<el-input
v-model="form.newPassword"
placeholder="请输入新密码"
type="password"
show-password
clearable
size="small"
/>
</el-form-item>
<el-form-item label="确认新密码" prop="confirmPassword">
<el-input v-model="form.confirmPassword" placeholder="请再次输入新密码" type="password" show-password clearable size="small" />
<el-input
v-model="form.confirmPassword"
placeholder="请再次输入新密码"
type="password"
show-password
clearable
size="small"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" size="small" :loading="loading" @click="submitForm"> </el-button>
<el-button
type="primary"
size="small"
:loading="loading"
@click="submitForm"
> </el-button
>
<el-button size="small" @click="handleClose"> </el-button>
</div>
</el-dialog>
@@ -49,9 +88,17 @@ export default {
confirmPassword: ''
},
rules: {
userPassword: [{ required: true, message: '请输入旧密码', trigger: 'blur' }],
newPassword: [{ required: true, message: '请输入新密码', trigger: 'blur' }, { min: 6, message: '密码长度不能少于6个字符', trigger: 'blur' }],
confirmPassword: [{ required: true, message: '请再次输入新密码', trigger: 'blur' }, { validator: validateConfirmPassword, trigger: 'blur' }]
userPassword: [
{ required: true, message: '请输入旧密码', trigger: 'blur' }
],
newPassword: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ min: 6, message: '密码长度不能少于6个字符', trigger: 'blur' }
],
confirmPassword: [
{ required: true, message: '请再次输入新密码', trigger: 'blur' },
{ validator: validateConfirmPassword, trigger: 'blur' }
]
},
loading: false
}
@@ -66,24 +113,23 @@ export default {
if (valid) {
this.loading = true
const data = {
userId: this.userId,
userPassword: this.form.userPassword,
newPassword: this.form.newPassword
}
updatePassword(data)
.then(response => {
.then(async response => {
if (response.code === '0') {
this.$message.success('密码重置成功')
this.handleClose()
this.$emit('success')
this.$message.success('密码修改成功')
await this.$store.dispatch('user/logout')
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
} else {
this.$message.error(response.msg || '密码重置失败')
this.$message.error(response.msg || '密码修改失败')
}
})
.catch(error => {
console.error('密码重置出错:', error)
this.$message.error('密码重置出错')
console.error('密码修改出错:', error)
this.$message.error('密码修改出错')
})
.finally(() => {
this.loading = false

View File

@@ -2,15 +2,29 @@
<div class=" render-container user-manage ">
<div class="filter-container">
<div class="flex align-items-c justify-content-b">
<el-form :model="queryParams" label-width="100px" label-position="top" ref="queryParams" inline>
<el-form
:model="queryParams"
label-width="100px"
label-position="top"
ref="queryParams"
inline
>
<el-form-item label="用户名称" prop="userName">
<el-input v-model="queryParams.userName" size="medium" placeholder="请输入用户名称"></el-input>
<el-input
v-model="queryParams.userName"
size="medium"
placeholder="请输入用户名称"
></el-input>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" size="medium">
<el-option label="全部" value=""></el-option>
<el-option v-for="item in statusList" :label="item.label" :value="item.value"
:key="item.value"></el-option>
<el-option
v-for="item in statusList"
:label="item.label"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="上传时间" prop="times">-->
@@ -26,22 +40,43 @@
<!-- </el-form-item>-->
</el-form>
<div class="mt15 flex align-items-c justify-content-b">
<el-button size="medium" type="primary" @click="handleQuery">查询</el-button>
<el-button size="medium" type="primary" @click="handleQuery"
>查询</el-button
>
<el-button size="medium" @click="resetQuery">重置</el-button>
<el-button size="medium" type="primary" @click="handleAdd">新增</el-button>
<el-button size="medium" type="primary" @click="handleAdd"
>新增</el-button
>
</div>
</div>
</div>
<r-table :columns="tableConfig.columns" :data="tableData" :deletion="false" :total="tableConfig.total"
@currentChange="handleCurrentChange" @sizeChange="handleSizeChange" :currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize" />
<r-table
:columns="tableConfig.columns"
:data="tableData"
:deletion="false"
:total="tableConfig.total"
@currentChange="handleCurrentChange"
@sizeChange="handleSizeChange"
:currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize"
/>
<!-- 用户新增弹窗 -->
<user-dialog :visible.sync="dialogVisible" :title="dialogTitle" :is-edit="isEdit" :is-view="isView"
:user-data="currentUserData" @submit="handleSubmit" />
<user-dialog
:visible.sync="dialogVisible"
:title="dialogTitle"
:is-edit="isEdit"
:is-view="isView"
:user-data="currentUserData"
@submit="handleSubmit"
/>
<!-- 重置密码弹窗 -->
<reset-password-dialog :visible.sync="resetPasswordVisible" :user-id="currentUserId" @success="getUserList" />
<reset-password-dialog
:visible.sync="resetPasswordVisible"
:user-id="currentUserId"
@success="getUserList"
/>
</div>
</template>
@@ -53,7 +88,7 @@ import {
queryUserDetail,
deleteUser,
changeUserStatus,
updatePassword
resetPassword
} from '@/api/generatedApi/system'
export default {
@@ -347,7 +382,21 @@ export default {
},
handleResetPassword(row) {
this.currentUserId = row.id
this.resetPasswordVisible = true
this.$confirm('确认重置该用户的密码吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 调用resetPassword接口
resetPassword({
userId: row.id
}).then(response => {
if (response.code === '0') {
this.$message.success('重置密码成功')
this.handleQuery() // 刷新列表
}
})
})
}
}
}

View File

@@ -1,5 +1,8 @@
<script>
import { datasetsExTaskPages as datasetsExPages, docManageDataset } from '@/api/generatedApi'
import {
datasetsExTaskPages as datasetsExPages,
docManageDataset
} from '@/api/generatedApi'
import KnowledgeInfo from '@/views/track/views/knowledge-info/Index.vue'
export default {
@@ -39,7 +42,10 @@ export default {
key: '上传状态',
width: '100',
render: (h, params) => {
return h('span', this.tableConfig.uploadStatusType[params.row.documentStatus])
return h(
'span',
this.tableConfig.uploadStatusType[params.row.documentStatus]
)
}
},
// 上传用户 现在只有 admin . 后面需要自己添加
@@ -78,7 +84,9 @@ export default {
if (!this.form.taskTime || this.form.taskTime.length !== 2) return ''
return this.form.taskTime.map((date, index) => {
return `${new Date(date).getFullYear()}-${String(new Date(date).getMonth() + 1).padStart(2, '0')}-${String(new Date(date).getDate()).padStart(
return `${new Date(date).getFullYear()}-${String(
new Date(date).getMonth() + 1
).padStart(2, '0')}-${String(new Date(date).getDate()).padStart(
2,
'0'
)} ${index === 0 ? '00:00:00' : '23:59:59'}`
@@ -124,14 +132,18 @@ export default {
// // 上传状态
// documentStatus: this.form.documentStatus,
// // 任务时间
startCreatedDate: this.formattedDate.length > 1 ? this.formattedDate[0] : '',
endCreatedDate: this.formattedDate.length > 1 ? this.formattedDate[1] : '',
startCreatedDate:
this.formattedDate.length > 1 ? this.formattedDate[0] : '',
endCreatedDate:
this.formattedDate.length > 1 ? this.formattedDate[1] : '',
knowledgeNameLike: this.form.knowledgeName,
documentStatus: this.form.documentStatus
}
datasetsExPages(payload).then(res => {
this.tableData = res.content.content.list ? res.content.content.list : []
this.tableData = res.content.content.list
? res.content.content.list
: []
this.tableConfig.total = res.content.content.total
})
},
@@ -187,17 +199,29 @@ export default {
<el-col :span="8">
<el-form-item label="知识库">
<!-- 启用远程加载 -->
<el-select filterable v-model="form.datasetId" placeholder="输入搜索知识库">
<el-select
filterable
v-model="form.datasetId"
placeholder="输入搜索知识库"
>
<!-- 后续需要添加懒加载 -->
<el-option v-for="item in datasetList" :key="item.id" :label="item.name" :value="item.id" />
<el-option
v-for="item in datasetList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="知识文件名称">
<el-input @keydown.enter.native="handleSearch" v-model="form.knowledgeName"
placeholder="请输入知识文件名称"></el-input>
<el-input
@keydown.enter.native="handleSearch"
v-model="form.knowledgeName"
placeholder="请输入知识文件名称"
></el-input>
</el-form-item>
</el-col>
@@ -205,45 +229,82 @@ export default {
<el-form-item label="上传用户">
<el-select v-model="form.uploadUser" placeholder="请选择上传用户">
<el-option label="全部上传用户" value="">全部上传用户</el-option>
<el-option v-for="item in getUploadUserList" :key="item" :label="item" :value="item"></el-option>
<el-option
v-for="item in getUploadUserList"
:key="item"
:label="item"
:value="item"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="上传状态">
<el-select v-model="form.documentStatus" placeholder="请选择上传状态">
<el-select
v-model="form.documentStatus"
placeholder="请选择上传状态"
>
<el-option label="全部上传状态" value="" />
<el-option v-for="item in Object.keys(this.tableConfig.uploadStatusType)" :key="item"
:label="tableConfig.uploadStatusType[item]" :value="Number(item)" />
<el-option
v-for="item in Object.keys(this.tableConfig.uploadStatusType)"
:key="item"
:label="tableConfig.uploadStatusType[item]"
:value="Number(item)"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="任务时间">
<el-date-picker v-model="form.taskTime" type="daterange" unlink-panels range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" style="width: 100%" />
<el-date-picker
v-model="form.taskTime"
type="daterange"
unlink-panels
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="9" :offset="11" class="mb20">
<!-- 搜索按钮 -->
<el-button type="primary" size="small" @click="handleSearch">搜索</el-button>
<el-button type="primary" size="small" @click="handleSearch"
>搜索</el-button
>
<!-- 重置按钮 -->
<el-button type="primary" size="small" @click="handleReset">重置筛选</el-button>
<el-button type="primary" size="small" @click="handleReset"
>重置筛选</el-button
>
</el-col>
</el-row>
</el-form>
<!-- 任务列表 -->
<div>
<r-table :columns="tableConfig.columns" :data="tableData" :deletion="false" :total="tableConfig.total"
@currentChange="handleCurrentChange" @sizeChange="handleSizeChange" :currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize" />
<r-table
:columns="tableConfig.columns"
:data="tableData"
:deletion="false"
:total="tableConfig.total"
@currentChange="handleCurrentChange"
@sizeChange="handleSizeChange"
:currentPage="tableConfig.currentPage"
:pageSize="tableConfig.pageSize"
/>
<!-- 弹出提示框 里面是各种详情内容 -->
<el-drawer title="上传任务详情" :visible.sync="infoDialogVisible" size="95%"
:before-close="() => (infoDialogVisible = false)">
<knowledge-info :form="activeForm" v-if="infoDialogVisible"></knowledge-info>
<el-drawer
title="上传任务详情"
:visible.sync="infoDialogVisible"
size="95%"
:before-close="() => (infoDialogVisible = false)"
>
<knowledge-info
:form="activeForm"
v-if="infoDialogVisible"
></knowledge-info>
</el-drawer>
</div>
</div>

View File

@@ -104,22 +104,38 @@ export default {
</div>
<el-form ref="form" :model="newForm" label-width="120px">
<el-form-item label="知识库">
<el-input v-model="newForm.datasetName" placeholder="" disabled></el-input>
<el-input
v-model="newForm.datasetName"
placeholder=""
disabled
></el-input>
</el-form-item>
<el-form-item label="知识文件名称">
<el-input v-model="newForm.fileName" placeholder="" disabled></el-input>
<el-input
v-model="newForm.fileName"
placeholder=""
disabled
></el-input>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="上传用户">
<el-input v-model="newForm.userName" placeholder="" disabled></el-input>
<el-input
v-model="newForm.userName"
placeholder=""
disabled
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上传时间">
<el-input v-model="newForm.createdDate" placeholder="" disabled></el-input>
<el-input
v-model="newForm.createdDate"
placeholder=""
disabled
></el-input>
</el-form-item>
</el-col>
</el-row>
@@ -127,12 +143,20 @@ export default {
<el-row>
<el-col :span="12">
<el-form-item label="任务号">
<el-input v-model="newForm.id" placeholder="" disabled></el-input>
<el-input
v-model="newForm.id"
placeholder=""
disabled
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分段模式">
<el-input v-model="newForm.segmentedMode" placeholder="null" disabled></el-input>
<el-input
v-model="newForm.segmentedMode"
placeholder="null"
disabled
></el-input>
</el-form-item>
</el-col>
</el-row>
@@ -140,18 +164,32 @@ export default {
<el-row>
<el-col :span="12">
<el-form-item label="高级模式">
<el-input v-model="useMineru" placeholder="" disabled></el-input>
<el-input
v-model="useMineru"
placeholder=""
disabled
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务状态">
<el-input v-model="documentStatus" placeholder="" disabled></el-input>
<el-input
v-model="documentStatus"
placeholder=""
disabled
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="失败原因" v-if="newForm.documentStatus === -1">
<el-input v-model="newForm.errMessage" placeholder=""></el-input>
<el-form-item
label="失败原因"
v-if="newForm.documentStatus === -1"
>
<el-input
v-model="newForm.errMessage"
placeholder=""
></el-input>
</el-form-item>
</el-form>
</el-card>
@@ -162,8 +200,14 @@ export default {
<span>知识内容</span>
</div>
<div class="knowledge-content" v-if="descriptions">
<text-model v-if="descriptions.doc_form === 'text_model'" :descriptions="descriptions" />
<q-a-model v-else-if="descriptions.doc_form === 'qa_model'" :descriptions="descriptions" />
<text-model
v-if="descriptions.doc_form === 'text_model'"
:descriptions="descriptions"
/>
<q-a-model
v-else-if="descriptions.doc_form === 'qa_model'"
:descriptions="descriptions"
/>
</div>
<span v-else>暂无知识内容</span>
</el-card>