npmapps 1.0.24 → 1.0.26

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 (210) hide show
  1. package/app/.codegraph/daemon.pid +6 -0
  2. package/app/.eslintrc.js +19 -0
  3. package/app/README.md +24 -0
  4. package/app/babel.config.js +5 -0
  5. package/app/devtool-windows-amd64.zip +0 -0
  6. package/app/docs/superpowers/plans/2026-05-29-quill-editor.md +836 -0
  7. package/app/docs/superpowers/specs/2026-05-29-quill-editor-design.md +210 -0
  8. package/app/docs/superpowers/specs/2026-06-06-lazy-cascader-design.md +400 -0
  9. package/app/jsconfig.json +19 -0
  10. package/app/package-lock.json +21347 -0
  11. package/app/package.json +63 -0
  12. package/app/postcss.config.js +10 -0
  13. package/app/public/favicon.ico +0 -0
  14. package/app/public/index.html +17 -0
  15. package/app/public//344/270/200/351/224/256/351/273/221/346/232/227.html +136 -0
  16. package/app/src/App.vue +110 -0
  17. package/app/src/assets/bpmn-camunda.jpg +0 -0
  18. package/app/src/assets/css/diagram.less +17 -0
  19. package/app/src/assets/icon/Icon.less +31 -0
  20. package/app/src/assets/icon/font/app-codes.css +26 -0
  21. package/app/src/assets/icon/font/app.eot +0 -0
  22. package/app/src/assets/icon/font/app.svg +60 -0
  23. package/app/src/assets/icon/font/app.ttf +0 -0
  24. package/app/src/assets/icon/font/app.woff +0 -0
  25. package/app/src/assets/icon/font/app.woff2 +0 -0
  26. package/app/src/assets/icon/font/config.json +248 -0
  27. package/app/src/assets/icon/font/source/raw/align-bottom-tool.svg +30 -0
  28. package/app/src/assets/icon/font/source/raw/align-horizontal-center-tool.svg +85 -0
  29. package/app/src/assets/icon/font/source/raw/align-left-tool.svg +84 -0
  30. package/app/src/assets/icon/font/source/raw/align-right-tool.svg +80 -0
  31. package/app/src/assets/icon/font/source/raw/align-top-tool.svg +84 -0
  32. package/app/src/assets/icon/font/source/raw/align-vertical-center-tool.svg +89 -0
  33. package/app/src/assets/icon/font/source/raw/distribute-horizontally-tool.svg +95 -0
  34. package/app/src/assets/icon/font/source/raw/distribute-vertically-tool.svg +99 -0
  35. package/app/src/assets/icon/font/source/raw/set-color-tool.svg +111 -0
  36. package/app/src/assets/icon/font/source/symbols/align-bottom-tool.svg +30 -0
  37. package/app/src/assets/icon/font/source/symbols/align-horizontal-center-tool.svg +30 -0
  38. package/app/src/assets/icon/font/source/symbols/align-left-tool.svg +30 -0
  39. package/app/src/assets/icon/font/source/symbols/align-right-tool.svg +30 -0
  40. package/app/src/assets/icon/font/source/symbols/align-top-tool.svg +30 -0
  41. package/app/src/assets/icon/font/source/symbols/align-vertical-center-tool.svg +30 -0
  42. package/app/src/assets/icon/font/source/symbols/distribute-horizontally-tool.svg +30 -0
  43. package/app/src/assets/icon/font/source/symbols/distribute-vertically-tool.svg +30 -0
  44. package/app/src/assets/icon/font/source/symbols/set-color-tool.svg +63 -0
  45. package/app/src/assets/logo.png +0 -0
  46. package/app/src/components/EllTable/README.md +70 -0
  47. package/app/src/components/EllTable/article.md +184 -0
  48. package/app/src/components/EllTable/index.js +213 -0
  49. package/app/src/components/FormulaEditor/FunctionSelector.vue +123 -0
  50. package/app/src/components/FormulaEditor/OperatorSelector.vue +184 -0
  51. package/app/src/components/FormulaEditor/ParameterSelector.vue +123 -0
  52. package/app/src/components/FormulaEditor/api.js +69 -0
  53. package/app/src/components/FormulaEditor/index.vue +435 -0
  54. package/app/src/components/HelloWorld.vue +58 -0
  55. package/app/src/components/PageHeader/index.vue +158 -0
  56. package/app/src/components/Splitter/README.md +144 -0
  57. package/app/src/components/Splitter/example.vue +88 -0
  58. package/app/src/components/Splitter/index.vue +203 -0
  59. package/app/src/components/diagram/ToolBar.vue +357 -0
  60. package/app/src/components/diagram/customTranslate/customTranslate.js +12 -0
  61. package/app/src/components/diagram/customTranslate/translationsGerman.js +241 -0
  62. package/app/src/components/diagram/index.vue +261 -0
  63. package/app/src/components/diagram/xmlData.js +29 -0
  64. package/app/src/directives/filldown.js +155 -0
  65. package/app/src/directives/filldownTable.js +291 -0
  66. package/app/src/main.js +40 -0
  67. package/app/src/router/index.js +63 -0
  68. package/app/src/store/index.js +23 -0
  69. package/app/src/utils/winBox.js +23 -0
  70. package/app/src/views/Extend/A.vue +12 -0
  71. package/app/src/views/Extend/B.vue +10 -0
  72. package/app/src/views/Extend/MagicalComponentsForELFormItem.vue +87 -0
  73. package/app/src/views/Extend/index.vue +59 -0
  74. package/app/src/views/Extend/tableMouseHorizontalWheel.vue +193 -0
  75. package/app/src/views/Home.vue +37 -0
  76. package/app/src/views/RouterJump.vue +155 -0
  77. package/app/src/views/css.vue +57 -0
  78. package/app/src/views/cssComponents/EllipsisText.vue +83 -0
  79. package/app/src/views/cssComponents/HoverCard.vue +79 -0
  80. package/app/src/views/cssComponents/TableHover.vue +140 -0
  81. package/app/src/views/cssComponents/inputSlo.vue +52 -0
  82. package/app/src/views/cssComponents/tableFixed.vue +158 -0
  83. package/app/src/views/echarts/echart-dome.vue +82 -0
  84. package/app/src/views/echarts/index.vue +118 -0
  85. package/app/src/views/echarts/pei3d.vue +667 -0
  86. package/app/src/views/element/bpmn/index.vue +18 -0
  87. package/app/src/views/element/components/attendanceCycle/index.vue +131 -0
  88. package/app/src/views/element/components/attendanceGroup/index.vue +147 -0
  89. package/app/src/views/element/components/attendancePersonnel/index.vue +158 -0
  90. package/app/src/views/element/components/companyCalendar/index.vue +147 -0
  91. package/app/src/views/element/components/shift/index.vue +147 -0
  92. package/app/src/views/element/components/shiftRotationSystem/index.vue +147 -0
  93. package/app/src/views/element/elTableJsx/columnManagement.vue +340 -0
  94. package/app/src/views/element/elTableJsx/dialogInput.vue +71 -0
  95. package/app/src/views/element/elTableJsx/elTableJsx.vue +1826 -0
  96. package/app/src/views/element/elTableJsx/formTable.vue +598 -0
  97. package/app/src/views/element/elTableJsx/index.vue +29 -0
  98. package/app/src/views/element/elTableJsx/simpleTable.vue +192 -0
  99. package/app/src/views/element/elTableJsx.zip +0 -0
  100. package/app/src/views/element/index.vue +44 -0
  101. package/app/src/views/element/lazyCascader/LazyCascader.vue +302 -0
  102. package/app/src/views/element/lazyCascader/data.js +205 -0
  103. package/app/src/views/element/lazyCascader/index.vue +315 -0
  104. package/app/src/views/element/quillEditor/README.md +163 -0
  105. package/app/src/views/element/quillEditor/example.vue +314 -0
  106. package/app/src/views/element/quillEditor/index.vue +409 -0
  107. package/app/src/views/element/quillEditor/toolbar.js +122 -0
  108. package/app/vue.config.js +15 -0
  109. package/package.json +1 -1
  110. package/app/wujie-vue3-child/.claude/settings.local.json +0 -8
  111. package/app/wujie-vue3-child/.vscode/extensions.json +0 -3
  112. package/app/wujie-vue3-child/PROJECT_MEMORY.md +0 -427
  113. package/app/wujie-vue3-child/README.md +0 -5
  114. package/app/wujie-vue3-child/index.html +0 -13
  115. package/app/wujie-vue3-child/package-lock.json +0 -5744
  116. package/app/wujie-vue3-child/package.json +0 -28
  117. package/app/wujie-vue3-child/public/vite.svg +0 -1
  118. package/app/wujie-vue3-child/src/App.vue +0 -130
  119. package/app/wujie-vue3-child/src/assets/vue.svg +0 -1
  120. package/app/wujie-vue3-child/src/components/HelloWorld.vue +0 -43
  121. package/app/wujie-vue3-child/src/components/tags-view.vue +0 -193
  122. package/app/wujie-vue3-child/src/components/tags-view1.vue +0 -131
  123. package/app/wujie-vue3-child/src/directives/aiLoading.js +0 -182
  124. package/app/wujie-vue3-child/src/hooks/useClickOutside.js +0 -11
  125. package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +0 -28
  126. package/app/wujie-vue3-child/src/main.js +0 -18
  127. package/app/wujie-vue3-child/src/router/index.js +0 -104
  128. package/app/wujie-vue3-child/src/store/tagsViewStroe.js +0 -34
  129. package/app/wujie-vue3-child/src/style.css +0 -171
  130. package/app/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.jsx +0 -108
  131. package/app/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.module.scss +0 -97
  132. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +0 -836
  133. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +0 -728
  134. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +0 -687
  135. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +0 -560
  136. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +0 -570
  137. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +0 -330
  138. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +0 -378
  139. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +0 -228
  140. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +0 -399
  141. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +0 -252
  142. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +0 -585
  143. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +0 -331
  144. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +0 -392
  145. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +0 -39
  146. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +0 -248
  147. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +0 -194
  148. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +0 -1459
  149. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +0 -301
  150. package/app/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.jsx +0 -182
  151. package/app/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.module.scss +0 -28
  152. package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +0 -293
  153. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +0 -121
  154. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +0 -76
  155. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +0 -104
  156. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +0 -75
  157. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +0 -12
  158. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +0 -62
  159. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +0 -43
  160. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +0 -29
  161. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +0 -5
  162. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +0 -58
  163. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +0 -85
  164. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +0 -92
  165. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +0 -56
  166. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +0 -40
  167. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +0 -53
  168. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +0 -106
  169. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +0 -132
  170. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +0 -176
  171. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +0 -96
  172. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +0 -162
  173. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +0 -16
  174. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +0 -29
  175. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +0 -25
  176. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +0 -106
  177. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +0 -164
  178. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +0 -182
  179. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +0 -203
  180. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +0 -145
  181. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +0 -126
  182. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +0 -67
  183. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +0 -105
  184. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +0 -81
  185. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +0 -47
  186. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +0 -64
  187. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +0 -85
  188. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +0 -39
  189. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +0 -44
  190. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +0 -83
  191. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +0 -101
  192. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +0 -50
  193. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +0 -25
  194. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/index.jsx +0 -196
  195. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/index.module.scss +0 -41
  196. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.jsx +0 -183
  197. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.module.scss +0 -115
  198. package/app/wujie-vue3-child/src/views/child-to-parent.vue +0 -117
  199. package/app/wujie-vue3-child/src/views/home.vue +0 -53
  200. package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +0 -169
  201. package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +0 -69
  202. package/app/wujie-vue3-child/src/views/jsx/com.vue +0 -44
  203. package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +0 -66
  204. package/app/wujie-vue3-child/src/views/jsx/index.vue +0 -72
  205. package/app/wujie-vue3-child/src/views/jsx/props.vue +0 -33
  206. package/app/wujie-vue3-child/src/views/parent-to-child.vue +0 -225
  207. package/app/wujie-vue3-child/src/views/phone-code.vue +0 -318
  208. package/app/wujie-vue3-child/src/views/router-jump.vue +0 -123
  209. package/app/wujie-vue3-child/src/views/test.vue +0 -192
  210. package/app/wujie-vue3-child/vite.config.js +0 -15
@@ -1,132 +0,0 @@
1
- import { defineComponent, onMounted, ref, watch, onUnmounted } from 'vue'
2
- import * as echarts from 'echarts'
3
-
4
- export default defineComponent({
5
- name: 'EchartsRankBar',
6
- props: {
7
- data: {
8
- type: Array,
9
- default: () => [],
10
- },
11
- max: {
12
- type: Number,
13
- default: 0,
14
- },
15
- valueFormatter: {
16
- type: Function,
17
- default: (v) => v,
18
- },
19
- height: {
20
- type: Number,
21
- default: 300,
22
- },
23
- },
24
- setup(props) {
25
- const chartRef = ref(null)
26
- let chartInstance = null
27
-
28
- const initChart = () => {
29
- if (!chartRef.value) return
30
- chartInstance = echarts.init(chartRef.value)
31
- updateOption()
32
- }
33
-
34
- const updateOption = () => {
35
- if (!chartInstance) return
36
-
37
- // 为了保证顺序(排名第一在最上面),ECharts 默认 category 轴是从下往上画的(index 0 在下)。
38
- // 所以通常需要把数据 reverse 一下,或者 yAxis.inverse = true。
39
- // 这里 props.data 应该是已排序好的(第一名在 index 0)。
40
- // 使用 inverse: true 让 index 0 排在顶部。
41
-
42
- const labels = props.data.map((d) => d.name)
43
- const values = props.data.map((d) => d.value)
44
-
45
- // 如果没有传 max,就取数据最大值作为背景条最大值
46
- const maxValue = props.max || (values.length > 0 ? Math.max(...values) * 1.1 : 100)
47
-
48
- const option = {
49
- grid: {
50
- top: 10,
51
- bottom: 10,
52
- left: 10,
53
- right: 40, // 留给 label
54
- containLabel: true,
55
- },
56
- xAxis: {
57
- type: 'value',
58
- show: false,
59
- max: maxValue,
60
- },
61
- yAxis: {
62
- type: 'category',
63
- data: labels,
64
- inverse: true, // 反转,让第一个数据在顶部
65
- axisLine: { show: false },
66
- axisTick: { show: false },
67
- axisLabel: {
68
- color: '#606266',
69
- width: 60, // 限制宽度避免太宽
70
- overflow: 'truncate',
71
- },
72
- },
73
- series: [
74
- {
75
- type: 'bar',
76
- data: values,
77
- barWidth: 12,
78
- showBackground: true,
79
- backgroundStyle: {
80
- color: '#f5f7fa',
81
- borderRadius: 6,
82
- },
83
- itemStyle: {
84
- color: '#ff7d00',
85
- borderRadius: 6,
86
- },
87
- label: {
88
- show: true,
89
- position: 'right',
90
- formatter: (params) => {
91
- return props.valueFormatter(params.value)
92
- },
93
- color: '#333',
94
- },
95
- },
96
- ],
97
- }
98
- chartInstance.setOption(option)
99
- }
100
-
101
- watch(
102
- () => [props.data, props.max],
103
- () => {
104
- updateOption()
105
- },
106
- { deep: true }
107
- )
108
-
109
- onMounted(() => {
110
- initChart()
111
- window.addEventListener('resize', handleResize)
112
- })
113
-
114
- onUnmounted(() => {
115
- if (chartInstance) {
116
- chartInstance.dispose()
117
- }
118
- window.removeEventListener('resize', handleResize)
119
- })
120
-
121
- const handleResize = () => {
122
- chartInstance?.resize()
123
- }
124
-
125
- return () => (
126
- <div
127
- ref={chartRef}
128
- style={{ width: '100%', height: `${props.height}px` }}
129
- ></div>
130
- )
131
- },
132
- })
@@ -1,176 +0,0 @@
1
- import { defineComponent, ref } from 'vue'
2
- import styles from './index.module.scss'
3
- import StatCardsRow from './components/StatCardsRow'
4
- import ChartsPanel from './components/ChartsPanel'
5
- import PracticeTable from './components/PracticeTable'
6
- import ScriptStatsPanel from './components/ScriptStatsPanel'
7
-
8
- /**
9
- * 练习情况页面(按截图搭建)
10
- * 1) 组件化拆分:StatCardsRow / ChartsPanel / PracticeTable / ScriptStatsPanel
11
- * 2) 模拟数据:统一在父组件准备,props 传入子组件使用
12
- * 3) 所有组件均放在 practiceStatus 文件夹内(含子目录)
13
- * 4) JSX + Element Plus,风格对齐 aiCoach 目录现有写法
14
- */
15
- export default defineComponent({
16
- // 练习情况
17
- name: 'PracticeStatus',
18
- setup() {
19
- // 顶部 tabs(截图:计划统计/剧本统计)
20
- const activeTab = ref('plan')
21
- const useEcharts = ref(false)
22
- setTimeout(() => useEcharts.value = true, 1000)
23
-
24
- // 顶部筛选(截图:所属部门/职务)
25
- const filters = ref({
26
- dept: '全部部门',
27
- role: '全部职务',
28
- })
29
-
30
- // 模拟:练习数据概览(截图 6 个卡片)
31
- const overviewCards = ref([
32
- { key: 'students', label: '总学员人数', value: '828' },
33
- { key: 'rate', label: '完成率', value: '83.0%' },
34
- { key: 'avgCount', label: '平均练练次数', value: '1.9' },
35
- { key: 'avgDuration', label: '平均练练时长(分钟)', value: '10.1' },
36
- { key: 'firstAvg', label: '首次练习均分', value: '56.6' },
37
- { key: 'bestAvg', label: '最高一次均分', value: '83.4' },
38
- ])
39
-
40
- // 模拟:进度统计(截图:已完成/未开始/练习中)
41
- const progressSeries = ref([
42
- { name: '已完成', value: 68, color: '#ff7a00' },
43
- { name: '未开始', value: 6, color: '#7bdcf6' },
44
- { name: '练习中', value: 26, color: '#ffd08a' },
45
- ])
46
-
47
- // 模拟:学员练习时长排名(分钟)
48
- const durationRank = ref([
49
- { name: '张三', value: 469.7 },
50
- { name: '李四', value: 270.1 },
51
- { name: '王五', value: 75.1 },
52
- { name: '赵六', value: 74.8 },
53
- { name: '周七', value: 67.8 },
54
- { name: '吴八', value: 64.0 },
55
- { name: '郑九', value: 64.0 },
56
- { name: '钱十', value: 64.0 },
57
- ])
58
-
59
- // 模拟:学员最高一次均分排名(0-100)
60
- const scoreRank = ref([
61
- { name: '张三', value: 100 },
62
- { name: '李四', value: 100 },
63
- { name: '王五', value: 100 },
64
- { name: '赵六', value: 100 },
65
- { name: '周七', value: 98 },
66
- { name: '吴八', value: 96 },
67
- { name: '郑九', value: 90 },
68
- { name: '钱十', value: 88 },
69
- ])
70
-
71
- // 模拟:明细数据(截图表格)
72
- const tableData = ref(
73
- Array.from({ length: 30 }).map((_, idx) => {
74
- const base = idx % 10
75
- const score = [80, 70, 75, 90, 96, 56, 78, 67, 69, 99][base]
76
- const progress = ['2/5', '5/5', '5/5', '5/5', '5/5', '5/5', '5/5', '5/5', '2/5', '2/5'][base]
77
- const passStatus = score >= 60 ? '通过' : '未通过'
78
- return {
79
- id: `${Date.now()}-${idx}`,
80
- jobNo: '123456',
81
- name: ['张三', '李四', '王五', '赵六', '周七', '吴八'][idx % 6],
82
- planName: '标准内容',
83
- scriptName: '标准内容',
84
- startTime: '2025-08-01',
85
- endTime: '2025-09-01',
86
- status: '已完成',
87
- score,
88
- passStatus,
89
- progress,
90
- }
91
- }),
92
- )
93
-
94
- return () => {
95
- return <div>
96
- <div class={styles.practiceStatus}>
97
- <div class={styles.toolbar}>
98
- <div class={styles.toolbarLeft}>
99
- <div class={styles.tabsWrap}>
100
- <div
101
- class={[styles.tabBtn, activeTab.value === 'plan' ? styles.tabBtnActive : null]}
102
- onClick={() => (activeTab.value = 'plan')}
103
- >
104
- 计划统计
105
- </div>
106
- <div
107
- class={[styles.tabBtn, activeTab.value === 'script' ? styles.tabBtnActive : null]}
108
- onClick={() => (activeTab.value = 'script')}
109
- >
110
- 剧本统计
111
- </div>
112
- </div>
113
- </div>
114
- {activeTab.value === 'plan' && (
115
- <div class={styles.toolbarRight}>
116
- <el-switch
117
- v-model={useEcharts.value}
118
- active-text="ECharts"
119
- inactive-text="CSS"
120
- style={{ marginRight: '16px' }}
121
- />
122
- <el-select size="small" style={{ width: '120px' }} v-model={filters.value.dept}>
123
- <el-option label="全部部门" value="全部部门" />
124
- <el-option label="销售一部" value="销售一部" />
125
- <el-option label="销售二部" value="销售二部" />
126
- </el-select>
127
- <el-select size="small" style={{ width: '120px' }} v-model={filters.value.role}>
128
- <el-option label="全部职务" value="全部职务" />
129
- <el-option label="导购" value="导购" />
130
- <el-option label="店长" value="店长" />
131
- </el-select>
132
- <el-button size="small">下载</el-button>
133
- </div>
134
- )}
135
- {activeTab.value === 'script' && (
136
- <div class={styles.toolbarRight}>
137
- <el-switch
138
- v-model={useEcharts.value}
139
- active-text="ECharts"
140
- inactive-text="CSS"
141
- style={{ marginRight: '16px' }}
142
- />
143
- </div>
144
- )}
145
- </div>
146
-
147
- {activeTab.value === 'plan' ? (
148
- <>
149
- <div class={styles.section}>
150
- <div class={styles.sectionHeader}>练习数据概览</div>
151
- <StatCardsRow cards={overviewCards.value} />
152
- </div>
153
-
154
- <div class={styles.section}>
155
- <div class={styles.sectionHeader}>练习情况统计</div>
156
- <ChartsPanel
157
- progress={progressSeries.value}
158
- durationRank={durationRank.value}
159
- scoreRank={scoreRank.value}
160
- useEcharts={useEcharts.value}
161
- />
162
- </div>
163
-
164
- <div class={styles.section}>
165
- <div class={styles.sectionHeader}>明细数据</div>
166
- <PracticeTable data={tableData.value} pageSize={10} />
167
- </div>
168
- </>
169
- ) : (
170
- <ScriptStatsPanel useEcharts={useEcharts.value} />
171
- )}
172
- </div>
173
- </div>
174
- }
175
- },
176
- })
@@ -1,96 +0,0 @@
1
- .practiceStatus {
2
- width: 100%;
3
- max-width: 1100px;
4
- }
5
-
6
- .toolbar {
7
- display: flex;
8
- justify-content: space-between;
9
- align-items: center;
10
- margin-bottom: 12px;
11
- }
12
-
13
- .toolbarLeft {
14
- display: flex;
15
- align-items: center;
16
- gap: 8px;
17
- }
18
-
19
- .toolbarTitle {
20
- display: flex;
21
- align-items: center;
22
- font-size: 16px;
23
- font-weight: 600;
24
- color: #303133;
25
- }
26
-
27
- .toolbarTitle:before {
28
- content: '';
29
- display: inline-block;
30
- width: 3px;
31
- height: 14px;
32
- background: #ff7a00;
33
- border-radius: 2px;
34
- margin-right: 8px;
35
- }
36
-
37
- .toolbarRight {
38
- display: flex;
39
- align-items: center;
40
- gap: 10px;
41
- }
42
-
43
- .section {
44
- margin-top: 12px;
45
- }
46
-
47
- .sectionHeader {
48
- display: flex;
49
- align-items: center;
50
- margin-bottom: 10px;
51
- font-size: 14px;
52
- font-weight: 600;
53
- color: #303133;
54
- }
55
-
56
- .sectionHeader:before {
57
- content: '';
58
- display: inline-block;
59
- width: 3px;
60
- height: 14px;
61
- background: #ff7a00;
62
- border-radius: 2px;
63
- margin-right: 8px;
64
- }
65
-
66
- /* Tabs */
67
- .tabsWrap {
68
- display: flex;
69
- gap: 8px;
70
- }
71
-
72
- .tabBtn {
73
- padding: 6px 16px;
74
- border: 1px solid #dcdfe6;
75
- background: #fff;
76
- border-radius: 4px;
77
- color: #606266;
78
- cursor: pointer;
79
- font-size: 14px;
80
- transition: all 0.2s;
81
- }
82
-
83
- .tabBtn:hover {
84
- color: #ff7a00;
85
- border-color: #ff7a00;
86
- }
87
-
88
- .tabBtnActive {
89
- background: #ff7a00;
90
- border-color: #ff7a00;
91
- color: #fff;
92
- }
93
-
94
- .tabBtnActive:hover {
95
- color: #fff;
96
- }
@@ -1,162 +0,0 @@
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
- })
@@ -1,16 +0,0 @@
1
- // 陪练报告样式
2
- .coachReport {
3
- width: 100%;
4
- }
5
-
6
- .overviewSection {
7
- margin-bottom: 24px;
8
- }
9
-
10
- .detailSection {
11
- margin-bottom: 24px;
12
-
13
- &:last-child {
14
- margin-bottom: 0;
15
- }
16
- }
@@ -1,29 +0,0 @@
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
- })
@@ -1,25 +0,0 @@
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
- }