aegon-lv82 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.
- package/package.json +12 -0
- package/src/App.vue +44 -0
- package/src/api/index.ts +19 -0
- package/src/api/modules/build-report/reportEditor.ts +526 -0
- package/src/api/modules/build-report/reportPermission.ts +64 -0
- package/src/api/modules/index.ts +69 -0
- package/src/api/modules/industry/green_mortgage.ts +42 -0
- package/src/api/modules/user/index.ts +4 -0
- package/src/api/request.ts +124 -0
- package/src/assets/sample-access-icon.png +0 -0
- package/src/assets/sample-pie-chart.png +0 -0
- package/src/assets/vue.svg +1 -0
- package/src/components/CapsuleScrollbar.vue +7 -0
- package/src/components/Export/ExcelExport.vue +592 -0
- package/src/components/Export/ExcelExport2.vue +494 -0
- package/src/components/Export/ExcelExport3.vue +342 -0
- package/src/components/Export/ExcelExport4.vue +665 -0
- package/src/components/Export/excelExport.js +547 -0
- package/src/components/Export/excelExport.ts +551 -0
- package/src/components/GEN-AI/index.vue +140 -0
- package/src/components/GEN-AI/index1.vue +422 -0
- package/src/components/GEN-AI/index10.vue +5 -0
- package/src/components/GEN-AI/index2.vue +548 -0
- package/src/components/GEN-AI/index3.vue +605 -0
- package/src/components/GEN-AI/index4.vue +609 -0
- package/src/components/GEN-AI/index5.vue +558 -0
- package/src/components/GEN-AI/index6.vue +634 -0
- package/src/components/GEN-AI/index7.vue +688 -0
- package/src/components/GEN-AI/index8.vue +458 -0
- package/src/components/GEN-AI/index9.vue +1217 -0
- package/src/components/GEN-AI/types.ts +12 -0
- package/src/components/GEN-AI/utils.ts +42 -0
- package/src/components/HelloWorld.vue +41 -0
- package/src/components/PageCard.vue +124 -0
- package/src/components/PageHeader.vue +32 -0
- package/src/components/backup/index5 copy.vue +556 -0
- package/src/components/backup/index5.vue +620 -0
- package/src/components/backup/index9 copy.vue +1029 -0
- package/src/components/backup/index9-pro.vue +1065 -0
- package/src/components/backup/index9.vue +1057 -0
- package/src/directives/btnLoading.ts +455 -0
- package/src/directives/debounce copy.ts +670 -0
- package/src/directives/debounce.ts +98 -0
- package/src/directives/index.ts +25 -0
- package/src/layouts/MainLayout.vue +129 -0
- package/src/main.ts +76 -0
- package/src/router/index.ts +142 -0
- package/src/router/menus.ts +28 -0
- package/src/store/modules/gen-ai/index.ts +1 -0
- package/src/store/modules/gen-ai/reportBuild.ts +37 -0
- package/src/style.css +79 -0
- package/src/styles/report-config-popover.css +39 -0
- package/src/styles/report-icon-btn.css +19 -0
- package/src/test/mock.ts +101 -0
- package/src/test/test1.vue +402 -0
- package/src/test/test2.vue +1689 -0
- package/src/types/gen-ai/build-report/reportEditor.ts +684 -0
- package/src/utils/function.ts +46 -0
- package/src/utils/gen-ai-navigation.ts +1 -0
- package/src/utils/gen-ai-scroll.ts +1 -0
- package/src/utils/openDataLoaderWordExport.ts +33 -0
- package/src/utils/pageScrollbar.ts +115 -0
- package/src/utils/randomTranscode.ts +87 -0
- package/src/utils/reportPdfExport.ts +44 -0
- package/src/views/Blank.vue +68 -0
- package/src/views/Home.vue +29 -0
- package/src/views/TemplateCenter/Knowledge.ts +83 -0
- package/src/views/TemplateCenter/data.d.ts +10 -0
- package/src/views/TemplateCenter/index.vue +1128 -0
- package/src/views/TemplateCenter/service.ts +69 -0
- package/src/views/gen-ai/build-report/chartStreamRefs.ts +174 -0
- package/src/views/gen-ai/build-report/coherence-check/index.vue +559 -0
- package/src/views/gen-ai/build-report/components/ReportChapterWorkspace.vue +4258 -0
- package/src/views/gen-ai/build-report/components/ReportConfigPanel.vue +727 -0
- package/src/views/gen-ai/build-report/components/ReportGenerateSettingsPanel.vue +2361 -0
- package/src/views/gen-ai/build-report/components/ReportGeneratingPanel.vue +1765 -0
- package/src/views/gen-ai/build-report/components/ReportPromptPanel.vue +614 -0
- package/src/views/gen-ai/build-report/components/ReportSourceFileSummary.vue +656 -0
- package/src/views/gen-ai/build-report/components/ReportSourcesPanel.vue +1327 -0
- package/src/views/gen-ai/build-report/components/ReportTemplateDetail.vue +191 -0
- package/src/views/gen-ai/build-report/components/ReportTemplateEditorFormPanel.vue +667 -0
- package/src/views/gen-ai/build-report/components/ReportTemplatePicker.vue +302 -0
- package/src/views/gen-ai/build-report/components/ReportWorkflowSidebar.vue +148 -0
- package/src/views/gen-ai/build-report/components/paramsSetting.vue +886 -0
- package/src/views/gen-ai/build-report/components/reportEdit.vue +2283 -0
- package/src/views/gen-ai/build-report/index.vue +856 -0
- package/src/views/gen-ai/build-report/report-domain.ts +1133 -0
- package/src/views/gen-ai/build-report/report-template-data.ts +295 -0
- package/src/views/gen-ai/build-report/useReportWorkflow.ts +1408 -0
- package/src/views/gen-ai/common/assets/NotoSans-SC.woff2 +0 -0
- package/src/views/gen-ai/common/assets/NotoSans-TC.woff2 +0 -0
- package/src/views/gen-ai/common/assets/NotoSans.woff2 +0 -0
- package/src/views/gen-ai/common/assets/fonts.css +278 -0
- package/src/views/gen-ai/common/assets/pagination.css +163 -0
- package/src/views/gen-ai/common/directives/btnLoading.ts +455 -0
- package/src/views/gen-ai/common/directives/debounce.ts +98 -0
- package/src/views/gen-ai/common/directives/index.ts +30 -0
- package/src/views/gen-ai/common/en.md +417 -0
- package/src/views/gen-ai/common/index.ts +36 -0
- package/src/views/gen-ai/common/types/component-expose.ts +9 -0
- package/src/views/gen-ai/common/utils/api-res-status.ts +7 -0
- package/src/views/gen-ai/common/utils/navigation.ts +59 -0
- package/src/views/gen-ai/common/utils/remote-request.ts +45 -0
- package/src/views/gen-ai/common/utils/scroll.ts +577 -0
- package/src/views/gen-ai/components/AIExport/docx-export.ts +950 -0
- package/src/views/gen-ai/components/AIExport/docxExport.ts +2566 -0
- package/src/views/gen-ai/components/AIExport/index.ts +52 -0
- package/src/views/gen-ai/components/AIExport/parseMarkdownHtml.ts +649 -0
- package/src/views/gen-ai/components/CapsuleScrollbar.vue +149 -0
- package/src/views/gen-ai/components/ChapterTitleScroll.vue +468 -0
- package/src/views/gen-ai/components/EntryHeroNavCards.vue +379 -0
- package/src/views/gen-ai/components/GenAiPagination.vue +52 -0
- package/src/views/gen-ai/components/ModelCard.vue +1114 -0
- package/src/views/gen-ai/components/Preview/FilePreviewPage.vue +947 -0
- package/src/views/gen-ai/components/Preview/PreviewCapsuleScroll.vue +205 -0
- package/src/views/gen-ai/components/Preview/PreviewOutlineTree.vue +148 -0
- package/src/views/gen-ai/components/Preview/index.ts +11 -0
- package/src/views/gen-ai/components/Preview/preview.ts +722 -0
- package/src/views/gen-ai/components/PromptField.vue +505 -0
- package/src/views/gen-ai/components/RecentReportsTable.vue +974 -0
- package/src/views/gen-ai/components/ReportCollapsibleSection.vue +172 -0
- package/src/views/gen-ai/components/ReportHistoryList.vue +637 -0
- package/src/views/gen-ai/components/ReportSectionConfirmPopover.vue +251 -0
- package/src/views/gen-ai/components/editor/ChapterTiptapEditor.vue +3139 -0
- package/src/views/gen-ai/components/editor/StructureBlockView.vue +441 -0
- package/src/views/gen-ai/components/editor/TiptapToolbar.vue +1036 -0
- package/src/views/gen-ai/components/editor/TypewriterDocEditor.vue +398 -0
- package/src/views/gen-ai/components/editor/_StructureOrgNode.vue +326 -0
- package/src/views/gen-ai/components/editor/index.ts +12 -0
- package/src/views/gen-ai/components/editor/parseMarkdownHtml.ts +667 -0
- package/src/views/gen-ai/gen-entry/api/index.ts +32 -0
- package/src/views/gen-ai/gen-entry/index.vue +287 -0
- package/src/views/gen-ai/gen-entry/types/index.ts +4 -0
- package/src/views/gen-ai/i.mark +2 -0
- package/src/views/gen-ai/management-center/index.vue +1815 -0
- package/src/views/gen-ai/management-center/mockData.ts +248 -0
- package/src/views/gen-ai/management-center/types/index.ts +37 -0
- package/src/views/gen-ai/model-manager/TemplateEditorFormPanel.vue +661 -0
- package/src/views/gen-ai/model-manager/api/index.ts +32 -0
- package/src/views/gen-ai/model-manager/api/mockApi.ts +33 -0
- package/src/views/gen-ai/model-manager/index.vue +1583 -0
- package/src/views/gen-ai/model-manager/mockData.ts +177 -0
- package/src/views/gen-ai/model-manager/template-detail-shared.ts +154 -0
- package/src/views/gen-ai/model-manager/template-editor.vue +345 -0
- package/src/views/gen-ai/model-manager/types/index.ts +40 -0
- package/src/views/gen-ai/model-manager/utils.ts +25 -0
- package/src/views/greenMortgage.vue +1834 -0
- package/src/vite-env.d.ts +46 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { getToken, streamPostSse } from '../request'
|
|
2
|
+
|
|
3
|
+
/** @deprecated 已移除本地 Mock;保留導出避免舊引用報錯,恒為 false */
|
|
4
|
+
export const REPORT_STREAM_USE_MOCK = false
|
|
5
|
+
|
|
6
|
+
export const REPORT_STREAM_API_URL =
|
|
7
|
+
import.meta.env.VITE_REPORT_STREAM_URL || '/sse/aiStream'
|
|
8
|
+
|
|
9
|
+
/** @deprecated 已移除 Mock 正文;舊頁面若仍引用則為空字串 */
|
|
10
|
+
export const MOCK_REPORT_STREAM_TEXT = ''
|
|
11
|
+
|
|
12
|
+
export interface GenerateReportParams {
|
|
13
|
+
userId?: string
|
|
14
|
+
question?: string
|
|
15
|
+
chapters?: string[]
|
|
16
|
+
chapterVersions?: Record<string, string>
|
|
17
|
+
reportMode?: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface AiStreamParams {
|
|
21
|
+
userId: string
|
|
22
|
+
question: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function* streamAiReportSse(
|
|
26
|
+
params: AiStreamParams,
|
|
27
|
+
signal?: AbortSignal
|
|
28
|
+
): AsyncGenerator<string> {
|
|
29
|
+
for await (const block of streamPostSse({
|
|
30
|
+
url: REPORT_STREAM_API_URL,
|
|
31
|
+
data: params,
|
|
32
|
+
signal,
|
|
33
|
+
})) {
|
|
34
|
+
if (block.event === 'text') {
|
|
35
|
+
yield block.data
|
|
36
|
+
}
|
|
37
|
+
if (block.event === 'end') {
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** 与 basicInformationApi 同风格的 reportApi */
|
|
44
|
+
export const reportApi = {
|
|
45
|
+
getToken,
|
|
46
|
+
|
|
47
|
+
/** SSE 流式生成报告(POST + Token,event: text / end) */
|
|
48
|
+
async *streamAiReport(params: AiStreamParams, signal?: AbortSignal) {
|
|
49
|
+
yield* streamAiReportSse(params, signal)
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
async *generateReport(params: GenerateReportParams, signal?: AbortSignal) {
|
|
53
|
+
yield* streamGenerateReport(params, signal)
|
|
54
|
+
},
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** 僅真實 SSE;不再回落本地 Mock 正文 */
|
|
58
|
+
export async function* streamGenerateReport(
|
|
59
|
+
params: GenerateReportParams,
|
|
60
|
+
signal?: AbortSignal
|
|
61
|
+
): AsyncGenerator<string> {
|
|
62
|
+
yield* streamAiReportSse(
|
|
63
|
+
{
|
|
64
|
+
userId: params.userId ?? 'user001',
|
|
65
|
+
question: params.question ?? '介绍一下SSE流式传输',
|
|
66
|
+
},
|
|
67
|
+
signal
|
|
68
|
+
)
|
|
69
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { postRequest } from '@/api/request'
|
|
2
|
+
|
|
3
|
+
export interface GreenMortgageQueryParams {
|
|
4
|
+
endYear: string
|
|
5
|
+
ratingList: string[]
|
|
6
|
+
startYear: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface GreenMortgageApiResponse<T = unknown> {
|
|
10
|
+
data?: T
|
|
11
|
+
success?: boolean
|
|
12
|
+
message?: string
|
|
13
|
+
code?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type GreenMortgageRatingsData = string[]
|
|
17
|
+
|
|
18
|
+
/** 評級選項 */
|
|
19
|
+
const GREEN_MORTGAGE_RATINGS_URL =
|
|
20
|
+
'/api/v1/Industry/GreenMortgage/GetGreenMortgageRatings'
|
|
21
|
+
|
|
22
|
+
/** 查詢列表 */
|
|
23
|
+
const GREEN_MORTGAGE_QUERY_URL =
|
|
24
|
+
'/api/v1/Industry/GreenMortgage/GetGreenMortgageQuery'
|
|
25
|
+
|
|
26
|
+
const greenMortgageApi = {
|
|
27
|
+
getGreenMortgageRatings() {
|
|
28
|
+
return postRequest<GreenMortgageApiResponse<GreenMortgageRatingsData>>({
|
|
29
|
+
url: GREEN_MORTGAGE_RATINGS_URL,
|
|
30
|
+
data: {},
|
|
31
|
+
})
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
getGreenMortgageQuery(params: GreenMortgageQueryParams) {
|
|
35
|
+
return postRequest<GreenMortgageApiResponse>({
|
|
36
|
+
url: GREEN_MORTGAGE_QUERY_URL,
|
|
37
|
+
data: params,
|
|
38
|
+
})
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default greenMortgageApi
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export interface PostRequestOptions {
|
|
2
|
+
url: string
|
|
3
|
+
data?: unknown
|
|
4
|
+
signal?: AbortSignal
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function getToken(): string {
|
|
8
|
+
return localStorage.getItem('token') || ''
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function buildAuthHeaders(): HeadersInit {
|
|
12
|
+
const token = getToken()
|
|
13
|
+
return {
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** 普通 POST JSON 請求(已含 method / Content-Type / Authorization) */
|
|
20
|
+
export async function postRequest<T = unknown>(options: PostRequestOptions): Promise<T> {
|
|
21
|
+
const response = await fetch(options.url, {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: buildAuthHeaders(),
|
|
24
|
+
body: JSON.stringify(options.data ?? {}),
|
|
25
|
+
signal: options.signal,
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(`請求失敗 ${response.status}`)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return response.json() as Promise<T>
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** SSE POST 請求(與 postRequest 相同 headers,返回原始 Response 供流式讀取) */
|
|
36
|
+
export async function postStreamRequest(options: PostRequestOptions): Promise<Response> {
|
|
37
|
+
const response = await fetch(options.url, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: buildAuthHeaders(),
|
|
40
|
+
body: JSON.stringify(options.data ?? {}),
|
|
41
|
+
signal: options.signal,
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`請求失敗 ${response.status}`)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return response
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface SseBlock {
|
|
52
|
+
event: string
|
|
53
|
+
data: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function parseSseBlock(block: string): SseBlock | null {
|
|
57
|
+
if (!block.trim()) return null
|
|
58
|
+
|
|
59
|
+
let event = ''
|
|
60
|
+
let data = ''
|
|
61
|
+
for (const rawLine of block.split(/\r?\n/)) {
|
|
62
|
+
const line = rawLine.replace(/^\uFEFF/, '')
|
|
63
|
+
if (/^event\s*:/i.test(line)) {
|
|
64
|
+
event = line.replace(/^event\s*:/i, '').trim()
|
|
65
|
+
} else if (/^data\s*:/i.test(line)) {
|
|
66
|
+
// 0916-1:data: 後剝一個可選空格。按字母分包時詞間空格常是「data: 」,
|
|
67
|
+
// strip 後變空會被上層跳過 → Themanufacturing;空包則還原為一個空格
|
|
68
|
+
const afterColon = line.replace(/^data\s*:/i, '')
|
|
69
|
+
let piece = afterColon.startsWith(' ') ? afterColon.slice(1) : afterColon
|
|
70
|
+
if (!piece && afterColon.startsWith(' ')) piece = ' '
|
|
71
|
+
data = data ? `${data}\n${piece}` : piece
|
|
72
|
+
// 0916-1
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!event && /AUDIT-EVENT/i.test(block)) {
|
|
76
|
+
event = 'AUDIT-EVENT'
|
|
77
|
+
if (!data) {
|
|
78
|
+
const m = block.match(/data\s*:\s*([^\r\n]+)/i)
|
|
79
|
+
if (m?.[1]) data = m[1].trim()
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!event && /^event\s*:\s*REF\b/im.test(block)) {
|
|
83
|
+
event = 'REF'
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return { event, data }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** SSE POST 流(event: text / end),基于 postRequest 同款 headers */
|
|
90
|
+
export async function* streamPostSse(options: PostRequestOptions): AsyncGenerator<SseBlock> {
|
|
91
|
+
const response = await postStreamRequest(options)
|
|
92
|
+
const stream = response.body
|
|
93
|
+
if (!stream) {
|
|
94
|
+
throw new Error('暫無數據')
|
|
95
|
+
}
|
|
96
|
+
const reader: ReadableStreamDefaultReader<Uint8Array> = stream.getReader()
|
|
97
|
+
|
|
98
|
+
const decoder = new TextDecoder('utf-8')
|
|
99
|
+
let buffer = ''
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
while (true) {
|
|
103
|
+
const { done, value } = await reader.read()
|
|
104
|
+
if (done) break
|
|
105
|
+
if (!value) continue
|
|
106
|
+
|
|
107
|
+
buffer += decoder.decode(value, { stream: true }).replace(/\r\n/g, '\n').replace(/\r/g, '\n')
|
|
108
|
+
const blocks = buffer.split('\n\n')
|
|
109
|
+
buffer = blocks.pop() || ''
|
|
110
|
+
|
|
111
|
+
for (const block of blocks) {
|
|
112
|
+
const parsed = parseSseBlock(block)
|
|
113
|
+
if (parsed) yield parsed
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (buffer.trim()) {
|
|
118
|
+
const parsed = parseSseBlock(buffer)
|
|
119
|
+
if (parsed) yield parsed
|
|
120
|
+
}
|
|
121
|
+
} finally {
|
|
122
|
+
reader.releaseLock()
|
|
123
|
+
}
|
|
124
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|