npmapps 1.0.25 → 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 (212) 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/SmartAnchorTabs/index.jsx +0 -224
  122. package/app/wujie-vue3-child/src/components/SmartAnchorTabs/style.css +0 -154
  123. package/app/wujie-vue3-child/src/components/tags-view.vue +0 -193
  124. package/app/wujie-vue3-child/src/components/tags-view1.vue +0 -131
  125. package/app/wujie-vue3-child/src/directives/aiLoading.js +0 -182
  126. package/app/wujie-vue3-child/src/hooks/useClickOutside.js +0 -11
  127. package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +0 -28
  128. package/app/wujie-vue3-child/src/main.js +0 -18
  129. package/app/wujie-vue3-child/src/router/index.js +0 -104
  130. package/app/wujie-vue3-child/src/store/tagsViewStroe.js +0 -34
  131. package/app/wujie-vue3-child/src/style.css +0 -171
  132. package/app/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.jsx +0 -108
  133. package/app/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.module.scss +0 -97
  134. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +0 -836
  135. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +0 -728
  136. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +0 -687
  137. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +0 -560
  138. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +0 -570
  139. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +0 -330
  140. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +0 -378
  141. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +0 -228
  142. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +0 -399
  143. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +0 -252
  144. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +0 -585
  145. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +0 -331
  146. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +0 -392
  147. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +0 -39
  148. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +0 -248
  149. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +0 -194
  150. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +0 -1459
  151. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +0 -301
  152. package/app/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.jsx +0 -182
  153. package/app/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.module.scss +0 -28
  154. package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +0 -375
  155. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +0 -121
  156. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +0 -76
  157. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +0 -104
  158. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +0 -75
  159. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +0 -12
  160. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +0 -62
  161. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +0 -43
  162. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +0 -29
  163. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +0 -5
  164. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +0 -58
  165. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +0 -85
  166. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +0 -92
  167. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +0 -56
  168. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +0 -40
  169. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +0 -53
  170. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +0 -106
  171. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +0 -132
  172. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +0 -176
  173. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +0 -96
  174. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +0 -162
  175. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +0 -16
  176. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +0 -29
  177. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +0 -25
  178. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +0 -106
  179. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +0 -164
  180. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +0 -182
  181. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +0 -203
  182. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +0 -145
  183. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +0 -126
  184. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +0 -67
  185. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +0 -105
  186. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +0 -81
  187. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +0 -47
  188. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +0 -64
  189. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +0 -85
  190. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +0 -39
  191. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +0 -44
  192. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +0 -83
  193. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +0 -101
  194. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +0 -50
  195. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +0 -25
  196. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/index.jsx +0 -196
  197. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/index.module.scss +0 -41
  198. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.jsx +0 -183
  199. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.module.scss +0 -115
  200. package/app/wujie-vue3-child/src/views/child-to-parent.vue +0 -117
  201. package/app/wujie-vue3-child/src/views/home.vue +0 -53
  202. package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +0 -169
  203. package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +0 -69
  204. package/app/wujie-vue3-child/src/views/jsx/com.vue +0 -44
  205. package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +0 -66
  206. package/app/wujie-vue3-child/src/views/jsx/index.vue +0 -72
  207. package/app/wujie-vue3-child/src/views/jsx/props.vue +0 -33
  208. package/app/wujie-vue3-child/src/views/parent-to-child.vue +0 -225
  209. package/app/wujie-vue3-child/src/views/phone-code.vue +0 -318
  210. package/app/wujie-vue3-child/src/views/router-jump.vue +0 -123
  211. package/app/wujie-vue3-child/src/views/test.vue +0 -192
  212. package/app/wujie-vue3-child/vite.config.js +0 -15
@@ -1,106 +0,0 @@
1
- import { defineComponent, onMounted, ref, watch, onUnmounted } from 'vue'
2
- import * as echarts from 'echarts'
3
-
4
- export default defineComponent({
5
- name: 'EchartsDonut',
6
- props: {
7
- series: {
8
- type: Array,
9
- default: () => [],
10
- },
11
- hiddenLegend: {
12
- type: Array,
13
- default: () => [],
14
- },
15
- height: {
16
- type: Number,
17
- default: 200,
18
- },
19
- },
20
- setup(props) {
21
- const chartRef = ref(null)
22
- let chartInstance = null
23
-
24
- const initChart = () => {
25
- if (!chartRef.value) return
26
- chartInstance = echarts.init(chartRef.value)
27
- updateOption()
28
- }
29
-
30
- const updateOption = () => {
31
- if (!chartInstance) return
32
- // 过滤掉被隐藏的项
33
- const data = props.series
34
- .filter((item) => !props.hiddenLegend.includes(item.name))
35
- .map((item) => ({
36
- name: item.name,
37
- value: item.value,
38
- itemStyle: { color: item.color },
39
- }))
40
-
41
- // 计算总数
42
- const total = data.reduce((sum, item) => sum + (Number(item.value) || 0), 0)
43
-
44
- const option = {
45
- tooltip: {
46
- trigger: 'item',
47
- formatter: '{b}: {c} ({d}%)',
48
- },
49
- legend: {
50
- show: false, // 外部已有 Legend
51
- },
52
- series: [
53
- {
54
- name: '进度统计',
55
- type: 'pie',
56
- radius: ['55%', '90%'],
57
- avoidLabelOverlap: true,
58
- label: {
59
- show: true,
60
- position: 'inside',
61
- formatter: '{c}({d}%)',
62
- color: '#000',
63
- fontSize: 12,
64
- },
65
- labelLine: {
66
- show: false,
67
- },
68
- data: data,
69
- },
70
- ],
71
- }
72
- chartInstance.setOption(option)
73
- }
74
-
75
- watch(
76
- () => [props.series, props.hiddenLegend],
77
- () => {
78
- updateOption()
79
- },
80
- { deep: true }
81
- )
82
-
83
- onMounted(() => {
84
- initChart()
85
- window.addEventListener('resize', handleResize)
86
- })
87
-
88
- onUnmounted(() => {
89
- if (chartInstance) {
90
- chartInstance.dispose()
91
- }
92
- window.removeEventListener('resize', handleResize)
93
- })
94
-
95
- const handleResize = () => {
96
- chartInstance?.resize()
97
- }
98
-
99
- return () => (
100
- <div
101
- ref={chartRef}
102
- style={{ width: '100%', height: `${props.height}px` }}
103
- ></div>
104
- )
105
- },
106
- })
@@ -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
- }