@gientech/modual 2.0.8 → 2.0.9
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/.editorconfig +38 -0
- package/.prettierignore +16 -0
- package/.prettierrc +17 -0
- package/INSTALL_TROUBLESHOOTING.md +316 -0
- package/USAGE.md +247 -0
- package/bash.exe.stackdump +40 -0
- package/components.json +21 -0
- package/dist/README.md +761 -0
- package/dist/package.json +68 -0
- package/doc_assets/2.png +0 -0
- package/doc_assets/demo.md +27 -0
- package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +2 -0
- package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +23699 -0
- package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +1 -0
- package/doc_assets/demos/dist-app/index.html +14 -0
- package/doc_assets/demos/dist-app/vite.svg +1 -0
- package/doc_assets/images/1.png +0 -0
- package/doc_assets/images/3.png +0 -0
- package/doc_assets/images/component-screenshot.png +1 -0
- package/doc_assets/install.md +5 -0
- package/doc_assets/v2.0.7/345/217/230/346/233/264/346/200/273/347/273/223.md +115 -0
- package/doc_assets//346/226/271/346/241/210//344/274/230/345/214/226/346/226/271/346/241/210-/345/244/232/344/274/232/350/257/235SSE/350/277/236/346/216/245/347/256/241/347/220/206.md +504 -0
- package/eslint.config.js +92 -0
- package/index.html +13 -0
- package/package.json +103 -41
- package/package.json.demo-backup +109 -0
- package/postcss.config.cjs +19 -0
- package/public/icons/answerAwartar.png +0 -0
- package/public/icons/docx-file.png +0 -0
- package/public/icons/folder.png +0 -0
- package/public/icons/html.png +0 -0
- package/public/icons/image.png +0 -0
- package/public/icons/jpg-file.png +0 -0
- package/public/icons/json.png +0 -0
- package/public/icons/md.png +0 -0
- package/public/icons/pdf.png +0 -0
- package/public/icons/pptx.png +0 -0
- package/public/icons/questionAwartar.png +0 -0
- package/public/icons/sheets.png +0 -0
- package/public/icons/txt.png +0 -0
- package/public/icons/xlsx.png +0 -0
- package/public/vite.svg +1 -0
- package/public/worker/pdf.worker.min.js +22 -0
- package/scripts/README.md +133 -0
- package/scripts/build-demo.js +88 -0
- package/scripts/decrypt-api-key.js +95 -0
- package/scripts/demo-selector.js +216 -0
- package/scripts/dev-demo.js +76 -0
- package/scripts/preview-demo.js +130 -0
- package/scripts/run-demo.bat +34 -0
- package/src/assets/img/close.png +0 -0
- package/src/assets/img/database.png +0 -0
- package/src/assets/img/downArrow.png +0 -0
- package/src/assets/img/downLoad.png +0 -0
- package/src/assets/img/excel.png +0 -0
- package/src/assets/img/graphIcon.png +0 -0
- package/src/assets/img/img.png +0 -0
- package/src/assets/img/pdf.png +0 -0
- package/src/assets/img/ppt.png +0 -0
- package/src/assets/img/singleQa.png +0 -0
- package/src/assets/img/txt.png +0 -0
- package/src/assets/img/webSearch.png +0 -0
- package/src/assets/img/word.png +0 -0
- package/src/assets/login/homeBg.png +0 -0
- package/src/assets/login/left.jpg +0 -0
- package/src/assets/login/logoImg.png +0 -0
- package/src/examples/ConversationAssistantPage/index.tsx +41 -0
- package/src/examples/Demo/index.tsx +12 -0
- package/src/examples/LoginPage/index.tsx +18 -0
- package/src/examples/chat/components/DrawerGraphPreview.tsx +78 -0
- package/src/examples/chat/index.tsx +166 -0
- package/src/examples/chat/logo03.png +0 -0
- package/src/examples/gientechStreamFilesReader/index.tsx +951 -0
- package/src/examples/headlessChat/assets/mind.svg +6 -0
- package/src/examples/headlessChat/assets/net.svg +7 -0
- package/src/examples/headlessChat/index.tsx +285 -0
- package/src/examples/ragDatabaseDataPage/index.tsx +40 -0
- package/src/examples/ragDatabaseIdPage/index.tsx +47 -0
- package/src/examples/ragDatabasePage/index.tsx +36 -0
- package/src/examples/ragModelManagePage/index.tsx +38 -0
- package/src/examples/ragSearchPage/index.tsx +0 -0
- package/src/examples/ragSensitiveWordsPage/index.tsx +32 -0
- package/src/examples/streamFiles/index.tsx +417 -0
- package/src/lib_enter.ts +43 -0
- package/src/main.tsx +5 -0
- package/src/main.tsx.backup +5 -0
- package/src/modules/CHAT_UNIFICATION_PLAN.md +324 -0
- package/src/modules/assistantConfig/assets/databse.svg +6 -0
- package/src/modules/assistantConfig/assets/empty.png +0 -0
- package/src/modules/assistantConfig/assets/graph.svg +4 -0
- package/src/modules/assistantConfig/assets/knowledge.svg +4 -0
- package/src/modules/assistantConfig/assets/sensitive.svg +5 -0
- package/src/modules/assistantConfig/components/Database.tsx +171 -0
- package/src/modules/assistantConfig/components/Graph.tsx +177 -0
- package/src/modules/assistantConfig/components/Knowledge.tsx +276 -0
- package/src/modules/assistantConfig/components/NotFoundContent.tsx +21 -0
- package/src/modules/assistantConfig/components/Paragraph.tsx +51 -0
- package/src/modules/assistantConfig/components/ParamsItem.tsx +39 -0
- package/src/modules/assistantConfig/components/ResourceBinderItem.tsx +133 -0
- package/src/modules/assistantConfig/components/SearchableSelector.tsx +500 -0
- package/src/modules/assistantConfig/components/Sensitive.tsx +221 -0
- package/src/modules/assistantConfig/components/SliderInput.tsx +65 -0
- package/src/modules/assistantConfig/constants.tsx +75 -0
- package/src/modules/assistantConfig/index.tsx +710 -0
- package/src/modules/assistantConfig/server.ts +262 -0
- package/src/modules/chat/Conversations/Item.tsx +167 -0
- package/src/modules/chat/Conversations/List.tsx +210 -0
- package/src/modules/chat/Conversations/groupByTime.ts +39 -0
- package/src/modules/chat/Conversations/index.tsx +252 -0
- package/src/modules/chat/ReferenceBar.tsx +622 -0
- package/src/modules/chat/constants.tsx +57 -0
- package/src/modules/chat/index.tsx +2449 -0
- package/src/modules/chat/referenceCom/DeleteModal.tsx +75 -0
- package/src/modules/chat/referenceCom/DrawerContent.tsx +136 -0
- package/src/modules/chat/referenceCom/DrawerDatabase.tsx +102 -0
- package/src/modules/chat/referenceCom/DrawerGraphPreview.tsx +86 -0
- package/src/modules/chat/referenceCom/DrawerPreview.tsx +73 -0
- package/src/modules/chat/referenceCom/DrawerTitle.tsx +26 -0
- package/src/modules/chat/referenceCom/RenameModal.tsx +86 -0
- package/src/modules/chat/referenceCom/TagCom.tsx +30 -0
- package/src/modules/chat/style.less +3 -0
- package/src/modules/chat/types.ts +17 -0
- package/src/modules/chat/utils/index.ts +348 -0
- package/src/modules/database/CreateModal.tsx +403 -0
- package/src/modules/database/assets/Doris.png +0 -0
- package/src/modules/database/assets/PostgreSQL.png +0 -0
- package/src/modules/database/assets/SQLServer.png +0 -0
- package/src/modules/database/assets/database.svg +11 -0
- package/src/modules/database/assets/database_add.svg +53 -0
- package/src/modules/database/assets/database_connect.svg +66 -0
- package/src/modules/database/assets/database_upload.svg +29 -0
- package/src/modules/database/assets/empty.png +0 -0
- package/src/modules/database/assets/mysql.svg +14 -0
- package/src/modules/database/index.tsx +477 -0
- package/src/modules/database/server.ts +196 -0
- package/src/modules/databaseId/CustomCom.tsx +156 -0
- package/src/modules/databaseId/EditConfig.tsx +280 -0
- package/src/modules/databaseId/UploadDrawer.tsx +535 -0
- package/src/modules/databaseId/assets/aiOptimize.svg +10 -0
- package/src/modules/databaseId/assets/empty.png +0 -0
- package/src/modules/databaseId/assets/template.svg +6 -0
- package/src/modules/databaseId/assets/upload.svg +9 -0
- package/src/modules/databaseId/assets/useTemp.svg +6 -0
- package/src/modules/databaseId/index.tsx +769 -0
- package/src/modules/databaseId/server.ts +286 -0
- package/src/modules/databaseId/style.css +5 -0
- package/src/modules/databaseTable/EditRowDrawer.tsx +124 -0
- package/src/modules/databaseTable/index.tsx +359 -0
- package/src/modules/databaseTable/server.ts +180 -0
- package/src/modules/headlessChat/ReferenceBar.tsx +783 -0
- package/src/modules/headlessChat/constants.tsx +54 -0
- package/src/modules/headlessChat/index.tsx +1782 -0
- package/src/modules/headlessChat/referenceCom/DeleteModal.tsx +75 -0
- package/src/modules/headlessChat/referenceCom/DrawerContent.tsx +136 -0
- package/src/modules/headlessChat/referenceCom/DrawerDatabase.tsx +102 -0
- package/src/modules/headlessChat/referenceCom/DrawerGraphPreview.tsx +86 -0
- package/src/modules/headlessChat/referenceCom/DrawerPreview.tsx +73 -0
- package/src/modules/headlessChat/referenceCom/DrawerTitle.tsx +26 -0
- package/src/modules/headlessChat/referenceCom/RenameModal.tsx +86 -0
- package/src/modules/headlessChat/referenceCom/TagCom.tsx +30 -0
- package/src/modules/headlessChat/style.less +3 -0
- package/src/modules/headlessChat/types.ts +23 -0
- package/src/modules/headlessChat/utils/index.ts +348 -0
- package/src/modules/login/components/Login/LoginBox/index.tsx +102 -0
- package/src/modules/login/components/Login/RegisterBox/index.tsx +180 -0
- package/src/modules/login/components/Login/index.tsx +100 -0
- package/src/modules/login/index.tsx +106 -0
- package/src/modules/login/style.css +3 -0
- package/src/modules/login/useServices.ts +53 -0
- package/src/modules/login/utils.ts +42 -0
- package/src/modules/modelManage/ConfigDrawer.tsx +249 -0
- package/src/modules/modelManage/ReplaceModal.tsx +124 -0
- package/src/modules/modelManage/assets/empty.png +0 -0
- package/src/modules/modelManage/const.ts +51 -0
- package/src/modules/modelManage/index.tsx +606 -0
- package/src/modules/modelManage/server.ts +223 -0
- package/src/modules/nodegraph/index.tsx +1 -0
- package/src/modules/search/assets/Icon-history.svg +8 -0
- package/src/modules/search/assets/answerAwartar.png +0 -0
- package/src/modules/search/assets/doc.png +0 -0
- package/src/modules/search/assets/genera.gif +0 -0
- package/src/modules/search/assets/icon-robot.svg +9 -0
- package/src/modules/search/assets/icon-search-bar.svg +14 -0
- package/src/modules/search/assets/icon-sub-title.svg +3 -0
- package/src/modules/search/assets/icon-title.svg +9 -0
- package/src/modules/search/assets/icon-zoomOut.svg +9 -0
- package/src/modules/search/assets/iconAi.svg +9 -0
- package/src/modules/search/assets/pdf.png +0 -0
- package/src/modules/search/assets/ppt.png +0 -0
- package/src/modules/search/assets/search.svg +3 -0
- package/src/modules/search/assets/selected.svg +4 -0
- package/src/modules/search/assets/txt.png +0 -0
- package/src/modules/search/assets/xls.png +0 -0
- package/src/modules/search/components/AssisSelect.tsx +137 -0
- package/src/modules/search/components/Editor/ChatViewEditor.tsx +261 -0
- package/src/modules/search/components/Editor/aichat.css +1 -0
- package/src/modules/search/components/Editor/constant.ts +13 -0
- package/src/modules/search/components/Editor/index.tsx +113 -0
- package/src/modules/search/components/Editor/plugins/autofomatRules.ts +332 -0
- package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +20 -0
- package/src/modules/search/components/Editor/plugins/createIndexes.tsx +38 -0
- package/src/modules/search/components/Editor/plugins/displayer.ts +298 -0
- package/src/modules/search/components/Editor/plugins/imageClick.tsx +32 -0
- package/src/modules/search/components/Editor/plugins/myplugin.tsx +98 -0
- package/src/modules/search/components/Editor/ui/avatar.tsx +19 -0
- package/src/modules/search/components/Editor/ui/blockquote-element.tsx +21 -0
- package/src/modules/search/components/Editor/ui/button.tsx +58 -0
- package/src/modules/search/components/Editor/ui/calendar.tsx +68 -0
- package/src/modules/search/components/Editor/ui/caption.tsx +46 -0
- package/src/modules/search/components/Editor/ui/checkbox.tsx +27 -0
- package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +188 -0
- package/src/modules/search/components/Editor/ui/code-block-element.css +434 -0
- package/src/modules/search/components/Editor/ui/code-block-element.tsx +39 -0
- package/src/modules/search/components/Editor/ui/code-leaf.tsx +24 -0
- package/src/modules/search/components/Editor/ui/code-line-element.tsx +10 -0
- package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +21 -0
- package/src/modules/search/components/Editor/ui/column-element.tsx +30 -0
- package/src/modules/search/components/Editor/ui/column-group-element.tsx +94 -0
- package/src/modules/search/components/Editor/ui/command.tsx +75 -0
- package/src/modules/search/components/Editor/ui/comment-avatar.tsx +22 -0
- package/src/modules/search/components/Editor/ui/comment-create-form.tsx +37 -0
- package/src/modules/search/components/Editor/ui/comment-item.tsx +74 -0
- package/src/modules/search/components/Editor/ui/comment-leaf.tsx +49 -0
- package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +42 -0
- package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +22 -0
- package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +32 -0
- package/src/modules/search/components/Editor/ui/comment-value.tsx +34 -0
- package/src/modules/search/components/Editor/ui/comments-popover.tsx +63 -0
- package/src/modules/search/components/Editor/ui/date-element.tsx +83 -0
- package/src/modules/search/components/Editor/ui/dialog.tsx +63 -0
- package/src/modules/search/components/Editor/ui/draggable.tsx +177 -0
- package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +180 -0
- package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +85 -0
- package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +28 -0
- package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +76 -0
- package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +8 -0
- package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +51 -0
- package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +77 -0
- package/src/modules/search/components/Editor/ui/heading-element.tsx +48 -0
- package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +17 -0
- package/src/modules/search/components/Editor/ui/hr-element.tsx +30 -0
- package/src/modules/search/components/Editor/ui/icons.tsx +267 -0
- package/src/modules/search/components/Editor/ui/image-element.tsx +74 -0
- package/src/modules/search/components/Editor/ui/inline-combobox.tsx +368 -0
- package/src/modules/search/components/Editor/ui/input.tsx +25 -0
- package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +218 -0
- package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +20 -0
- package/src/modules/search/components/Editor/ui/link-element.tsx +29 -0
- package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +161 -0
- package/src/modules/search/components/Editor/ui/list-element.tsx +30 -0
- package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +24 -0
- package/src/modules/search/components/Editor/ui/media-embed-element.tsx +133 -0
- package/src/modules/search/components/Editor/ui/media-popover.tsx +97 -0
- package/src/modules/search/components/Editor/ui/mention-element.tsx +43 -0
- package/src/modules/search/components/Editor/ui/mention-input-element.tsx +141 -0
- package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +93 -0
- package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +67 -0
- package/src/modules/search/components/Editor/ui/paragraph-element.tsx +4 -0
- package/src/modules/search/components/Editor/ui/placeholder.tsx +52 -0
- package/src/modules/search/components/Editor/ui/popover.tsx +32 -0
- package/src/modules/search/components/Editor/ui/resizable.tsx +66 -0
- package/src/modules/search/components/Editor/ui/separator.tsx +25 -0
- package/src/modules/search/components/Editor/ui/style.less +12 -0
- package/src/modules/search/components/Editor/ui/table-cell-element.tsx +143 -0
- package/src/modules/search/components/Editor/ui/table-element.tsx +243 -0
- package/src/modules/search/components/Editor/ui/table-row-element.tsx +22 -0
- package/src/modules/search/components/Editor/ui/tableValue.tsx +135 -0
- package/src/modules/search/components/Editor/ui/todo-list-element.tsx +43 -0
- package/src/modules/search/components/Editor/ui/toggle-element.tsx +31 -0
- package/src/modules/search/components/Editor/ui/toolbar.tsx +157 -0
- package/src/modules/search/components/Editor/ui/tooltip.tsx +65 -0
- package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +160 -0
- package/src/modules/search/components/Editor/ui/with-draggables.tsx +175 -0
- package/src/modules/search/components/FileList.tsx +287 -0
- package/src/modules/search/components/ImageGroupView/index.tsx +85 -0
- package/src/modules/search/components/ResultContent.tsx +232 -0
- package/src/modules/search/components/SearchInput.tsx +232 -0
- package/src/modules/search/components/SearchLanding.tsx +74 -0
- package/src/modules/search/components/SearchView.tsx +563 -0
- package/src/modules/search/components/SimpleEditor.tsx +158 -0
- package/src/modules/search/components/SimpleFileList.tsx +215 -0
- package/src/modules/search/index.tsx +10 -0
- package/src/modules/search/reademe.md +1 -0
- package/src/modules/search/servers/apis.tsx +19 -0
- package/src/modules/search/servers/index.ts +184 -0
- package/src/modules/search/style.less +503 -0
- package/src/modules/search/type.ts +22 -0
- package/src/modules/search/utils.ts +34 -0
- package/src/modules/sensitive/index.tsx +313 -0
- package/src/modules/sensitive/server.ts +122 -0
- package/src/modules/streamFilesReader/GientechStreamReader.tsx +1625 -0
- package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
- package/src/modules/streamFilesReader/components/Header/index.tsx +297 -0
- package/src/modules/streamFilesReader/index.tsx +3 -0
- package/src/style.css +6 -0
- package/src/type.d.ts +0 -0
- package/src/utils/commonFn.tsx +111 -0
- package/src/utils/decryptApiKey.ts +40 -0
- package/src/utils/gientechCommon/components/AppError.tsx +32 -0
- package/src/utils/gientechCommon/components/AppLoading.tsx +75 -0
- package/src/utils/gientechCommon/components/DeleteModal.tsx +75 -0
- package/src/utils/gientechCommon/components/DisplayError.tsx +33 -0
- package/src/utils/gientechCommon/components/DisplayLoading.tsx +38 -0
- package/src/utils/gientechCommon/components/FeedBackModal.tsx +319 -0
- package/src/utils/gientechCommon/components/FileCardCommon.tsx +82 -0
- package/src/utils/gientechCommon/components/FileManager/index.tsx +418 -0
- package/src/utils/gientechCommon/components/FileManager/style.css +5 -0
- package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +581 -0
- package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +359 -0
- package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +245 -0
- package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +209 -0
- package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
- package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +148 -0
- package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +14 -0
- package/src/utils/gientechCommon/components/RenameModal.tsx +86 -0
- package/src/utils/gientechCommon/components/style.less +11 -0
- package/src/utils/gientechCommon/configs/commonConfig.ts +2 -0
- package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
- package/src/utils/gientechCommon/configs/stylesConfig.ts +142 -0
- package/src/utils/gientechCommon/hooks/AichatUseController.tsx +417 -0
- package/src/utils/gientechCommon/hooks/useFileDisplayTools.tsx +251 -0
- package/src/utils/gientechCommon/hooks/useFileManager.ts +208 -0
- package/src/utils/gientechCommon/slate/converters/deserializers.ts +763 -0
- package/src/utils/gientechCommon/slate/converters/mockData.ts +232 -0
- package/src/utils/gientechCommon/slate/converters/slateConverters.ts +258 -0
- package/src/utils/gientechCommon/slate/richElements/index.tsx +499 -0
- package/src/utils/gientechCommon/utils/fileUtils.ts +86 -0
- package/src/utils/gientechCommon/utils/request.ts +37 -0
- package/src/utils/gientechCommon/utils/serverFn.ts +172 -0
- package/src/utils/index.tsx +142 -0
- package/src/utils/testconfigs/demologin/index.tsx +32 -0
- package/src/utils/testconfigs/index.ts +59 -0
- package/src/vite-env.d.ts +42 -0
- package/stats.html +4949 -0
- package/tailwind.config.js +170 -0
- package/tsconfig.app.json +30 -0
- package/tsconfig.app.tsbuildinfo +11 -0
- package/tsconfig.json +13 -0
- package/tsconfig.node.json +22 -0
- package/tsconfig.node.tsbuildinfo +1 -0
- package/vite.config.app.ts +93 -0
- package/vite.config.ts +232 -0
- package/workflows/release.yml +60 -0
- package//346/215/242/350/241/214/346/240/274/345/274/217/344/277/235/346/214/201/344/274/230/345/214/226/346/226/271/346/241/210.md +359 -0
- /package/{assets → dist/assets}/Doris.png +0 -0
- /package/{assets → dist/assets}/GientechStreamReader-CNj6Rcm7.js +0 -0
- /package/{assets → dist/assets}/PostgreSQL.png +0 -0
- /package/{assets → dist/assets}/SQLServer.png +0 -0
- /package/{assets → dist/assets}/database.svg +0 -0
- /package/{assets → dist/assets}/database_add.svg +0 -0
- /package/{assets → dist/assets}/database_connect.svg +0 -0
- /package/{assets → dist/assets}/database_upload.svg +0 -0
- /package/{assets → dist/assets}/databse.svg +0 -0
- /package/{assets → dist/assets}/defaultWeLogo.svg +0 -0
- /package/{assets → dist/assets}/empty.png +0 -0
- /package/{assets → dist/assets}/graph.svg +0 -0
- /package/{assets → dist/assets}/homeBg.png +0 -0
- /package/{assets → dist/assets}/index-B2yNvzjy.js +0 -0
- /package/{assets → dist/assets}/index-BJv0t0eJ.js +0 -0
- /package/{assets → dist/assets}/index-BKe5FgcC.js +0 -0
- /package/{assets → dist/assets}/index-CU45mVZ4.js +0 -0
- /package/{assets → dist/assets}/index-CpW6Dhpp.js +0 -0
- /package/{assets → dist/assets}/index-D72cKELw.js +0 -0
- /package/{assets → dist/assets}/index-DdVFXD_y.js +0 -0
- /package/{assets → dist/assets}/index-DrkSoKz6.js +0 -0
- /package/{assets → dist/assets}/index-ZopkeZtI.js +0 -0
- /package/{assets → dist/assets}/index-g-SUxfJH.js +0 -0
- /package/{assets → dist/assets}/index-j0kQJd0a.js +0 -0
- /package/{assets → dist/assets}/knowledge.svg +0 -0
- /package/{assets → dist/assets}/left.jpg +0 -0
- /package/{assets → dist/assets}/logoImg.png +0 -0
- /package/{assets → dist/assets}/mysql.svg +0 -0
- /package/{assets → dist/assets}/plus-V9zUoSq6.js +0 -0
- /package/{assets → dist/assets}/sensitive.svg +0 -0
- /package/{assets → dist/assets}/style-CGmZ5osp.js +0 -0
- /package/{assets → dist/assets}/style.css +0 -0
- /package/{assets → dist/assets}/style2.css +0 -0
- /package/{assets → dist/assets}/style3.css +0 -0
- /package/{assets → dist/assets}/style4.css +0 -0
- /package/{assets → dist/assets}/worker-BbpylX7l.js +0 -0
- /package/{assets → dist/assets}/x-CnaaLGJF.js +0 -0
- /package/{assistantConfig.d.ts → dist/assistantConfig.d.ts} +0 -0
- /package/{assistantConfig.js → dist/assistantConfig.js} +0 -0
- /package/{chat.d.ts → dist/chat.d.ts} +0 -0
- /package/{chat.js → dist/chat.js} +0 -0
- /package/{database.d.ts → dist/database.d.ts} +0 -0
- /package/{database.js → dist/database.js} +0 -0
- /package/{databaseId.d.ts → dist/databaseId.d.ts} +0 -0
- /package/{databaseId.js → dist/databaseId.js} +0 -0
- /package/{databaseTable.d.ts → dist/databaseTable.d.ts} +0 -0
- /package/{databaseTable.js → dist/databaseTable.js} +0 -0
- /package/{icons → dist/icons}/answerAwartar.png +0 -0
- /package/{icons → dist/icons}/docx-file.png +0 -0
- /package/{icons → dist/icons}/folder.png +0 -0
- /package/{icons → dist/icons}/html.png +0 -0
- /package/{icons → dist/icons}/image.png +0 -0
- /package/{icons → dist/icons}/jpg-file.png +0 -0
- /package/{icons → dist/icons}/json.png +0 -0
- /package/{icons → dist/icons}/md.png +0 -0
- /package/{icons → dist/icons}/pdf.png +0 -0
- /package/{icons → dist/icons}/pptx.png +0 -0
- /package/{icons → dist/icons}/questionAwartar.png +0 -0
- /package/{icons → dist/icons}/sheets.png +0 -0
- /package/{icons → dist/icons}/txt.png +0 -0
- /package/{icons → dist/icons}/xlsx.png +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{index.js → dist/index.js} +0 -0
- /package/{modelManage.d.ts → dist/modelManage.d.ts} +0 -0
- /package/{modelManage.js → dist/modelManage.js} +0 -0
- /package/{sensitive.d.ts → dist/sensitive.d.ts} +0 -0
- /package/{sensitive.js → dist/sensitive.js} +0 -0
- /package/{streamFilesReader.d.ts → dist/streamFilesReader.d.ts} +0 -0
- /package/{streamFilesReader.js → dist/streamFilesReader.js} +0 -0
- /package/{vite.svg → dist/vite.svg} +0 -0
- /package/{worker → dist/worker}/pdf.worker.min.js +0 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# 用户输入换行格式保持优化方案
|
|
2
|
+
|
|
3
|
+
## 问题描述
|
|
4
|
+
|
|
5
|
+
用户输入包含换行格式的内容时,提交后显示变成了一行,中间有一些空格,换行格式丢失。
|
|
6
|
+
|
|
7
|
+
## 问题分析
|
|
8
|
+
|
|
9
|
+
### 完整数据流追踪
|
|
10
|
+
|
|
11
|
+
#### 1. 输入阶段 (`apps/AIChat/src/components/Sender/index.tsx`)
|
|
12
|
+
- **第225-228行**:`handleInput` 直接使用 `e.target.value`,通过 `eventsEmit('sender:change', e.target.value)` 传递
|
|
13
|
+
- **第231-237行**:`handlePaste` 处理粘贴事件,确保粘贴内容中的换行符被正确保留
|
|
14
|
+
- **第232-256行**:`handleKeyDown` 处理换行逻辑,支持 Shift+Enter 和 Ctrl/Cmd+Enter
|
|
15
|
+
- **第254行**:发送时触发 `eventsEmit('sender:send')`,**未传递内容参数**
|
|
16
|
+
- **第520-525行**:textarea 添加 `whiteSpace: 'pre-wrap'` 样式,确保 textarea 本身也保留换行格式
|
|
17
|
+
- **状态**:✅ 输入阶段保持原始格式,无 trim 操作
|
|
18
|
+
- **支持场景**:
|
|
19
|
+
- ✅ 手动输入换行(Shift+Enter 或 Ctrl/Cmd+Enter)
|
|
20
|
+
- ✅ 从外部复制粘贴包含换行的内容
|
|
21
|
+
|
|
22
|
+
#### 2. 状态同步阶段 (`apps/AIChat/src/core/AiChat.tsx`)
|
|
23
|
+
- **第172-175行**:`sender:change` 事件直接设置 `setInputValue(payload)`,无 trim
|
|
24
|
+
- **第220行**:`sender:send` 事件中,使用 `content: inputValue` 直接传递
|
|
25
|
+
- **状态**:✅ 状态同步阶段保持原始格式,无 trim 操作
|
|
26
|
+
|
|
27
|
+
#### 3. 业务层处理 (`gientech/src/modules/chat/index.tsx`)
|
|
28
|
+
- **第968行**:`addEmptyMessage` 使用 `content: data.content || data.text || ''`
|
|
29
|
+
- **第1132行、1192行**:`api_startChat_re` 调用时使用 `content: data.content || data.text || ''`
|
|
30
|
+
- **状态**:✅ 业务层直接传递,无 trim 操作
|
|
31
|
+
|
|
32
|
+
#### 4. API 调用阶段 (`gientech/src/utils/gientechCommon/hooks/AichatUseController.tsx`)
|
|
33
|
+
- **第180行**:使用 `JSON.stringify(params)` 序列化请求体
|
|
34
|
+
- **JSON.stringify 行为**:✅ 会保留换行符 `\n`(作为转义字符 `\\n` 或直接保留)
|
|
35
|
+
- **状态**:✅ API 调用阶段理论上应保留格式
|
|
36
|
+
|
|
37
|
+
#### 5. 渲染阶段 (`apps/Rtext/src/adopters/ChatMessageAdapter.tsx`)
|
|
38
|
+
- **第1132-1145行**:`processedContent` 简单转换为字符串
|
|
39
|
+
- **第2804行**:渲染为 `<div>{processedContent}</div>`
|
|
40
|
+
- **问题所在**:`.message-text` 样式缺少 `white-space: pre-wrap`,导致浏览器默认行为忽略换行符
|
|
41
|
+
|
|
42
|
+
### 根本原因
|
|
43
|
+
|
|
44
|
+
**双重问题**:
|
|
45
|
+
1. **渲染层问题**:`.message-text` 没有设置 `white-space: pre-wrap`,浏览器默认的 `white-space: normal` 会将:
|
|
46
|
+
- 多个连续空格合并为一个
|
|
47
|
+
- 换行符(`\n`)转换为空格
|
|
48
|
+
- 导致用户输入的换行格式丢失
|
|
49
|
+
|
|
50
|
+
2. **数据流保障**:虽然当前代码没有显式的 trim 操作,但需要确保整个数据流中内容不被意外处理
|
|
51
|
+
|
|
52
|
+
## 解决方案
|
|
53
|
+
|
|
54
|
+
### 方案一:CSS 样式修复 + 数据流保障(推荐)
|
|
55
|
+
|
|
56
|
+
**优点**:
|
|
57
|
+
- 修改最小,影响范围可控
|
|
58
|
+
- 不改变数据流和业务逻辑
|
|
59
|
+
- 性能最优
|
|
60
|
+
- 双重保障,确保格式完整保留
|
|
61
|
+
|
|
62
|
+
**修改位置**:
|
|
63
|
+
1. `apps/Rtext/src/adopters/ChatMessageAdapter.tsx` - 渲染样式修复
|
|
64
|
+
2. `gientech/src/modules/chat/index.tsx` - 数据流保障(可选,防御性代码)
|
|
65
|
+
|
|
66
|
+
**具体修改**:
|
|
67
|
+
|
|
68
|
+
#### 1. 渲染层样式修复
|
|
69
|
+
|
|
70
|
+
在 `.message-text` 样式中添加 `white-space: pre-wrap`,保留换行和空格,同时允许自动换行。
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
.message-text {
|
|
74
|
+
width: 100%;
|
|
75
|
+
line-height: 1.6;
|
|
76
|
+
white-space: pre-wrap; /* 保留换行和空格格式 */
|
|
77
|
+
border-radius: 0.5rem;
|
|
78
|
+
min-height: ${props => props.$isUser ? 'auto' : '40px'};
|
|
79
|
+
font-size: 0.875rem;
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### 2. 数据流保障(防御性代码)
|
|
84
|
+
|
|
85
|
+
在 `sendMessageWithSessionId` 函数中,确保内容不被意外处理:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
function sendMessageWithSessionId(
|
|
89
|
+
sessionId: string,
|
|
90
|
+
data: any,
|
|
91
|
+
clearFn: () => void,
|
|
92
|
+
configIdOverride?: string
|
|
93
|
+
) {
|
|
94
|
+
// ... 现有代码 ...
|
|
95
|
+
|
|
96
|
+
// 确保内容保持原始格式,不进行任何 trim 或替换
|
|
97
|
+
const rawContent = data.content || data.text || '';
|
|
98
|
+
// 明确保留换行符和空格,不进行任何处理
|
|
99
|
+
const preservedContent = typeof rawContent === 'string' ? rawContent : String(rawContent);
|
|
100
|
+
|
|
101
|
+
addEmptyMessage({
|
|
102
|
+
content: preservedContent, // 使用保留格式的内容
|
|
103
|
+
queryId,
|
|
104
|
+
currentFiles: localCurrentFiles,
|
|
105
|
+
filePaths: localCurrentFiles ? JSON.stringify(localCurrentFiles) : undefined,
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// ... 后续代码中,使用 preservedContent 替代 data.content || data.text || ''
|
|
109
|
+
api_startChat_re({
|
|
110
|
+
configId: configIdToUse,
|
|
111
|
+
content: preservedContent, // 使用保留格式的内容
|
|
112
|
+
// ... 其他参数
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 方案二:内容预处理(备选)
|
|
118
|
+
|
|
119
|
+
如果方案一无法完全解决问题,可以考虑在渲染前将换行符转换为 `<br>` 标签。
|
|
120
|
+
|
|
121
|
+
**修改位置**:
|
|
122
|
+
- `apps/Rtext/src/adopters/ChatMessageAdapter.tsx` 的 `processedContent` 处理逻辑
|
|
123
|
+
|
|
124
|
+
**具体修改**:
|
|
125
|
+
```typescript
|
|
126
|
+
const processedContent = useMemo(() => {
|
|
127
|
+
if (typeof content === 'string') {
|
|
128
|
+
// 如果是用户消息且为 plainText,保留换行格式
|
|
129
|
+
if (isUser && contentType === 'plainText') {
|
|
130
|
+
return content.split('\n').map((line, idx, arr) => (
|
|
131
|
+
<React.Fragment key={idx}>
|
|
132
|
+
{line}
|
|
133
|
+
{idx < arr.length - 1 && <br />}
|
|
134
|
+
</React.Fragment>
|
|
135
|
+
));
|
|
136
|
+
}
|
|
137
|
+
return content;
|
|
138
|
+
}
|
|
139
|
+
// ... 其他处理逻辑
|
|
140
|
+
}, [content, defaultAnswer, isUser, contentType]);
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**注意**:此方案需要修改渲染部分,将 `<div>{processedContent}</div>` 改为直接渲染 `processedContent`。
|
|
144
|
+
|
|
145
|
+
## 推荐实施方案
|
|
146
|
+
|
|
147
|
+
**采用方案一**,原因:
|
|
148
|
+
1. 最简单直接
|
|
149
|
+
2. 符合 HTML/CSS 标准做法
|
|
150
|
+
3. 不影响现有逻辑
|
|
151
|
+
4. 性能最优
|
|
152
|
+
|
|
153
|
+
## 涉及修改的组件和功能
|
|
154
|
+
|
|
155
|
+
### 1. 核心修改
|
|
156
|
+
|
|
157
|
+
#### `apps/Rtext/src/adopters/ChatMessageAdapter.tsx`
|
|
158
|
+
- **位置**:第 309-316 行,`.message-text` 样式定义
|
|
159
|
+
- **修改内容**:添加 `white-space: pre-wrap;`
|
|
160
|
+
- **影响范围**:所有使用 `ChatMessageAdapter` 渲染的用户消息
|
|
161
|
+
- **风险等级**:低(仅影响样式,不改变数据流)
|
|
162
|
+
|
|
163
|
+
### 2. 验证点
|
|
164
|
+
|
|
165
|
+
#### `apps/AIChat/src/components/Sender/index.tsx`
|
|
166
|
+
- **验证**:确认发送时 `localValue` 未被 trim
|
|
167
|
+
- **当前状态**:✅ 已确认无 trim 操作(第 254 行直接发送 `localValue`)
|
|
168
|
+
|
|
169
|
+
#### `apps/AIChat/src/core/AiChat.tsx`
|
|
170
|
+
- **验证**:确认 `inputValue` 传递时未被处理
|
|
171
|
+
- **当前状态**:✅ 已确认直接传递 `inputValue`(第 220 行)
|
|
172
|
+
|
|
173
|
+
#### `gientech/src/modules/chat/index.tsx`
|
|
174
|
+
- **验证**:确认 `handleSenderSend` 中 `data.content` 未被处理
|
|
175
|
+
- **当前状态**:✅ 已确认直接使用 `data.content || data.text || ''`(第 968 行)
|
|
176
|
+
|
|
177
|
+
## 实施步骤
|
|
178
|
+
|
|
179
|
+
### 步骤一:修复输入层样式(必须)
|
|
180
|
+
|
|
181
|
+
**文件**:`apps/AIChat/src/components/Sender/index.tsx`
|
|
182
|
+
|
|
183
|
+
1. 添加粘贴事件处理:
|
|
184
|
+
```typescript
|
|
185
|
+
// 处理粘贴事件,确保粘贴内容中的换行符被正确保留
|
|
186
|
+
const handlePaste = (e: React.ClipboardEvent<HTMLTextAreaElement>) => {
|
|
187
|
+
// 让浏览器默认处理粘贴,textarea 会自动保留换行符
|
|
188
|
+
// 这里不需要阻止默认行为,只需要确保粘贴后触发高度调整
|
|
189
|
+
setTimeout(() => {
|
|
190
|
+
adjustTextareaHeight();
|
|
191
|
+
}, 0);
|
|
192
|
+
};
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
2. 在 textarea 上添加样式和事件:
|
|
196
|
+
```typescript
|
|
197
|
+
<textarea
|
|
198
|
+
ref={textareaRef}
|
|
199
|
+
value={localValue}
|
|
200
|
+
onChange={handleInput}
|
|
201
|
+
onPaste={handlePaste} // 新增
|
|
202
|
+
onKeyDown={handleKeyDown}
|
|
203
|
+
onFocus={handleFocus}
|
|
204
|
+
style={{
|
|
205
|
+
backgroundColor: 'transparent',
|
|
206
|
+
color: textColor,
|
|
207
|
+
whiteSpace: 'pre-wrap', // 新增:确保 textarea 本身也保留换行格式
|
|
208
|
+
}}
|
|
209
|
+
/>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 步骤二:修复渲染层样式(必须)
|
|
213
|
+
|
|
214
|
+
**文件**:`apps/Rtext/src/adopters/ChatMessageAdapter.tsx`
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
.message-text {
|
|
218
|
+
width: 100%;
|
|
219
|
+
line-height: 1.6;
|
|
220
|
+
white-space: pre-wrap; /* 保留换行和空格格式 */
|
|
221
|
+
border-radius: 0.5rem;
|
|
222
|
+
min-height: ${props => props.$isUser ? 'auto' : '40px'};
|
|
223
|
+
font-size: 0.875rem;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 步骤三:添加数据流保障(推荐,防御性代码)
|
|
228
|
+
|
|
229
|
+
**文件**:`gientech/src/modules/chat/index.tsx`
|
|
230
|
+
|
|
231
|
+
在 `sendMessageWithSessionId` 函数中,明确保留内容格式:
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
function sendMessageWithSessionId(
|
|
235
|
+
sessionId: string,
|
|
236
|
+
data: any,
|
|
237
|
+
clearFn: () => void,
|
|
238
|
+
configIdOverride?: string
|
|
239
|
+
) {
|
|
240
|
+
const queryId = 'query-' + uid(32);
|
|
241
|
+
const conv = conversationList.find(c => c.sessionId === sessionId);
|
|
242
|
+
const configIdToUse = configIdOverride || conv?.configId || currentChatData.configId;
|
|
243
|
+
const label = data && data.content ? data.content.slice(0, 20) : '未命名会话';
|
|
244
|
+
|
|
245
|
+
// === 新增:明确保留内容格式,不进行任何处理 ===
|
|
246
|
+
const rawContent = data.content || data.text || '';
|
|
247
|
+
const preservedContent = typeof rawContent === 'string' ? rawContent : String(rawContent);
|
|
248
|
+
|
|
249
|
+
// ... 文件处理逻辑 ...
|
|
250
|
+
|
|
251
|
+
addEmptyMessage({
|
|
252
|
+
content: preservedContent, // 使用保留格式的内容
|
|
253
|
+
queryId,
|
|
254
|
+
currentFiles: localCurrentFiles,
|
|
255
|
+
filePaths: localCurrentFiles ? JSON.stringify(localCurrentFiles) : undefined,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// ... 后续所有使用 content 的地方,都使用 preservedContent
|
|
259
|
+
api_startChat_re({
|
|
260
|
+
configId: configIdToUse,
|
|
261
|
+
content: preservedContent, // 确保格式完整传递到后端
|
|
262
|
+
fileUids: serverUids, // 或 []
|
|
263
|
+
lastDate: now,
|
|
264
|
+
name: label,
|
|
265
|
+
queryId: queryId,
|
|
266
|
+
sessionId: String(sessionId || ''),
|
|
267
|
+
type: 'text',
|
|
268
|
+
audioUrl: '',
|
|
269
|
+
enableThinking: !!senderSwitchValues.reasoning,
|
|
270
|
+
enableWebsearch: !!senderSwitchValues.netSearch,
|
|
271
|
+
qaChannel: senderSwitchValues.qaChannel,
|
|
272
|
+
} as any, ...);
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 步骤四:测试验证
|
|
277
|
+
|
|
278
|
+
1. **前端显示测试**
|
|
279
|
+
- 测试用户手动输入多行文本(Shift+Enter 换行)
|
|
280
|
+
- 测试用户从外部复制粘贴包含换行的内容(如从 Word、记事本、网页等)
|
|
281
|
+
- 测试用户输入包含多个空格的内容
|
|
282
|
+
- 测试用户输入包含制表符的内容
|
|
283
|
+
- 验证发送后显示格式与输入一致
|
|
284
|
+
|
|
285
|
+
2. **后端数据测试**
|
|
286
|
+
- 使用浏览器开发者工具检查 Network 请求
|
|
287
|
+
- 验证请求体中的 `content` 字段是否包含换行符 `\n`
|
|
288
|
+
- 验证后端接收到的数据格式是否正确
|
|
289
|
+
|
|
290
|
+
3. **兼容性检查**
|
|
291
|
+
- 检查是否影响 AI 消息的显示(AI 消息使用 `contentType="stream"`,不受影响)
|
|
292
|
+
- 检查是否影响其他使用 `ChatMessageAdapter` 的场景
|
|
293
|
+
|
|
294
|
+
## 预期效果
|
|
295
|
+
|
|
296
|
+
### 前端显示
|
|
297
|
+
- ✅ 用户输入的换行格式完整保留
|
|
298
|
+
- ✅ 用户输入的多个空格完整保留
|
|
299
|
+
- ✅ 不影响现有功能
|
|
300
|
+
- ✅ 不影响 AI 消息的渲染
|
|
301
|
+
|
|
302
|
+
### 后端数据
|
|
303
|
+
- ✅ 提交给后端的数据包含完整的换行符 `\n`
|
|
304
|
+
- ✅ JSON 序列化后换行符正确保留(`\n` 在 JSON 中是有效字符)
|
|
305
|
+
- ✅ 后端接收到的 `content` 字段格式与用户输入一致
|
|
306
|
+
|
|
307
|
+
## 注意事项
|
|
308
|
+
|
|
309
|
+
1. **`white-space: pre-wrap` 特性**:
|
|
310
|
+
- 保留换行符和空格
|
|
311
|
+
- 允许文本自动换行(与 `pre` 的区别)
|
|
312
|
+
- 适合聊天场景
|
|
313
|
+
|
|
314
|
+
2. **如果遇到问题**:
|
|
315
|
+
- 如果 `pre-wrap` 导致某些场景显示异常,可以考虑使用 `pre-line`(只保留换行,合并空格)
|
|
316
|
+
- 或者针对用户消息单独设置样式
|
|
317
|
+
|
|
318
|
+
3. **向后兼容**:
|
|
319
|
+
- 此修改不影响现有数据
|
|
320
|
+
- 只影响新消息的显示方式
|
|
321
|
+
- 历史消息也会受益于此修改
|
|
322
|
+
|
|
323
|
+
## 相关文件清单
|
|
324
|
+
|
|
325
|
+
### 需要修改的文件
|
|
326
|
+
- ✅ `apps/AIChat/src/components/Sender/index.tsx` - **已修改**:添加 `handlePaste` 和 `whiteSpace: 'pre-wrap'`
|
|
327
|
+
- ✅ `apps/Rtext/src/adopters/ChatMessageAdapter.tsx` - **已修改**:添加 `white-space: pre-wrap !important`
|
|
328
|
+
- ✅ `gientech/src/modules/chat/index.tsx` - **已修改**:添加数据流保障代码
|
|
329
|
+
|
|
330
|
+
### 已验证无需修改的文件
|
|
331
|
+
- ✅ `apps/AIChat/src/components/Sender/index.tsx` - 已验证无 trim 操作
|
|
332
|
+
- ✅ `apps/AIChat/src/core/AiChat.tsx` - 已验证直接传递 `inputValue`
|
|
333
|
+
- ✅ `gientech/src/utils/gientechCommon/hooks/AichatUseController.tsx` - 已验证使用 `JSON.stringify`,理论上保留格式
|
|
334
|
+
|
|
335
|
+
## 数据流保障说明
|
|
336
|
+
|
|
337
|
+
### JSON.stringify 对换行符的处理
|
|
338
|
+
|
|
339
|
+
`JSON.stringify` 在序列化字符串时:
|
|
340
|
+
- 换行符 `\n` 会被保留为 `\n`(在 JSON 字符串中)
|
|
341
|
+
- 多个空格会被保留
|
|
342
|
+
- 制表符 `\t` 会被保留为 `\t`
|
|
343
|
+
|
|
344
|
+
**示例**:
|
|
345
|
+
```javascript
|
|
346
|
+
const content = "第一行\n第二行\n 多个空格";
|
|
347
|
+
JSON.stringify({ content });
|
|
348
|
+
// 结果: '{"content":"第一行\\n第二行\\n 多个空格"}'
|
|
349
|
+
// 注意:JSON 字符串中的 \n 会被转义为 \\n,但后端解析后会恢复为 \n
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 防御性代码的作用
|
|
353
|
+
|
|
354
|
+
虽然当前代码没有显式的 trim 操作,但添加防御性代码可以:
|
|
355
|
+
1. **明确意图**:代码明确表达"保留原始格式"的意图
|
|
356
|
+
2. **防止未来误改**:如果未来有人修改代码,看到明确的注释和变量名,会意识到需要保留格式
|
|
357
|
+
3. **便于调试**:如果出现问题,可以快速定位到 `preservedContent` 变量
|
|
358
|
+
4. **类型安全**:确保内容始终是字符串类型
|
|
359
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|