Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-dml
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-dml
Commits
ab4da3a1
提交
ab4da3a1
authored
11月 14, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
8edfdb01
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
398 行增加
和
77 行删除
+398
-77
MarkdownRender.vue
src/components/MarkdownRender.vue
+298
-0
CompetitionLive.vue
src/modules/live/score/components/CompetitionLive.vue
+26
-4
CompetitionOperations.vue
src/modules/live/score/components/CompetitionOperations.vue
+20
-20
ScoreCardLive.vue
src/modules/live/score/components/ScoreCardLive.vue
+4
-7
RecordDialog.vue
src/modules/live/test/components/RecordDialog.vue
+2
-6
RecordView.vue
src/modules/live/test/components/RecordView.vue
+40
-34
Index.vue
src/modules/live/test/views/Index.vue
+3
-1
Index.vue
src/modules/operations/views/Index.vue
+5
-5
没有找到文件。
src/components/MarkdownRender.vue
0 → 100644
浏览文件 @
ab4da3a1
<
script
setup
>
import
VueMarkdown
from
'vue-markdown-render'
defineProps
({
source
:
{
type
:
String
,
required
:
true
}
})
const
options
=
{
html
:
true
,
breaks
:
true
,
}
</
script
>
<
template
>
<VueMarkdown
:source=
"source"
:options=
"options"
class=
"markdown-body"
/>
</
template
>
<
style
lang=
"scss"
>
.markdown-body
{
font-size
:
14px
;
line-height
:
1
;
color
:
#333
;
// 标题样式 - 优化间距
h1
,
h2
,
h3
,
h4
,
h5
,
h6
{
margin
:
1
.2em
0
0
.6em
0
;
font-weight
:
600
;
line-height
:
1
.3
;
color
:
#2c3e50
;
&
:first-child
{
margin-top
:
0
;
}
}
h1
{
font-size
:
1
.6em
;
border-bottom
:
2px
solid
#eaecef
;
padding-bottom
:
0
.4em
;
margin-top
:
1
.5em
;
}
h2
{
font-size
:
1
.4em
;
border-bottom
:
1px
solid
#eaecef
;
padding-bottom
:
0
.3em
;
margin-top
:
1
.3em
;
}
h3
{
font-size
:
1
.2em
;
margin-top
:
1
.1em
;
}
h4
{
font-size
:
1
.1em
;
margin-top
:
1em
;
}
h5
{
font-size
:
1
.05em
;
margin-top
:
0
.9em
;
}
h6
{
font-size
:
1em
;
color
:
#6a737d
;
margin-top
:
0
.8em
;
}
// 段落和文字 - 优化间距
p
{
margin
:
0
.8em
0
;
line-height
:
1
.7
;
}
// 强调文本
strong
,
b
{
font-weight
:
600
;
color
:
#2c3e50
;
}
em
,
i
{
font-style
:
italic
;
color
:
#5a6268
;
}
// 链接
a
{
color
:
#0366d6
;
text-decoration
:
none
;
&
:hover
{
text-decoration
:
underline
;
color
:
#0550ae
;
}
}
// 列表 - 优化间距和缩进
ul
,
ol
{
margin
:
0
.8em
0
;
padding-left
:
1
.8em
;
}
li
{
margin
:
0
.3em
0
;
line-height
:
1
.6
;
p
{
margin
:
0
.4em
0
;
}
// 嵌套列表间距
ul
,
ol
{
margin
:
0
.4em
0
;
}
}
// 代码块 - 优化内边距
// pre {
// background-color: #f6f8fa;
// border-radius: 6px;
// padding: 0.9em;
// margin: 0.9em 0;
// overflow: auto;
// border: 1px solid #e1e4e8;
// code {
// background: transparent;
// padding: 0;
// border: none;
// color: #24292e;
// font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
// font-size: 0.9em;
// line-height: 1.5;
// }
// }
// 行内代码 - 优化内边距
// code {
// background-color: #f6f8fa;
// padding: 0.15em 0.3em;
// border-radius: 3px;
// font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace;
// font-size: 0.88em;
// color: #e01e5a;
// border: 1px solid #e1e4e8;
// line-height: 1.4;
// }
// 引用块 - 优化内边距
blockquote
{
margin
:
0
.9em
0
;
padding
:
0
.6em
0
.9em
0
.6em
1em
;
background-color
:
#f8f9fa
;
border-left
:
4px
solid
#dfe2e5
;
color
:
#6a737d
;
border-radius
:
0
4px
4px
0
;
p
{
margin
:
0
.4em
0
;
}
// 嵌套引用
blockquote
{
margin
:
0
.6em
0
;
padding
:
0
.4em
0
.8em
0
.4em
0
.9em
;
}
}
// 表格 - 优化单元格内边距
table
{
width
:
100%
;
border-collapse
:
collapse
;
margin
:
0
.9em
0
;
font-size
:
0
.95em
;
th
,
td
{
padding
:
0
.5em
0
.8em
;
border
:
1px
solid
#dfe2e5
;
line-height
:
1
.5
;
}
th
{
background-color
:
#f6f8fa
;
font-weight
:
600
;
text-align
:
left
;
}
tr
:nth-child
(
even
)
{
background-color
:
#f6f8fa
;
}
}
// 水平分割线 - 优化间距
hr
{
height
:
1px
;
background-color
:
#e1e4e8
;
border
:
none
;
margin
:
1
.5em
0
;
}
// 图片 - 优化外边距
img
{
max-width
:
100%
;
height
:
auto
;
border-radius
:
4px
;
border
:
1px
solid
#e1e4e8
;
margin
:
0
.8em
0
;
}
// 任务列表 - 优化对齐
.contains-task-list
{
list-style
:
none
;
padding-left
:
0
;
margin
:
0
.8em
0
;
li
{
display
:
flex
;
align-items
:
flex-start
;
gap
:
0
.5em
;
margin
:
0
.3em
0
;
input
[
type
=
'checkbox'
]
{
margin-top
:
0
.15em
;
transform
:
scale
(
1
.1
);
}
}
}
// 相邻元素间距优化
*
+
h1
,
*
+
h2
,
*
+
h3
{
margin-top
:
1
.4em
;
}
// 代码块后的内容间距
pre
+
*
{
margin-top
:
1em
;
}
// 图片后的内容间距
img
+
*
{
margin-top
:
0
.9em
;
}
[
data-streamdown
=
'code-block'
]
{
background-color
:
#f6f3f4
;
border
:
1px
solid
#e5e5e5
;
border-radius
:
14px
;
}
[
data-streamdown
=
'code-block-header'
]
{
padding
:
12px
;
border-bottom
:
1px
solid
#e5e5e5
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
}
// [data-streamdown='code-actions'] {
// display: flex;
// align-items: center;
// justify-content: center;
// gap: 10px;
// button {
// border-radius: 4px;
// border: 0;
// padding: 4px;
// background-color: #ebe6e7;
// cursor: pointer;
// display: flex;
// align-items: center;
// justify-content: center;
// color: #333;
// svg {
// width: 14px;
// height: 14px;
// }
// span {
// display: none;
// }
// }
// }
[
data-streamdown
=
'code-body'
]
{
padding
:
12px
;
}
}
@media
(
prefers-color-scheme
:
dark
)
{
.markdown-body
{
[
data-streamdown
=
'code-block-header'
]
{
color
:
#fff
;
}
}
}
</
style
>
src/modules/live/score/components/CompetitionLive.vue
浏览文件 @
ab4da3a1
...
...
@@ -50,6 +50,22 @@ watchEffect(() => {
defineEmits
([
'save'
])
const
firstLivePractice
=
computed
(()
=>
{
return
props
.
detail
.
live_data
.
practices
[
0
]
})
const
firstLivePracticeRecord
=
computed
(()
=>
{
return
props
.
detail
.
live_data
.
practice_records
.
find
((
item
)
=>
item
.
live_practice_id
===
firstLivePractice
.
value
?.
id
)
})
const
secondLivePractice
=
computed
(()
=>
{
return
props
.
detail
.
live_data
.
practices
[
1
]
})
const
secondLivePracticeRecord
=
computed
(()
=>
{
return
props
.
detail
.
live_data
.
practice_records
.
find
((
item
)
=>
item
.
live_practice_id
===
secondLivePractice
.
value
?.
id
)
})
// 商品类别
const
categoryTableOptions
=
{
columns
:
[
...
...
@@ -304,7 +320,10 @@ const handleNext = () => {
v-model:comment=
"scoreDetails.practice_record1.comment"
@
save=
"$emit('save')"
@
next=
"handleNext"
>
<ScoreCardLive
:data=
"detail.live_data.practice_records[0]"
v-if=
"detail.live_data.practice_records[0]"
/>
<ScoreCardLive
:livePracticeId=
"firstLivePractice.id"
:recordId=
"firstLivePracticeRecord.id"
v-if=
"firstLivePracticeRecord"
/>
<el-empty
v-else
/>
</ScoreCard>
</el-tab-pane>
...
...
@@ -316,9 +335,9 @@ const handleNext = () => {
v-model:comment=
"scoreDetails.improvement_plan.comment"
@
save=
"$emit('save')"
@
next=
"handleNext"
>
<el-form
label-position=
"top"
v-if=
"
detail.live_data.practice_records[0]
?.improvement_plan"
>
<el-form
label-position=
"top"
v-if=
"
firstLivePracticeRecord
?.improvement_plan"
>
<el-form-item
label=
"改进方案"
>
<div
class=
"form-box"
v-html=
"
detail.live_data.practice_records[0]
?.improvement_plan"
></div>
<div
class=
"form-box"
v-html=
"
firstLivePracticeRecord
?.improvement_plan"
></div>
</el-form-item>
</el-form>
<el-empty
v-else
/>
...
...
@@ -332,7 +351,10 @@ const handleNext = () => {
v-model:comment=
"scoreDetails.practice_record2.comment"
@
save=
"$emit('save')"
@
next=
"handleNext"
>
<ScoreCardLive
:data=
"detail.live_data.practice_records[1]"
v-if=
"detail.live_data.practice_records[1]"
/>
<ScoreCardLive
:livePracticeId=
"secondLivePractice.id"
:recordId=
"secondLivePracticeRecord.id"
v-if=
"secondLivePracticeRecord"
/>
<el-empty
v-else
/>
</ScoreCard>
</el-tab-pane>
...
...
src/modules/live/score/components/CompetitionOperations.vue
浏览文件 @
ab4da3a1
...
...
@@ -62,29 +62,29 @@ const handleNext = () => {
<el-tab-pane
label=
"创意策划方案"
:name=
"1"
>
<ModuleCard
:maxScore=
"20"
:hasSaveButton=
"detail.status != '2'"
@
next=
"handleNext"
@
save=
"$emit('save')"
>
<ScoreCardSub
title=
"全媒体运营的主题(方向)描述(
4
分)"
:maxScore=
"
4
"
title=
"全媒体运营的主题(方向)描述(
3
分)"
:maxScore=
"
3
"
v-model:score=
"scoreDetails.plan_theme.score"
v-model:comment=
"scoreDetails.plan_theme.comment"
>
<div
class=
"html-content"
v-html=
"json.plan?.theme"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"运营的渠道路径(
5
分)"
:maxScore=
"
5
"
title=
"运营的渠道路径(
3
分)"
:maxScore=
"
3
"
v-model:score=
"scoreDetails.plan_path.score"
v-model:comment=
"scoreDetails.plan_path.comment"
>
<div
class=
"html-content"
v-html=
"json.plan?.path"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"运营的重点和难点(
5
分)"
:maxScore=
"
5
"
title=
"运营的重点和难点(
4
分)"
:maxScore=
"
4
"
v-model:score=
"scoreDetails.plan_difficulty.score"
v-model:comment=
"scoreDetails.plan_difficulty.comment"
>
<div
class=
"html-content"
v-html=
"json.plan?.
path
"
></div>
<div
class=
"html-content"
v-html=
"json.plan?.
difficulty
"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"运营策划框架方案(从媒介技术、加工匹配、传播、反馈等,要点式表述)(
6
分)"
:maxScore=
"
6
"
title=
"运营策划框架方案(从媒介技术、加工匹配、传播、反馈等,要点式表述)(
10
分)"
:maxScore=
"
10
"
v-model:score=
"scoreDetails.plan_framework.score"
v-model:comment=
"scoreDetails.plan_framework.comment"
>
<div
class=
"html-content"
v-html=
"json.plan?.framework"
></div>
...
...
@@ -92,7 +92,7 @@ const handleNext = () => {
</ModuleCard>
</el-tab-pane>
<el-tab-pane
label=
"视听运营"
:name=
"2"
>
<ModuleCard
:maxScore=
"
20
"
:hasSaveButton=
"detail.status != '2'"
@
next=
"handleNext"
@
save=
"$emit('save')"
>
<ModuleCard
:maxScore=
"
55
"
:hasSaveButton=
"detail.status != '2'"
@
next=
"handleNext"
@
save=
"$emit('save')"
>
<ScoreCardSub
title=
"综合稿件标题(5分)"
:maxScore=
"5"
...
...
@@ -101,22 +101,22 @@ const handleNext = () => {
<div
class=
"html-content"
v-html=
"json.audiovisual?.title"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"导语(
5
分)"
:maxScore=
"
5
"
title=
"导语(
3
分)"
:maxScore=
"
3
"
v-model:score=
"scoreDetails.audiovisual_intro.score"
v-model:comment=
"scoreDetails.audiovisual_intro.comment"
>
<div
class=
"html-content"
v-html=
"json.audiovisual?.intro"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"正文报道文字(不少于200字)(
5
分)"
:maxScore=
"
5
"
title=
"正文报道文字(不少于200字)(
7
分)"
:maxScore=
"
7
"
v-model:score=
"scoreDetails.audiovisual_content.score"
v-model:comment=
"scoreDetails.audiovisual_content.comment"
>
<div
class=
"html-content"
v-html=
"json.audiovisual?.content"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"主题活动(场景)现场照片(不少于2张)(
10
分)"
:maxScore=
"
10
"
title=
"主题活动(场景)现场照片(不少于2张)(
5
分)"
:maxScore=
"
5
"
v-model:score=
"scoreDetails.audiovisual_images.score"
v-model:comment=
"scoreDetails.audiovisual_images.comment"
>
<div
class=
"html-content"
>
...
...
@@ -128,8 +128,8 @@ const handleNext = () => {
</div>
</ScoreCardSub>
<ScoreCardSub
title=
"原创视频短片(不少于60秒)。该视频至少包括:字幕、音乐或音效、一段同期声采访(或现场声)等要素。(3
0
分)"
:maxScore=
"3
0
"
title=
"原创视频短片(不少于60秒)。该视频至少包括:字幕、音乐或音效、一段同期声采访(或现场声)等要素。(3
5
分)"
:maxScore=
"3
5
"
v-model:score=
"scoreDetails.audiovisual_video.score"
v-model:comment=
"scoreDetails.audiovisual_video.comment"
>
<div
class=
"html-content"
>
...
...
@@ -148,8 +148,8 @@ const handleNext = () => {
<div
class=
"html-content"
v-html=
"json.flow?.platforms"
></div>
</ScoreCardSub>
<ScoreCardSub
title=
"流量运营及直播运营的预期成效分析(
5
分)"
:maxScore=
"
5
"
title=
"流量运营及直播运营的预期成效分析(
10
分)"
:maxScore=
"
10
"
v-model:score=
"scoreDetails.flow_traffic.score"
v-model:comment=
"scoreDetails.flow_traffic.comment"
>
<div
class=
"html-content"
v-html=
"json.flow?.traffic"
></div>
...
...
src/modules/live/score/components/ScoreCardLive.vue
浏览文件 @
ab4da3a1
...
...
@@ -2,17 +2,14 @@
import
Demo
from
'../../test/components/Demo.vue'
import
RecordView
from
'../../test/components/RecordView.vue'
defineProps
({
data
:
{
type
:
Object
},
})
defineProps
({
livePracticeId
:
{
type
:
String
},
recordId
:
{
type
:
String
}
})
</
script
>
<
template
>
<RecordView
:recordId=
"
data.i
d"
:recordId=
"
recordI
d"
:isView=
"false"
style=
"border: 1px solid #eee; border-radius: 10px; margin-bottom: 20px; overflow: hidden"
v-if=
"data"
/>
style=
"border: 1px solid #eee; border-radius: 10px; margin-bottom: 20px; overflow: hidden"
/>
<Demo
:id=
"
data.live_practice_id"
:recordId=
"data.i
d"
:isView=
"true"
/>
<Demo
:id=
"
livePracticeId"
:recordId=
"recordI
d"
:isView=
"true"
/>
</
template
>
src/modules/live/test/components/RecordDialog.vue
浏览文件 @
ab4da3a1
...
...
@@ -109,17 +109,13 @@ const handleUpload = (row) => {
<AppList
v-bind=
"listOptions"
ref=
"appList"
>
<template
#
table-x=
"
{ row }">
<el-button
text
type=
"primary"
>
<router-link
:to=
"
{ path: 'test/reply', query: { ...$route.query, id: data.id, record_id: row.id } }"
target="_blank"
<router-link
:to=
"
{ path: 'test/reply', query: { ...$route.query, id: data.id, record_id: row.id } }"
>直播视频回放
</router-link>
</el-button>
<br
/>
<el-button
text
type=
"primary"
>
<router-link
:to=
"
{ path: 'test/view', query: { ...$route.query, id: data.id, record_id: row.id } }"
target="_blank"
<router-link
:to=
"
{ path: 'test/view', query: { ...$route.query, id: data.id, record_id: row.id } }"
>查看AI评价
</router-link
>
</el-button>
...
...
src/modules/live/test/components/RecordView.vue
浏览文件 @
ab4da3a1
<
script
setup
>
import
VueMarkdown
from
'vue-markdown-render
'
import
MarkdownRender
from
'@/components/MarkdownRender.vue
'
import
Demo
from
'../components/Demo.vue'
import
ImprovementPlan
from
'../components/ImprovementPlan.vue'
import
{
getRecord
,
updateRecord
}
from
'../api'
...
...
@@ -118,6 +118,7 @@ const handleAIScore = async () => {
【用几句话总结卖点讲解的整体情况,如:本次直播时长
XX
,累计口播
XX
字,本次直播共讲解了
X
个卖点,覆盖率达到
XX
%
。讲解较为全面
/
部分遗漏,重点突出
/
略显平淡。建议在二次直播中
...
】
二、违禁词分析报告
检测结果总览:
...
...
@@ -144,7 +145,7 @@ const handleAIScore = async () => {
类型:绝对化用语
夸大宣传
医疗用语
虚假宣传
出现时间:第
X
分
X
秒
出现次数:
X
次
上下文原文:
"【引用完整句子】"
例:
"这款面膜能够治疗痘痘,快速修复受损肌肤..."
...
...
@@ -204,6 +205,7 @@ const handleAIScore = async () => {
销量第一、市场占有率第一
三、直播优化建议
综合评价:
...
...
@@ -211,11 +213,14 @@ const handleAIScore = async () => {
以下
5
个维度需逐项输出:
1
、语速与节奏
【现状描述】详细描述当前语速和节奏的表现,如:平均语速约
XXX
字
/
分钟,整体偏快
/
适中
/
偏慢。在产品讲解环节语速过快,在互动环节节奏较好。
【存在问题】示例如下:
问题
1
,如:产品讲解环节(
X
分
X
秒
-
X
分
X
秒)语速过快,达到
XXX
字
/
分钟,观众可能跟不上
问题
2
,如:停顿不当,关键信息没有留出思考时间
问题
3
,如:节奏不稳定,时快时慢,影响观看体验
【改进建议】示例如下:
具体建议
1
,如:在讲解三重玻尿酸成分时,有意识放慢语速至
200
字
/
分钟以内,并在关键数据后
停顿
1
-
2
秒
具体建议
2
,如:使用
"那么"
、
"接下来"
等连接词自然控制节奏
...
...
@@ -246,12 +251,15 @@ const handleAIScore = async () => {
2
、互动能力
【现状描述】详细描述当前互动情况,如:互动频率一般
/
良好
/
不足,共发起
X
次互动,回应了
X
条观众评论。互动形式包括
...
【存在问题】示例如下:
问题
1
,如:互动频率过低,整场直播仅发起
X
次互动,直播间氛围不够活跃
问题
1
,如:互动频率过低,整场
直播仅发起
X
次互动,直播间氛围不够活跃
问题
2
,如:互动问题设计不够吸引人,观众参与度不高
问题
3
,如:对观众评论回应不够及时,错过了多次互动机会
问题
4
,如:抽奖活动执行不到位,未能充分调动观众积极性
【改进建议】示例如下:
具体建议
1
,如:增加互动频率,建议每
3
-
5
分钟发起一次互动,如
"有宝宝用过玻尿酸面膜吗?效果如何?"
具体建议
2
,如:设计更有趣的互动问题,如
"猜猜这款面膜的秒杀价是多少?猜中送小样!"
...
...
@@ -261,12 +269,15 @@ const handleAIScore = async () => {
3
、卖点讲解能力
【现状描述】详细描述当前卖点讲解情况,如:共讲解了
X
个卖点,覆盖率
XX
%
。讲解较为清晰
/
逻辑性强
/
略显混乱。
【存在问题】示例如下:
问题
1
,如:卖点讲解不够深入,对
"三重玻尿酸"
的概念解释不清
问题
2
,如:缺少具体案例和数据支撑,说服力不足
问题
3
,如:卖点讲解顺序混乱,没有逻辑层次
问题
4
,如:遗漏重要卖点
"神经酰胺和角鲨烷"
,影响产品价值传达
【改进建议】示例如下:
具体建议
1
,如:讲解
"三重玻尿酸"
时,要说明
"大中小分子玻尿酸,分别作用于肌肤不同层次,大分子锁水、中分子补水、小分子深层渗透"
具体建议
2
,如:引用具体数据
"真人实测48小时后肌肤水润度依然提升40%"
增强说服力
...
...
@@ -275,12 +286,15 @@ const handleAIScore = async () => {
4
、促单能力
【现状描述】详细描述当前促单话术使用情况,如:促单环节共
X
次,促单话术包括
...
促单效果一般
/
良好
/
不足。
【存在问题】示例如下:
问题
1
,如:促单话术力度不够,缺乏紧迫感营造
问题
2
,如:未充分强调价格优惠,
"秒杀价69元"
只提了一次
问题
3
,如:限时限量信息传达不清,未能激发购买欲望
问题
4
,如:组合优惠活动讲解不够清晰,观众可能不理解
【改进建议】示例如下:
具体建议
1
,如:在秒杀环节强调
"只剩最后5分钟!只有100份!现在还剩XX份!"
营造紧迫感
具体建议
2
,如:多次强调价格对比
"平时99元,今天秒杀只要69元,一片才6.9元,太划算了!"
...
...
@@ -290,12 +304,15 @@ const handleAIScore = async () => {
5
、整体表现力
【现状描述】详细描述整体表现,如:仪表整洁,妆容得体。肢体语言自然
/
略显僵硬。镜头感良好
/
需加强。整体自信度较好
/
略显紧张。
【存在问题】示例如下:
问题
1
,如:肢体语言不够丰富,全程较为僵硬
问题
2
,如:眼神交流不够,经常低头看脚本
问题
3
,如:产品展示不够充分,没有特写展示
问题
4
,如:整体略显紧张,影响自信度
【改进建议】示例如下:
具体建议
1
,如:增加手势配合讲解,如讲
"三重玻尿酸"
时用手势比划
"三层"
具体建议
2
,如:尽量看镜头而不是脚本,熟记话术内容
...
...
@@ -306,37 +323,23 @@ const handleAIScore = async () => {
四、语速分析报告
━━
(一)语速分析
━━
(一)语速分析
整体语速数据
平均语速:
XXX
字
/
分钟
最快语速:
XXX
字
/
分钟(出现在第
X
分
X
秒)
最慢语速:
XXX
字
/
分钟(出现在第
X
分
X
秒)
语速波动:
XX
字
/
分钟(标准差)
━━
(二)语速标准参考
━━
理想语速:
180
-
220
字
/
分钟
-
观众能够轻松跟上
-
有足够时间理解信息
-
节奏舒适,不紧不慢
偏快语速:
221
-
240
字
/
分钟
-
部分观众可能跟不上
-
影响信息吸收效果
-
建议适当放慢
过快语速:
>
240
字
/
分钟
-
大部分观众难以跟上
-
严重影响直播效果
-
必须改进
偏慢语速:
150
-
179
字
/
分钟
-
节奏稍显拖沓
-
可能影响直播间活跃度
-
建议适当加快
过慢语速:
<
150
字
/
分钟
-
节奏过于拖沓
-
观众容易失去耐心
-
必须改进
(二)语速标准参考
1
、理想语速:
180
-
220
字
/
分钟
2
、偏快语速:
221
-
240
字
/
分钟
3
、过快语速:
>
240
字
/
分钟
4
、偏慢语速:
150
-
179
字
/
分钟
5
、过慢语速:
<
150
字
/
分钟
━━
(三)语速曲线分析
━━
【语速统计区间】(输出为表格,表头
和示例行保持不变
)
(三)语速曲线分析
【语速统计区间】(输出为表格,表头
保持不变,以直播实际实际的语速数据来进行展示,展示每分钟的语速分布情况,下表为展示表格的示例内容,表格里面的内容居中对齐
)
时间段
|
语速
(
字
/
分
)
|
评价
|
对应环节
---------------|-------------|--------|-------------
...
...
@@ -357,7 +360,8 @@ const handleAIScore = async () => {
14
:
00
-
15
:
00
|
XXX
|
✅正常
|
结束语
━━
(四)语速异常时间段详细分析
━━
(四)语速异常时间段详细分析
示例如下:
【异常片段
#
1
】━━━━━━━━━━━━
时间:
XX
:
XX
-
XX
:
XX
(
X
分钟)
...
...
@@ -380,8 +384,10 @@ const handleAIScore = async () => {
数据:
XXX
字
/
分钟(低于标准
XX
字
/
分钟)
对应内容:【具体内容,如:互动环节】
━━
(五)语速变化趋势分析
━━
(五)语速变化趋势分析
【整体趋势】描述语速在整场直播中的变化趋势,如:开场语速正常,在产品讲解环节(
4
-
6
分钟)明显加快,互动环节放慢,促销环节又再次加快,结束语恢复正常。整体呈现
"波浪形"
变化,稳定性不足。
【问题诊断】示例如下:
主要问题:【如:在需要重点讲解的环节(产品卖点)语速反而过快,影响效果】
次要问题:【如:语速波动过大,缺乏整体节奏控制】
...
...
@@ -492,7 +498,7 @@ function formatDuration(seconds) {
<li>
覆盖率:
{{
((
successWords
.
length
/
detail
.
words
?.
length
)
*
100
).
toFixed
(
2
)
}}
%
</li>
</ul>
<div
class=
"live-markdown"
>
<
VueMarkdown
:source=
"result.sellingPoints"
v-if=
"result.sellingPoints"
/>
<
MarkdownRender
:source=
"result.sellingPoints"
v-if=
"result.sellingPoints"
/>
</div>
<h2
class=
"live-title"
>
已讲解卖点:
</h2>
<el-steps
direction=
"vertical"
:active=
"1"
>
...
...
@@ -509,23 +515,23 @@ function formatDuration(seconds) {
</AppCard>
<AppCard
title=
"违禁词分析"
>
<div
class=
"live-markdown"
>
<
VueMarkdown
:source=
"result.forbiddenWords"
v-if=
"result.forbiddenWords"
/>
<
MarkdownRender
:source=
"result.forbiddenWords"
v-if=
"result.forbiddenWords"
/>
</div>
</AppCard>
<AppCard
title=
"语速分析"
>
<div
class=
"live-markdown"
>
<
VueMarkdown
:source=
"result.speechSpeed"
v-if=
"result.speechSpeed"
/>
<
MarkdownRender
:source=
"result.speechSpeed"
v-if=
"result.speechSpeed"
/>
</div>
</AppCard>
<AppCard
title=
"直播优化建议"
>
<div
class=
"live-markdown"
>
<
VueMarkdown
:source=
"result.optimizationTips"
v-if=
"result.optimizationTips"
/>
<
MarkdownRender
:source=
"result.optimizationTips"
v-if=
"result.optimizationTips"
/>
</div>
</AppCard>
<AppCard
v-if=
"false"
>
<h2
class=
"live-title"
>
违规情况
</h2>
<div
class=
"live-markdown"
>
<
VueMarkdown
:source=
"result.illegal_word"
v-if=
"result.illegal_word"
/>
<
MarkdownRender
:source=
"result.illegal_word"
v-if=
"result.illegal_word"
/>
</div>
</AppCard>
<AppCard
v-if=
"false"
>
...
...
src/modules/live/test/views/Index.vue
浏览文件 @
ab4da3a1
...
...
@@ -83,7 +83,9 @@ const handleRemove = async (row) => {
</
template
>
<
template
#
table-x=
"{ row }"
>
<el-button
text
type=
"primary"
>
<router-link
:to=
"
{ path: 'test/demo', query: { id: row.id } }">开始直播
</router-link>
<router-link
:to=
"
{ path: 'test/demo', query: { id: row.id } }" v-if="row.practice_count == 0"
>开始直播
</router-link
>
</el-button>
<el-button
text
type=
"primary"
@
click=
"handelView(row)"
>
查看
</el-button>
<el-button
text
type=
"primary"
@
click=
"handleRemove(row)"
>
删除
</el-button>
...
...
src/modules/operations/views/Index.vue
浏览文件 @
ab4da3a1
...
...
@@ -45,19 +45,19 @@ const typeMap = {
{
name
:
2
,
label
:
'第二步'
,
title
:
'导语(
5
分)'
,
title
:
'导语(
3
分)'
,
key
:
'intro'
,
},
{
name
:
3
,
label
:
'第三步'
,
title
:
'正文报道文字(不少于200字)(
5
分)'
,
title
:
'正文报道文字(不少于200字)(
7
分)'
,
key
:
'content'
,
},
{
name
:
4
,
label
:
'第四步'
,
title
:
'主题活动(场景)现场照片(不少于2张)(
10
分)'
,
title
:
'主题活动(场景)现场照片(不少于2张)(
5
分)'
,
key
:
'images'
,
isImage
:
true
,
},
...
...
@@ -65,7 +65,7 @@ const typeMap = {
name
:
5
,
label
:
'第五步'
,
title
:
'原创视频短片(不少于60秒)。该视频至少包括:字幕、音乐或音效、一段同期声采访(或现场声)等要素。(3
0
分)'
,
'原创视频短片(不少于60秒)。该视频至少包括:字幕、音乐或音效、一段同期声采访(或现场声)等要素。(3
5
分)'
,
key
:
'video'
,
isVideo
:
true
,
},
...
...
@@ -82,7 +82,7 @@ const typeMap = {
{
name
:
2
,
label
:
'第二步'
,
title
:
'流量运营及直播运营的预期成效分析(
5
分)'
,
title
:
'流量运营及直播运营的预期成效分析(
10
分)'
,
key
:
'traffic'
,
},
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论