Merge branch 'main' of github.com:maxkb-dev/maxkb

This commit is contained in:
shaohuzhang1 2024-03-04 15:26:36 +08:00
commit 724f1cc7c5
9 changed files with 73 additions and 37 deletions

View File

@ -41,8 +41,13 @@
<div class="flex-between w-full"> <div class="flex-between w-full">
<el-input class="code-input" v-model="resetPasswordForm.code" placeholder="请输入验证码"> <el-input class="code-input" v-model="resetPasswordForm.code" placeholder="请输入验证码">
</el-input> </el-input>
<el-button class="send-email-button ml-8" @click="sendEmail" :loading="loading" <el-button
>获取验证码</el-button :disabled="isDisabled"
class="send-email-button ml-8"
@click="sendEmail"
:loading="loading"
>
{{ isDisabled ? `重新发送(${time}s` : '获取验证码' }}</el-button
> >
</div> </div>
</el-form-item> </el-form-item>
@ -77,6 +82,8 @@ const resetPasswordForm = ref<ResetCurrentUserPasswordRequest>({
const resetPasswordFormRef = ref<FormInstance>() const resetPasswordFormRef = ref<FormInstance>()
const loading = ref<boolean>(false) const loading = ref<boolean>(false)
const isDisabled = ref<boolean>(false)
const time = ref<number>(60)
const rules = ref<FormRules<ResetCurrentUserPasswordRequest>>({ const rules = ref<FormRules<ResetCurrentUserPasswordRequest>>({
code: [{ required: true, message: '请输入验证码' }], code: [{ required: true, message: '请输入验证码' }],
@ -123,9 +130,23 @@ const rules = ref<FormRules<ResetCurrentUserPasswordRequest>>({
const sendEmail = () => { const sendEmail = () => {
UserApi.sendEmailToCurrent(loading).then(() => { UserApi.sendEmailToCurrent(loading).then(() => {
MsgSuccess('发送验证码成功') MsgSuccess('发送验证码成功')
isDisabled.value = true
handleTimeChange()
}) })
} }
const handleTimeChange = () => {
if (time.value <= 0) {
isDisabled.value = false
time.value = 60
} else {
setTimeout(() => {
time.value--
handleTimeChange()
}, 1000)
}
}
const open = () => { const open = () => {
resetPasswordForm.value = { resetPasswordForm.value = {
code: '', code: '',

View File

@ -24,7 +24,7 @@
{{ datetimeFormat(row.create_time) }} {{ datetimeFormat(row.create_time) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="80"> <el-table-column label="操作" align="left" width="80">
<template #default="{ row }"> <template #default="{ row }">
<el-tooltip effect="dark" content="删除" placement="top"> <el-tooltip effect="dark" content="删除" placement="top">
<el-button type="primary" text @click="deleteApiKey(row)"> <el-button type="primary" text @click="deleteApiKey(row)">

View File

@ -40,7 +40,7 @@
type="textarea" type="textarea"
placeholder="描述该应用的应用场景及用途MaxKB 小助手回答用户提出的 MaxKB 产品使用问题" placeholder="描述该应用的应用场景及用途MaxKB 小助手回答用户提出的 MaxKB 产品使用问题"
:rows="3" :rows="3"
maxlength="500" maxlength="256"
show-word-limit show-word-limit
/> />
</el-form-item> </el-form-item>
@ -109,6 +109,7 @@
v-model="applicationForm.model_setting.prompt" v-model="applicationForm.model_setting.prompt"
:rows="6" :rows="6"
type="textarea" type="textarea"
maxlength="2048"
:placeholder="defaultPrompt" :placeholder="defaultPrompt"
/> />
</el-form-item> </el-form-item>

View File

@ -21,7 +21,7 @@
v-model="form.desc" v-model="form.desc"
type="textarea" type="textarea"
placeholder="描述知识库的内容详尽的描述将帮助AI能深入理解该知识库的内容能更准确的检索到内容提高该知识库的命中率。" placeholder="描述知识库的内容详尽的描述将帮助AI能深入理解该知识库的内容能更准确的检索到内容提高该知识库的命中率。"
maxlength="500" maxlength="256"
show-word-limit show-word-limit
:autosize="{ minRows: 3 }" :autosize="{ minRows: 3 }"
@blur="form.desc = form.desc.trim()" @blur="form.desc = form.desc.trim()"

View File

@ -34,7 +34,7 @@
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click.prevent="dialogVisible = false"> 取消 </el-button> <el-button @click.prevent="dialogVisible = false"> 取消 </el-button>
<el-button type="primary" @click="submit" :loading="loading"> 确定 </el-button> <el-button type="primary" @click="submit(webFormRef)" :loading="loading"> 确定 </el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -42,6 +42,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, watch } from 'vue' import { ref, reactive, watch } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import type { FormInstance, FormRules } from 'element-plus'
import documentApi from '@/api/document' import documentApi from '@/api/document'
import { MsgSuccess } from '@/utils/message' import { MsgSuccess } from '@/utils/message'
@ -51,6 +52,7 @@ const {
} = route as any } = route as any
const emit = defineEmits(['refresh']) const emit = defineEmits(['refresh'])
const webFormRef = ref()
const loading = ref<boolean>(false) const loading = ref<boolean>(false)
const isImport = ref<boolean>(false) const isImport = ref<boolean>(false)
const form = ref<any>({ const form = ref<any>({
@ -86,27 +88,34 @@ const open = (row: any) => {
dialogVisible.value = true dialogVisible.value = true
} }
const submit = () => { const submit = async (formEl: FormInstance | undefined) => {
if (isImport.value) { if (!formEl) return
const obj = { await formEl.validate((valid, fields) => {
source_url_list: form.value.source_url.split('\n'), if (valid) {
selector: form.value.selector if (isImport.value) {
const obj = {
source_url_list: form.value.source_url.split('\n'),
selector: form.value.selector
}
documentApi.postWebDocument(id, obj, loading).then((res: any) => {
MsgSuccess('导入成功')
emit('refresh')
dialogVisible.value = false
})
} else {
const obj = {
meta: form.value
}
documentApi.putDocument(id, documentId.value, obj, loading).then((res) => {
MsgSuccess('设置成功')
emit('refresh')
dialogVisible.value = false
})
}
} else {
console.log('error submit!', fields)
} }
documentApi.postWebDocument(id, obj, loading).then((res: any) => { })
MsgSuccess('导入成功')
emit('refresh')
dialogVisible.value = false
})
} else {
const obj = {
meta: form.value
}
documentApi.putDocument(id, documentId.value, obj, loading).then((res) => {
MsgSuccess('设置成功')
emit('refresh')
dialogVisible.value = false
})
}
} }
defineExpose({ open }) defineExpose({ open })

View File

@ -98,7 +98,7 @@
{{ datetimeFormat(row.update_time) }} {{ datetimeFormat(row.update_time) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="left">
<template #default="{ row }"> <template #default="{ row }">
<div v-if="datasetDetail.type === '0'"> <div v-if="datasetDetail.type === '0'">
<span v-if="row.status === '2'" class="mr-4"> <span v-if="row.status === '2'" class="mr-4">

View File

@ -44,7 +44,7 @@
<template #icon> <template #icon>
<AppAvatar :name="index + 1 + ''" class="mr-12 avatar-light" :size="22" /> <AppAvatar :name="index + 1 + ''" class="mr-12 avatar-light" :size="22" />
</template> </template>
<div class="active-button primary">{{ item.similarity.toFixed(3) }}</div> <div class="active-button primary">{{ item.similarity?.toFixed(3) }}</div>
<template #footer> <template #footer>
<div class="footer-content flex-between"> <div class="footer-content flex-between">
<el-text> <el-text>
@ -93,7 +93,7 @@
/> />
</div> </div>
<div class="mb-16"> <div class="mb-16">
<div class="title mb-8">返回分段数 Top</div> <div class="title mb-8">返回分段数 TOP</div>
<el-input-number <el-input-number
v-model="cloneForm.top_number" v-model="cloneForm.top_number"
@ -226,8 +226,9 @@ function getHitTestList() {
function refresh(data: any) { function refresh(data: any) {
if (data) { if (data) {
const index = paragraphDetail.value.findIndex((v) => v.id === data.id) const obj = paragraphDetail.value.filter((v) => v.id === data.id)[0]
paragraphDetail.value.splice(index, 1, data) obj.content = data.content
obj.title = data.title
} else { } else {
paragraphDetail.value = [] paragraphDetail.value = []
getHitTestList() getHitTestList()

View File

@ -33,12 +33,12 @@
<el-table-column prop="chat_record_count" label="对话提问数" align="right" /> <el-table-column prop="chat_record_count" label="对话提问数" align="right" />
<el-table-column prop="star_num" align="right"> <el-table-column prop="star_num" align="right">
<template #header> <template #header>
<div class="flex align-center"> <div>
<span>用户反馈</span> <span>用户反馈</span>
<el-popover :width="160" trigger="click" :visible="popoverVisible"> <el-popover :width="190" trigger="click" :visible="popoverVisible">
<template #reference> <template #reference>
<el-button <el-button
style="margin-top: -2px;" style="margin-top: -2px"
:type="filter.min_star || filter.min_trample ? 'primary' : ''" :type="filter.min_star || filter.min_trample ? 'primary' : ''"
link link
@click="popoverVisible = !popoverVisible" @click="popoverVisible = !popoverVisible"
@ -55,8 +55,9 @@
:min="0" :min="0"
:step="1" :step="1"
controls-position="right" controls-position="right"
style="width: 70px" style="width: 100px"
size="small" size="small"
step-strictly
/> />
</div> </div>
</div> </div>
@ -68,8 +69,9 @@
:min="0" :min="0"
:step="1" :step="1"
controls-position="right" controls-position="right"
style="width: 70px" style="width: 100px"
size="small" size="small"
step-strictly
/> />
</div> </div>
</div> </div>
@ -102,7 +104,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="70" align="center"> <el-table-column label="操作" width="70" align="left">
<template #default="{ row }"> <template #default="{ row }">
<el-tooltip effect="dark" content="删除" placement="top"> <el-tooltip effect="dark" content="删除" placement="top">
<el-button type="primary" text @click.stop="deleteLog(row)"> <el-button type="primary" text @click.stop="deleteLog(row)">

View File

@ -109,6 +109,8 @@ const sendEmail = () => {
if (v) { if (v) {
UserApi.sendEmit(CheckEmailForm.value.email, 'reset_password', loading).then(() => { UserApi.sendEmit(CheckEmailForm.value.email, 'reset_password', loading).then(() => {
MsgSuccess('发送验证码成功') MsgSuccess('发送验证码成功')
isDisabled.value = true
handleTimeChange()
}) })
} }
}) })