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.
Files changed (105) hide show
  1. package/app/Wscats.vue-1.0.26.vsix +0 -0
  2. package/app/febean.vue-format-0.1.8.vsix +0 -0
  3. package/app/wujie-vue3-child/.claude/settings.local.json +8 -0
  4. package/app/wujie-vue3-child/.vscode/extensions.json +3 -0
  5. package/app/wujie-vue3-child/PROJECT_MEMORY.md +427 -0
  6. package/app/wujie-vue3-child/README.md +5 -0
  7. package/app/wujie-vue3-child/index.html +13 -0
  8. package/app/wujie-vue3-child/package-lock.json +5744 -0
  9. package/app/wujie-vue3-child/package.json +28 -0
  10. package/app/wujie-vue3-child/public/vite.svg +1 -0
  11. package/app/wujie-vue3-child/src/App.vue +130 -0
  12. package/app/wujie-vue3-child/src/assets/vue.svg +1 -0
  13. package/app/wujie-vue3-child/src/components/HelloWorld.vue +43 -0
  14. package/app/wujie-vue3-child/src/components/tags-view.vue +193 -0
  15. package/app/wujie-vue3-child/src/components/tags-view1.vue +131 -0
  16. package/app/wujie-vue3-child/src/hooks/useClickOutside.js +11 -0
  17. package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +28 -0
  18. package/app/wujie-vue3-child/src/main.js +15 -0
  19. package/app/wujie-vue3-child/src/router/index.js +104 -0
  20. package/app/wujie-vue3-child/src/store/tagsViewStroe.js +34 -0
  21. package/app/wujie-vue3-child/src/style.css +4 -0
  22. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +836 -0
  23. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +728 -0
  24. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +687 -0
  25. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +560 -0
  26. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +570 -0
  27. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +330 -0
  28. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +378 -0
  29. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +228 -0
  30. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +399 -0
  31. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +252 -0
  32. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +585 -0
  33. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +331 -0
  34. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +392 -0
  35. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +39 -0
  36. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +248 -0
  37. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +194 -0
  38. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +1459 -0
  39. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +301 -0
  40. package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.jsx +28 -4
  41. package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +32 -0
  42. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +121 -0
  43. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +76 -0
  44. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +104 -0
  45. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +75 -0
  46. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +12 -0
  47. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +62 -0
  48. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +43 -0
  49. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +29 -0
  50. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +5 -0
  51. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +58 -0
  52. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +85 -0
  53. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +92 -0
  54. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +56 -0
  55. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +40 -0
  56. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +53 -0
  57. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +106 -0
  58. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +132 -0
  59. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +176 -0
  60. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +96 -0
  61. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +162 -0
  62. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +16 -0
  63. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +29 -0
  64. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +25 -0
  65. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +106 -0
  66. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +164 -0
  67. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +182 -0
  68. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +203 -0
  69. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +145 -0
  70. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +126 -0
  71. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +67 -0
  72. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +105 -0
  73. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +81 -0
  74. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +47 -0
  75. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +64 -0
  76. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +85 -0
  77. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +39 -0
  78. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +44 -0
  79. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +83 -0
  80. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +101 -0
  81. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +50 -0
  82. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +25 -0
  83. package/app/wujie-vue3-child/src/views/child-to-parent.vue +117 -0
  84. package/app/wujie-vue3-child/src/views/home.vue +53 -0
  85. package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +169 -0
  86. package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +69 -0
  87. package/app/wujie-vue3-child/src/views/jsx/com.vue +44 -0
  88. package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +66 -0
  89. package/app/wujie-vue3-child/src/views/jsx/index.vue +72 -0
  90. package/app/wujie-vue3-child/src/views/jsx/props.vue +33 -0
  91. package/app/wujie-vue3-child/src/views/parent-to-child.vue +225 -0
  92. package/app/wujie-vue3-child/src/views/phone-code.vue +318 -0
  93. package/app/wujie-vue3-child/src/views/router-jump.vue +123 -0
  94. package/app/wujie-vue3-child/src/views/test.vue +192 -0
  95. package/app/wujie-vue3-child/vite.config.js +15 -0
  96. package/package.json +1 -1
  97. package/app/aiCoach/index.jsx +0 -20
  98. package/npmapps-1.0.20.tgz +0 -0
  99. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.jsx +0 -0
  100. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/collapseExpand/index.module.scss +0 -0
  101. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/dialogueSegment/index.module.scss +0 -0
  102. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.jsx +0 -0
  103. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/index.module.scss +0 -0
  104. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.jsx +0 -0
  105. /package/app/{aiCoach → wujie-vue3-child/src/views/aiCoach}/scriptTable/inputColumn/index.module.scss +0 -0
@@ -0,0 +1,67 @@
1
+ import { defineComponent } from 'vue'
2
+ import styles from './index.module.scss'
3
+
4
+ /**
5
+ * 维度评分组件
6
+ * @description 显示各个评分维度的进度条和得分
7
+ */
8
+ export default defineComponent({
9
+ name: 'DimensionScores',
10
+
11
+ props: {
12
+ // 维度列表
13
+ dimensions: {
14
+ type: Array,
15
+ required: true,
16
+ // 数据格式: [{ name: '话术准确度', score: 10, total: 10, color: 'green' }]
17
+ },
18
+ },
19
+
20
+ setup(props) {
21
+ // 获取进度条颜色类
22
+ const getColorClass = (color) => {
23
+ return styles[`progress${color.charAt(0).toUpperCase() + color.slice(1)}`]
24
+ }
25
+
26
+ // 计算进度百分比
27
+ const getPercentage = (score, total) => {
28
+ return (score / total) * 100
29
+ }
30
+
31
+ return () => {
32
+ return (
33
+ <div class={styles.dimensionScores}>
34
+
35
+ {props.dimensions.map((dimension, index) => {
36
+ const percentage = getPercentage(dimension.score, dimension.total)
37
+ const colorClass = getColorClass(dimension.color)
38
+
39
+ return (
40
+ <div key={index} class={styles.dimensionItem}>
41
+ <div class={styles.dimensionHeader}>
42
+ <span class={styles.dimensionName}>{dimension.name}</span>
43
+ <span class={[styles.dimensionScore, colorClass]}>
44
+ {dimension.score}/{dimension.total}
45
+ </span>
46
+ </div>
47
+ <div class={styles.progressBar}>
48
+ <div
49
+ class={[styles.progressFill, colorClass]}
50
+ style={{ width: `${percentage}%` }}
51
+ ></div>
52
+ </div>
53
+ </div>
54
+ )
55
+ })}
56
+
57
+ {/* 底部评级说明 */}
58
+ <div class={styles.ratingLegend}>
59
+ <span class={styles.legendItem}>0分</span>
60
+ <span class={styles.legendItem}>通过</span>
61
+ <span class={styles.legendItem}>满分</span>
62
+ </div>
63
+ </div>
64
+ )
65
+ }
66
+ },
67
+ })
@@ -0,0 +1,105 @@
1
+ // 维度评分样式
2
+ .dimensionScores {
3
+ background: #fff;
4
+ padding: 20px 24px;
5
+ border-radius: 8px;
6
+ height: 300px;
7
+ display: flex;
8
+ flex-direction: column;
9
+ }
10
+
11
+ .sectionTitle {
12
+ font-size: 16px;
13
+ font-weight: 600;
14
+ color: #262626;
15
+ margin: 0 0 20px 0;
16
+ padding-bottom: 12px;
17
+ border-bottom: 1px solid #f0f0f0;
18
+ }
19
+
20
+ .dimensionItem {
21
+ margin-bottom: 20px;
22
+
23
+ &:last-child {
24
+ margin-bottom: 0;
25
+ }
26
+ }
27
+
28
+ .dimensionHeader {
29
+ display: flex;
30
+ justify-content: space-between;
31
+ align-items: center;
32
+ margin-bottom: 10px;
33
+ }
34
+
35
+ .dimensionName {
36
+ font-size: 14px;
37
+ color: #262626;
38
+ font-weight: 400;
39
+ }
40
+
41
+ .dimensionScore {
42
+ font-size: 15px;
43
+ font-weight: 600;
44
+ }
45
+
46
+ .progressBar {
47
+ width: 100%;
48
+ height: 10px;
49
+ background: #f5f5f5;
50
+ border-radius: 5px;
51
+ overflow: hidden;
52
+ }
53
+
54
+ .progressFill {
55
+ height: 100%;
56
+ border-radius: 5px;
57
+ transition: width 0.3s ease;
58
+ }
59
+
60
+ // 进度条颜色类型
61
+ .progressGreen {
62
+ color: #52c41a;
63
+
64
+ &.progressFill {
65
+ background: linear-gradient(90deg, #52c41a 0%, #73d13d 100%);
66
+ }
67
+ }
68
+
69
+ .progressOrange {
70
+ color: #fa8c16;
71
+
72
+ &.progressFill {
73
+ background: linear-gradient(90deg, #fa8c16 0%, #ffa940 100%);
74
+ }
75
+ }
76
+
77
+ .progressRed {
78
+ color: #ff4d4f;
79
+
80
+ &.progressFill {
81
+ background: linear-gradient(90deg, #ff4d4f 0%, #ff7875 100%);
82
+ }
83
+ }
84
+
85
+ .progressGray {
86
+ color: #d9d9d9;
87
+
88
+ &.progressFill {
89
+ background: #d9d9d9;
90
+ }
91
+ }
92
+
93
+ // 评级说明
94
+ .ratingLegend {
95
+ display: flex;
96
+ justify-content: space-between;
97
+ margin-top: 24px;
98
+ padding-top: 16px;
99
+ border-top: 1px solid #f0f0f0;
100
+ }
101
+
102
+ .legendItem {
103
+ font-size: 12px;
104
+ color: #8c8c8c;
105
+ }
@@ -0,0 +1,81 @@
1
+ import { defineComponent } from 'vue'
2
+ import styles from './index.module.scss'
3
+ import ScoreBadge from '../ScoreBadge/index.jsx'
4
+
5
+ /**
6
+ * 报告头部组件
7
+ * @description 显示报告标题、基本信息和分数徽章
8
+ */
9
+ export default defineComponent({
10
+ name: 'ReportHeader',
11
+
12
+ props: {
13
+ // 报告标题
14
+ title: {
15
+ type: String,
16
+ required: true,
17
+ },
18
+ // 是否中途退出
19
+ isQuit: {
20
+ type: Boolean,
21
+ default: false,
22
+ },
23
+ // 练习时间
24
+ practiceTime: {
25
+ type: String,
26
+ required: true,
27
+ },
28
+ // 轮次
29
+ rounds: {
30
+ type: Number,
31
+ required: true,
32
+ },
33
+ // 时长
34
+ duration: {
35
+ type: String,
36
+ required: true,
37
+ },
38
+ // 得分
39
+ score: {
40
+ type: Number,
41
+ required: true,
42
+ },
43
+ // 是否达标
44
+ isPassed: {
45
+ type: Boolean,
46
+ default: false,
47
+ },
48
+ },
49
+
50
+ setup(props) {
51
+ return () => {
52
+ return (
53
+ <div class={styles.reportHeader}>
54
+ <div class={styles.headerContent}>
55
+ {/* 左侧:标题和基本信息 */}
56
+ <div class={styles.leftSection}>
57
+ <div class={styles.titleRow}>
58
+ <h2 class={styles.title}>{props.title}</h2>
59
+ {props.isQuit && (
60
+ <el-tag type="warning" size="small">
61
+ 中途退出
62
+ </el-tag>
63
+ )}
64
+ </div>
65
+ <div class={styles.infoRow}>
66
+ <span class={styles.infoItem}>{props.practiceTime}</span>
67
+ <span class={styles.infoItem}>轮次:{props.rounds}轮</span>
68
+ <span class={styles.infoItem}>时长:{props.duration}</span>
69
+ </div>
70
+ </div>
71
+
72
+ {/* 右侧:分数徽章 */}
73
+ <div class={styles.rightSection}>
74
+ <ScoreBadge score={props.score} isPassed={props.isPassed} />
75
+ </div>
76
+ </div>
77
+ </div>
78
+ )
79
+ }
80
+ },
81
+ })
@@ -0,0 +1,47 @@
1
+ // 报告头部样式
2
+ .reportHeader {
3
+ background: linear-gradient(180deg, #FFF0E6 0%, #FFFFFF 100%);
4
+ padding: 12px 24px;
5
+ border-radius: 12px;
6
+ margin-bottom: 24px;
7
+ }
8
+
9
+ .headerContent {
10
+ display: flex;
11
+ justify-content: space-between;
12
+ align-items: center;
13
+ }
14
+
15
+ .leftSection {
16
+ flex: 1;
17
+ }
18
+
19
+ .titleRow {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: 12px;
23
+ margin-bottom: 16px;
24
+ }
25
+
26
+ .title {
27
+ font-size: 28px;
28
+ font-weight: 600;
29
+ color: #262626;
30
+ margin: 0;
31
+ }
32
+
33
+ .infoRow {
34
+ display: flex;
35
+ gap: 32px;
36
+ color: #595959;
37
+ font-size: 15px;
38
+ }
39
+
40
+ .infoItem {
41
+ display: inline-block;
42
+ }
43
+
44
+ .rightSection {
45
+ flex-shrink: 0;
46
+ padding-left: 40px;
47
+ }
@@ -0,0 +1,64 @@
1
+ import { defineComponent, toRefs } from 'vue'
2
+ import styles from './index.module.scss'
3
+
4
+ /**
5
+ * 陪练角色信息组件
6
+ * @description 显示陪练角色的基本信息(头像、姓名、性别、年龄、标签)
7
+ */
8
+ export default defineComponent({
9
+ name: 'RoleInfo',
10
+
11
+ props: {
12
+ data: {
13
+ type: Object,
14
+ default: () => ({
15
+ avatar: '', // 头像URL,为空时显示占位符
16
+ name: '',
17
+ gender: '',
18
+ age: 0,
19
+ tag: '',
20
+ description: '',
21
+ }),
22
+ },
23
+ },
24
+
25
+ setup(props) {
26
+ const { data } = toRefs(props)
27
+ return () => {
28
+ return (
29
+ <div class={styles.roleInfo}>
30
+ <h3 class={styles.sectionTitle}>陪练角色</h3>
31
+
32
+ <div class={styles.roleCard}>
33
+ {/* 头像 */}
34
+ <div class={styles.avatar}>
35
+ {data.value.avatar ? (
36
+ <img src={data.value.avatar} alt={data.value.name} />
37
+ ) : (
38
+ <div class={styles.avatarPlaceholder}>
39
+ {data.value.name.charAt(0)}
40
+ </div>
41
+ )}
42
+ </div>
43
+
44
+ {/* 基本信息 */}
45
+ <div class={styles.infoSection}>
46
+ <div class={styles.infoItem}>
47
+ <div class={styles.name}>{data.value.name}</div>
48
+ <div class={styles.details}>
49
+ <span class={styles.detailItem}>{data.value.gender}</span>
50
+ <span class={styles.divider}>·</span>
51
+ <span class={styles.detailItem}>{data.value.age}</span>
52
+ <span class={styles.divider}>·</span>
53
+ <span class={styles.detailItem}>{data.value.tag}</span>
54
+ </div>
55
+ </div>
56
+ {/* 描述 */}
57
+ <div class={styles.description}>{data.value.description}</div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ )
62
+ }
63
+ },
64
+ })
@@ -0,0 +1,85 @@
1
+ // 陪练角色信息样式
2
+ .roleInfo {
3
+ background: #fff;
4
+ padding: 20px 24px;
5
+ border-radius: 8px;
6
+ margin-top: 24px;
7
+ }
8
+
9
+ .sectionTitle {
10
+ font-size: 22px;
11
+ font-weight: 600;
12
+ color: #262626;
13
+ margin: 0 0 16px 0;
14
+ padding-bottom: 12px;
15
+ }
16
+
17
+ .roleCard {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 16px;
21
+ background-color: #F8F8F8;
22
+ padding: 20px;
23
+ border-radius: 12px;
24
+ }
25
+
26
+ .avatar {
27
+ width: 60px;
28
+ height: 60px;
29
+ border-radius: 8px;
30
+ overflow: hidden;
31
+ flex-shrink: 0;
32
+
33
+ img {
34
+ width: 100%;
35
+ height: 100%;
36
+ object-fit: cover;
37
+ }
38
+ }
39
+
40
+ .avatarPlaceholder {
41
+ width: 100%;
42
+ height: 100%;
43
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ color: #fff;
48
+ font-size: 22px;
49
+ font-weight: 600;
50
+ }
51
+
52
+ .infoSection {
53
+ flex: 1;
54
+ background-color: #fff;
55
+ padding: 20px;
56
+ border-radius: 12px;
57
+ .infoItem {
58
+ margin-bottom: 12px;
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 18px;
62
+ }
63
+ }
64
+
65
+
66
+ .name {
67
+ font-size: 16px;
68
+ font-weight: 600;
69
+ color: #262626;
70
+ }
71
+
72
+ .details {
73
+ display: flex;
74
+ align-items: center;
75
+ font-size: 14px;
76
+ color: #8c8c8c;
77
+ }
78
+
79
+ .detailItem {
80
+ display: inline-block;
81
+ }
82
+
83
+ .divider {
84
+ margin: 0 8px;
85
+ }
@@ -0,0 +1,39 @@
1
+ import { defineComponent } from 'vue'
2
+ import styles from './index.module.scss'
3
+
4
+ /**
5
+ * 分数徽章组件
6
+ * @description 显示练习得分和达标状态的六边形徽章
7
+ */
8
+ export default defineComponent({
9
+ name: 'ScoreBadge',
10
+
11
+ props: {
12
+ // 分数
13
+ score: {
14
+ type: Number,
15
+ required: true,
16
+ },
17
+ // 是否达标
18
+ isPassed: {
19
+ type: Boolean,
20
+ default: false,
21
+ },
22
+ },
23
+
24
+ setup(props) {
25
+ return () => {
26
+ const statusText = props.isPassed ? '已达标' : '未达标'
27
+ const badgeClass = props.isPassed ? styles.passed : styles.failed
28
+
29
+ return (
30
+ <div class={[styles.scoreBadge, badgeClass]}>
31
+ <div class={styles.hexagon}>
32
+ <div class={styles.score}>{props.score}</div>
33
+ <div class={styles.status}>{statusText}</div>
34
+ </div>
35
+ </div>
36
+ )
37
+ }
38
+ },
39
+ })
@@ -0,0 +1,44 @@
1
+ // 分数徽章样式
2
+ .scoreBadge {
3
+ position: relative;
4
+ width: 120px;
5
+ height: 138px;
6
+ }
7
+
8
+ .hexagon {
9
+ position: relative;
10
+ width: 120px;
11
+ height: 138px;
12
+ background: linear-gradient(135deg, #ff6b6b 0%, #ff8e53 100%);
13
+ clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
14
+ display: flex;
15
+ flex-direction: column;
16
+ align-items: center;
17
+ justify-content: center;
18
+ box-shadow: 0 4px 12px rgba(255, 107, 107, 0.3);
19
+ }
20
+
21
+ .score {
22
+ font-size: 48px;
23
+ font-weight: bold;
24
+ color: #fff;
25
+ line-height: 1;
26
+ }
27
+
28
+ .status {
29
+ font-size: 14px;
30
+ color: #fff;
31
+ margin-top: 4px;
32
+ }
33
+
34
+ // 已达标状态
35
+ .passed .hexagon {
36
+ background: linear-gradient(135deg, #52c41a 0%, #73d13d 100%);
37
+ box-shadow: 0 4px 12px rgba(82, 196, 26, 0.3);
38
+ }
39
+
40
+ // 未达标状态
41
+ .failed .hexagon {
42
+ background: linear-gradient(135deg, #ff6b6b 0%, #ff8e53 100%);
43
+ box-shadow: 0 4px 12px rgba(255, 107, 107, 0.3);
44
+ }
@@ -0,0 +1,83 @@
1
+ import { defineComponent } from 'vue'
2
+ import styles from './index.module.scss'
3
+
4
+ /**
5
+ * 子维度项组件
6
+ * @description 显示评分维度下的子维度详情(如语言组织的易于理解、逻辑性等)
7
+ */
8
+ export default defineComponent({
9
+ name: 'SubDimensionItem',
10
+
11
+ props: {
12
+ // 维度名称
13
+ name: {
14
+ type: String,
15
+ required: true,
16
+ },
17
+ // 得分
18
+ score: {
19
+ type: Number,
20
+ required: true,
21
+ },
22
+ // 总分
23
+ total: {
24
+ type: Number,
25
+ required: true,
26
+ },
27
+ // 评价内容
28
+ comment: {
29
+ type: String,
30
+ default: '',
31
+ },
32
+ },
33
+
34
+ setup(props) {
35
+ // 计算进度百分比
36
+ const percentage = (props.score / props.total) * 100
37
+
38
+ // 根据分数百分比确定进度条颜色类型
39
+ const getProgressColorClass = () => {
40
+ if (percentage >= 60) {
41
+ return styles.progressFillHigh // 大于等于60:绿色
42
+ } else if (percentage >= 30) {
43
+ return styles.progressFillMedium // 30-60:黄色
44
+ } else {
45
+ return styles.progressFillLow // 低于30:红色
46
+ }
47
+ }
48
+
49
+ return () => {
50
+ return (
51
+ <div class={styles.subDimensionItem}>
52
+ {/* 维度标题和分数 */}
53
+ <div class={styles.header}>
54
+ <span class={styles.name}>{props.name}</span>
55
+ <span class={styles.score}>{props.score}分</span>
56
+ </div>
57
+
58
+ {/* 进度条 */}
59
+ <div class={styles.progressBar}>
60
+ <div class={styles.progressTrack}>
61
+ <div
62
+ class={getProgressColorClass()}
63
+ style={{ width: `${percentage}%` }}
64
+ ></div>
65
+ </div>
66
+ <div class={styles.progressLabels}>
67
+ <span>0</span>
68
+ <span>{props.total}</span>
69
+ </div>
70
+ </div>
71
+
72
+ {/* 评价内容 */}
73
+ {props.comment && (
74
+ <div class={styles.comment}>
75
+ <span class={styles.commentIcon}>👍</span>
76
+ <span class={styles.commentText}>{props.comment}</span>
77
+ </div>
78
+ )}
79
+ </div>
80
+ )
81
+ }
82
+ },
83
+ })