Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
c16bcef5
authored
May 13, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【新增】AI:聊天角色管理(80%)
parent
9e99807b
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
55 additions
and
36 deletions
+55
-36
src/api/ai/model/apiKey/index.ts
+1
-1
src/api/ai/model/chatModel/index.ts
+10
-0
src/views/ai/model/chatModel/ChatModelForm.vue
+4
-4
src/views/ai/model/chatModel/index.vue
+1
-2
src/views/ai/model/chatRole/ChatRoleForm.vue
+31
-15
src/views/ai/model/chatRole/index.vue
+8
-14
No files found.
src/api/ai/model/apiKey/index.ts
View file @
c16bcef5
...
@@ -18,7 +18,7 @@ export const ApiKeyApi = {
...
@@ -18,7 +18,7 @@ export const ApiKeyApi = {
},
},
// 获得 API 密钥列表
// 获得 API 密钥列表
getApiKeyList
:
async
()
=>
{
getApiKey
Simple
List
:
async
()
=>
{
return
await
request
.
get
({
url
:
`/ai/api-key/simple-list`
})
return
await
request
.
get
({
url
:
`/ai/api-key/simple-list`
})
},
},
...
...
src/api/ai/model/chatModel/index.ts
View file @
c16bcef5
...
@@ -21,6 +21,16 @@ export const ChatModelApi = {
...
@@ -21,6 +21,16 @@ export const ChatModelApi = {
return
await
request
.
get
({
url
:
`/ai/chat-model/page`
,
params
})
return
await
request
.
get
({
url
:
`/ai/chat-model/page`
,
params
})
},
},
// 获得聊天模型列表
getChatModelSimpleList
:
async
(
status
?:
number
)
=>
{
return
await
request
.
get
({
url
:
`/ai/chat-model/simple-list`
,
params
:
{
status
}
})
},
// 查询聊天模型详情
// 查询聊天模型详情
getChatModel
:
async
(
id
:
number
)
=>
{
getChatModel
:
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/ai/chat-model/get?id=`
+
id
})
return
await
request
.
get
({
url
:
`/ai/chat-model/get?id=`
+
id
})
...
...
src/views/ai/model/chatModel/ChatModelForm.vue
View file @
c16bcef5
...
@@ -33,10 +33,10 @@
...
@@ -33,10 +33,10 @@
<el-form-item
label=
"模型标识"
prop=
"model"
>
<el-form-item
label=
"模型标识"
prop=
"model"
>
<el-input
v-model=
"formData.model"
placeholder=
"请输入模型标识"
/>
<el-input
v-model=
"formData.model"
placeholder=
"请输入模型标识"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"排序"
prop=
"sort"
>
<el-form-item
label=
"
模型
排序"
prop=
"sort"
>
<el-input
v-model=
"formData.sort"
placeholder=
"请输入排序
"
/>
<el-input
-number
v-model=
"formData.sort"
placeholder=
"请输入模型排序"
class=
"!w-1/1
"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"状态"
prop=
"status"
>
<el-form-item
label=
"
开启
状态"
prop=
"status"
>
<el-radio-group
v-model=
"formData.status"
>
<el-radio-group
v-model=
"formData.status"
>
<el-radio
<el-radio
v-for=
"dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
v-for=
"dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
...
@@ -118,7 +118,7 @@ const open = async (type: string, id?: number) => {
...
@@ -118,7 +118,7 @@ const open = async (type: string, id?: number) => {
}
}
}
}
// 获得下拉数据
// 获得下拉数据
apiKeyList
.
value
=
await
ApiKeyApi
.
getApiKeyList
(
CommonStatusEnum
.
ENABLE
)
apiKeyList
.
value
=
await
ApiKeyApi
.
getApiKey
Simple
List
(
CommonStatusEnum
.
ENABLE
)
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
...
...
src/views/ai/model/chatModel/index.vue
View file @
c16bcef5
...
@@ -109,7 +109,6 @@
...
@@ -109,7 +109,6 @@
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
ChatModelApi
,
ChatModelVO
}
from
'@/api/ai/model/chatModel'
import
{
ChatModelApi
,
ChatModelVO
}
from
'@/api/ai/model/chatModel'
import
ChatModelForm
from
'./ChatModelForm.vue'
import
ChatModelForm
from
'./ChatModelForm.vue'
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
DICT_TYPE
}
from
'@/utils/dict'
...
@@ -181,6 +180,6 @@ const handleDelete = async (id: number) => {
...
@@ -181,6 +180,6 @@ const handleDelete = async (id: number) => {
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
getList
()
getList
()
// 获得下拉数据
// 获得下拉数据
apiKeyList
.
value
=
await
ApiKeyApi
.
getApiKeyList
()
apiKeyList
.
value
=
await
ApiKeyApi
.
getApiKey
Simple
List
()
})
})
</
script
>
</
script
>
src/views/ai/model/chatRole/ChatRoleForm.vue
View file @
c16bcef5
...
@@ -7,29 +7,37 @@
...
@@ -7,29 +7,37 @@
label-width=
"100px"
label-width=
"100px"
v-loading=
"formLoading"
v-loading=
"formLoading"
>
>
<el-form-item
label=
"模型编号"
prop=
"modelId"
>
<el-input
v-model=
"formData.modelId"
placeholder=
"请输入模型编号"
/>
</el-form-item>
<el-form-item
label=
"角色名称"
prop=
"name"
>
<el-form-item
label=
"角色名称"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入角色名称"
/>
<el-input
v-model=
"formData.name"
placeholder=
"请输入角色名称"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"角色头像"
prop=
"avatar"
>
<el-form-item
label=
"角色头像"
prop=
"avatar"
>
<el-input
v-model=
"formData.avatar"
placeholder=
"请输入角色头像"
/>
<UploadImg
v-model=
"formData.avatar"
height=
"60px"
width=
"60px"
/>
</el-form-item>
<el-form-item
label=
"绑定模型"
prop=
"modelId"
>
<el-select
v-model=
"formData.modelId"
placeholder=
"请选择模型"
clearable
>
<el-option
v-for=
"chatModel in chatModelList"
:key=
"chatModel.id"
:label=
"chatModel.name"
:value=
"chatModel.id"
/>
</el-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"角色类别"
prop=
"category"
>
<el-form-item
label=
"角色类别"
prop=
"category"
>
<el-input
v-model=
"formData.category"
placeholder=
"请输入角色类别"
/>
<el-input
v-model=
"formData.category"
placeholder=
"请输入角色类别"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"角色排序"
prop=
"sort"
>
<el-input
v-model=
"formData.sort"
placeholder=
"请输入角色排序"
/>
</el-form-item>
<el-form-item
label=
"角色描述"
prop=
"description"
>
<el-form-item
label=
"角色描述"
prop=
"description"
>
<
Editor
v-model=
"formData.description"
height=
"150px
"
/>
<
el-input
type=
"textarea"
v-model=
"formData.description"
placeholder=
"请输入角色描述
"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"角色欢迎语"
prop=
"welcomeMessage"
>
<el-form-item
label=
"角色欢迎语"
prop=
"welcomeMessage"
>
<el-input
v-model=
"formData.welcomeMessage"
placeholder=
"请输入角色欢迎语"
/>
<el-input
type=
"textarea"
v-model=
"formData.welcomeMessage"
placeholder=
"请输入角色欢迎语"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"角色上下文"
prop=
"systemMessage"
>
<el-form-item
label=
"角色上下文"
prop=
"systemMessage"
>
<el-input
v-model=
"formData.systemMessage"
placeholder=
"请输入角色上下文"
/>
<el-input
type=
"textarea"
v-model=
"formData.systemMessage"
placeholder=
"请输入角色上下文"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"是否公开"
prop=
"publicStatus"
>
<el-form-item
label=
"是否公开"
prop=
"publicStatus"
>
<el-radio-group
v-model=
"formData.publicStatus"
>
<el-radio-group
v-model=
"formData.publicStatus"
>
...
@@ -42,7 +50,10 @@
...
@@ -42,7 +50,10 @@
</el-radio>
</el-radio>
</el-radio-group>
</el-radio-group>
</el-form-item>
</el-form-item>
<el-form-item
label=
"状态"
prop=
"status"
>
<el-form-item
label=
"角色排序"
prop=
"sort"
>
<el-input-number
v-model=
"formData.sort"
placeholder=
"请输入角色排序"
class=
"!w-1/1"
/>
</el-form-item>
<el-form-item
label=
"开启状态"
prop=
"status"
>
<el-radio-group
v-model=
"formData.status"
>
<el-radio-group
v-model=
"formData.status"
>
<el-radio
<el-radio
v-for=
"dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
v-for=
"dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
...
@@ -63,6 +74,8 @@
...
@@ -63,6 +74,8 @@
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
getIntDictOptions
,
getBoolDictOptions
,
DICT_TYPE
}
from
'@/utils/dict'
import
{
getIntDictOptions
,
getBoolDictOptions
,
DICT_TYPE
}
from
'@/utils/dict'
import
{
ChatRoleApi
,
ChatRoleVO
}
from
'@/api/ai/model/chatRole'
import
{
ChatRoleApi
,
ChatRoleVO
}
from
'@/api/ai/model/chatRole'
import
{
CommonStatusEnum
}
from
'@/utils/constants'
import
{
ChatModelApi
,
ChatModelVO
}
from
'@/api/ai/model/chatModel'
/** AI 聊天角色 表单 */
/** AI 聊天角色 表单 */
defineOptions
({
name
:
'ChatRoleForm'
})
defineOptions
({
name
:
'ChatRoleForm'
})
...
@@ -84,8 +97,8 @@ const formData = ref({
...
@@ -84,8 +97,8 @@ const formData = ref({
description
:
undefined
,
description
:
undefined
,
welcomeMessage
:
undefined
,
welcomeMessage
:
undefined
,
systemMessage
:
undefined
,
systemMessage
:
undefined
,
publicStatus
:
undefined
,
publicStatus
:
true
,
status
:
undefined
status
:
CommonStatusEnum
.
ENABLE
})
})
const
formRules
=
reactive
({
const
formRules
=
reactive
({
name
:
[{
required
:
true
,
message
:
'角色名称不能为空'
,
trigger
:
'blur'
}],
name
:
[{
required
:
true
,
message
:
'角色名称不能为空'
,
trigger
:
'blur'
}],
...
@@ -98,6 +111,7 @@ const formRules = reactive({
...
@@ -98,6 +111,7 @@ const formRules = reactive({
publicStatus
:
[{
required
:
true
,
message
:
'是否公开不能为空'
,
trigger
:
'blur'
}]
publicStatus
:
[{
required
:
true
,
message
:
'是否公开不能为空'
,
trigger
:
'blur'
}]
})
})
const
formRef
=
ref
()
// 表单 Ref
const
formRef
=
ref
()
// 表单 Ref
const
chatModelList
=
ref
([]
as
ChatModelVO
[])
// 聊天模型列表
/** 打开弹窗 */
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
...
@@ -114,6 +128,8 @@ const open = async (type: string, id?: number) => {
...
@@ -114,6 +128,8 @@ const open = async (type: string, id?: number) => {
formLoading
.
value
=
false
formLoading
.
value
=
false
}
}
}
}
// 获得下拉数据
chatModelList
.
value
=
await
ChatModelApi
.
getChatModelSimpleList
(
CommonStatusEnum
.
ENABLE
)
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
...
@@ -153,8 +169,8 @@ const resetForm = () => {
...
@@ -153,8 +169,8 @@ const resetForm = () => {
description
:
undefined
,
description
:
undefined
,
welcomeMessage
:
undefined
,
welcomeMessage
:
undefined
,
systemMessage
:
undefined
,
systemMessage
:
undefined
,
publicStatus
:
undefined
,
publicStatus
:
true
,
status
:
undefined
status
:
CommonStatusEnum
.
ENABLE
}
}
formRef
.
value
?.
resetFields
()
formRef
.
value
?.
resetFields
()
}
}
...
...
src/views/ai/model/chatRole/index.vue
View file @
c16bcef5
...
@@ -59,13 +59,14 @@
...
@@ -59,13 +59,14 @@
<!-- 列表 -->
<!-- 列表 -->
<ContentWrap>
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table-column
label=
"角色编号"
align=
"center"
prop=
"id"
/>
<el-table-column
label=
"用户编号"
align=
"center"
prop=
"userId"
/>
<el-table-column
label=
"模型编号"
align=
"center"
prop=
"modelId"
/>
<el-table-column
label=
"角色名称"
align=
"center"
prop=
"name"
/>
<el-table-column
label=
"角色名称"
align=
"center"
prop=
"name"
/>
<el-table-column
label=
"角色头像"
align=
"center"
prop=
"avatar"
/>
<el-table-column
label=
"绑定模型"
align=
"center"
prop=
"modelName"
/>
<el-table-column
label=
"角色头像"
align=
"center"
prop=
"avatar"
>
<template
#
default=
"scope"
>
<el-image
:src=
"scope?.row.avatar"
class=
"w-32px h-32px"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"角色类别"
align=
"center"
prop=
"category"
/>
<el-table-column
label=
"角色类别"
align=
"center"
prop=
"category"
/>
<el-table-column
label=
"角色排序"
align=
"center"
prop=
"sort"
/>
<el-table-column
label=
"角色描述"
align=
"center"
prop=
"description"
/>
<el-table-column
label=
"角色描述"
align=
"center"
prop=
"description"
/>
<el-table-column
label=
"角色欢迎语"
align=
"center"
prop=
"welcomeMessage"
/>
<el-table-column
label=
"角色欢迎语"
align=
"center"
prop=
"welcomeMessage"
/>
<el-table-column
label=
"角色上下文"
align=
"center"
prop=
"systemMessage"
/>
<el-table-column
label=
"角色上下文"
align=
"center"
prop=
"systemMessage"
/>
...
@@ -79,13 +80,7 @@
...
@@ -79,13 +80,7 @@
<dict-tag
:type=
"DICT_TYPE.COMMON_STATUS"
:value=
"scope.row.status"
/>
<dict-tag
:type=
"DICT_TYPE.COMMON_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
<el-table-column
label=
"角色排序"
align=
"center"
prop=
"sort"
/>
label=
"创建时间"
align=
"center"
prop=
"createTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
<el-table-column
label=
"操作"
align=
"center"
>
<el-table-column
label=
"操作"
align=
"center"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-button
<el-button
...
@@ -122,7 +117,6 @@
...
@@ -122,7 +117,6 @@
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
getBoolDictOptions
,
DICT_TYPE
}
from
'@/utils/dict'
import
{
getBoolDictOptions
,
DICT_TYPE
}
from
'@/utils/dict'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
ChatRoleApi
,
ChatRoleVO
}
from
'@/api/ai/model/chatRole'
import
{
ChatRoleApi
,
ChatRoleVO
}
from
'@/api/ai/model/chatRole'
import
ChatRoleForm
from
'./ChatRoleForm.vue'
import
ChatRoleForm
from
'./ChatRoleForm.vue'
...
@@ -140,7 +134,7 @@ const queryParams = reactive({
...
@@ -140,7 +134,7 @@ const queryParams = reactive({
pageSize
:
10
,
pageSize
:
10
,
name
:
undefined
,
name
:
undefined
,
category
:
undefined
,
category
:
undefined
,
publicStatus
:
undefined
publicStatus
:
true
})
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
queryFormRef
=
ref
()
// 搜索的表单
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment