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,75 +0,0 @@
1
- import { defineComponent, ref, computed } from 'vue'
2
- import styles from './index.module.scss'
3
-
4
- /**
5
- * 明细数据表格
6
- * - 组件化目的:后续切换接口数据时,只替换 props.data
7
- * - 目前仅实现展示与分页(模拟分页)
8
- */
9
- export default defineComponent({
10
- name: 'PracticeStatusPracticeTable',
11
- props: {
12
- data: {
13
- type: Array,
14
- default: () => [],
15
- },
16
- pageSize: {
17
- type: Number,
18
- default: 10,
19
- },
20
- },
21
- setup(props) {
22
- const currentPage = ref(1)
23
-
24
- const total = computed(() => props.data.length)
25
- const pageCount = computed(() => Math.max(1, Math.ceil(total.value / props.pageSize)))
26
-
27
- const pageData = computed(() => {
28
- const start = (currentPage.value - 1) * props.pageSize
29
- return props.data.slice(start, start + props.pageSize)
30
- })
31
-
32
- const handlePageChange = (p) => {
33
- currentPage.value = p
34
- }
35
-
36
- return () => (
37
- <div class={styles.tableWrap}>
38
- <el-table data={pageData.value} stripe style={{ width: '100%' }}>
39
- <el-table-column type="selection" width="44" />
40
- <el-table-column prop="jobNo" label="工号" width="90" />
41
- <el-table-column prop="name" label="姓名" width="80" />
42
- <el-table-column prop="planName" label="计划名称" />
43
- <el-table-column prop="scriptName" label="脚本名称" />
44
- <el-table-column prop="startTime" label="开始时间" width="120" />
45
- <el-table-column prop="endTime" label="结束时间" width="120" />
46
- <el-table-column prop="status" label="完成状态" width="90" />
47
- <el-table-column prop="score" label="得分" width="70" />
48
- <el-table-column prop="passStatus" label="通过状态" width="90" />
49
- <el-table-column prop="progress" label="练习进度" width="90" />
50
- <el-table-column label="操作" width="110">
51
- {{
52
- default: (scope) => (
53
- <el-button link size="small" type="primary" onClick={() => console.log('查看练习记录', scope.row)}>
54
- 查看练习记录
55
- </el-button>
56
- ),
57
- }}
58
- </el-table-column>
59
- </el-table>
60
-
61
- <div class={styles.paginationRow}>
62
- <el-pagination
63
- background
64
- currentPage={currentPage.value}
65
- pageSize={props.pageSize}
66
- total={total.value}
67
- layout="total, prev, pager, next"
68
- onCurrentChange={handlePageChange}
69
- />
70
- </div>
71
- </div>
72
- )
73
- },
74
- })
75
-
@@ -1,12 +0,0 @@
1
- .tableWrap {
2
- background: #fff;
3
- border-radius: 8px;
4
- padding: 12px;
5
- border: 1px solid #ebeef5;
6
- }
7
-
8
- .paginationRow {
9
- display: flex;
10
- justify-content: flex-end;
11
- margin-top: 12px;
12
- }
@@ -1,62 +0,0 @@
1
- import { defineComponent, computed } from 'vue'
2
- import styles from './index.module.scss'
3
-
4
- /**
5
- * 横向条形排行(不依赖图表库)
6
- * - 通过百分比宽度绘制
7
- * - 支持自定义最大值,便于复用
8
- */
9
- export default defineComponent({
10
- name: 'PracticeStatusRankBarChart',
11
- props: {
12
- data: {
13
- type: Array,
14
- default: () => [],
15
- },
16
- max: {
17
- type: Number,
18
- default: undefined,
19
- },
20
- valueFormatter: {
21
- type: Function,
22
- default: (v) => `${v}`,
23
- },
24
- },
25
- setup(props) {
26
- const maxValue = computed(() => {
27
- const list = props.data || []
28
- const maxInData = list.reduce((m, cur) => Math.max(m, Number(cur?.value ?? 0)), 0)
29
- const base = Number.isFinite(props.max) ? props.max : maxInData
30
- return base > 0 ? base : 1
31
- })
32
-
33
- const rows = computed(() =>
34
- (props.data || []).map((it) => {
35
- const value = Number(it?.value ?? 0)
36
- const ratio = Math.min(1, Math.max(0, value / maxValue.value))
37
- return {
38
- name: it?.name ?? '',
39
- value,
40
- ratio,
41
- }
42
- }),
43
- )
44
-
45
- return () => (
46
- <div class={styles.barsWrap}>
47
- {rows.value.map((row, idx) => (
48
- <div class={styles.barRow} key={`${row.name}-${idx}`}>
49
- <div class={styles.barName} title={row.name}>
50
- {row.name}
51
- </div>
52
- <div class={styles.barTrack}>
53
- <div class={styles.barFill} style={{ width: `${row.ratio * 100}%` }} />
54
- </div>
55
- <div class={styles.barValue}>{props.valueFormatter(row.value)}</div>
56
- </div>
57
- ))}
58
- </div>
59
- )
60
- },
61
- })
62
-
@@ -1,43 +0,0 @@
1
- .barsWrap {
2
- display: flex;
3
- flex-direction: column;
4
- gap: 8px;
5
- }
6
-
7
- .barRow {
8
- display: flex;
9
- align-items: center;
10
- height: 24px;
11
- }
12
-
13
- .barName {
14
- width: 60px;
15
- font-size: 12px;
16
- color: #606266;
17
- white-space: nowrap;
18
- overflow: hidden;
19
- text-overflow: ellipsis;
20
- margin-right: 8px;
21
- text-align: right;
22
- }
23
-
24
- .barTrack {
25
- flex: 1;
26
- height: 12px;
27
- background: #f5f7fa;
28
- border-radius: 6px;
29
- overflow: hidden;
30
- margin-right: 8px;
31
- }
32
-
33
- .barFill {
34
- height: 100%;
35
- background: #ff7d00;
36
- border-radius: 6px;
37
- }
38
-
39
- .barValue {
40
- width: 40px;
41
- font-size: 12px;
42
- color: #333;
43
- }
@@ -1,29 +0,0 @@
1
- import { defineComponent } from 'vue'
2
- import RankingList from '../RankingList'
3
- import styles from './index.module.scss'
4
-
5
- /**
6
- * 剧本统计 - 排行榜组(三列布局)
7
- */
8
- export default defineComponent({
9
- name: 'RankingGroup',
10
- props: {
11
- data: {
12
- type: Object,
13
- default: () => ({
14
- overall: [],
15
- accuracy: [],
16
- fluency: [],
17
- }),
18
- },
19
- },
20
- setup(props) {
21
- return () => (
22
- <div class={styles.rankingGroup}>
23
- <RankingList title="综合排行榜" data={props.data.overall} />
24
- <RankingList title="话术准确度" data={props.data.accuracy} />
25
- <RankingList title="流利度" data={props.data.fluency} />
26
- </div>
27
- )
28
- },
29
- })
@@ -1,5 +0,0 @@
1
- .rankingGroup {
2
- display: grid;
3
- grid-template-columns: repeat(3, 1fr);
4
- gap: 12px;
5
- }
@@ -1,58 +0,0 @@
1
- import { defineComponent, toRef } from 'vue'
2
- import styles from './index.module.scss'
3
-
4
- /**
5
- * 剧本统计 - 排行榜列表项
6
- * 用于展示单列排行榜(综合、准确度、流利度等)
7
- */
8
- export default defineComponent({
9
- name: 'RankingList',
10
- props: {
11
- title: {
12
- type: String,
13
- default: '',
14
- },
15
- data: {
16
- type: Array,
17
- default: () => [],
18
- },
19
- },
20
- setup(props) {
21
- const list = toRef(props, 'data')
22
-
23
- // 奖牌图标(模拟 SVG 或使用 emoji/图片)
24
- const getRankIcon = (index) => {
25
- if (index === 0) return '🥇'
26
- if (index === 1) return '🥈'
27
- if (index === 2) return '🥉'
28
- return index + 1
29
- }
30
-
31
- const getRankClass = (index) => {
32
- if (index === 0) return styles.rankFirst
33
- if (index === 1) return styles.rankSecond
34
- if (index === 2) return styles.rankThird
35
- return styles.rankNormal
36
- }
37
-
38
- return () => (
39
- <div class={styles.rankingCard}>
40
- <div class={styles.rankingTitle}>{props.title}</div>
41
- <div class={styles.rankingList}>
42
- {list.value.map((item, index) => (
43
- <div key={index} class={styles.rankingItem}>
44
- <div class={[styles.rankIndex, getRankClass(index)]}>
45
- {getRankIcon(index)}
46
- </div>
47
- <div class={styles.rankInfo}>
48
- <div class={styles.rankName}>{item.name}</div>
49
- <div class={styles.rankDept}>{item.dept}</div>
50
- </div>
51
- <div class={styles.rankScore}>{item.score}</div>
52
- </div>
53
- ))}
54
- </div>
55
- </div>
56
- )
57
- },
58
- })
@@ -1,85 +0,0 @@
1
- .rankingCard {
2
- background: #fff;
3
- border-radius: 8px;
4
- padding: 16px;
5
- border: 1px solid #ebeef5;
6
- }
7
-
8
- .rankingTitle {
9
- font-size: 14px;
10
- font-weight: 600;
11
- color: #303133;
12
- margin-bottom: 12px;
13
- }
14
-
15
- .rankingList {
16
- display: flex;
17
- flex-direction: column;
18
- gap: 8px;
19
- }
20
-
21
- .rankingItem {
22
- display: flex;
23
- align-items: center;
24
- padding: 8px 0;
25
- border-bottom: 1px dashed #ebeef5;
26
- }
27
-
28
- .rankingItem:last-child {
29
- border-bottom: none;
30
- }
31
-
32
- .rankIndex {
33
- width: 24px;
34
- height: 24px;
35
- display: flex;
36
- align-items: center;
37
- justify-content: center;
38
- font-size: 14px;
39
- color: #909399;
40
- font-weight: 600;
41
- margin-right: 12px;
42
- }
43
-
44
- .rankFirst {
45
- color: #ff7d00;
46
- font-size: 20px;
47
- }
48
-
49
- .rankSecond {
50
- color: #909399;
51
- font-size: 20px;
52
- }
53
-
54
- .rankThird {
55
- color: #bfa176;
56
- font-size: 20px;
57
- }
58
-
59
- .rankNormal {
60
- color: #606266;
61
- }
62
-
63
- .rankInfo {
64
- flex: 1;
65
- display: flex;
66
- flex-direction: column;
67
- }
68
-
69
- .rankName {
70
- font-size: 14px;
71
- color: #303133;
72
- font-weight: 500;
73
- }
74
-
75
- .rankDept {
76
- font-size: 12px;
77
- color: #909399;
78
- margin-top: 2px;
79
- }
80
-
81
- .rankScore {
82
- font-size: 16px;
83
- font-weight: 600;
84
- color: #303133;
85
- }
@@ -1,92 +0,0 @@
1
- import { defineComponent, ref } from 'vue'
2
- import styles from './index.module.scss'
3
- import EchartsRankBar from '../echarts/EchartsRankBar'
4
- import RankBarChart from '../RankBarChart'
5
- import RankingGroup from '../RankingGroup'
6
-
7
- /**
8
- * 剧本统计主面板
9
- */
10
- export default defineComponent({
11
- name: 'ScriptStatsPanel',
12
- props: {
13
- useEcharts: {
14
- type: Boolean,
15
- default: false,
16
- },
17
- },
18
- setup(props) {
19
- // 模拟数据
20
- const dimensionData = ref([
21
- { name: '语言组织', value: 95.4, max: 100 },
22
- { name: '共情与优势介绍', value: 75.2, max: 100 },
23
- { name: '流利度', value: 72.5, max: 100 },
24
- { name: '顾客打消能力', value: 58.7, max: 100 },
25
- { name: '后续练联系告知', value: 52.7, max: 100 },
26
- { name: '合规话术', value: 0.0, max: 100 },
27
- ])
28
-
29
- const generateRanking = (count) => {
30
- return Array.from({ length: count }).map((_, i) => ({
31
- name: '李四',
32
- dept: '渠道营销三部',
33
- score: 100,
34
- }))
35
- }
36
-
37
- const rankingData = ref({
38
- overall: generateRanking(10),
39
- accuracy: generateRanking(10),
40
- fluency: generateRanking(10),
41
- })
42
-
43
- const handleClear = () => {
44
- console.log('清空已选')
45
- }
46
-
47
- const handleDownload = () => {
48
- console.log('下载')
49
- }
50
-
51
- return () => (
52
- <div class={styles.scriptStatsPanel}>
53
- {/* 顶部筛选栏 */}
54
- <div class={styles.filterBar}>
55
- <div class={styles.filterLeft}>
56
- {/* 这里的按钮已经在 index.jsx 的 toggle 控制,这里主要放筛选 */}
57
- </div>
58
- <div class={styles.filterRight}>
59
- <el-button link type="primary" onClick={handleClear} style={{ color: '#ff7a00' }}>
60
- 清空已选
61
- </el-button>
62
- <el-select placeholder="剧本名称: 电销话术1V1模拟训练" style={{ width: '240px' }} modelValue="">
63
- <el-option label="电销话术1V1模拟训练" value="1" />
64
- </el-select>
65
- <el-select placeholder="所属部门" style={{ width: '120px' }} modelValue="">
66
- <el-option label="部门A" value="A" />
67
- </el-select>
68
- <el-button onClick={handleDownload}>下载</el-button>
69
- </div>
70
- </div>
71
-
72
- {/* 维度得分排名 */}
73
- <div class={styles.section}>
74
- <div class={styles.sectionHeader}>维度得分排名</div>
75
- <div class={styles.chartContainer}>
76
- {props.useEcharts ? (
77
- <EchartsRankBar data={dimensionData.value} height={300} max={100} />
78
- ) : (
79
- <RankBarChart data={dimensionData.value} height={300} />
80
- )}
81
- </div>
82
- </div>
83
-
84
- {/* 排行榜 */}
85
- <div class={styles.section}>
86
- <div class={styles.sectionHeader}>排行榜</div>
87
- <RankingGroup data={rankingData.value} />
88
- </div>
89
- </div>
90
- )
91
- },
92
- })
@@ -1,56 +0,0 @@
1
- .scriptStatsPanel {
2
- /* 容器样式 */
3
- }
4
-
5
- .filterBar {
6
- display: flex;
7
- justify-content: space-between;
8
- align-items: center;
9
- background: #fff;
10
- padding: 12px;
11
- border-radius: 8px;
12
- border: 1px solid #ebeef5;
13
- margin-bottom: 12px;
14
- }
15
-
16
- .filterLeft {
17
- display: flex;
18
- align-items: center;
19
- gap: 8px;
20
- }
21
-
22
- .filterRight {
23
- display: flex;
24
- align-items: center;
25
- gap: 12px;
26
- }
27
-
28
- .chartContainer {
29
- background: #fff;
30
- padding: 16px;
31
- border-radius: 8px;
32
- border: 1px solid #ebeef5;
33
- }
34
-
35
- .section {
36
- margin-top: 12px;
37
- }
38
-
39
- .sectionHeader {
40
- display: flex;
41
- align-items: center;
42
- margin-bottom: 10px;
43
- font-size: 14px;
44
- font-weight: 600;
45
- color: #303133;
46
- }
47
-
48
- .sectionHeader:before {
49
- content: '';
50
- display: inline-block;
51
- width: 3px;
52
- height: 14px;
53
- background: #ff7a00;
54
- border-radius: 2px;
55
- margin-right: 8px;
56
- }
@@ -1,40 +0,0 @@
1
- import { defineComponent } from 'vue'
2
- import styles from './index.module.scss'
3
-
4
- /**
5
- * 练习数据概览卡片行
6
- * - 组件化目的:后续可复用在其他统计页
7
- * - 数据由父组件通过 props 传入
8
- */
9
- export default defineComponent({
10
- name: 'PracticeStatusStatCardsRow',
11
- props: {
12
- cards: {
13
- type: Array,
14
- default: () => [],
15
- },
16
- },
17
- setup(props) {
18
- const bgClassList = [
19
- styles.cardBg1,
20
- styles.cardBg2,
21
- styles.cardBg3,
22
- styles.cardBg4,
23
- styles.cardBg5,
24
- styles.cardBg6,
25
- ]
26
-
27
- return () => (
28
- <div class={styles.cardsRow}>
29
- {props.cards.map((card, idx) => (
30
- <div class={[styles.statCard, bgClassList[idx % bgClassList.length]]} key={card.key || idx}>
31
- <div class={styles.statCardLabel}>{card.label}</div>
32
- <div class={styles.statCardValue}>{card.value}</div>
33
- {card.hint ? <div class={styles.statCardHint}>{card.hint}</div> : null}
34
- </div>
35
- ))}
36
- </div>
37
- )
38
- },
39
- })
40
-
@@ -1,53 +0,0 @@
1
- .cardsRow {
2
- display: grid;
3
- grid-template-columns: repeat(6, minmax(0, 1fr));
4
- gap: 10px;
5
- }
6
-
7
- .card {
8
- border: 1px solid #ebeef5;
9
- border-radius: 8px;
10
- padding: 12px 14px;
11
- background: #fff;
12
- }
13
-
14
- .cardTitle {
15
- font-size: 12px;
16
- color: #606266;
17
- margin-bottom: 6px;
18
- }
19
-
20
- .cardValue {
21
- font-size: 20px;
22
- font-weight: 700;
23
- color: #303133;
24
- }
25
-
26
- .statCard {
27
- border-radius: 8px;
28
- border: 1px solid #ebeef5;
29
- padding: 12px 14px;
30
- background: #fff;
31
- display: flex;
32
- flex-direction: column;
33
- }
34
-
35
- .statCardTitle {
36
- font-size: 12px;
37
- color: #606266;
38
- margin-bottom: 6px;
39
- }
40
-
41
- .statCardValue {
42
- font-size: 20px;
43
- font-weight: 700;
44
- color: #303133;
45
- }
46
-
47
- /* bgClassList placeholders if needed, though not found in original CSS */
48
- .cardBg1 {}
49
- .cardBg2 {}
50
- .cardBg3 {}
51
- .cardBg4 {}
52
- .cardBg5 {}
53
- .cardBg6 {}