Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-dml
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-dml
Commits
541c105d
提交
541c105d
authored
7月 15, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
8ce62951
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
179 行增加
和
71 行删除
+179
-71
.env.dev
.env.dev
+9
-3
useAI.js
src/composables/useAI.js
+154
-55
AIChat.vue
src/modules/material/all/components/AIChat.vue
+3
-1
StepOne.vue
src/modules/material/all/components/StepOne.vue
+3
-3
menu.ts
src/stores/menu.ts
+7
-7
dictionary.ts
src/utils/dictionary.ts
+1
-1
vite.config.ts
vite.config.ts
+2
-1
没有找到文件。
.env.dev
浏览文件 @
541c105d
VITE_LOGIN_URL=https://login.zijing.chat/auth/login/index
# VITE_LAB_URL=https://digitalmarketinglab.zijing.chat
VITE_LAB_URL=https://bi.zijing.chat/bi/?proc=0&action=index
VITE_LOGIN_URL=http://172.16.3.203:1001/auth/login/index
VITE_LAB_URL=http://172.16.3.203:1012/bi/?proc=0&action=index
VITE_SURVEYKING_URL=http://172.16.3.203:1011
VITE_STATIC_URL=https://saas-lab-api
# 直播语音识别
VITE_ACCESS_KEY_ID=LTAI5t7YUVzDVSFLYvnuWGuq
VITE_ACCESS_KEY_SECRET=GBsohg5hSUP99dzIuRuCQilUXTSiYe
VITE_APP_KEY=W7Yqc8L49MEnnLsE
src/composables/useAI.js
浏览文件 @
541c105d
...
...
@@ -8,13 +8,14 @@ import { ElMessage } from 'element-plus'
export
function
useAI
(
config
)
{
// AI 配置列表
const
options
=
[
{
label
:
'文心一言'
,
value
:
'yiyan'
},
{
label
:
'DeepSeek'
,
value
:
'deepseek'
},
{
label
:
'通义千问'
,
value
:
'qwen'
},
{
label
:
'天工'
,
value
:
'tiangong'
},
// { label: '文心一言', value: 'yiyan' },
// { label: 'DeepSeek', value: 'deepseek' },
// { label: '通义千问', value: 'qwen' },
{
label
:
'通义千问'
,
value
:
'qwenLocal'
},
// { label: '天工', value: 'tiangong' },
]
const
ai
=
useStorage
(
'ai'
,
'
tiangong
'
)
const
ai
=
useStorage
(
'ai'
,
'
qwen
'
)
const
messages
=
ref
([])
const
isLoading
=
ref
(
false
)
...
...
@@ -31,6 +32,9 @@ export function useAI(config) {
case
'qwen'
:
await
qwen
(
data
)
break
case
'qwenLocal'
:
await
qwenLocal
(
data
)
break
case
'tiangong'
:
await
tiangong
(
data
)
break
...
...
@@ -101,6 +105,70 @@ export function useAI(config) {
messages
.
value
.
push
({
role
:
'assistant'
,
content
:
choice
.
message
.
content
.
replaceAll
(
'
\
n'
,
'<br/>'
)
})
}
}
// 通义千问
async
function
qwenLocal
(
data
,
isReplace
=
true
)
{
console
.
log
(
'qwenLocal'
,
data
)
isLoading
.
value
=
true
return
new
Promise
((
resolve
,
reject
)
=>
{
fetchEventSource
(
'/api/lab/v1/experiment/qwen/chat'
,
{
method
:
'POST'
,
headers
:
{
'Content-Type'
:
'application/json'
},
body
:
JSON
.
stringify
({
model
:
'qwen-long'
,
messages
:
[{
role
:
'user'
,
content
:
data
.
content
}]
}),
async
onopen
(
response
)
{
if
(
response
.
ok
)
{
return
response
}
else
{
isLoading
.
value
=
false
reject
(
response
)
throw
response
}
},
onmessage
(
res
)
{
console
.
log
(
res
.
data
)
if
(
res
.
data
===
'[DONE]'
)
{
isLoading
.
value
=
false
resolve
(
messages
.
value
.
at
(
-
1
))
return
}
try
{
const
message
=
JSON
.
parse
(
res
.
data
)
if
(
message
.
error
)
{
ElMessage
.
error
(
message
.
error
.
message
)
return
}
const
id
=
message
.
id
const
messageIndex
=
messages
.
value
.
findIndex
((
session
)
=>
session
.
id
===
id
)
let
content
=
message
?.
choices
[
0
]?.
delta
.
content
||
''
if
(
isReplace
)
{
content
=
content
.
replaceAll
(
'
\
n'
,
'<br/>'
)
}
if
(
messageIndex
===
-
1
)
{
messages
.
value
.
push
({
id
,
role
:
'assistant'
,
content
:
content
.
replace
(
/<think>
[\s\S]
*
?
<
\/
think>/g
,
''
).
replace
(
/^
((
<br
\s
*
\/?
>
)
|
\s
|
\\
n|
\\
r
)
+/g
,
''
),
})
}
else
{
messages
.
value
[
messageIndex
].
content
=
(
messages
.
value
[
messageIndex
].
content
+
content
)
.
replace
(
/<think>
[\s\S]
*
?
<
\/
think>/g
,
''
)
.
replace
(
/^
((
<br
\s
*
\/?
>
)
|
\s
|
\\
n|
\\
r
)
+/g
,
''
)
}
}
catch
(
error
)
{
console
.
log
(
error
)
isLoading
.
value
=
false
reject
(
error
)
}
},
onerror
(
err
)
{
isLoading
.
value
=
false
reject
(
err
)
throw
err
},
})
})
}
// 通义千问
async
function
qwen
(
data
)
{
const
apiKey
=
'sk-afd0fcdb53bf4058b2068b8548820150'
...
...
@@ -184,74 +252,105 @@ export function useAI(config) {
async
function
generateText
(
data
)
{
isLoading
.
value
=
true
const
docAction
=
{
2
:
'write'
,
3
:
'rewrite'
,
4
:
'expand'
,
5
:
'rewrite'
,
7
:
'abbreviate'
,
8
:
'summary'
,
}
const
params
=
{
content
:
data
.
content
,
doc_action
:
docAction
[
data
.
type
],
full_text
:
!!
(
data
.
type
===
2
),
}
await
fetchEventSource
(
'/api/lab/v1/experiment/
marketing-ai/sky-agent3-
chat'
,
{
//
const docAction = {
//
2: 'write',
//
3: 'rewrite',
//
4: 'expand',
//
5: 'rewrite',
//
7: 'abbreviate',
//
8: 'summary',
//
}
//
const params = {
//
content: data.content,
//
doc_action: docAction[data.type],
//
full_text: !!(data.type === 2),
//
}
await
fetchEventSource
(
'/api/lab/v1/experiment/
qwen/
chat'
,
{
method
:
'POST'
,
headers
:
{
'Content-Type'
:
'application/json'
,
},
body
:
JSON
.
stringify
({
...
config
,
...
data
,
api_type
:
parseInt
(
data
.
type
)
===
1
?
1
:
2
,
context
:
data
.
content
,
params
:
params
,
}),
headers
:
{
'Content-Type'
:
'application/json'
},
body
:
JSON
.
stringify
({
model
:
'qwen-long'
,
messages
:
[{
role
:
'user'
,
content
:
data
.
content
}]
}),
async
onopen
(
response
)
{
if
(
response
.
ok
)
{
return
return
response
}
else
{
isLoading
.
value
=
false
// reject(response)
throw
response
}
},
onmessage
(
res
)
{
const
message
=
JSON
.
parse
(
res
.
data
)
// 聊天返回内容
if
(
data
.
type
===
'1'
)
{
if
(
message
.
code
===
0
)
{
ElMessage
.
error
(
message
.
message
)
console
.
log
(
res
.
data
)
if
(
res
.
data
===
'[DONE]'
)
{
isLoading
.
value
=
false
// resolve(messages.value.at(-1))
return
}
try
{
const
message
=
JSON
.
parse
(
res
.
data
)
if
(
message
.
error
)
{
ElMessage
.
error
(
message
.
error
.
message
)
return
}
const
conversationId
=
message
.
conversation_id
const
messageIndex
=
messages
.
value
.
findIndex
((
session
)
=>
session
.
conversationId
===
conversationId
)
const
content
=
message
?.
arguments
?.
reduce
((
a
,
b
)
=>
{
a
=
b
?.
messages
[
0
]?.
text
||
''
return
a
},
''
)
if
(
messageIndex
===
-
1
)
{
messages
.
value
.
push
({
conversationId
,
role
:
'assistant'
,
content
,
input
:
data
.
context
})
}
else
{
if
(
content
)
{
messages
.
value
[
messageIndex
].
content
=
content
}
}
}
else
{
// 按钮功能返回内容
const
requestId
=
message
.
request_id
const
messageIndex
=
messages
.
value
.
findIndex
((
session
)
=>
session
.
conversationId
===
requestId
)
const
id
=
message
.
id
const
messageIndex
=
messages
.
value
.
findIndex
((
session
)
=>
session
.
id
===
id
)
let
content
=
message
?.
choices
[
0
]?.
delta
.
content
||
''
// if (isReplace) {
// content = content.replaceAll('\n', '<br/>')
// }
if
(
messageIndex
===
-
1
)
{
messages
.
value
.
push
({
conversationId
:
requestId
,
conversationId
:
id
,
id
,
role
:
'assistant'
,
content
:
message
.
data
?.
text
||
''
,
content
:
content
.
replace
(
/<think>
[\s\S]
*
?
<
\/
think>/g
,
''
).
replace
(
/^
((
<br
\s
*
\/?
>
)
|
\s
|
\\
n|
\\
r
)
+/g
,
''
)
,
input
:
data
.
context
,
})
}
else
{
messages
.
value
[
messageIndex
].
content
=
message
.
data
?.
text
messages
.
value
[
messageIndex
].
content
=
(
messages
.
value
[
messageIndex
].
content
+
content
)
.
replace
(
/<think>
[\s\S]
*
?
<
\/
think>/g
,
''
)
.
replace
(
/^
((
<br
\s
*
\/?
>
)
|
\s
|
\\
n|
\\
r
)
+/g
,
''
)
}
}
catch
(
error
)
{
console
.
log
(
error
)
isLoading
.
value
=
false
// reject(error)
}
// const message = JSON.parse(res.data)
// // 聊天返回内容
// if (data.type === '1') {
// if (message.code === 0) {
// ElMessage.error(message.message)
// return
// }
// const conversationId = message.conversation_id
// const messageIndex = messages.value.findIndex((session) => session.conversationId === conversationId)
// const content = message?.arguments?.reduce((a, b) => {
// a = b?.messages[0]?.text || ''
// return a
// }, '')
// if (messageIndex === -1) {
// messages.value.push({ conversationId, role: 'assistant', content, input: data.context })
// } else {
// if (content) {
// messages.value[messageIndex].content = content
// }
// }
// } else {
// // 按钮功能返回内容
// const requestId = message.request_id
// const messageIndex = messages.value.findIndex((session) => session.conversationId === requestId)
// if (messageIndex === -1) {
// messages.value.push({
// conversationId: requestId,
// role: 'assistant',
// content: message.data?.text || '',
// input: data.context,
// })
// } else {
// messages.value[messageIndex].content = message.data?.text
// }
// }
isLoading
.
value
=
false
},
onclose
()
{
...
...
src/modules/material/all/components/AIChat.vue
浏览文件 @
541c105d
...
...
@@ -101,9 +101,11 @@ async function handleSendType(type, content) {
})
switch
(
type
)
{
case
2
:
content
=
`
${
content
}
`
// content = `${content}`
content
=
`我是
${
userName
}
,请帮我创作以下内容:
${
content
.
replace
(
'请帮我创作一个'
,
''
)}
`
break
case
3
:
case
5
:
content
=
`我是
${
userName
}
,请帮我改写以下内容:
${
content
.
replace
(
'请帮我创作一个'
,
''
)}
`
break
case
4
:
...
...
src/modules/material/all/components/StepOne.vue
浏览文件 @
541c105d
...
...
@@ -16,7 +16,7 @@ const formRef = ref()
const
rules
=
ref
({
type
:
[{
required
:
true
,
message
:
'请选择营销内容类型'
}],
name
:
[{
required
:
true
,
message
:
'请输入内容名称'
}],
teacher_id
:[{
required
:
true
,
message
:
'请选择老师标签'
}],
teacher_id
:
[{
required
:
true
,
message
:
'请选择老师标签'
}],
})
async
function
handleValidate
()
{
...
...
@@ -30,8 +30,8 @@ async function handleNext() {
function
wayDisabled
(
item
,
type
)
{
if
(
item
.
value
==
1
)
{
// return !['1'
, '2'
].includes(type)
return
!
[
'1'
].
includes
(
type
)
// return !['1'].includes(type)
return
!
[
'1'
,
'2'
].
includes
(
type
)
}
if
(
item
.
value
==
3
)
{
return
!
[
'2'
,
'8'
].
includes
(
type
)
...
...
src/stores/menu.ts
浏览文件 @
541c105d
...
...
@@ -297,13 +297,13 @@ const adminMenus: IMenuItem[] = [
icon
:
markRaw
(
IconAudio
),
// tag: 'v1-experiment-marketing-material-list',
},
//
{
//
id: 14,
//
name: '数字人管理',
//
path: '/material/digital-human',
//
icon: markRaw(IconVideo),
//
// tag: 'v1-experiment-marketing-material-list',
//
},
{
id
:
14
,
name
:
'数字人管理'
,
path
:
'/material/digital-human'
,
icon
:
markRaw
(
IconVideo
),
// tag: 'v1-experiment-marketing-material-list',
},
{
id
:
14
,
name
:
'视频资料管理'
,
...
...
src/utils/dictionary.ts
浏览文件 @
541c105d
...
...
@@ -115,7 +115,7 @@ export const wayList = [
export
const
materialMethodList
=
[
{
label
:
'离线上传 '
,
value
:
'2'
},
{
label
:
'在线AI'
,
value
:
'1'
},
{
label
:
'在线设计'
,
value
:
'3'
},
//
{ label: '在线设计', value: '3' },
]
// 使用场景
...
...
vite.config.ts
浏览文件 @
541c105d
...
...
@@ -60,7 +60,8 @@ export default defineConfig(() => ({
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api\/lab/, ''),
// },
'/api'
:
'https://saas-dml.ezijing.com'
,
// '/api': 'https://saas-dml.ezijing.com',
'/api'
:
'http://172.16.30.33:1007'
,
},
},
resolve
:
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论