aegon-gen 1.0.0

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 (86) hide show
  1. package/package.json +12 -0
  2. package/src/App.vue +3 -0
  3. package/src/api/index.ts +19 -0
  4. package/src/api/modules/gen-ai/gen-entry/index.ts +30 -0
  5. package/src/api/modules/gen-ai/model-manager/index.ts +42 -0
  6. package/src/api/modules/gen-ai/model-manager/mockApi.ts +33 -0
  7. package/src/api/modules/index.ts +98 -0
  8. package/src/api/modules/user/index.ts +4 -0
  9. package/src/api/request.ts +102 -0
  10. package/src/assets/sample-access-icon.png +0 -0
  11. package/src/assets/sample-pie-chart.png +0 -0
  12. package/src/assets/vue.svg +1 -0
  13. package/src/components/CapsuleScrollbar.vue +93 -0
  14. package/src/components/Export/ExcelExport.vue +592 -0
  15. package/src/components/Export/ExcelExport2.vue +494 -0
  16. package/src/components/Export/ExcelExport3.vue +342 -0
  17. package/src/components/Export/ExcelExport4.vue +665 -0
  18. package/src/components/Export/excelExport.js +547 -0
  19. package/src/components/Export/excelExport.ts +551 -0
  20. package/src/components/GEN-AI/index.vue +142 -0
  21. package/src/components/GEN-AI/index1.vue +456 -0
  22. package/src/components/GEN-AI/index10.vue +5 -0
  23. package/src/components/GEN-AI/index2.vue +568 -0
  24. package/src/components/GEN-AI/index3.vue +623 -0
  25. package/src/components/GEN-AI/index4.vue +629 -0
  26. package/src/components/GEN-AI/index5.vue +578 -0
  27. package/src/components/GEN-AI/index6.vue +656 -0
  28. package/src/components/GEN-AI/index7.vue +717 -0
  29. package/src/components/GEN-AI/index8.vue +405 -0
  30. package/src/components/GEN-AI/index9.vue +1065 -0
  31. package/src/components/GEN-AI/types.ts +12 -0
  32. package/src/components/GEN-AI/utils.ts +42 -0
  33. package/src/components/HelloWorld.vue +41 -0
  34. package/src/components/PageCard.vue +7 -0
  35. package/src/components/PageHeader.vue +32 -0
  36. package/src/components/backup/index5 copy.vue +556 -0
  37. package/src/components/backup/index5.vue +620 -0
  38. package/src/components/backup/index9 copy.vue +1029 -0
  39. package/src/components/backup/index9-pro.vue +1065 -0
  40. package/src/components/backup/index9.vue +1057 -0
  41. package/src/components/el-date-picker.vue +64 -0
  42. package/src/directives/btnLoading.ts +427 -0
  43. package/src/directives/debounce copy.ts +670 -0
  44. package/src/directives/debounce.ts +98 -0
  45. package/src/directives/index.ts +25 -0
  46. package/src/layouts/MainLayout.vue +101 -0
  47. package/src/main.ts +85 -0
  48. package/src/router/index.ts +76 -0
  49. package/src/router/menus.ts +28 -0
  50. package/src/style.css +79 -0
  51. package/src/styles/_variables.scss +24 -0
  52. package/src/styles/app-button.css +26 -0
  53. package/src/styles/element-overrides.css +23 -0
  54. package/src/styles/global.css +44 -0
  55. package/src/styles/index.scss +1 -0
  56. package/src/styles/page-card.css +21 -0
  57. package/src/styles/variables.css +26 -0
  58. package/src/test/mock.ts +101 -0
  59. package/src/test/test1.vue +402 -0
  60. package/src/test/test2.vue +1689 -0
  61. package/src/types/gen-ai/gen-entry/index.ts +17 -0
  62. package/src/types/gen-ai/model-manager/index.ts +19 -0
  63. package/src/utils/docxExport.ts +1610 -0
  64. package/src/utils/gen-ai-navigation.ts +37 -0
  65. package/src/utils/gen-ai-scroll.ts +455 -0
  66. package/src/utils/openDataLoaderWordExport.ts +33 -0
  67. package/src/utils/pageScrollbar.ts +115 -0
  68. package/src/utils/randomTranscode.ts +87 -0
  69. package/src/utils/reportPdfExport.ts +44 -0
  70. package/src/views/AdminCenter/index.vue +817 -0
  71. package/src/views/Blank.vue +68 -0
  72. package/src/views/Home.vue +29 -0
  73. package/src/views/ReportCenter/index.vue +1380 -0
  74. package/src/views/TemplateCenter/Knowledge.ts +83 -0
  75. package/src/views/TemplateCenter/data.d.ts +10 -0
  76. package/src/views/TemplateCenter/index.vue +1205 -0
  77. package/src/views/TemplateCenter/service.ts +69 -0
  78. package/src/views/gen-ai/components/RecentReportsTable.vue +193 -0
  79. package/src/views/gen-ai/gen-entry/index.vue +309 -0
  80. package/src/views/gen-ai/gen-entry/mockData.ts +160 -0
  81. package/src/views/gen-ai/management-center/index.vue +53 -0
  82. package/src/views/gen-ai/model-manager/ChapterTitleScroll.vue +275 -0
  83. package/src/views/gen-ai/model-manager/index.vue +1205 -0
  84. package/src/views/gen-ai/model-manager/mockData.ts +122 -0
  85. package/src/views/gen-ai/report-center/index.vue +158 -0
  86. package/src/vite-env.d.ts +38 -0
@@ -0,0 +1,160 @@
1
+ import type { RecentReport } from '@/types/gen-ai/gen-entry/index'
2
+
3
+ export const MOCK_RECENT_REPORTS: RecentReport[] = [
4
+ {
5
+ id: '1',
6
+ name: '深圳房地產風控年報 - 2024',
7
+ industry: '房地產',
8
+ year: '2025',
9
+ status: '草稿',
10
+ initiator: '陳大文 (單位 xxxx)',
11
+ editor: '陳1文 (單位 xxxx) , 陳2文 (單位 xxxx) , 陳3文 (單位 xxxx) ...',
12
+ permission: '可編輯',
13
+ updatedAt: '3天前',
14
+ canOpen: true,
15
+ },
16
+ {
17
+ id: '2',
18
+ name: '深圳房地產風控年報 - 2024',
19
+ industry: '房地產',
20
+ year: '2024',
21
+ status: '已產生',
22
+ initiator: '陳中文 (單位 yyyy)',
23
+ editor: '陳4文 (單位 yyyy) , 陳5文 (單位 yyyy) ...',
24
+ permission: '無權限',
25
+ updatedAt: '3天前',
26
+ canOpen: false,
27
+ },
28
+ {
29
+ id: '3',
30
+ name: '深圳房地產風控年報 - 2024',
31
+ industry: '房地產',
32
+ year: '2023',
33
+ status: '已導出',
34
+ initiator: '陳小文 (單位 zzzz)',
35
+ editor: '陳6文 (單位 zzzz)',
36
+ permission: '可編輯',
37
+ updatedAt: '3天前',
38
+ canOpen: true,
39
+ },
40
+ {
41
+ id: '4',
42
+ name: '深圳房地產風控年報 - 2024',
43
+ industry: '房地產',
44
+ year: '2023',
45
+ status: '已導出',
46
+ initiator: '陳小文 (單位 zzzz)',
47
+ editor: '陳6文 (單位 zzzz)',
48
+ permission: '可編輯',
49
+ updatedAt: '3天前',
50
+ canOpen: true,
51
+ },
52
+ {
53
+ id: '5',
54
+ name: '深圳房地產風控年報 - 2024',
55
+ industry: '房地產',
56
+ year: '2023',
57
+ status: '已導出',
58
+ initiator: '陳小文 (單位 zzzz)',
59
+ editor: '陳6文 (單位 zzzz)',
60
+ permission: '可編輯',
61
+ updatedAt: '3天前',
62
+ canOpen: true,
63
+ },
64
+ {
65
+ id: '6',
66
+ name: '深圳房地產風控年報 - 2024',
67
+ industry: '房地產',
68
+ year: '2023',
69
+ status: '已導出',
70
+ initiator: '陳小文 (單位 zzzz)',
71
+ editor: '陳6文 (單位 zzzz)',
72
+ permission: '可編輯',
73
+ updatedAt: '3天前',
74
+ canOpen: true,
75
+ },
76
+ {
77
+ id: '7',
78
+ name: '深圳房地產風控年報 - 2024',
79
+ industry: '房地產',
80
+ year: '2023',
81
+ status: '已導出',
82
+ initiator: '陳小文 (單位 zzzz)',
83
+ editor: '陳6文 (單位 zzzz)',
84
+ permission: '可編輯',
85
+ updatedAt: '3天前',
86
+ canOpen: true,
87
+ },
88
+ {
89
+ id: '8',
90
+ name: '深圳房地產風控年報 - 2024',
91
+ industry: '房地產',
92
+ year: '2023',
93
+ status: '已導出',
94
+ initiator: '陳小文 (單位 zzzz)',
95
+ editor: '陳6文 (單位 zzzz)',
96
+ permission: '可編輯',
97
+ updatedAt: '3天前',
98
+ canOpen: true,
99
+ },
100
+ {
101
+ id: '9',
102
+ name: '深圳房地產風控年報 - 2024',
103
+ industry: '房地產',
104
+ year: '2023',
105
+ status: '已導出',
106
+ initiator: '陳小文 (單位 zzzz)',
107
+ editor: '陳6文 (單位 zzzz)',
108
+ permission: '可編輯',
109
+ updatedAt: '3天前',
110
+ canOpen: true,
111
+ },
112
+ {
113
+ id: '10',
114
+ name: '深圳房地產風控年報 - 2024',
115
+ industry: '房地產',
116
+ year: '2023',
117
+ status: '已導出',
118
+ initiator: '陳小文 (單位 zzzz)',
119
+ editor: '陳6文 (單位 zzzz)',
120
+ permission: '可編輯',
121
+ updatedAt: '3天前',
122
+ canOpen: true,
123
+ },
124
+ {
125
+ id: '11',
126
+ name: '上海商業地產風控季報 - 2024',
127
+ industry: '商業地產',
128
+ year: '2024',
129
+ status: '草稿',
130
+ initiator: '王小明 (單位 aaaa)',
131
+ editor: '王2文 (單位 aaaa)',
132
+ permission: '可編輯',
133
+ updatedAt: '5天前',
134
+ canOpen: true,
135
+ },
136
+ {
137
+ id: '12',
138
+ name: '廣州基建項目風控月報 - 2024',
139
+ industry: '基建',
140
+ year: '2024',
141
+ status: '已產生',
142
+ initiator: '李雷 (單位 bbbb)',
143
+ editor: '李3文 (單位 bbbb)',
144
+ permission: '可編輯',
145
+ updatedAt: '1周前',
146
+ canOpen: true,
147
+ },
148
+ {
149
+ id: '13',
150
+ name: '北京科技園區風控年報 - 2023',
151
+ industry: '科技園區',
152
+ year: '2023',
153
+ status: '已導出',
154
+ initiator: '韓梅梅 (單位 cccc)',
155
+ editor: '韓4文 (單位 cccc)',
156
+ permission: '無權限',
157
+ updatedAt: '2周前',
158
+ canOpen: false,
159
+ },
160
+ ]
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <div class="management-center-page">
3
+ <PageHeader title="IR-DEMO" />
4
+
5
+ <main class="management-center-page__body">
6
+ <section class="management-center-hero">
7
+ <h2 class="management-center-hero__title">管理中心</h2>
8
+ <p class="management-center-hero__desc">系統配置、權限與運營管理入口</p>
9
+ </section>
10
+ </main>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import PageHeader from '@/components/PageHeader.vue'
16
+ </script>
17
+
18
+ <style scoped>
19
+ .management-center-page {
20
+ display: flex;
21
+ flex-direction: column;
22
+ height: 100vh;
23
+ overflow: hidden;
24
+ background: #fff;
25
+ }
26
+
27
+ .management-center-page__body {
28
+ flex: 1;
29
+ min-height: 0;
30
+ overflow-y: auto;
31
+ width: 100%;
32
+ padding: 48px 24px 40px;
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ .management-center-hero {
37
+ text-align: center;
38
+ }
39
+
40
+ .management-center-hero__title {
41
+ margin: 0 0 12px;
42
+ font-size: 28px;
43
+ font-weight: 700;
44
+ color: #1a1a1a;
45
+ }
46
+
47
+ .management-center-hero__desc {
48
+ margin: 0;
49
+ font-size: 14px;
50
+ line-height: 1.7;
51
+ color: #666;
52
+ }
53
+ </style>
@@ -0,0 +1,275 @@
1
+ <template>
2
+ <li
3
+ class="chapter-title-scroll"
4
+ :class="{
5
+ 'is-truncatable': isTruncatable,
6
+ 'is-animating': isAnimating,
7
+ 'is-dragging': isDragging,
8
+ }"
9
+ @click="handleClick"
10
+ @wheel.prevent="handleWheel"
11
+ >
12
+ <div
13
+ ref="viewportRef"
14
+ class="chapter-title-scroll__viewport"
15
+ @pointerdown="handlePointerDown"
16
+ >
17
+ <span
18
+ ref="textRef"
19
+ class="chapter-title-scroll__text"
20
+ :style="{ transform: `translateX(${-offset}px)` }"
21
+ >
22
+ <template v-if="!showFull && isTruncatable">{{ truncatedPrefix }}</template>
23
+ <template v-else>{{ title }}</template>
24
+ </span>
25
+ <span
26
+ v-if="!showFull && isTruncatable"
27
+ class="chapter-title-scroll__ellipsis"
28
+ aria-hidden="true"
29
+ >...</span>
30
+ </div>
31
+ </li>
32
+ </template>
33
+
34
+ <script setup lang="ts">
35
+ import { computed, nextTick, onBeforeUnmount, ref } from 'vue'
36
+
37
+ const TITLE_MAX = 19
38
+ /** 自動滾動速度(px/s),較慢 */
39
+ const SCROLL_SPEED_PX_PER_SEC = 22
40
+ const END_PAUSE_MS = 280
41
+ const DRAG_CLICK_THRESHOLD_PX = 4
42
+
43
+ const props = defineProps<{
44
+ title: string
45
+ }>()
46
+
47
+ const viewportRef = ref<HTMLElement | null>(null)
48
+ const textRef = ref<HTMLElement | null>(null)
49
+ const offset = ref(0)
50
+ const showFull = ref(false)
51
+ const isAnimating = ref(false)
52
+ const isDragging = ref(false)
53
+
54
+ let animFrameId = 0
55
+ let endPauseTimer = 0
56
+ let dragStartX = 0
57
+ let dragStartOffset = 0
58
+ let pointerMoved = false
59
+ let activePointerMove: ((event: PointerEvent) => void) | null = null
60
+ let activePointerUp: ((event: PointerEvent) => void) | null = null
61
+
62
+ const isTruncatable = computed(() => props.title.length > TITLE_MAX)
63
+ const truncatedPrefix = computed(() =>
64
+ isTruncatable.value ? props.title.slice(0, TITLE_MAX) : props.title,
65
+ )
66
+
67
+ function getMaxOffset() {
68
+ const viewport = viewportRef.value
69
+ const text = textRef.value
70
+ if (!viewport || !text) return 0
71
+ return Math.max(0, text.scrollWidth - viewport.clientWidth)
72
+ }
73
+
74
+ function clampOffset(value: number) {
75
+ return Math.min(getMaxOffset(), Math.max(0, value))
76
+ }
77
+
78
+ function cancelAnimation() {
79
+ if (animFrameId) {
80
+ cancelAnimationFrame(animFrameId)
81
+ animFrameId = 0
82
+ }
83
+ if (endPauseTimer) {
84
+ clearTimeout(endPauseTimer)
85
+ endPauseTimer = 0
86
+ }
87
+ isAnimating.value = false
88
+ }
89
+
90
+ function removePointerListeners() {
91
+ if (activePointerMove) {
92
+ window.removeEventListener('pointermove', activePointerMove)
93
+ activePointerMove = null
94
+ }
95
+ if (activePointerUp) {
96
+ window.removeEventListener('pointerup', activePointerUp)
97
+ window.removeEventListener('pointercancel', activePointerUp)
98
+ activePointerUp = null
99
+ }
100
+ }
101
+
102
+ function resetToInitial() {
103
+ cancelAnimation()
104
+ removePointerListeners()
105
+ isDragging.value = false
106
+ offset.value = 0
107
+ showFull.value = false
108
+ }
109
+
110
+ async function ensureFullMode() {
111
+ if (!showFull.value) {
112
+ showFull.value = true
113
+ offset.value = 0
114
+ await nextTick()
115
+ }
116
+ }
117
+
118
+ async function startAutoScroll() {
119
+ if (!isTruncatable.value || isAnimating.value) return
120
+
121
+ cancelAnimation()
122
+ showFull.value = true
123
+ offset.value = 0
124
+ await nextTick()
125
+
126
+ const maxOffset = getMaxOffset()
127
+ if (maxOffset <= 0) {
128
+ resetToInitial()
129
+ return
130
+ }
131
+
132
+ isAnimating.value = true
133
+ const startTime = performance.now()
134
+
135
+ const tick = (now: number) => {
136
+ const elapsedSec = (now - startTime) / 1000
137
+ const nextOffset = Math.min(maxOffset, elapsedSec * SCROLL_SPEED_PX_PER_SEC)
138
+ offset.value = nextOffset
139
+
140
+ if (nextOffset >= maxOffset) {
141
+ endPauseTimer = window.setTimeout(() => {
142
+ resetToInitial()
143
+ }, END_PAUSE_MS)
144
+ return
145
+ }
146
+
147
+ animFrameId = requestAnimationFrame(tick)
148
+ }
149
+
150
+ animFrameId = requestAnimationFrame(tick)
151
+ }
152
+
153
+ function handleClick() {
154
+ if (!isTruncatable.value || isAnimating.value || pointerMoved) {
155
+ pointerMoved = false
156
+ return
157
+ }
158
+ resetToInitial()
159
+ void nextTick(() => {
160
+ void startAutoScroll()
161
+ })
162
+ }
163
+
164
+ function handleWheel(event: WheelEvent) {
165
+ if (!isTruncatable.value) return
166
+
167
+ cancelAnimation()
168
+
169
+ void ensureFullMode().then(() => {
170
+ const delta = (event.deltaY !== 0 ? event.deltaY : event.deltaX) * 0.6
171
+ offset.value = clampOffset(offset.value + delta)
172
+ })
173
+ }
174
+
175
+ function handlePointerDown(event: PointerEvent) {
176
+ if (!isTruncatable.value || event.button !== 0) return
177
+
178
+ event.preventDefault()
179
+ cancelAnimation()
180
+
181
+ void ensureFullMode().then(() => {
182
+ isDragging.value = true
183
+ pointerMoved = false
184
+ dragStartX = event.clientX
185
+ dragStartOffset = offset.value
186
+
187
+ activePointerMove = (moveEvent: PointerEvent) => {
188
+ const delta = dragStartX - moveEvent.clientX
189
+ if (Math.abs(delta) > DRAG_CLICK_THRESHOLD_PX) {
190
+ pointerMoved = true
191
+ }
192
+ offset.value = clampOffset(dragStartOffset + delta)
193
+ }
194
+
195
+ activePointerUp = () => {
196
+ isDragging.value = false
197
+ removePointerListeners()
198
+ if (pointerMoved) {
199
+ window.setTimeout(() => {
200
+ pointerMoved = false
201
+ }, 0)
202
+ }
203
+ }
204
+
205
+ window.addEventListener('pointermove', activePointerMove)
206
+ window.addEventListener('pointerup', activePointerUp)
207
+ window.addEventListener('pointercancel', activePointerUp)
208
+ })
209
+ }
210
+
211
+ onBeforeUnmount(() => {
212
+ resetToInitial()
213
+ })
214
+ </script>
215
+
216
+ <style scoped>
217
+ .chapter-title-scroll {
218
+ height: 19.5px;
219
+ line-height: 19.5px;
220
+ list-style: none;
221
+ font-size: 13px;
222
+ color: #606266;
223
+ cursor: default;
224
+ user-select: none;
225
+ }
226
+
227
+ .chapter-title-scroll.is-truncatable {
228
+ cursor: grab;
229
+ }
230
+
231
+ .chapter-title-scroll.is-dragging {
232
+ cursor: grabbing;
233
+ }
234
+
235
+ .chapter-title-scroll__viewport {
236
+ position: relative;
237
+ overflow: hidden;
238
+ height: 19.5px;
239
+ line-height: 19.5px;
240
+ scrollbar-width: none;
241
+ -ms-overflow-style: none;
242
+ touch-action: none;
243
+ }
244
+
245
+ .chapter-title-scroll__viewport::-webkit-scrollbar {
246
+ display: none;
247
+ width: 0;
248
+ height: 0;
249
+ }
250
+
251
+ .chapter-title-scroll__text {
252
+ display: inline-block;
253
+ white-space: nowrap;
254
+ will-change: transform;
255
+ color: #606266;
256
+ }
257
+
258
+ .chapter-title-scroll.is-dragging .chapter-title-scroll__text {
259
+ transition: none;
260
+ }
261
+
262
+ .chapter-title-scroll__ellipsis {
263
+ position: absolute;
264
+ right: 0;
265
+ top: 0;
266
+ padding-left: 8px;
267
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, #fff 45%);
268
+ color: #c53355;
269
+ font-weight: 900;
270
+ font-size: 16px;
271
+ line-height: 19.5px;
272
+ letter-spacing: 0.05em;
273
+ pointer-events: none;
274
+ }
275
+ </style>