npmapps 1.0.21 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/Wscats.vue-1.0.26.vsix +0 -0
- package/app/febean.vue-format-0.1.8.vsix +0 -0
- package/app/wujie-vue3-child/.claude/settings.local.json +8 -0
- package/app/wujie-vue3-child/.vscode/extensions.json +3 -0
- package/app/wujie-vue3-child/PROJECT_MEMORY.md +427 -0
- package/app/wujie-vue3-child/README.md +5 -0
- package/app/wujie-vue3-child/index.html +13 -0
- package/app/wujie-vue3-child/package-lock.json +5744 -0
- package/app/wujie-vue3-child/package.json +28 -0
- package/app/wujie-vue3-child/public/vite.svg +1 -0
- package/app/wujie-vue3-child/src/App.vue +130 -0
- package/app/wujie-vue3-child/src/assets/vue.svg +1 -0
- package/app/wujie-vue3-child/src/components/HelloWorld.vue +43 -0
- package/app/wujie-vue3-child/src/components/tags-view.vue +193 -0
- package/app/wujie-vue3-child/src/components/tags-view1.vue +131 -0
- package/app/wujie-vue3-child/src/hooks/useClickOutside.js +11 -0
- package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +28 -0
- package/app/wujie-vue3-child/src/main.js +15 -0
- package/app/wujie-vue3-child/src/router/index.js +104 -0
- package/app/wujie-vue3-child/src/store/tagsViewStroe.js +34 -0
- package/app/wujie-vue3-child/src/style.css +4 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +836 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +728 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +687 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +560 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +570 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +330 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +378 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +228 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +399 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +252 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +585 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +331 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +392 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +39 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +248 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +194 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +1459 -0
- package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +301 -0
- package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.jsx +28 -4
- package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +32 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +121 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +76 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +104 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +75 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +12 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +62 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +43 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +29 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +5 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +58 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +85 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +92 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +56 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +40 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +53 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +106 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +132 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +176 -0
- package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +96 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +162 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +16 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +29 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +25 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +106 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +164 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +182 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +203 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +145 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +126 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +67 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +105 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +81 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +47 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +64 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +85 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +39 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +44 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +83 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +101 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +50 -0
- package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +25 -0
- package/app/wujie-vue3-child/src/views/child-to-parent.vue +117 -0
- package/app/wujie-vue3-child/src/views/home.vue +53 -0
- package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +169 -0
- package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +69 -0
- package/app/wujie-vue3-child/src/views/jsx/com.vue +44 -0
- package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +66 -0
- package/app/wujie-vue3-child/src/views/jsx/index.vue +72 -0
- package/app/wujie-vue3-child/src/views/jsx/props.vue +33 -0
- package/app/wujie-vue3-child/src/views/parent-to-child.vue +225 -0
- package/app/wujie-vue3-child/src/views/phone-code.vue +318 -0
- package/app/wujie-vue3-child/src/views/router-jump.vue +123 -0
- package/app/wujie-vue3-child/src/views/test.vue +192 -0
- package/app/wujie-vue3-child/vite.config.js +15 -0
- package/package.json +1 -1
- package/app/aiCoach/index.jsx +0 -20
- package/npmapps-1.0.20.tgz +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.jsx +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.module.scss +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.module.scss +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.jsx +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.module.scss +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.jsx +0 -0
- /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.module.scss +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { defineComponent, ref } from 'vue'
|
|
2
|
+
import styles from './index.module.scss'
|
|
3
|
+
import DimensionScores from '../DimensionScores/index.jsx'
|
|
4
|
+
import ComprehensiveEvaluation from '../ComprehensiveEvaluation/index.jsx'
|
|
5
|
+
import RoleInfo from '../RoleInfo/index.jsx'
|
|
6
|
+
import DimensionDetail from '../DimensionDetail/index.jsx'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 陪练报告组件
|
|
10
|
+
* @description 显示陪练报告的详细内容,包括维度评分、综合评价、角色信息和各维度详情
|
|
11
|
+
*/
|
|
12
|
+
export default defineComponent({
|
|
13
|
+
name: 'CoachReport',
|
|
14
|
+
|
|
15
|
+
setup() {
|
|
16
|
+
// ==================== 模拟数据 ====================
|
|
17
|
+
|
|
18
|
+
// 维度评分数据
|
|
19
|
+
const dimensionsData = ref([
|
|
20
|
+
{ name: '话术准确度', score: 10, total: 10, color: 'green' },
|
|
21
|
+
{ name: '语言组织', score: 9, total: 10, color: 'green' },
|
|
22
|
+
{ name: '需求倾听记录', score: 22, total: 28, color: 'orange' },
|
|
23
|
+
{ name: '产品介绍解答', score: 17, total: 27, color: 'orange' },
|
|
24
|
+
{ name: '产品推荐促成', score: 0, total: 26, color: 'red' },
|
|
25
|
+
])
|
|
26
|
+
|
|
27
|
+
// 综合评价数据
|
|
28
|
+
const evaluationContent = ref(
|
|
29
|
+
'在整个对话过程中,你表现出了良好的职业素养。语言表达清晰易懂,逻辑较为明确,且态度友好,具有亲和力。在倾听用户需求方面,能够引导用户说出关键信息,但在记录关键信息上还有所欠缺,没有及时总结和确认用户的资金流动要求和目标收益率等重要内容。后续可以加强这方面的能力。'
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
// 陪练角色数据
|
|
33
|
+
const roleData = ref({
|
|
34
|
+
avatar: '', // 头像URL,为空时显示占位符
|
|
35
|
+
name: '王白白',
|
|
36
|
+
gender: '女',
|
|
37
|
+
age: 35,
|
|
38
|
+
tag: '企业白领',
|
|
39
|
+
description: `王白白是一个经验丰富的企业白领,她在客户服务领域有丰富的经验。她的专业知识和良好的客户服务能力使得客户在与她互动时能够获得满意的服务。
|
|
40
|
+
谨慎细致,做事有条不,对待保险这类重要决策极为慎重。沟通时专注认真,会详细记录理财经理的
|
|
41
|
+
介绍内容。习惯对关键信息反复确认,情绪较为稳定,不会轻易被推销话术影响。做决策前会全面考量
|
|
42
|
+
产品的各项细节,权衡利弊后才会行动。`,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// 话术准确度详情数据
|
|
46
|
+
const speechAccuracyDetail = ref({
|
|
47
|
+
dimension: {
|
|
48
|
+
name: '话术准确度',
|
|
49
|
+
score: 10,
|
|
50
|
+
total: 10,
|
|
51
|
+
icon: '👏',
|
|
52
|
+
description: '本项分数基于你全部话术的平均表现得出',
|
|
53
|
+
},
|
|
54
|
+
dialogues: [
|
|
55
|
+
{
|
|
56
|
+
question: '您好,速汇盈直联后我们内部系统就和你们打通了,安全性有保障吗?',
|
|
57
|
+
answer:
|
|
58
|
+
'王总,系统的安全性能您可以放心,我行会提供多重保障,主要是有三方面向您汇报。首先,第一是在客户端,我们会通过前置机加UK对物理数据进行一个隔离,那就像防火墙一样,保障信息的安全。二呢,是在数据端,系统会自动对企业发出的原始指令进行数据加密和加密,就跟摩斯密码一样,确保外部无法解析,但是在银行端呢,我们采用了国际上最高的安全标准,就像中国电建、上汽集团这样的国央企呢,已经和我们进行了试点。这个模式的安全性在国资委已经获得了普及...',
|
|
59
|
+
score: 98,
|
|
60
|
+
scoreDetails: [
|
|
61
|
+
{ name: '关键词', score: 20, total: 20, tags: ['多重保障'] },
|
|
62
|
+
{ name: '语义准确', score: 78, total: 80, tags: [] },
|
|
63
|
+
],
|
|
64
|
+
suggestion: '你在对话中表现的非常好,请继续保持!',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
question: '这个产品的收益率是多少?',
|
|
68
|
+
answer:
|
|
69
|
+
'关于收益率,我们这款产品是浮动收益型的,近一年的年化收益率在4.5%-5.2%之间,相比市场同类产品具有较强的竞争力。而且我们有专业的投资团队进行管理,历史业绩表现稳定。',
|
|
70
|
+
score: 95,
|
|
71
|
+
scoreDetails: [
|
|
72
|
+
{ name: '关键词', score: 18, total: 20, tags: ['年化收益率'] },
|
|
73
|
+
{ name: '语义准确', score: 77, total: 80, tags: [] },
|
|
74
|
+
],
|
|
75
|
+
suggestion: '回答准确,继续保持!',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
// 语言组织详情数据
|
|
81
|
+
const languageOrganizationDetail = ref({
|
|
82
|
+
dimension: {
|
|
83
|
+
name: '语言组织',
|
|
84
|
+
score: 9,
|
|
85
|
+
total: 9,
|
|
86
|
+
icon: '👏',
|
|
87
|
+
description:
|
|
88
|
+
'你在语言组织方面表现不错。回答清晰易懂,用防火墙和摩斯密码作比喻,让抽象的安全保障概念变得形象易懂,这一点做得非常好。',
|
|
89
|
+
},
|
|
90
|
+
subDimensions: [
|
|
91
|
+
{
|
|
92
|
+
name: '易于理解',
|
|
93
|
+
score: 1,
|
|
94
|
+
total: 3,
|
|
95
|
+
comment:
|
|
96
|
+
'你在介绍系统安全保障时,运用防火墙和摩斯密码的比喻,使抽象的安全保障概念变得形象易懂,让对方能轻松理解内容,这一点做得非常好。',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: '逻辑性',
|
|
100
|
+
score: 2,
|
|
101
|
+
total: 3,
|
|
102
|
+
comment:
|
|
103
|
+
'你按照客户端、数据端、银行端的顺序,有条理地介绍系统安全保障的三个方面,逻辑清晰,让对方能清楚了解整体情况,表现十分出色。',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: '亲和力',
|
|
107
|
+
score: 3,
|
|
108
|
+
total: 3,
|
|
109
|
+
comment:
|
|
110
|
+
'你使用"王总"这一友好称呼,迅速拉近与对方的关系,展现出良好的亲和力,让交流氛围更加融洽,值得称赞。',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
return () => {
|
|
116
|
+
return (
|
|
117
|
+
<div class={styles.coachReport}>
|
|
118
|
+
{/* 总览区域 */}
|
|
119
|
+
<div class={styles.overviewSection}>
|
|
120
|
+
{/* 第一行:维度评分和综合评价 */}
|
|
121
|
+
<el-row gutter={24}>
|
|
122
|
+
{/* 左侧:维度评分 */}
|
|
123
|
+
<el-col span={10}>
|
|
124
|
+
<DimensionScores dimensions={dimensionsData.value} />
|
|
125
|
+
</el-col>
|
|
126
|
+
|
|
127
|
+
{/* 右侧:综合评价 */}
|
|
128
|
+
<el-col span={14}>
|
|
129
|
+
<ComprehensiveEvaluation content={evaluationContent.value} />
|
|
130
|
+
</el-col>
|
|
131
|
+
</el-row>
|
|
132
|
+
|
|
133
|
+
{/* 第二行:角色信息 */}
|
|
134
|
+
<el-row gutter={24}>
|
|
135
|
+
<el-col span={24}>
|
|
136
|
+
<RoleInfo data={roleData.value} />
|
|
137
|
+
</el-col>
|
|
138
|
+
</el-row>
|
|
139
|
+
</div>
|
|
140
|
+
|
|
141
|
+
{/* 话术准确度详情 */}
|
|
142
|
+
<div class={styles.detailSection}>
|
|
143
|
+
<DimensionDetail
|
|
144
|
+
type="dialogue"
|
|
145
|
+
dimension={speechAccuracyDetail.value.dimension}
|
|
146
|
+
dialogues={speechAccuracyDetail.value.dialogues}
|
|
147
|
+
/>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
{/* 语言组织详情 */}
|
|
151
|
+
<div class={styles.detailSection}>
|
|
152
|
+
<DimensionDetail
|
|
153
|
+
type="subdimension"
|
|
154
|
+
dimension={languageOrganizationDetail.value.dimension}
|
|
155
|
+
subDimensions={languageOrganizationDetail.value.subDimensions}
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineComponent } from 'vue'
|
|
2
|
+
import styles from './index.module.scss'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 综合评价组件
|
|
6
|
+
* @description 显示AI对练习表现的综合评价文字
|
|
7
|
+
*/
|
|
8
|
+
export default defineComponent({
|
|
9
|
+
name: 'ComprehensiveEvaluation',
|
|
10
|
+
|
|
11
|
+
props: {
|
|
12
|
+
// 评价内容
|
|
13
|
+
content: {
|
|
14
|
+
type: String,
|
|
15
|
+
required: true,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
setup(props) {
|
|
20
|
+
return () => {
|
|
21
|
+
return (
|
|
22
|
+
<div class={styles.comprehensiveEvaluation}>
|
|
23
|
+
<h3 class={styles.title}>综合评价</h3>
|
|
24
|
+
<div class={styles.content}>{props.content}</div>
|
|
25
|
+
</div>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
})
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// 综合评价样式
|
|
2
|
+
.comprehensiveEvaluation {
|
|
3
|
+
background: #fff;
|
|
4
|
+
padding: 20px 24px;
|
|
5
|
+
border-radius: 8px;
|
|
6
|
+
height: 300px;
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.title {
|
|
13
|
+
font-size: 16px;
|
|
14
|
+
font-weight: 600;
|
|
15
|
+
color: #262626;
|
|
16
|
+
margin: 0 0 16px 0;
|
|
17
|
+
padding-bottom: 12px;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.content {
|
|
21
|
+
font-size: 14px;
|
|
22
|
+
color: #595959;
|
|
23
|
+
line-height: 1.8;
|
|
24
|
+
text-align: justify;
|
|
25
|
+
}
|
package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { defineComponent } from 'vue'
|
|
2
|
+
import styles from './index.module.scss'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 对话气泡组件
|
|
6
|
+
* @description 显示客户问题和AI回答的对话气泡
|
|
7
|
+
*/
|
|
8
|
+
export default defineComponent({
|
|
9
|
+
name: 'DialogueBubble',
|
|
10
|
+
|
|
11
|
+
props: {
|
|
12
|
+
// 对话数据
|
|
13
|
+
dialogue: {
|
|
14
|
+
type: Object,
|
|
15
|
+
required: true,
|
|
16
|
+
// 数据格式: { question: 'AI提问', answer: '用户回答', score: 98 }
|
|
17
|
+
},
|
|
18
|
+
// 得分详情
|
|
19
|
+
scoreDetails: {
|
|
20
|
+
type: Array,
|
|
21
|
+
default: () => [],
|
|
22
|
+
// 数据格式: [{ name: '关键词', score: 20, total: 20, tags: ['多重保障'] }]
|
|
23
|
+
},
|
|
24
|
+
// 指导建议
|
|
25
|
+
suggestion: {
|
|
26
|
+
type: String,
|
|
27
|
+
default: '',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
setup(props) {
|
|
32
|
+
// 获取评分等级表情
|
|
33
|
+
const getScoreEmoji = (score) => {
|
|
34
|
+
if (score >= 90) return '😃'
|
|
35
|
+
if (score >= 70) return '🙂'
|
|
36
|
+
if (score >= 60) return '😐'
|
|
37
|
+
return '😟'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return () => {
|
|
41
|
+
return (
|
|
42
|
+
<div class={styles.dialogueBubble}>
|
|
43
|
+
{/* 对话内容 */}
|
|
44
|
+
<div class={styles.dialogueContent}>
|
|
45
|
+
{/* AI提问 */}
|
|
46
|
+
<div class={styles.questionBubble}>
|
|
47
|
+
<div class={styles.bubbleText}>
|
|
48
|
+
<span class={styles.audioIcon}>🔊</span>
|
|
49
|
+
<span>{props.dialogue.question}</span>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
{/* 用户回答 */}
|
|
54
|
+
<div class={styles.answerBubble}>
|
|
55
|
+
<div class={styles.bubbleText}>
|
|
56
|
+
{props.dialogue.answer}
|
|
57
|
+
</div>
|
|
58
|
+
<div class={styles.scoreTag}>
|
|
59
|
+
<span class={styles.scoreValue}>{props.dialogue.score}分</span>
|
|
60
|
+
<span class={styles.scoreEmoji}>{getScoreEmoji(props.dialogue.score)}</span>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
{/* 得分明细卡片 */}
|
|
64
|
+
<div class={styles.scoreCard}>
|
|
65
|
+
{/* 得分明细 */}
|
|
66
|
+
<div class={styles.scoreDetails}>
|
|
67
|
+
<div class={styles.detailsTitle}>得分明细</div>
|
|
68
|
+
{props.scoreDetails.map((detail, index) => (
|
|
69
|
+
<div key={index} class={styles.detailItem}>
|
|
70
|
+
<div class={styles.detailHeader}>
|
|
71
|
+
<span class={styles.detailName}>{detail.name}</span>
|
|
72
|
+
<span class={styles.detailScore}>
|
|
73
|
+
{detail.score}/{detail.total}分
|
|
74
|
+
</span>
|
|
75
|
+
</div>
|
|
76
|
+
{detail.tags && detail.tags.length > 0 && (
|
|
77
|
+
<div class={styles.tags}>
|
|
78
|
+
<span class={styles.tagLabel}>
|
|
79
|
+
关键词共{detail.tags.length}个,命中{detail.tags.length}个
|
|
80
|
+
</span>
|
|
81
|
+
{detail.tags.map((tag, idx) => (
|
|
82
|
+
<el-tag key={idx} type="success" size="small">
|
|
83
|
+
{tag}
|
|
84
|
+
</el-tag>
|
|
85
|
+
))}
|
|
86
|
+
</div>
|
|
87
|
+
)}
|
|
88
|
+
</div>
|
|
89
|
+
))}
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
{/* 指导建议 */}
|
|
93
|
+
{props.suggestion && (
|
|
94
|
+
<div class={styles.suggestion}>
|
|
95
|
+
<div class={styles.suggestionTitle}>指导建议</div>
|
|
96
|
+
<div class={styles.suggestionContent}>{props.suggestion}</div>
|
|
97
|
+
</div>
|
|
98
|
+
)}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
})
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// 对话气泡样式
|
|
2
|
+
.dialogueBubble {
|
|
3
|
+
background: #f8f8f8;
|
|
4
|
+
padding: 16px;
|
|
5
|
+
border-radius: 0 0 8px 8px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// 对话内容
|
|
9
|
+
.dialogueContent {
|
|
10
|
+
margin-bottom: 0;
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: 16px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.questionBubble {
|
|
17
|
+
display: flex;
|
|
18
|
+
justify-content: flex-start;
|
|
19
|
+
align-self: flex-start;
|
|
20
|
+
max-width: 70%;
|
|
21
|
+
|
|
22
|
+
.bubbleText {
|
|
23
|
+
background: #f5f5f5;
|
|
24
|
+
color: #262626;
|
|
25
|
+
padding: 14px 16px;
|
|
26
|
+
border-radius: 8px 8px 8px 2px;
|
|
27
|
+
line-height: 1.7;
|
|
28
|
+
font-size: 14px;
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
gap: 8px;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.answerBubble {
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
align-items: flex-end;
|
|
39
|
+
align-self: flex-end;
|
|
40
|
+
background: #e4ebfd;
|
|
41
|
+
padding: 16px;
|
|
42
|
+
border-radius: 8px;
|
|
43
|
+
max-width: 80%;
|
|
44
|
+
|
|
45
|
+
.bubbleText {
|
|
46
|
+
background: transparent;
|
|
47
|
+
color: #262626;
|
|
48
|
+
padding: 0;
|
|
49
|
+
max-width: 100%;
|
|
50
|
+
line-height: 1.7;
|
|
51
|
+
font-size: 14px;
|
|
52
|
+
margin-bottom: 12px;
|
|
53
|
+
width: 100%;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.scoreTag {
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 6px;
|
|
61
|
+
margin-bottom: 12px;
|
|
62
|
+
align-self: flex-end;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.scoreValue {
|
|
66
|
+
font-size: 16px;
|
|
67
|
+
font-weight: 600;
|
|
68
|
+
color: #ff8c00;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.scoreEmoji {
|
|
72
|
+
font-size: 16px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.audioIcon {
|
|
76
|
+
font-size: 16px;
|
|
77
|
+
cursor: pointer;
|
|
78
|
+
opacity: 0.6;
|
|
79
|
+
flex-shrink: 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 得分明细卡片
|
|
83
|
+
.scoreCard {
|
|
84
|
+
background: #ffffff;
|
|
85
|
+
padding: 16px 20px;
|
|
86
|
+
border-radius: 8px;
|
|
87
|
+
align-self: stretch;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 得分明细
|
|
91
|
+
.scoreDetails {
|
|
92
|
+
margin-bottom: 16px;
|
|
93
|
+
|
|
94
|
+
&:last-child {
|
|
95
|
+
margin-bottom: 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.detailsTitle {
|
|
100
|
+
font-size: 15px;
|
|
101
|
+
font-weight: 600;
|
|
102
|
+
color: #fa8c16;
|
|
103
|
+
margin-bottom: 12px;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.detailItem {
|
|
107
|
+
margin-bottom: 12px;
|
|
108
|
+
|
|
109
|
+
&:last-child {
|
|
110
|
+
margin-bottom: 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.detailHeader {
|
|
115
|
+
display: flex;
|
|
116
|
+
justify-content: space-between;
|
|
117
|
+
align-items: center;
|
|
118
|
+
margin-bottom: 6px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.detailName {
|
|
122
|
+
font-size: 14px;
|
|
123
|
+
color: #262626;
|
|
124
|
+
font-weight: 500;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.detailScore {
|
|
128
|
+
font-size: 15px;
|
|
129
|
+
color: #52c41a;
|
|
130
|
+
font-weight: 600;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.tags {
|
|
134
|
+
display: flex;
|
|
135
|
+
gap: 8px;
|
|
136
|
+
flex-wrap: wrap;
|
|
137
|
+
align-items: center;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.tagLabel {
|
|
141
|
+
font-size: 13px;
|
|
142
|
+
color: #595959;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// 指导建议
|
|
146
|
+
.suggestion {
|
|
147
|
+
padding-top: 16px;
|
|
148
|
+
border-top: 1px solid rgba(0, 0, 0, 0.06);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.suggestionTitle {
|
|
152
|
+
font-size: 15px;
|
|
153
|
+
font-weight: 600;
|
|
154
|
+
color: #fa8c16;
|
|
155
|
+
margin-bottom: 8px;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.suggestionContent {
|
|
159
|
+
font-size: 14px;
|
|
160
|
+
color: #262626;
|
|
161
|
+
line-height: 1.7;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|