├── .dockerignore ├── .env.dev ├── .env.pro ├── .env.test ├── .gitignore ├── .vscode ├── extensions.json └── settings.json ├── Makefile ├── README-en.md ├── README.md ├── chromedriver ├── common ├── __init__.py ├── date_util.py ├── duckdb_util.py ├── exception.py ├── initialize_mysql.py ├── minio_util.py ├── mysql_util.py ├── pdf_util.py ├── redis_tool.py ├── res_decorator.py ├── route_utility.py ├── token_decorator.py └── word_util.py ├── component ├── .DS_Store ├── __init__.py └── pandasai │ ├── __init__.py │ └── pandas_ai_response.py ├── config ├── __init__.py ├── load_env.py ├── logging.conf └── serv.py ├── constants ├── __init__.py ├── code_enum.py └── dify_rest_api.py ├── controllers ├── __init__.py ├── common_chat_api.py ├── db_chat_api.py ├── dify_chat_api.py ├── file_chat_api.py ├── ta_assistant_api.py └── user_service_api.py ├── docker ├── .DS_Store ├── .env ├── Dockerfile ├── dify │ ├── .DS_Store │ ├── docker │ │ ├── .env │ │ ├── .env.example │ │ ├── README.md │ │ ├── certbot │ │ │ ├── README.md │ │ │ ├── docker-entrypoint.sh │ │ │ └── update-cert.template.txt │ │ ├── couchbase-server │ │ │ ├── Dockerfile │ │ │ └── init-cbserver.sh │ │ ├── docker-compose-template.yaml │ │ ├── docker-compose.middleware.yaml │ │ ├── docker-compose.png │ │ ├── docker-compose.yaml │ │ ├── elasticsearch │ │ │ └── docker-entrypoint.sh │ │ ├── generate_docker_compose │ │ ├── middleware.env.example │ │ ├── nginx │ │ │ ├── conf.d │ │ │ │ └── default.conf.template │ │ │ ├── docker-entrypoint.sh │ │ │ ├── https.conf.template │ │ │ ├── nginx.conf.template │ │ │ ├── proxy.conf.template │ │ │ └── ssl │ │ │ │ └── .gitkeep │ │ ├── pgvector │ │ │ └── docker-entrypoint.sh │ │ ├── ssrf_proxy │ │ │ ├── docker-entrypoint.sh │ │ │ └── squid.conf.template │ │ ├── startupscripts │ │ │ ├── init.sh │ │ │ └── init_user.script │ │ ├── tidb │ │ │ ├── config │ │ │ │ ├── pd.toml │ │ │ │ ├── tiflash-learner.toml │ │ │ │ └── tiflash.toml │ │ │ └── docker-compose.yaml │ │ └── volumes │ │ │ ├── myscale │ │ │ └── config │ │ │ │ └── users.d │ │ │ │ └── custom_users_config.xml │ │ │ ├── oceanbase │ │ │ └── init.d │ │ │ │ └── vec_memory.sql │ │ │ ├── opensearch │ │ │ └── opensearch_dashboards.yml │ │ │ └── sandbox │ │ │ ├── conf │ │ │ ├── config.yaml │ │ │ └── config.yaml.example │ │ │ └── dependencies │ │ │ └── python-requirements.txt │ ├── 数据问答.yml │ ├── 数据问答_v1.1.0.yml │ ├── 数据问答_v1.1.1_deepseek.yml │ └── 数据问答_v1.1.2_deepseek.yml ├── docker-compose.yaml ├── init_data.sh ├── init_sql.sql └── my.cnf ├── images ├── app-01.png ├── chat-01.png ├── chat-02.png ├── chat-04.gif ├── chat-05.png ├── convas-api-key.png ├── ding.png ├── img.png ├── import-convas.png ├── llm-setting-deepseek.png ├── llm-setting.png ├── wchat-search.png └── wchat.png ├── models └── __init__.py ├── poetry.lock ├── puml ├── llm_to_chart_dify.puml ├── llm_to_chart_matplotlib.puml ├── llm_to_chart_ycs.puml └── mcp.puml ├── pyproject.toml ├── serv.py ├── services ├── __init__.py ├── db_qadata_process.py ├── dify_service.py ├── pandas_ai_service.py ├── selenium_service.py ├── ta_assistant_service.py ├── text2_sql_service.py └── user_service.py └── web ├── .dockerignore ├── .env.template ├── .eslintrc-auto-import.json ├── .gitignore ├── .stylelintignore ├── .stylelintrc.cjs ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── LICENSE ├── Makefile ├── README.md ├── auto-imports.d.ts ├── babel.config.cjs ├── components-instance.d.ts ├── components.d.ts ├── docker ├── Dockerfile └── nginx.conf ├── eslint.config.ts ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public ├── favicon.svg └── pdfjs-4.10.38-dist │ ├── LICENSE │ ├── build │ ├── pdf.mjs │ ├── pdf.mjs.map │ ├── pdf.sandbox.mjs │ ├── pdf.sandbox.mjs.map │ ├── pdf.worker.mjs │ └── pdf.worker.mjs.map │ └── web │ ├── cmaps │ ├── 78-EUC-H.bcmap │ ├── 78-EUC-V.bcmap │ ├── 78-H.bcmap │ ├── 78-RKSJ-H.bcmap │ ├── 78-RKSJ-V.bcmap │ ├── 78-V.bcmap │ ├── 78ms-RKSJ-H.bcmap │ ├── 78ms-RKSJ-V.bcmap │ ├── 83pv-RKSJ-H.bcmap │ ├── 90ms-RKSJ-H.bcmap │ ├── 90ms-RKSJ-V.bcmap │ ├── 90msp-RKSJ-H.bcmap │ ├── 90msp-RKSJ-V.bcmap │ ├── 90pv-RKSJ-H.bcmap │ ├── 90pv-RKSJ-V.bcmap │ ├── Add-H.bcmap │ ├── Add-RKSJ-H.bcmap │ ├── Add-RKSJ-V.bcmap │ ├── Add-V.bcmap │ ├── Adobe-CNS1-0.bcmap │ ├── Adobe-CNS1-1.bcmap │ ├── Adobe-CNS1-2.bcmap │ ├── Adobe-CNS1-3.bcmap │ ├── Adobe-CNS1-4.bcmap │ ├── Adobe-CNS1-5.bcmap │ ├── Adobe-CNS1-6.bcmap │ ├── Adobe-CNS1-UCS2.bcmap │ ├── Adobe-GB1-0.bcmap │ ├── Adobe-GB1-1.bcmap │ ├── Adobe-GB1-2.bcmap │ ├── Adobe-GB1-3.bcmap │ ├── Adobe-GB1-4.bcmap │ ├── Adobe-GB1-5.bcmap │ ├── Adobe-GB1-UCS2.bcmap │ ├── Adobe-Japan1-0.bcmap │ ├── Adobe-Japan1-1.bcmap │ ├── Adobe-Japan1-2.bcmap │ ├── Adobe-Japan1-3.bcmap │ ├── Adobe-Japan1-4.bcmap │ ├── Adobe-Japan1-5.bcmap │ ├── Adobe-Japan1-6.bcmap │ ├── Adobe-Japan1-UCS2.bcmap │ ├── Adobe-Korea1-0.bcmap │ ├── Adobe-Korea1-1.bcmap │ ├── Adobe-Korea1-2.bcmap │ ├── Adobe-Korea1-UCS2.bcmap │ ├── B5-H.bcmap │ ├── B5-V.bcmap │ ├── B5pc-H.bcmap │ ├── B5pc-V.bcmap │ ├── CNS-EUC-H.bcmap │ ├── CNS-EUC-V.bcmap │ ├── CNS1-H.bcmap │ ├── CNS1-V.bcmap │ ├── CNS2-H.bcmap │ ├── CNS2-V.bcmap │ ├── ETHK-B5-H.bcmap │ ├── ETHK-B5-V.bcmap │ ├── ETen-B5-H.bcmap │ ├── ETen-B5-V.bcmap │ ├── ETenms-B5-H.bcmap │ ├── ETenms-B5-V.bcmap │ ├── EUC-H.bcmap │ ├── EUC-V.bcmap │ ├── Ext-H.bcmap │ ├── Ext-RKSJ-H.bcmap │ ├── Ext-RKSJ-V.bcmap │ ├── Ext-V.bcmap │ ├── GB-EUC-H.bcmap │ ├── GB-EUC-V.bcmap │ ├── GB-H.bcmap │ ├── GB-V.bcmap │ ├── GBK-EUC-H.bcmap │ ├── GBK-EUC-V.bcmap │ ├── GBK2K-H.bcmap │ ├── GBK2K-V.bcmap │ ├── GBKp-EUC-H.bcmap │ ├── GBKp-EUC-V.bcmap │ ├── GBT-EUC-H.bcmap │ ├── GBT-EUC-V.bcmap │ ├── GBT-H.bcmap │ ├── GBT-V.bcmap │ ├── GBTpc-EUC-H.bcmap │ ├── GBTpc-EUC-V.bcmap │ ├── GBpc-EUC-H.bcmap │ ├── GBpc-EUC-V.bcmap │ ├── H.bcmap │ ├── HKdla-B5-H.bcmap │ ├── HKdla-B5-V.bcmap │ ├── HKdlb-B5-H.bcmap │ ├── HKdlb-B5-V.bcmap │ ├── HKgccs-B5-H.bcmap │ ├── HKgccs-B5-V.bcmap │ ├── HKm314-B5-H.bcmap │ ├── HKm314-B5-V.bcmap │ ├── HKm471-B5-H.bcmap │ ├── HKm471-B5-V.bcmap │ ├── HKscs-B5-H.bcmap │ ├── HKscs-B5-V.bcmap │ ├── Hankaku.bcmap │ ├── Hiragana.bcmap │ ├── KSC-EUC-H.bcmap │ ├── KSC-EUC-V.bcmap │ ├── KSC-H.bcmap │ ├── KSC-Johab-H.bcmap │ ├── KSC-Johab-V.bcmap │ ├── KSC-V.bcmap │ ├── KSCms-UHC-H.bcmap │ ├── KSCms-UHC-HW-H.bcmap │ ├── KSCms-UHC-HW-V.bcmap │ ├── KSCms-UHC-V.bcmap │ ├── KSCpc-EUC-H.bcmap │ ├── KSCpc-EUC-V.bcmap │ ├── Katakana.bcmap │ ├── LICENSE │ ├── NWP-H.bcmap │ ├── NWP-V.bcmap │ ├── RKSJ-H.bcmap │ ├── RKSJ-V.bcmap │ ├── Roman.bcmap │ ├── UniCNS-UCS2-H.bcmap │ ├── UniCNS-UCS2-V.bcmap │ ├── UniCNS-UTF16-H.bcmap │ ├── UniCNS-UTF16-V.bcmap │ ├── UniCNS-UTF32-H.bcmap │ ├── UniCNS-UTF32-V.bcmap │ ├── UniCNS-UTF8-H.bcmap │ ├── UniCNS-UTF8-V.bcmap │ ├── UniGB-UCS2-H.bcmap │ ├── UniGB-UCS2-V.bcmap │ ├── UniGB-UTF16-H.bcmap │ ├── UniGB-UTF16-V.bcmap │ ├── UniGB-UTF32-H.bcmap │ ├── UniGB-UTF32-V.bcmap │ ├── UniGB-UTF8-H.bcmap │ ├── UniGB-UTF8-V.bcmap │ ├── UniJIS-UCS2-H.bcmap │ ├── UniJIS-UCS2-HW-H.bcmap │ ├── UniJIS-UCS2-HW-V.bcmap │ ├── UniJIS-UCS2-V.bcmap │ ├── UniJIS-UTF16-H.bcmap │ ├── UniJIS-UTF16-V.bcmap │ ├── UniJIS-UTF32-H.bcmap │ ├── UniJIS-UTF32-V.bcmap │ ├── UniJIS-UTF8-H.bcmap │ ├── UniJIS-UTF8-V.bcmap │ ├── UniJIS2004-UTF16-H.bcmap │ ├── UniJIS2004-UTF16-V.bcmap │ ├── UniJIS2004-UTF32-H.bcmap │ ├── UniJIS2004-UTF32-V.bcmap │ ├── UniJIS2004-UTF8-H.bcmap │ ├── UniJIS2004-UTF8-V.bcmap │ ├── UniJISPro-UCS2-HW-V.bcmap │ ├── UniJISPro-UCS2-V.bcmap │ ├── UniJISPro-UTF8-V.bcmap │ ├── UniJISX0213-UTF32-H.bcmap │ ├── UniJISX0213-UTF32-V.bcmap │ ├── UniJISX02132004-UTF32-H.bcmap │ ├── UniJISX02132004-UTF32-V.bcmap │ ├── UniKS-UCS2-H.bcmap │ ├── UniKS-UCS2-V.bcmap │ ├── UniKS-UTF16-H.bcmap │ ├── UniKS-UTF16-V.bcmap │ ├── UniKS-UTF32-H.bcmap │ ├── UniKS-UTF32-V.bcmap │ ├── UniKS-UTF8-H.bcmap │ ├── UniKS-UTF8-V.bcmap │ ├── V.bcmap │ └── WP-Symbol.bcmap │ ├── compressed.tracemonkey-pldi-09.pdf │ ├── debugger.css │ ├── debugger.mjs │ ├── images │ ├── altText_add.svg │ ├── altText_disclaimer.svg │ ├── altText_done.svg │ ├── altText_spinner.svg │ ├── altText_warning.svg │ ├── annotation-check.svg │ ├── annotation-comment.svg │ ├── annotation-help.svg │ ├── annotation-insert.svg │ ├── annotation-key.svg │ ├── annotation-newparagraph.svg │ ├── annotation-noicon.svg │ ├── annotation-note.svg │ ├── annotation-paperclip.svg │ ├── annotation-paragraph.svg │ ├── annotation-pushpin.svg │ ├── cursor-editorFreeHighlight.svg │ ├── cursor-editorFreeText.svg │ ├── cursor-editorInk.svg │ ├── cursor-editorTextHighlight.svg │ ├── editor-toolbar-delete.svg │ ├── findbarButton-next.svg │ ├── findbarButton-previous.svg │ ├── gv-toolbarButton-download.svg │ ├── loading-icon.gif │ ├── loading.svg │ ├── messageBar_closingButton.svg │ ├── messageBar_warning.svg │ ├── secondaryToolbarButton-documentProperties.svg │ ├── secondaryToolbarButton-firstPage.svg │ ├── secondaryToolbarButton-handTool.svg │ ├── secondaryToolbarButton-lastPage.svg │ ├── secondaryToolbarButton-rotateCcw.svg │ ├── secondaryToolbarButton-rotateCw.svg │ ├── secondaryToolbarButton-scrollHorizontal.svg │ ├── secondaryToolbarButton-scrollPage.svg │ ├── secondaryToolbarButton-scrollVertical.svg │ ├── secondaryToolbarButton-scrollWrapped.svg │ ├── secondaryToolbarButton-selectTool.svg │ ├── secondaryToolbarButton-spreadEven.svg │ ├── secondaryToolbarButton-spreadNone.svg │ ├── secondaryToolbarButton-spreadOdd.svg │ ├── toolbarButton-bookmark.svg │ ├── toolbarButton-currentOutlineItem.svg │ ├── toolbarButton-download.svg │ ├── toolbarButton-editorFreeText.svg │ ├── toolbarButton-editorHighlight.svg │ ├── toolbarButton-editorInk.svg │ ├── toolbarButton-editorStamp.svg │ ├── toolbarButton-menuArrow.svg │ ├── toolbarButton-openFile.svg │ ├── toolbarButton-pageDown.svg │ ├── toolbarButton-pageUp.svg │ ├── toolbarButton-presentationMode.svg │ ├── toolbarButton-print.svg │ ├── toolbarButton-search.svg │ ├── toolbarButton-secondaryToolbarToggle.svg │ ├── toolbarButton-sidebarToggle.svg │ ├── toolbarButton-viewAttachments.svg │ ├── toolbarButton-viewLayers.svg │ ├── toolbarButton-viewOutline.svg │ ├── toolbarButton-viewThumbnail.svg │ ├── toolbarButton-zoomIn.svg │ ├── toolbarButton-zoomOut.svg │ ├── treeitem-collapsed.svg │ └── treeitem-expanded.svg │ ├── locale │ ├── ach │ │ └── viewer.ftl │ ├── af │ │ └── viewer.ftl │ ├── an │ │ └── viewer.ftl │ ├── ar │ │ └── viewer.ftl │ ├── ast │ │ └── viewer.ftl │ ├── az │ │ └── viewer.ftl │ ├── be │ │ └── viewer.ftl │ ├── bg │ │ └── viewer.ftl │ ├── bn │ │ └── viewer.ftl │ ├── bo │ │ └── viewer.ftl │ ├── br │ │ └── viewer.ftl │ ├── brx │ │ └── viewer.ftl │ ├── bs │ │ └── viewer.ftl │ ├── ca │ │ └── viewer.ftl │ ├── cak │ │ └── viewer.ftl │ ├── ckb │ │ └── viewer.ftl │ ├── cs │ │ └── viewer.ftl │ ├── cy │ │ └── viewer.ftl │ ├── da │ │ └── viewer.ftl │ ├── de │ │ └── viewer.ftl │ ├── dsb │ │ └── viewer.ftl │ ├── el │ │ └── viewer.ftl │ ├── en-CA │ │ └── viewer.ftl │ ├── en-GB │ │ └── viewer.ftl │ ├── en-US │ │ └── viewer.ftl │ ├── eo │ │ └── viewer.ftl │ ├── es-AR │ │ └── viewer.ftl │ ├── es-CL │ │ └── viewer.ftl │ ├── es-ES │ │ └── viewer.ftl │ ├── es-MX │ │ └── viewer.ftl │ ├── et │ │ └── viewer.ftl │ ├── eu │ │ └── viewer.ftl │ ├── fa │ │ └── viewer.ftl │ ├── ff │ │ └── viewer.ftl │ ├── fi │ │ └── viewer.ftl │ ├── fr │ │ └── viewer.ftl │ ├── fur │ │ └── viewer.ftl │ ├── fy-NL │ │ └── viewer.ftl │ ├── ga-IE │ │ └── viewer.ftl │ ├── gd │ │ └── viewer.ftl │ ├── gl │ │ └── viewer.ftl │ ├── gn │ │ └── viewer.ftl │ ├── gu-IN │ │ └── viewer.ftl │ ├── he │ │ └── viewer.ftl │ ├── hi-IN │ │ └── viewer.ftl │ ├── hr │ │ └── viewer.ftl │ ├── hsb │ │ └── viewer.ftl │ ├── hu │ │ └── viewer.ftl │ ├── hy-AM │ │ └── viewer.ftl │ ├── hye │ │ └── viewer.ftl │ ├── ia │ │ └── viewer.ftl │ ├── id │ │ └── viewer.ftl │ ├── is │ │ └── viewer.ftl │ ├── it │ │ └── viewer.ftl │ ├── ja │ │ └── viewer.ftl │ ├── ka │ │ └── viewer.ftl │ ├── kab │ │ └── viewer.ftl │ ├── kk │ │ └── viewer.ftl │ ├── km │ │ └── viewer.ftl │ ├── kn │ │ └── viewer.ftl │ ├── ko │ │ └── viewer.ftl │ ├── lij │ │ └── viewer.ftl │ ├── lo │ │ └── viewer.ftl │ ├── locale.json │ ├── lt │ │ └── viewer.ftl │ ├── ltg │ │ └── viewer.ftl │ ├── lv │ │ └── viewer.ftl │ ├── meh │ │ └── viewer.ftl │ ├── mk │ │ └── viewer.ftl │ ├── mr │ │ └── viewer.ftl │ ├── ms │ │ └── viewer.ftl │ ├── my │ │ └── viewer.ftl │ ├── nb-NO │ │ └── viewer.ftl │ ├── ne-NP │ │ └── viewer.ftl │ ├── nl │ │ └── viewer.ftl │ ├── nn-NO │ │ └── viewer.ftl │ ├── oc │ │ └── viewer.ftl │ ├── pa-IN │ │ └── viewer.ftl │ ├── pl │ │ └── viewer.ftl │ ├── pt-BR │ │ └── viewer.ftl │ ├── pt-PT │ │ └── viewer.ftl │ ├── rm │ │ └── viewer.ftl │ ├── ro │ │ └── viewer.ftl │ ├── ru │ │ └── viewer.ftl │ ├── sat │ │ └── viewer.ftl │ ├── sc │ │ └── viewer.ftl │ ├── scn │ │ └── viewer.ftl │ ├── sco │ │ └── viewer.ftl │ ├── si │ │ └── viewer.ftl │ ├── sk │ │ └── viewer.ftl │ ├── skr │ │ └── viewer.ftl │ ├── sl │ │ └── viewer.ftl │ ├── son │ │ └── viewer.ftl │ ├── sq │ │ └── viewer.ftl │ ├── sr │ │ └── viewer.ftl │ ├── sv-SE │ │ └── viewer.ftl │ ├── szl │ │ └── viewer.ftl │ ├── ta │ │ └── viewer.ftl │ ├── te │ │ └── viewer.ftl │ ├── tg │ │ └── viewer.ftl │ ├── th │ │ └── viewer.ftl │ ├── tl │ │ └── viewer.ftl │ ├── tr │ │ └── viewer.ftl │ ├── trs │ │ └── viewer.ftl │ ├── uk │ │ └── viewer.ftl │ ├── ur │ │ └── viewer.ftl │ ├── uz │ │ └── viewer.ftl │ ├── vi │ │ └── viewer.ftl │ ├── wo │ │ └── viewer.ftl │ ├── xh │ │ └── viewer.ftl │ ├── zh-CN │ │ └── viewer.ftl │ └── zh-TW │ │ └── viewer.ftl │ ├── standard_fonts │ ├── FoxitDingbats.pfb │ ├── FoxitFixed.pfb │ ├── FoxitFixedBold.pfb │ ├── FoxitFixedBoldItalic.pfb │ ├── FoxitFixedItalic.pfb │ ├── FoxitSerif.pfb │ ├── FoxitSerifBold.pfb │ ├── FoxitSerifBoldItalic.pfb │ ├── FoxitSerifItalic.pfb │ ├── FoxitSymbol.pfb │ ├── LICENSE_FOXIT │ ├── LICENSE_LIBERATION │ ├── LiberationSans-Bold.ttf │ ├── LiberationSans-BoldItalic.ttf │ ├── LiberationSans-Italic.ttf │ └── LiberationSans-Regular.ttf │ ├── viewer.css │ ├── viewer.html │ ├── viewer.mjs │ └── viewer.mjs.map ├── src ├── App.vue ├── NaiveProvider.vue ├── api │ └── index.ts ├── assets │ ├── fonts │ │ ├── iconfont.js │ │ └── index.ts │ ├── images │ │ └── entry-background.png │ └── svg │ │ ├── avatar.svg │ │ ├── chat-agent.svg │ │ ├── chat-efficiency.svg │ │ ├── chat-index.svg │ │ ├── empty-status.svg │ │ ├── system-logo.svg │ │ └── user-avatar.svg ├── base │ └── index.ts ├── components │ ├── 404.vue │ ├── ClipBoard │ │ └── index.vue │ ├── IconFont │ │ ├── QatypeIcon.vue │ │ └── index.vue │ ├── IconifyIcon │ │ └── index.vue │ ├── Layout │ │ ├── SidearPage.vue │ │ ├── SlotArea.vue │ │ ├── SlotCenterPanel.vue │ │ ├── SlotFrame.vue │ │ └── default.vue │ ├── MarkdownPreview │ │ ├── MarkdownEcharts.vue │ │ ├── MarkdownTable.vue │ │ ├── index.vue │ │ ├── plugins │ │ │ ├── highlight.ts │ │ │ ├── markdown.ts │ │ │ └── preWrapper.ts │ │ └── transform │ │ │ └── index.ts │ ├── Navigation │ │ ├── NavBar.vue │ │ ├── NavFooter.vue │ │ ├── NavOctocat.vue │ │ ├── NavSideBar.vue │ │ └── SideBar.vue │ ├── Pagination │ │ └── index.vue │ ├── SideBar │ │ └── Item.vue │ ├── TableList │ │ └── index.vue │ └── index.ts ├── config │ ├── env.ts │ └── index.ts ├── data │ ├── index.ts │ └── mock-md.md ├── env.d.ts ├── hooks │ ├── useClipText.ts │ ├── useCopyCode.ts │ ├── useCurrentInstance.ts │ └── useTheme.ts ├── main.ts ├── router │ ├── child-routes.ts │ ├── index.ts │ ├── permission.ts │ └── routes.ts ├── shims-vue.d.ts ├── store │ ├── business │ │ ├── index.ts │ │ ├── initChatHistory.ts │ │ └── userStore.ts │ ├── hooks │ │ └── useAppStore.ts │ ├── index.ts │ ├── plugins │ │ └── index.ts │ └── utils │ │ └── mixin.ts ├── styles │ ├── global.scss │ ├── index.scss │ ├── markdown.scss │ ├── naive-variables.scss │ └── theme.scss ├── types │ ├── global.d.ts │ └── index.d.ts ├── utils │ ├── files-tool.ts │ ├── location.ts │ ├── number.ts │ ├── request.ts │ └── type.ts └── views │ ├── DefaultPage.vue │ ├── DemandManager.vue │ ├── Login.vue │ ├── PdfViewer.vue │ ├── SuggestedPage.vue │ ├── TableModal.vue │ ├── TestAssistant.vue │ ├── chat.vue │ ├── mcp │ └── MCPClient.vue │ └── usassistant │ └── UsDetail.vue ├── tsconfig.json ├── uno.config.ts └── vite.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | .idea/ 3 | docker/ 4 | tests/ 5 | web/ 6 | images/ -------------------------------------------------------------------------------- /.env.dev: -------------------------------------------------------------------------------- 1 | 2 | # 开发环境数据库配置 3 | MYSQL_HOST=localhost 4 | MYSQL_PORT=13006 5 | MYSQL_USER=root 6 | MYSQL_PASSWORD=1 7 | MYSQL_DATABASE=chat_db 8 | 9 | #Dify服务地址 10 | DIFY_SERVER_URL="http://127.0.0.1:18000" 11 | 12 | # Dify 数据问答画布key 13 | DIFY_DATABASE_QA_API_KEY="app-i6hHQ1u9BEqzkL3PYZh9Rqrk" 14 | 15 | # minio 16 | MINIO_ENDPOINT=localhost:19000 17 | MINIO_ACCESS_KEY=A1TwSUF3NCdh1qdA3zUO 18 | MiNIO_SECRET_KEY=KYvzplcksgLEii1fm2MpIZscuFTXh65BDIr6Jg1J 19 | 20 | #关闭pandas-ai匿名收集信息 21 | SCARF_NO_ANALYTICS=true 22 | DO_NOT_TRACK=true 23 | 24 | # jwt token 密钥 25 | JWT_SECRET_KEY='550e8400-e29b-41d4-a716-446655440000' 26 | -------------------------------------------------------------------------------- /.env.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/.env.pro -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | #测试环境数据库配置 2 | MYSQL_HOST=host.docker.internal 3 | MYSQL_PORT=13006 4 | MYSQL_USER=root 5 | MYSQL_PASSWORD=1 6 | MYSQL_DATABASE=chat_db 7 | 8 | #Dify服务地址 这里配置成dify-service的nginx容器名称 避免502错误 9 | DIFY_SERVER_URL=http://host.docker.internal:18000 10 | 11 | # Dify 数据问答画布 key 12 | DIFY_DATABASE_QA_API_KEY="app-HweY9lluF8ennstah2VF7g08" 13 | 14 | # minio 15 | MINIO_ENDPOINT=host.docker.internal:19000 16 | MINIO_ACCESS_KEY=sIR5eeDkiwoo779yNJbw 17 | MiNIO_SECRET_KEY=MreuQ3aC1ymHJeo3QfzSg7aPz7PqlxeOw39nZUdE 18 | 19 | #关闭pandas-ai匿名收集信息 20 | SCARF_NO_ANALYTICS=true 21 | DO_NOT_TRACK=true 22 | 23 | # jwt token 密钥 24 | JWT_SECRET_KEY='550e8400-e29b-41d4-a716-446655440000' -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | tests/ 7 | docker/volume/ 8 | docker/dify/volumes/* 9 | !docker/dify/docker/volumes/myscale/config/users.d/custom_users_config.xml 10 | !docker/dify/docker/volumes/oceanbase/init.d/vec_memory.sql 11 | !docker/dify/docker/volumes/opensearch/opensearch_dashboards.yml 12 | !docker/dify/docker/volumes/sandbox/conf/config.yaml 13 | !docker/dify/docker/volumes/sandbox/conf/config.yaml.example 14 | !docker/dify/docker/volumes/sandbox/dependencies/python-requirements.txt 15 | 16 | 17 | 18 | 19 | 20 | web/node_modules/ 21 | web/dist/ 22 | 23 | .DS_Store 24 | .idea/ 25 | .venv/ 26 | logs/ 27 | # 环境变量文件 28 | .pytest_cache/ 29 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "vue.volar", 4 | "dbaeumer.vscode-eslint", 5 | "stylelint.vscode-stylelint" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.workingDirectories": [ 3 | { 4 | "directory": "web/*", 5 | "changeProcessCWD": true 6 | } 7 | ], 8 | "editor.formatOnSave": false, 9 | 10 | // Auto fix 11 | 12 | "editor.codeActionsOnSave": { 13 | "source.fixAll.eslint": "explicit", 14 | "source.organizeImports": "never", 15 | "source.fixAll.stylelint": "explicit" 16 | }, 17 | "eslint.run": "onType", 18 | "eslint.format.enable": true, 19 | "stylelint.validate": [ 20 | "vue", 21 | "scss" 22 | ], 23 | "css.validate": false, 24 | "less.validate": false, 25 | 26 | "files.autoSaveDelay": 500, 27 | 28 | // Enable eslint for all supported languages 29 | "eslint.validate": [ 30 | "javascript", 31 | "javascriptreact", 32 | "typescript", 33 | "typescriptreact", 34 | "vue", 35 | "html", 36 | "markdown", 37 | "json", 38 | "jsonc", 39 | "yaml", 40 | "toml", 41 | "gql", 42 | "graphql" 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # 导入子模块web的 Makefile 2 | include web/Makefile 3 | 4 | # 服务端项目名称 5 | SERVER_PROJECT_NAME = sanic-web 6 | 7 | # 服务端 Docker 镜像标签 8 | SERVER_DOCKER_IMAGE = apconw/$(SERVER_PROJECT_NAME):1.1.3 9 | 10 | 11 | # 构建 Vue 3 前端项目镜像 12 | web-build: 13 | $(MAKE) -C web docker-build 14 | 15 | # 构建服务端镜像 16 | service-build: 17 | docker build --no-cache -t $(SERVER_DOCKER_IMAGE) -f ./docker/Dockerfile . 18 | 19 | 20 | # 构建 服务端arm64/amd64架构镜像并推送 21 | docker-build-server-multi: 22 | docker buildx build --platform linux/amd64,linux/arm64 --push -t $(SERVER_DOCKER_IMAGE) -f ./docker/Dockerfile . 23 | 24 | 25 | .PHONY: web-build service-build -------------------------------------------------------------------------------- /chromedriver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/chromedriver -------------------------------------------------------------------------------- /common/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/common/__init__.py -------------------------------------------------------------------------------- /common/date_util.py: -------------------------------------------------------------------------------- 1 | import decimal 2 | import json 3 | from datetime import date, datetime 4 | 5 | 6 | class DateEncoder(json.JSONEncoder): 7 | """ 8 | 日期格式 9 | """ 10 | 11 | def default(self, obj): 12 | """ 13 | 14 | :param obj: 15 | :return: 16 | """ 17 | # 处理返回数据中有date类型的数据 18 | if isinstance(obj, date): 19 | return obj.strftime("%Y-%m-%d") 20 | # 处理返回数据中有datetime类型的数据 21 | elif isinstance(obj, datetime): 22 | return obj.strftime("%Y-%m-%d %H:%M:%S") 23 | # 处理返回数据中有decimal类型的数据 24 | elif isinstance(obj, decimal.Decimal): 25 | return float(obj) 26 | else: 27 | return json.JSONEncoder.default(self, obj) 28 | -------------------------------------------------------------------------------- /common/duckdb_util.py: -------------------------------------------------------------------------------- 1 | import duckdb 2 | import pandas as pd 3 | 4 | if __name__ == "__main__": 5 | """ 6 | 查询excel数据表 7 | """ 8 | df = pd.read_excel("data.xlsx", engine="openpyxl") 9 | con = duckdb.connect(database=":memory") 10 | con.register("excel_table", df) 11 | 12 | sql = """ 13 | SELECT * FROM excel_table where 产地='中国' 14 | """ 15 | 16 | result = con.execute(sql).fetchall() 17 | print(result) 18 | -------------------------------------------------------------------------------- /common/exception.py: -------------------------------------------------------------------------------- 1 | from constants.code_enum import SysCodeEnum 2 | 3 | 4 | class MyException(Exception): 5 | """ 6 | 自定义异常 7 | """ 8 | 9 | def __init__(self, ex_code: SysCodeEnum): 10 | super().__init__(f"{ex_code.name}({ex_code.value[0]})") 11 | 12 | self.code, self.message, self.detail = ( 13 | ex_code.value[0], 14 | ex_code.value[1], 15 | ex_code.value[2], 16 | ) 17 | 18 | def __str__(self): 19 | return f"MyException: " f"code: {self.code}, " f"message: {self.message} - " f"detail: {self.detail}" 20 | 21 | def to_dict(self): 22 | """ 23 | 24 | :return: 25 | """ 26 | return {"code": self.code, "message": self.message} 27 | -------------------------------------------------------------------------------- /common/token_decorator.py: -------------------------------------------------------------------------------- 1 | import os 2 | from datetime import datetime 3 | 4 | import jwt 5 | from sanic import response 6 | 7 | 8 | def check_token(f): 9 | """ 10 | jwt token 校验注解 11 | """ 12 | 13 | async def wrapper(request, *args, **kwargs): 14 | token = request.headers.get("Authorization") 15 | if not token: 16 | return response.json({"message": "无效Token", "code": 401}, status=401) 17 | try: 18 | # 去掉 Bearer 前缀(如果有的话) 19 | if token.startswith("Bearer "): 20 | token = token.split(" ")[1] 21 | 22 | # 解码 JWT token 23 | payload = jwt.decode(token, key=os.getenv("JWT_SECRET_KEY"), algorithms=["HS256"]) 24 | # 检查 token 是否过期 25 | if "exp" in payload and datetime.utcfromtimestamp(payload["exp"]) < datetime.utcnow(): 26 | return response.json({"message": "Token已过期", "code": 401}, status=401) 27 | 28 | request.ctx.user_payload = payload 29 | except jwt.ExpiredSignatureError as e: 30 | return response.json({"message": "Token已过期", "code": 401}, status=401) 31 | except Exception as e: 32 | return response.json({"message": "无效Token", "code": 401}, status=401) 33 | 34 | # 继续处理请求 35 | return await f(request, *args, **kwargs) 36 | 37 | return wrapper 38 | -------------------------------------------------------------------------------- /component/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/component/.DS_Store -------------------------------------------------------------------------------- /component/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/component/__init__.py -------------------------------------------------------------------------------- /component/pandasai/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/component/pandasai/__init__.py -------------------------------------------------------------------------------- /component/pandasai/pandas_ai_response.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | 3 | import pandas as pd 4 | from pandasai.responses.response_parser import ResponseParser 5 | from pandasai.responses.response_serializer import ResponseSerializer 6 | 7 | 8 | class PandasaiCustomResponse(ResponseParser): 9 | """ 10 | 自定义返回值解析类型 11 | """ 12 | 13 | def _init__(self, context) -> None: 14 | super().__init__(context) 15 | 16 | def parse(self, result: dict) -> Any: 17 | """ 18 | 19 | :param result: 20 | :return: 21 | """ 22 | if not isinstance(result, dict) or any( 23 | key not in result for key in ["type", "value"] 24 | ): 25 | raise ValueError("Unsupported result format") 26 | 27 | return ResponseSerializer.serialize(result) 28 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/config/__init__.py -------------------------------------------------------------------------------- /config/load_env.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | 4 | from dotenv import load_dotenv 5 | 6 | 7 | def load_env(): 8 | """ 9 | 加载日志配置文件 10 | """ 11 | with open("config/logging.conf", encoding="utf-8") as f: 12 | logging.config.fileConfig(f) 13 | 14 | # 根据环境变量 ENV 的值选择加载哪个 .env 文件 15 | dotenv_path = f'.env.{os.getenv("ENV","dev")}' 16 | logging.info(f"""====当前配置文件是:{dotenv_path}====""") 17 | load_dotenv(dotenv_path) 18 | -------------------------------------------------------------------------------- /config/logging.conf: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys=root 3 | 4 | [handlers] 5 | keys=consoleHandler,fileHandler 6 | 7 | [formatters] 8 | keys=fileFormatter 9 | 10 | [logger_root] 11 | level=INFO 12 | handlers=consoleHandler,fileHandler 13 | 14 | [handler_consoleHandler] 15 | class=StreamHandler 16 | level=DEBUG 17 | formatter=fileFormatter 18 | args=(sys.stdout,) 19 | 20 | [handler_fileHandler] 21 | class=logging.handlers.TimedRotatingFileHandler 22 | level=DEBUG 23 | formatter=fileFormatter 24 | args=('logs/assistant.log', 'midnight', 1, 5, 'utf8') 25 | 26 | [formatter_fileFormatter] 27 | format=%(levelname)-8s | %(asctime)s | %(filename)s:%(lineno)d | %(funcName)s() | %(message)s 28 | datefmt=%Y-%m-%d %H:%M:%S -------------------------------------------------------------------------------- /config/serv.py: -------------------------------------------------------------------------------- 1 | # server 2 | host = "0.0.0.0" 3 | workers = 2 4 | port = 8088 5 | 6 | # Redis Config 7 | redis_host = "localhost" 8 | redis_port = 16379 9 | redis_password = "difyai123456" 10 | -------------------------------------------------------------------------------- /constants/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/constants/__init__.py -------------------------------------------------------------------------------- /constants/code_enum.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class SysCodeEnum(Enum): 5 | """ 6 | 系统状态码定义 7 | """ 8 | 9 | c_200 = (200, "ok", "ok") 10 | 11 | c_401 = (401, "登录异常", "登录异常") 12 | 13 | c_400 = (401, "无效Token", "无效Token") 14 | 15 | c_9999 = (9999, "系统异常", "系统异常") 16 | 17 | 18 | class DiFyAppEnum(Enum): 19 | """ 20 | DiFy app-key 枚举 21 | """ 22 | 23 | DATABASE_QA = ("DATABASE_QA", "数据问答") 24 | 25 | FILEDATA_QA = ("FILEDATA_QA", "表格问答") 26 | 27 | COMMON_QA = ("COMMON_QA", "通用问答") 28 | 29 | REPORT_QA = ("REPORT_QA", "报告问答") 30 | 31 | 32 | class DataTypeEnum(Enum): 33 | """ 34 | 自定义数据类型枚举 35 | """ 36 | 37 | ANSWER = ("t02", "答案") 38 | 39 | LOCATION = ("t03", "溯源") 40 | 41 | BUS_DATA = ("t04", "业务数据") 42 | 43 | TASK_ID = ("t11", "任务ID,方便后续点赞等操作") 44 | 45 | STREAM_END = ("t99", "流式推流结束") 46 | 47 | 48 | class DiFyCodeEnum(Enum): 49 | """ 50 | DiFy 返回数据流定义 51 | """ 52 | 53 | MESSAGE = ("message", "答案") 54 | 55 | MESSAGE_END = ("message_end", "结束") 56 | 57 | MESSAGE_ERROR = ("error", "错误") 58 | -------------------------------------------------------------------------------- /constants/dify_rest_api.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | class DiFyRestApi: 5 | """ 6 | dify 接口定义 7 | """ 8 | 9 | # 对话接口 10 | DIFY_REST_CHAT = "/v1/chat-messages" 11 | 12 | # 对话反馈接口 13 | DIFY_REST_FEEDBACK = "/v1/messages/:message_id/feedbacks" 14 | 15 | # 获取下一轮建议问题列表 16 | DIFY_REST_SUGGESTED = "/v1/messages/:message_id/suggested" 17 | 18 | @classmethod 19 | def _get_env(cls, name): 20 | value = os.getenv(name) 21 | if not value: 22 | raise Exception(f"{name} is not set") 23 | return value 24 | 25 | @classmethod 26 | def build_url(cls, api_path): 27 | """ 28 | 构建请求地址 29 | :param api_path: 30 | :return: 31 | """ 32 | base_url = cls._get_env("DIFY_SERVER_URL") 33 | return f"{base_url}{api_path}" 34 | 35 | @classmethod 36 | def replace_path_params(cls, api_path, path_params): 37 | """ 38 | 替换API路径中的占位符为实际的路径参数值 39 | :param cls 40 | :param api_path: 包含占位符的API路径模板 41 | :param path_params: 一个字典,键是占位符名称(不包含前缀冒号),值是要替换的路径参数值 42 | :return: 替换后的API路径 43 | """ 44 | for key, value in path_params.items(): 45 | # 使用 :key 格式的占位符以匹配路径参数 46 | placeholder = ":{}".format(key) 47 | if placeholder in api_path: 48 | api_path = api_path.replace(placeholder, str(value)) 49 | return cls.build_url(api_path) 50 | -------------------------------------------------------------------------------- /controllers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/controllers/__init__.py -------------------------------------------------------------------------------- /controllers/common_chat_api.py: -------------------------------------------------------------------------------- 1 | """ 2 | 通用问答 3 | """ 4 | import logging 5 | import os 6 | import traceback 7 | 8 | from sanic import Blueprint, request 9 | 10 | from common.exception import MyException 11 | from common.res_decorator import async_json_resp 12 | from constants.code_enum import SysCodeEnum 13 | from services.selenium_service import get_bing_first_href, get_search_results_links 14 | 15 | bp = Blueprint("common-chat", url_prefix="/common") 16 | 17 | 18 | @bp.post("/get_search_url") 19 | @async_json_resp 20 | async def get_bing_search_url(req: request.Request): 21 | """ 22 | 通用问答 获取搜索引擎第一个结果url 23 | """ 24 | try: 25 | query_str = req.args.get("query_str") 26 | if os.getenv("ENV") == "test": 27 | result = await get_bing_first_href(query_str) 28 | else: 29 | # 本地调试使用chromedriver 30 | result = await get_search_results_links(query_str) 31 | 32 | return result 33 | except Exception as e: 34 | traceback.print_exception(e) 35 | logging.error(f"Error processing LLM output: {e}") 36 | raise MyException(SysCodeEnum.c_9999) 37 | -------------------------------------------------------------------------------- /controllers/db_chat_api.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from sanic import Blueprint, request 4 | 5 | from services.db_qadata_process import select_report_by_title 6 | from services.text2_sql_service import exe_sql_query 7 | from common.exception import MyException 8 | from constants.code_enum import SysCodeEnum 9 | from common.res_decorator import async_json_resp 10 | 11 | bp = Blueprint("text2sql", url_prefix="/llm") 12 | 13 | 14 | @bp.post("/process_llm_out") 15 | @async_json_resp 16 | async def process_llm_out(req: request.Request): 17 | """ 18 | 数据问答处理大模型返回SQL语句 19 | """ 20 | try: 21 | # 获取请求体内容 22 | # body_content = req.body 23 | # # 将字节流解码为字符串 24 | # body_str = body_content.decode("utf-8") 25 | 26 | body_str = req.form.get("llm_text") 27 | 28 | # 用户问题 29 | # question_str = req.args.get("question") 30 | logging.info(f"query param: {body_str}") 31 | 32 | result = await exe_sql_query(body_str) 33 | return result 34 | except Exception as e: 35 | logging.error(f"Error processing LLM output: {e}") 36 | raise MyException(SysCodeEnum.c_9999) 37 | 38 | 39 | @bp.get("/query_guided_report") 40 | @async_json_resp 41 | async def query_guided_report(req: request.Request): 42 | """ 43 | 查询报告 44 | """ 45 | try: 46 | question_str = req.args.get("query_str").strip().replace("\r", "") 47 | result = await select_report_by_title(question_str) 48 | return result 49 | except Exception as e: 50 | logging.error(f"查询报告失败: {e}") 51 | raise MyException(SysCodeEnum.c_9999) 52 | -------------------------------------------------------------------------------- /controllers/dify_chat_api.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from sanic import Blueprint 4 | from sanic.response import ResponseStream 5 | 6 | from common.exception import MyException 7 | from common.res_decorator import async_json_resp 8 | from common.token_decorator import check_token 9 | from constants.code_enum import SysCodeEnum 10 | from services.dify_service import DiFyRequest, query_dify_suggested 11 | 12 | bp = Blueprint("fiFyApi", url_prefix="/dify") 13 | 14 | dify = DiFyRequest() 15 | 16 | 17 | @bp.post("/get_answer") 18 | @check_token 19 | async def get_answer(req): 20 | """ 21 | 调用diFy画布获取数据流式返回 22 | :param req: 23 | :return: 24 | """ 25 | 26 | try: 27 | response = ResponseStream(dify.exec_query, content_type="text/event-stream") 28 | return response 29 | except Exception as e: 30 | logging.error(f"Error Invoke diFy: {e}") 31 | raise MyException(SysCodeEnum.c_9999) 32 | 33 | 34 | @bp.post("/get_dify_suggested", name="get_dify_suggested") 35 | @check_token 36 | @async_json_resp 37 | async def dify_suggested(request): 38 | """ 39 | dify问题建议 40 | :param request: 41 | :return: 42 | """ 43 | chat_id = request.json.get("chat_id") 44 | return await query_dify_suggested(chat_id) 45 | -------------------------------------------------------------------------------- /docker/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/docker/.DS_Store -------------------------------------------------------------------------------- /docker/.env: -------------------------------------------------------------------------------- 1 | # service 服务名称 2 | COMPOSE_PROJECT_NAME=chat_app_mvp -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | # 使用官方Python基础镜像 3 | # base image 4 | FROM python:3.10-slim-bookworm AS base 5 | 6 | # 设置工作目录 7 | WORKDIR /sanic-web 8 | 9 | # 复制当前目录的内容到容器中的/app目录 10 | COPY . /sanic-web 11 | 12 | # 安装Poetry 13 | ENV POETRY_VERSION=1.8.3 14 | 15 | RUN pip install poetry==${POETRY_VERSION} 16 | 17 | # 将 Poetry 安装路径添加到环境变量 18 | ENV PATH="${PATH}:/root/.local/bin" 19 | 20 | # 配置清华PyPI镜像 21 | RUN poetry source add --priority=primary mirrors https://pypi.tuna.tsinghua.edu.cn/simple/ 22 | 23 | # 安装依赖 24 | RUN poetry lock --no-update 25 | 26 | # 这里使用系统默认的python环境 27 | RUN poetry env use system 28 | 29 | # 安装依赖 30 | RUN poetry install --no-root 31 | 32 | 33 | # 暴露端口 34 | EXPOSE 8088 35 | 36 | # 运行命令 source命令激活相应的虚拟环境 37 | CMD ["/bin/bash", "-c", "source $(poetry env info --path)/bin/activate && python3 serv.py"] 38 | -------------------------------------------------------------------------------- /docker/dify/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/docker/dify/.DS_Store -------------------------------------------------------------------------------- /docker/dify/docker/certbot/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | printf '%s\n' "Docker entrypoint script is running" 5 | 6 | printf '%s\n' "\nChecking specific environment variables:" 7 | printf '%s\n' "CERTBOT_EMAIL: ${CERTBOT_EMAIL:-Not set}" 8 | printf '%s\n' "CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-Not set}" 9 | printf '%s\n' "CERTBOT_OPTIONS: ${CERTBOT_OPTIONS:-Not set}" 10 | 11 | printf '%s\n' "\nChecking mounted directories:" 12 | for dir in "/etc/letsencrypt" "/var/www/html" "/var/log/letsencrypt"; do 13 | if [ -d "$dir" ]; then 14 | printf '%s\n' "$dir exists. Contents:" 15 | ls -la "$dir" 16 | else 17 | printf '%s\n' "$dir does not exist." 18 | fi 19 | done 20 | 21 | printf '%s\n' "\nGenerating update-cert.sh from template" 22 | sed -e "s|\${CERTBOT_EMAIL}|$CERTBOT_EMAIL|g" \ 23 | -e "s|\${CERTBOT_DOMAIN}|$CERTBOT_DOMAIN|g" \ 24 | -e "s|\${CERTBOT_OPTIONS}|$CERTBOT_OPTIONS|g" \ 25 | /update-cert.template.txt > /update-cert.sh 26 | 27 | chmod +x /update-cert.sh 28 | 29 | printf '%s\n' "\nExecuting command:" "$@" 30 | exec "$@" 31 | -------------------------------------------------------------------------------- /docker/dify/docker/certbot/update-cert.template.txt: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | DOMAIN="${CERTBOT_DOMAIN}" 5 | EMAIL="${CERTBOT_EMAIL}" 6 | OPTIONS="${CERTBOT_OPTIONS}" 7 | CERT_NAME="${DOMAIN}" # 証明書名をドメイン名と同じにする 8 | 9 | # Check if the certificate already exists 10 | if [ -f "/etc/letsencrypt/renewal/${CERT_NAME}.conf" ]; then 11 | echo "Certificate exists. Attempting to renew..." 12 | certbot renew --noninteractive --cert-name ${CERT_NAME} --webroot --webroot-path=/var/www/html --email ${EMAIL} --agree-tos --no-eff-email ${OPTIONS} 13 | else 14 | echo "Certificate does not exist. Obtaining a new certificate..." 15 | certbot certonly --noninteractive --webroot --webroot-path=/var/www/html --email ${EMAIL} --agree-tos --no-eff-email -d ${DOMAIN} ${OPTIONS} 16 | fi 17 | echo "Certificate operation successful" 18 | # Note: Nginx reload should be handled outside this container 19 | echo "Please ensure to reload Nginx to apply any certificate changes." 20 | -------------------------------------------------------------------------------- /docker/dify/docker/couchbase-server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM couchbase/server:latest AS stage_base 2 | # FROM couchbase:latest AS stage_base 3 | COPY init-cbserver.sh /opt/couchbase/init/ 4 | RUN chmod +x /opt/couchbase/init/init-cbserver.sh 5 | -------------------------------------------------------------------------------- /docker/dify/docker/docker-compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/docker/dify/docker/docker-compose.png -------------------------------------------------------------------------------- /docker/dify/docker/elasticsearch/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | if [ "${VECTOR_STORE}" = "elasticsearch-ja" ]; then 6 | # Check if the ICU tokenizer plugin is installed 7 | if ! /usr/share/elasticsearch/bin/elasticsearch-plugin list | grep -q analysis-icu; then 8 | printf '%s\n' "Installing the ICU tokenizer plugin" 9 | if ! /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu; then 10 | printf '%s\n' "Failed to install the ICU tokenizer plugin" 11 | exit 1 12 | fi 13 | fi 14 | # Check if the Japanese language analyzer plugin is installed 15 | if ! /usr/share/elasticsearch/bin/elasticsearch-plugin list | grep -q analysis-kuromoji; then 16 | printf '%s\n' "Installing the Japanese language analyzer plugin" 17 | if ! /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji; then 18 | printf '%s\n' "Failed to install the Japanese language analyzer plugin" 19 | exit 1 20 | fi 21 | fi 22 | fi 23 | 24 | # Run the original entrypoint script 25 | exec /bin/tini -- /usr/local/bin/docker-entrypoint.sh 26 | -------------------------------------------------------------------------------- /docker/dify/docker/nginx/conf.d/default.conf.template: -------------------------------------------------------------------------------- 1 | # Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. 2 | 3 | server { 4 | listen ${NGINX_PORT}; 5 | server_name ${NGINX_SERVER_NAME}; 6 | 7 | location /console/api { 8 | proxy_pass http://api:5001; 9 | include proxy.conf; 10 | } 11 | 12 | location /api { 13 | proxy_pass http://api:5001; 14 | include proxy.conf; 15 | } 16 | 17 | location /v1 { 18 | proxy_pass http://api:5001; 19 | include proxy.conf; 20 | } 21 | 22 | location /files { 23 | proxy_pass http://api:5001; 24 | include proxy.conf; 25 | } 26 | 27 | location /explore { 28 | proxy_pass http://web:3000; 29 | include proxy.conf; 30 | } 31 | 32 | location /e/ { 33 | proxy_pass http://plugin_daemon:5002; 34 | proxy_set_header Dify-Hook-Url $scheme://$host$request_uri; 35 | include proxy.conf; 36 | } 37 | 38 | location / { 39 | proxy_pass http://web:3000; 40 | include proxy.conf; 41 | } 42 | 43 | # placeholder for acme challenge location 44 | ${ACME_CHALLENGE_LOCATION} 45 | 46 | # placeholder for https config defined in https.conf.template 47 | ${HTTPS_CONFIG} 48 | } 49 | -------------------------------------------------------------------------------- /docker/dify/docker/nginx/https.conf.template: -------------------------------------------------------------------------------- 1 | # Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. 2 | 3 | listen ${NGINX_SSL_PORT} ssl; 4 | ssl_certificate ${SSL_CERTIFICATE_PATH}; 5 | ssl_certificate_key ${SSL_CERTIFICATE_KEY_PATH}; 6 | ssl_protocols ${NGINX_SSL_PROTOCOLS}; 7 | ssl_prefer_server_ciphers on; 8 | ssl_session_cache shared:SSL:10m; 9 | ssl_session_timeout 10m; 10 | -------------------------------------------------------------------------------- /docker/dify/docker/nginx/nginx.conf.template: -------------------------------------------------------------------------------- 1 | # Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. 2 | 3 | user nginx; 4 | worker_processes ${NGINX_WORKER_PROCESSES}; 5 | 6 | error_log /var/log/nginx/error.log notice; 7 | pid /var/run/nginx.pid; 8 | 9 | 10 | events { 11 | worker_connections 1024; 12 | } 13 | 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 20 | '$status $body_bytes_sent "$http_referer" ' 21 | '"$http_user_agent" "$http_x_forwarded_for"'; 22 | 23 | access_log /var/log/nginx/access.log main; 24 | 25 | sendfile on; 26 | #tcp_nopush on; 27 | 28 | keepalive_timeout ${NGINX_KEEPALIVE_TIMEOUT}; 29 | 30 | #gzip on; 31 | client_max_body_size ${NGINX_CLIENT_MAX_BODY_SIZE}; 32 | 33 | include /etc/nginx/conf.d/*.conf; 34 | } 35 | -------------------------------------------------------------------------------- /docker/dify/docker/nginx/proxy.conf.template: -------------------------------------------------------------------------------- 1 | # Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. 2 | 3 | proxy_set_header Host $host; 4 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 5 | proxy_set_header X-Forwarded-Proto $scheme; 6 | proxy_set_header X-Forwarded-Port $server_port; 7 | proxy_http_version 1.1; 8 | proxy_set_header Connection ""; 9 | proxy_buffering off; 10 | proxy_read_timeout ${NGINX_PROXY_READ_TIMEOUT}; 11 | proxy_send_timeout ${NGINX_PROXY_SEND_TIMEOUT}; 12 | -------------------------------------------------------------------------------- /docker/dify/docker/nginx/ssl/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/docker/dify/docker/nginx/ssl/.gitkeep -------------------------------------------------------------------------------- /docker/dify/docker/pgvector/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PG_MAJOR=16 4 | 5 | if [ "${PG_BIGM}" = "true" ]; then 6 | # install pg_bigm 7 | apt-get update 8 | apt-get install -y curl make gcc postgresql-server-dev-${PG_MAJOR} 9 | 10 | curl -LO https://github.com/pgbigm/pg_bigm/archive/refs/tags/v${PG_BIGM_VERSION}.tar.gz 11 | tar xf v${PG_BIGM_VERSION}.tar.gz 12 | cd pg_bigm-${PG_BIGM_VERSION} || exit 1 13 | make USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config 14 | make USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config install 15 | 16 | cd - || exit 1 17 | rm -rf v${PG_BIGM_VERSION}.tar.gz pg_bigm-${PG_BIGM_VERSION} 18 | 19 | # enable pg_bigm 20 | sed -i -e 's/^#\s*shared_preload_libraries.*/shared_preload_libraries = '\''pg_bigm'\''/' /var/lib/postgresql/data/pgdata/postgresql.conf 21 | fi 22 | 23 | # Run the original entrypoint script 24 | exec /usr/local/bin/docker-entrypoint.sh postgres 25 | -------------------------------------------------------------------------------- /docker/dify/docker/startupscripts/init.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | DB_INITIALIZED="/opt/oracle/oradata/dbinit" 4 | #[ -f ${DB_INITIALIZED} ] && exit 5 | #touch ${DB_INITIALIZED} 6 | if [ -f ${DB_INITIALIZED} ]; then 7 | echo 'File exists. Standards for have been Init' 8 | exit 9 | else 10 | echo 'File does not exist. Standards for first time Start up this DB' 11 | "$ORACLE_HOME"/bin/sqlplus -s "/ as sysdba" @"/opt/oracle/scripts/startup/init_user.script"; 12 | touch ${DB_INITIALIZED} 13 | fi 14 | -------------------------------------------------------------------------------- /docker/dify/docker/startupscripts/init_user.script: -------------------------------------------------------------------------------- 1 | show pdbs; 2 | ALTER SYSTEM SET PROCESSES=500 SCOPE=SPFILE; 3 | alter session set container= freepdb1; 4 | create user dify identified by dify DEFAULT TABLESPACE users quota unlimited on users; 5 | grant DB_DEVELOPER_ROLE to dify; 6 | 7 | BEGIN 8 | CTX_DDL.CREATE_PREFERENCE('dify.world_lexer','WORLD_LEXER'); 9 | END; 10 | / 11 | -------------------------------------------------------------------------------- /docker/dify/docker/tidb/config/pd.toml: -------------------------------------------------------------------------------- 1 | # PD Configuration File reference: 2 | # https://docs.pingcap.com/tidb/stable/pd-configuration-file#pd-configuration-file 3 | [replication] 4 | max-replicas = 1 5 | -------------------------------------------------------------------------------- /docker/dify/docker/tidb/config/tiflash-learner.toml: -------------------------------------------------------------------------------- 1 | # TiFlash tiflash-learner.toml Configuration File reference: 2 | # https://docs.pingcap.com/tidb/stable/tiflash-configuration#configure-the-tiflash-learnertoml-file 3 | 4 | log-file = "/logs/tiflash_tikv.log" 5 | 6 | [server] 7 | engine-addr = "tiflash:4030" 8 | addr = "0.0.0.0:20280" 9 | advertise-addr = "tiflash:20280" 10 | status-addr = "tiflash:20292" 11 | 12 | [storage] 13 | data-dir = "/data/flash" 14 | -------------------------------------------------------------------------------- /docker/dify/docker/tidb/config/tiflash.toml: -------------------------------------------------------------------------------- 1 | # TiFlash tiflash.toml Configuration File reference: 2 | # https://docs.pingcap.com/tidb/stable/tiflash-configuration#configure-the-tiflashtoml-file 3 | 4 | listen_host = "0.0.0.0" 5 | path = "/data" 6 | 7 | [flash] 8 | tidb_status_addr = "tidb:10080" 9 | service_addr = "tiflash:4030" 10 | 11 | [flash.proxy] 12 | config = "/tiflash-learner.toml" 13 | 14 | [logger] 15 | errorlog = "/logs/tiflash_error.log" 16 | log = "/logs/tiflash.log" 17 | 18 | [raft] 19 | pd_addr = "pd0:2379" 20 | -------------------------------------------------------------------------------- /docker/dify/docker/volumes/myscale/config/users.d/custom_users_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ::1 7 | 127.0.0.1 8 | 10.0.0.0/8 9 | 172.16.0.0/12 10 | 192.168.0.0/16 11 | 12 | default 13 | default 14 | 1 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docker/dify/docker/volumes/oceanbase/init.d/vec_memory.sql: -------------------------------------------------------------------------------- 1 | ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; 2 | -------------------------------------------------------------------------------- /docker/dify/docker/volumes/sandbox/conf/config.yaml: -------------------------------------------------------------------------------- 1 | app: 2 | port: 8194 3 | debug: True 4 | key: dify-sandbox 5 | max_workers: 4 6 | max_requests: 50 7 | worker_timeout: 5 8 | python_path: /usr/local/bin/python3 9 | enable_network: True # please make sure there is no network risk in your environment 10 | allowed_syscalls: # please leave it empty if you have no idea how seccomp works 11 | proxy: 12 | socks5: '' 13 | http: '' 14 | https: '' 15 | -------------------------------------------------------------------------------- /docker/dify/docker/volumes/sandbox/conf/config.yaml.example: -------------------------------------------------------------------------------- 1 | app: 2 | port: 8194 3 | debug: True 4 | key: dify-sandbox 5 | max_workers: 4 6 | max_requests: 50 7 | worker_timeout: 5 8 | python_path: /usr/local/bin/python3 9 | python_lib_path: 10 | - /usr/local/lib/python3.10 11 | - /usr/lib/python3.10 12 | - /usr/lib/python3 13 | - /usr/lib/x86_64-linux-gnu 14 | - /etc/ssl/certs/ca-certificates.crt 15 | - /etc/nsswitch.conf 16 | - /etc/hosts 17 | - /etc/resolv.conf 18 | - /run/systemd/resolve/stub-resolv.conf 19 | - /run/resolvconf/resolv.conf 20 | - /etc/localtime 21 | - /usr/share/zoneinfo 22 | - /etc/timezone 23 | # add more paths if needed 24 | python_pip_mirror_url: https://pypi.tuna.tsinghua.edu.cn/simple 25 | nodejs_path: /usr/local/bin/node 26 | enable_network: True 27 | allowed_syscalls: 28 | - 1 29 | - 2 30 | - 3 31 | # add all the syscalls which you require 32 | proxy: 33 | socks5: '' 34 | http: '' 35 | https: '' 36 | -------------------------------------------------------------------------------- /docker/dify/docker/volumes/sandbox/dependencies/python-requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/docker/dify/docker/volumes/sandbox/dependencies/python-requirements.txt -------------------------------------------------------------------------------- /docker/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | chat-web: 5 | image: apconw/chat-vue3-mvp:1.1.3 6 | container_name: chat-vue3-mvp 7 | environment: 8 | - TZ=Asia/Shanghai 9 | ports: 10 | - "8081:80" 11 | extra_hosts: 12 | - "host.docker.internal:host-gateway" 13 | depends_on: 14 | - chat-service 15 | 16 | minio: 17 | image: minio/minio:RELEASE.2025-04-22T22-12-26Z 18 | container_name: minio 19 | ports: 20 | - "19000:9000" 21 | - "19001:9001" 22 | volumes: 23 | - ./volume/minio/data:/data 24 | environment: 25 | - MINIO_ROOT_USER=admin 26 | - MINIO_ROOT_PASSWORD=12345678 27 | command: server /data --console-address ":9001" 28 | 29 | chat-service: 30 | image: apconw/sanic-web:1.1.3 31 | container_name: sanic-web 32 | environment: 33 | - ENV=test 34 | - DIFY_SERVER_URL=http://host.docker.internal:18000 35 | - DIFY_DATABASE_QA_API_KEY=app-wBZqS3Zf5trr453bvtZ7QF7F 36 | - MINIO_ENDPOINT=host.docker.internal:19000 37 | - MINIO_ACCESS_KEY=sIR5eeDkiwoo779yNJbw 38 | - MiNIO_SECRET_KEY=MreuQ3aC1ymHJeo3QfzSg7aPz7PqlxeOw39nZUdE 39 | - TZ=Asia/Shanghai 40 | ports: 41 | - "8088:8088" 42 | extra_hosts: 43 | - "host.docker.internal:host-gateway" 44 | 45 | mysql: 46 | image: mysql:latest 47 | container_name: chat-db 48 | ports: 49 | - "13006:3306" 50 | environment: 51 | - MYSQL_ROOT_PASSWORD=1 52 | - CHARACTER_SET_SERVER=utf8mb4 53 | - COLLATION_SERVER=utf8mb4_unicode_ci 54 | - TZ=Asia/Shanghai 55 | volumes: 56 | - ./volume/mysql/data:/var/lib/mysql 57 | - ./my.cnf:/etc/mysql/conf.d/my.cnf 58 | -------------------------------------------------------------------------------- /docker/init_data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | SQL_FILE="init_sql.sql" # SQL 文件路径 5 | 6 | # 检查 SQL 文件是否存在 7 | if [ ! -f "$SQL_FILE" ]; then 8 | echo "Error: SQL file $SQL_FILE not found." 9 | exit 1 10 | fi 11 | 12 | # 调用 Python 脚本 13 | python3 ../common/initialize_mysql.py 14 | -------------------------------------------------------------------------------- /docker/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | character-set-server = utf8mb4 3 | collation-server = utf8mb4_unicode_ci 4 | 5 | [client] 6 | default-character-set = utf8mb4 7 | 8 | [mysql] 9 | default-character-set = utf8mb4 -------------------------------------------------------------------------------- /images/app-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/app-01.png -------------------------------------------------------------------------------- /images/chat-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/chat-01.png -------------------------------------------------------------------------------- /images/chat-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/chat-02.png -------------------------------------------------------------------------------- /images/chat-04.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/chat-04.gif -------------------------------------------------------------------------------- /images/chat-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/chat-05.png -------------------------------------------------------------------------------- /images/convas-api-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/convas-api-key.png -------------------------------------------------------------------------------- /images/ding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/ding.png -------------------------------------------------------------------------------- /images/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/img.png -------------------------------------------------------------------------------- /images/import-convas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/import-convas.png -------------------------------------------------------------------------------- /images/llm-setting-deepseek.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/llm-setting-deepseek.png -------------------------------------------------------------------------------- /images/llm-setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/llm-setting.png -------------------------------------------------------------------------------- /images/wchat-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/wchat-search.png -------------------------------------------------------------------------------- /images/wchat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/images/wchat.png -------------------------------------------------------------------------------- /models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/models/__init__.py -------------------------------------------------------------------------------- /puml/llm_to_chart_dify.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | actor User 3 | participant "前端" as FE 4 | participant "大模型" as T2SQL 5 | participant "后端接口" as BA 6 | participant "数据库" as DB 7 | 8 | User -> FE: 发起数据分析请求 9 | FE -> T2SQL: 发送文本请求,生成SQL 10 | T2SQL -> FE: 返回生成的SQL 11 | FE -> BA: 调用后端接口,发送SQL 12 | BA -> DB: 执行SQL查询 13 | DB -> BA: 返回查询结果 14 | BA -> FE: 返回查询结果 15 | FE -> FE: 根据数据类型动态渲染表格 16 | FE -> User: 显示渲染后的表格 17 | @enduml -------------------------------------------------------------------------------- /puml/llm_to_chart_matplotlib.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | actor User 3 | participant "前端" as FE 4 | participant "大模型" as LLM 5 | participant "服务端" as Server 6 | participant "数据验证模块" as Validator 7 | 8 | User -> FE: 发起请求 9 | FE -> LLM: 封装提示词 10 | LLM -> FE: 返回Matplotlib统计Python代码 11 | FE -> Server: 发送Python代码 12 | Server -> Validator: 验证代码 13 | Validator -> Server: 代码验证结果 14 | alt 代码验证通过 15 | Server -> Server: 执行代码生成图表图片 16 | Server -> FE: 返回图表图片 17 | else 代码验证失败 18 | Server -> FE: 返回错误信息 19 | end if 20 | FE -> User: 显示结果 21 | @enduml -------------------------------------------------------------------------------- /puml/llm_to_chart_ycs.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | actor User 3 | participant "前端" as FE 4 | participant "统计指标管理模块" as MetricManager 5 | participant "大模型匹配" as Matcher 6 | participant "大模型" as LLM 7 | participant "后端接口" as API 8 | participant "数据库" as DB 9 | 10 | User -> FE: 发起查询请求 11 | FE -> MetricManager: 维护统计指标 SQL 12 | User -> FE: 提出问题 13 | FE -> Matcher: 传递用户问题 14 | Matcher -> MetricManager: 查找匹配的统计指标SQL 15 | MetricManager -> Matcher: 返回匹配的统计指标SQL 16 | Matcher -> LLM: 传递匹配指标SQL和用户问题 17 | LLM -> LLM: 进行 SQL 填槽 18 | LLM -> API: 调用方法执行SQL 19 | API -> DB: 执行 SQL 查询 20 | DB -> API: 返回查询结果 21 | API -> FE: 返回查询结果 22 | FE -> FE: 根据数据类型动态渲染表格 23 | FE -> User: 显示渲染后的表格 24 | @enduml -------------------------------------------------------------------------------- /puml/mcp.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | actor User 3 | participant "应用" as APP 4 | participant "配置MCP工具" as MCPServerTools 5 | participant "UV/UVX/NPX" as ExeTools 6 | participant "LLM" as LLM 7 | participant "MCP 客户端" as MCPClient 8 | participant "MPC 网关" as SuperGateway 9 | participant "MCP 服务端" as MCPServer 10 | 11 | User -> APP: 打开应用 12 | APP -> MCPServerTools: 配置工具集 13 | MCPServerTools -> ExeTools: APP主进程拉起服务端进程(stdio形式) 14 | ExeTools -> MCPServer: 启动MCP服务 15 | MCPServer -> MCPServer: 后台运行 16 | MCPServer -> MCPServer: 等待客户端连接 17 | MCPServerTools -[#red]-> SuperGateway: 启动MCP网关(sse形式) 18 | SuperGateway -[#red]-> MCPServer: 启动MCP服务 19 | SuperGateway -[#red]-> SuperGateway: 后台运行 20 | SuperGateway -[#red]-> SuperGateway: 等待客户端连接 21 | 22 | User -> APP: 提出问题 23 | APP -> MCPServerTools: 发送问题并获取配置工具集 24 | MCPServerTools -> LLM: 传递问题和工具集 25 | LLM -> LLM: 根据问题选择可用工具 26 | LLM -> APP: 返回选择的工具 27 | APP -> MCPClient: 按顺序调用选择的工具 28 | MCPClient -[#red]-> SuperGateway: 本地应用主进程调用MCP网关(sse形式) 29 | SuperGateway -[#red]-> MCPServer: 调用MCP服务端 30 | MCPClient -> MCPServer: 本地应用主进程调用MCP服务端子进程(stdio形式) 31 | MCPServer -> MCPServer: 处理客户端请求 32 | MCPServer -> LLM: 返回执行结果 33 | LLM -> LLM: 总结结果 34 | LLM -> APP: 生成最终回答 35 | APP -> User: 提供最终回答 36 | @enduml -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "app" 3 | version = "0.1.0" 4 | description = "" 5 | package-mode = true 6 | authors = ["lihuan <343397495@qq.com>"] 7 | readme = "README.md" 8 | 9 | [tool.poetry.dependencies] 10 | python = "^3.10" 11 | sanic = "^24.6.0" 12 | sqlalchemy = "^2.0.31" 13 | aiomysql = "^0.2.0" 14 | requests = "^2.32.3" 15 | redis = "^5.0.7" 16 | pytest = "^8.3.2" 17 | numpy = "1.26.4" 18 | pyyaml = "^6.0.1" 19 | duckdb = "^1.0.0" 20 | openpyxl = "^3.1.5" 21 | seaborn = "^0.13.2" 22 | langchain = "^0.2.14" 23 | pdfplumber = "^0.11.3" 24 | python-docx = "^1.1.2" 25 | ollama = "^0.3.1" 26 | langchain-community = "^0.2.12" 27 | python-dotenv = "^1.0.1" 28 | pandasai = "^2.2.15" 29 | minio = "^7.2.8" 30 | pyjwt = "^2.9.0" 31 | selenium = "^4.26.0" 32 | bs4 = "^0.0.2" 33 | sanic-ext = "^23.12.0" 34 | mammoth = "^1.9.0" 35 | markdownify = "^0.14.1" 36 | pymupdf = "^1.25.2" 37 | beautifulsoup4 = "^4.13.3" 38 | lxml = "^5.3.1" 39 | selenium-stealth = "^1.0.6" 40 | 41 | [[tool.poetry.source]] 42 | name = "tsinghua" 43 | url = "https://pypi.tuna.tsinghua.edu.cn/simple/" 44 | priority = "primary" 45 | 46 | [build-system] 47 | requires = ["poetry-core"] 48 | build-backend = "poetry.core.masonry.api" 49 | 50 | # 格式化代码插件 51 | [tool.black] 52 | line-length = 88 53 | include = '\.pyi?$' 54 | exclude = '''/(\.git|\.hg|\.mypy_cache|\.tox|\.venv|_build|buck-out|build|dist)/''' -------------------------------------------------------------------------------- /serv.py: -------------------------------------------------------------------------------- 1 | from sanic import Sanic 2 | from sanic.response import empty 3 | 4 | import controllers 5 | from common.route_utility import autodiscover 6 | from config import serv 7 | from config.load_env import load_env 8 | 9 | # 加载配置文件 10 | load_env() 11 | 12 | app = Sanic("sanic-web") 13 | autodiscover( 14 | app, 15 | controllers, 16 | recursive=True, 17 | ) 18 | 19 | app.route("/")(lambda _: empty()) 20 | 21 | 22 | if __name__ == "__main__": 23 | app.run(host=serv.host, port=serv.port, workers=serv.workers) 24 | -------------------------------------------------------------------------------- /services/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/services/__init__.py -------------------------------------------------------------------------------- /web/.dockerignore: -------------------------------------------------------------------------------- 1 | # 忽略 node_modules 目录 2 | node_modules 3 | 4 | # 忽略其他不需要的文件和目录 5 | *.log 6 | *.swp 7 | *.swo 8 | *.swn -------------------------------------------------------------------------------- /web/.env.template: -------------------------------------------------------------------------------- 1 | # 请替换 APIKey(假使APIKey是key123456)和APISecret(假使APISecret是secret123456) 2 | VITE_SPARK_KEY=key123456:secret123456 3 | VITE_SILICONFLOW_KEY=sk-xxxxxx 4 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .vite 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | dist 14 | cache 15 | dist-ssr 16 | 17 | # misc 18 | .DS_Store 19 | *.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | .pnpm-debug.log* 25 | .eslintcache 26 | 27 | # IDE 28 | .idea 29 | 30 | .env* 31 | !.env.template 32 | 33 | vite.config.ts.timestamp* 34 | -------------------------------------------------------------------------------- /web/.stylelintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | bin 3 | obj 4 | *.* 5 | !*.vue 6 | !*.css 7 | !*.scss 8 | -------------------------------------------------------------------------------- /web/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "vue.volar", 4 | "dbaeumer.vscode-eslint", 5 | "stylelint.vscode-stylelint" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /web/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // 使用 IntelliSense 了解相关属性。 3 | // 悬停以查看现有属性的描述。 4 | // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "chrome", 9 | "request": "launch", 10 | "name": "针对 localhost 启动 Chrome", 11 | "url": "http://localhost:2048/chat", 12 | "webRoot": "${workspaceFolder}" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /web/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": false, 3 | 4 | // Auto fix 5 | 6 | "editor.codeActionsOnSave": { 7 | "source.fixAll.eslint": "explicit", 8 | "source.organizeImports": "never", 9 | "source.fixAll.stylelint": "explicit" 10 | }, 11 | "eslint.run": "onType", 12 | "eslint.format.enable": true, 13 | "stylelint.validate": [ 14 | "vue", 15 | "scss" 16 | ], 17 | "css.validate": false, 18 | "less.validate": false, 19 | 20 | "files.autoSaveDelay": 500, 21 | 22 | // Enable eslint for all supported languages 23 | "eslint.validate": [ 24 | "javascript", 25 | "javascriptreact", 26 | "typescript", 27 | "typescriptreact", 28 | "vue", 29 | "html", 30 | "markdown", 31 | "json", 32 | "jsonc", 33 | "yaml", 34 | "toml", 35 | "gql", 36 | "graphql" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /web/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020-PRESENT Wisdom 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /web/Makefile: -------------------------------------------------------------------------------- 1 | # 项目名称 2 | PROJECT_NAME = chat-vue3-mvp 3 | 4 | # Docker 镜像标签 5 | DOCKER_IMAGE = apconw/$(PROJECT_NAME):1.1.3 6 | 7 | # Docker 容器名称 8 | DOCKER_WEB_CONTAINER = $(PROJECT_NAME) 9 | 10 | # Node.js 版本 11 | NODE_VERSION = 18-alpine 12 | 13 | # Nginx 配置文件路径 14 | NGINX_CONF = ./docker/nginx.conf 15 | 16 | # 构建 Vue 3 项目 17 | build: 18 | npm run build 19 | 20 | # 构建 Docker 镜像 21 | docker-build: clean build 22 | docker build -t $(DOCKER_IMAGE) -f ./docker/Dockerfile . 23 | 24 | # 构建 前端arm64/amd64架构镜像并推送 25 | docker-build-web-multi: clean build 26 | docker buildx build --platform linux/amd64,linux/arm64 --push -t $(DOCKER_IMAGE) -f ./docker/Dockerfile . 27 | 28 | # 清理构建产物 29 | clean: 30 | rm -rf dist 31 | 32 | .PHONY: build docker-build -------------------------------------------------------------------------------- /web/babel.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | '@vue/babel-plugin-jsx', 4 | ], 5 | } 6 | -------------------------------------------------------------------------------- /web/components-instance.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | type ComponentsInstance = { 3 | [Property in keyof GlobalComponents]: InstanceType 4 | } 5 | } 6 | export { } 7 | -------------------------------------------------------------------------------- /web/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | # 使用Nginx作为运行时的轻量级Web服务器 3 | FROM nginx:stable-alpine 4 | 5 | # 设置工作目录 6 | WORKDIR /app 7 | # 8 | ## 将package.json和pnpm-lock.yaml复制到工作目录 9 | #COPY package.json ./ 10 | # 11 | ## 复制项目源代码到容器中 12 | #COPY . . 13 | 14 | # 删除默认的Nginx配置 15 | RUN rm /etc/nginx/conf.d/default.conf 16 | 17 | # # 添加自定义的Nginx配置 18 | COPY ./docker/nginx.conf /etc/nginx/conf.d 19 | 20 | # 将构建输出复制到Nginx的HTML目录 21 | COPY dist /usr/share/nginx/html 22 | 23 | # 暴露80端口 24 | EXPOSE 80 25 | 26 | # 启动Nginx服务 27 | CMD ["nginx", "-g", "daemon off;"] -------------------------------------------------------------------------------- /web/docker/nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | 5 | location /sanic { 6 | proxy_pass http://host.docker.internal:8088; 7 | proxy_set_header Host $host; 8 | proxy_set_header X-Real-IP $remote_addr; 9 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 10 | proxy_set_header X-Forwarded-Proto $scheme; 11 | 12 | # 重写路径以去除/sanic前缀 13 | rewrite ^/sanic/(.*)$ /$1 break; 14 | 15 | # 如果需要支持WebSocket,添加以下两行 16 | proxy_http_version 1.1; 17 | proxy_set_header Upgrade $http_upgrade; 18 | proxy_set_header Connection "upgrade"; 19 | } 20 | 21 | # 静态文件服务 22 | location / { 23 | root /usr/share/nginx/html; 24 | index index.html index.htm; 25 | try_files $uri $uri/ /index.html; 26 | } 27 | 28 | error_page 500 502 503 504 /50x.html; 29 | location = /50x.html { 30 | root /usr/share/nginx/html; 31 | } 32 | } -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 数据助手 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /web/public/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78ms-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78ms-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/78ms-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/78ms-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/83pv-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/83pv-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/90ms-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/90ms-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/90ms-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/90ms-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/90msp-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/90msp-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/90msp-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/90msp-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/90pv-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/90pv-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/90pv-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/90pv-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Add-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Add-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Add-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Add-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Add-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Add-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Add-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Add-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-0.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-1.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-3.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-3.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-4.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-4.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-5.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-5.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-6.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-6.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-CNS1-UCS2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-0.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-1.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-3.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-3.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-4.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-4.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-5.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-5.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-GB1-UCS2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-0.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-1.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-3.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-3.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-4.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-4.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-5.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-5.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-6.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-6.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Japan1-UCS2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-0.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-0.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-1.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-1.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-UCS2.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Adobe-Korea1-UCS2.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/B5pc-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/B5pc-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/B5pc-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/B5pc-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/CNS-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/CNS-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/CNS-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/CNS-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/CNS1-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/CNS1-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/CNS1-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/CNS1-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/CNS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/CNS2-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/CNS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/CNS2-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/ETHK-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/ETHK-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/ETHK-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/ETHK-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/ETen-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/ETen-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/ETen-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/ETen-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/ETenms-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/ETenms-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/ETenms-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/ETenms-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Ext-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GB-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GB-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GB-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GB-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GB-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GB-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GB-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GB-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBK-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBK-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBK-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBK-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBK2K-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBK2K-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBK2K-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBK2K-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBKp-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBKp-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBKp-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBKp-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBT-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBTpc-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBTpc-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBTpc-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBTpc-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBpc-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBpc-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/GBpc-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/GBpc-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKdla-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKdla-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKdla-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKdla-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKdlb-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKdlb-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKdlb-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKdlb-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKgccs-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKgccs-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKgccs-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKgccs-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKm314-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKm314-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKm314-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKm314-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKm471-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKm471-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKm471-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKm471-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKscs-B5-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKscs-B5-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/HKscs-B5-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/HKscs-B5-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Hankaku.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Hankaku.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Hiragana.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Hiragana.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-Johab-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-Johab-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-Johab-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-Johab-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-HW-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-HW-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-HW-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-HW-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSCms-UHC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSCpc-EUC-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSCpc-EUC-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/KSCpc-EUC-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/KSCpc-EUC-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Katakana.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Katakana.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/NWP-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/NWP-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/NWP-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/NWP-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/RKSJ-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/RKSJ-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/RKSJ-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/RKSJ-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/Roman.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/Roman.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UCS2-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UCS2-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF16-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF16-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF8-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniCNS-UTF8-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UCS2-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UCS2-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF16-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF16-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF8-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniGB-UTF8-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-HW-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-HW-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-HW-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-HW-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UCS2-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF16-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF16-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF8-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS-UTF8-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF16-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF16-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF8-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJIS2004-UTF8-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISPro-UCS2-HW-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISPro-UCS2-HW-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISPro-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISPro-UCS2-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISPro-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISPro-UTF8-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX0213-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX0213-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX0213-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX0213-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX02132004-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX02132004-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX02132004-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniJISX02132004-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UCS2-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UCS2-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UCS2-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UCS2-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF16-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF16-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF16-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF16-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF32-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF32-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF32-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF32-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF8-H.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF8-H.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF8-V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/UniKS-UTF8-V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/V.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/V.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/cmaps/WP-Symbol.bcmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/cmaps/WP-Symbol.bcmap -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/compressed.tracemonkey-pldi-09.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/compressed.tracemonkey-pldi-09.pdf -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/altText_add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/altText_done.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/altText_warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-check.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-comment.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-insert.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-key.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-newparagraph.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-noicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-note.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 14 | 21 | 28 | 35 | 42 | 43 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-paperclip.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-paragraph.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/annotation-pushpin.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/cursor-editorFreeText.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/cursor-editorInk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/editor-toolbar-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/findbarButton-next.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/findbarButton-previous.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/gv-toolbarButton-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/loading-icon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/images/loading-icon.gif -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/loading.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/messageBar_closingButton.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/messageBar_warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-documentProperties.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-firstPage.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-handTool.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-lastPage.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-rotateCcw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-rotateCw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-scrollHorizontal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-scrollPage.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-scrollVertical.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-scrollWrapped.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-selectTool.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-spreadEven.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-spreadNone.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/secondaryToolbarButton-spreadOdd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-currentOutlineItem.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-editorFreeText.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-editorHighlight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-editorInk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-editorStamp.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-menuArrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-openFile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-pageDown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-pageUp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-presentationMode.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-print.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-secondaryToolbarToggle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-sidebarToggle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-viewAttachments.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-viewLayers.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-viewOutline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-viewThumbnail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-zoomIn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/toolbarButton-zoomOut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/treeitem-collapsed.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/images/treeitem-expanded.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitDingbats.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitDingbats.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixed.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixed.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixedBold.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixedBold.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixedBoldItalic.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixedBoldItalic.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixedItalic.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitFixedItalic.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerif.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerif.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerifBold.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerifBold.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerifBoldItalic.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerifBoldItalic.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerifItalic.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSerifItalic.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSymbol.pfb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/FoxitSymbol.pfb -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/LICENSE_FOXIT: -------------------------------------------------------------------------------- 1 | // Copyright 2014 PDFium Authors. All rights reserved. 2 | // 3 | // Redistribution and use in source and binary forms, with or without 4 | // modification, are permitted provided that the following conditions are 5 | // met: 6 | // 7 | // * Redistributions of source code must retain the above copyright 8 | // notice, this list of conditions and the following disclaimer. 9 | // * Redistributions in binary form must reproduce the above 10 | // copyright notice, this list of conditions and the following disclaimer 11 | // in the documentation and/or other materials provided with the 12 | // distribution. 13 | // * Neither the name of Google Inc. nor the names of its 14 | // contributors may be used to endorse or promote products derived from 15 | // this software without specific prior written permission. 16 | // 17 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-Bold.ttf -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-BoldItalic.ttf -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-Italic.ttf -------------------------------------------------------------------------------- /web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/public/pdfjs-4.10.38-dist/web/standard_fonts/LiberationSans-Regular.ttf -------------------------------------------------------------------------------- /web/src/App.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 27 | 28 | 31 | -------------------------------------------------------------------------------- /web/src/NaiveProvider.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 32 | -------------------------------------------------------------------------------- /web/src/assets/fonts/index.ts: -------------------------------------------------------------------------------- 1 | import '@/assets/fonts/iconfont' 2 | -------------------------------------------------------------------------------- /web/src/assets/images/entry-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apconw/sanic-web/ff1445b8260cffa06312f3486dd0e0ec35fd7b6d/web/src/assets/images/entry-background.png -------------------------------------------------------------------------------- /web/src/assets/svg/chat-agent.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 17 | -------------------------------------------------------------------------------- /web/src/assets/svg/chat-index.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 17 | -------------------------------------------------------------------------------- /web/src/assets/svg/system-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 17 | 22 | -------------------------------------------------------------------------------- /web/src/base/index.ts: -------------------------------------------------------------------------------- 1 | export const systemTitle = '数据助手' 2 | -------------------------------------------------------------------------------- /web/src/components/404.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /web/src/components/ClipBoard/index.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 60 | 61 | 64 | -------------------------------------------------------------------------------- /web/src/components/IconifyIcon/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /web/src/components/Layout/SidearPage.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 13 | 14 | 35 | -------------------------------------------------------------------------------- /web/src/components/Layout/SlotArea.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | 21 | 37 | -------------------------------------------------------------------------------- /web/src/components/Layout/SlotFrame.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 23 | 24 | 46 | -------------------------------------------------------------------------------- /web/src/components/Layout/default.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /web/src/components/MarkdownPreview/plugins/highlight.ts: -------------------------------------------------------------------------------- 1 | import hljs from 'highlight.js' 2 | 3 | function hljsDefineVue() { 4 | return { 5 | subLanguage: 'xml', 6 | contains: [ 7 | hljs.COMMENT('', { 8 | relevance: 10, 9 | }), 10 | { 11 | begin: /^(\s*)( 13 | 14 | 39 | 40 | 75 | -------------------------------------------------------------------------------- /web/src/components/TableList/index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /web/src/components/index.ts: -------------------------------------------------------------------------------- 1 | // Vue Component Install 2 | 3 | import IconFont from '@/components/IconFont/index.vue' 4 | 5 | const Components = { 6 | install(app: App) { 7 | componentList.forEach((Comp) => { 8 | app.component(Comp.name, Comp) 9 | }) 10 | }, 11 | } 12 | 13 | const componentList = [ 14 | IconFont, 15 | ] 16 | 17 | export default Components 18 | -------------------------------------------------------------------------------- /web/src/config/env.ts: -------------------------------------------------------------------------------- 1 | const isDev = import.meta.env.DEV 2 | 3 | /** 4 | * TODO: 若是本地开发环境、Github 部署环境,则模拟大模型相关策略,不调接口 5 | */ 6 | // export const isMockDevelopment = isDev 7 | // || process.env.VITE_ROUTER_MODE === 'hash' 8 | 9 | // 打开此行,则会调用真实的大模型接口(需提前配置好 Key) 10 | export const isMockDevelopment = false 11 | -------------------------------------------------------------------------------- /web/src/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from './env' 2 | -------------------------------------------------------------------------------- /web/src/data/index.ts: -------------------------------------------------------------------------------- 1 | import mockMd from './mock-md.md' 2 | 3 | export const mockEventStreamText = mockMd 4 | 5 | 6 | export const mockMenusList = [ 7 | { 8 | id: 'xxxxxx-1', 9 | name: '这是测试菜单名称', 10 | }, 11 | { 12 | id: 'xxxxxx-2', 13 | name: '编写一个 Hello World', 14 | }, 15 | ] 16 | -------------------------------------------------------------------------------- /web/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv extends Readonly> { 4 | readonly VITE_BASE_API: string 5 | readonly VITE_SPARK_KEY: string 6 | } 7 | 8 | interface ImportMeta { 9 | readonly env: ImportMetaEnv 10 | } 11 | -------------------------------------------------------------------------------- /web/src/hooks/useClipText.ts: -------------------------------------------------------------------------------- 1 | export function useClipText() { 2 | const copied = ref(false) 3 | const copyDuration = 1500 4 | 5 | const handleCopied = () => { 6 | copied.value = true 7 | setTimeout(() => { 8 | copied.value = false 9 | }, copyDuration) 10 | } 11 | 12 | function copy(textToCopy) { 13 | if (navigator.clipboard && window.isSecureContext) { 14 | return navigator.clipboard.writeText(textToCopy).then(() => { 15 | handleCopied() 16 | }) 17 | } else { 18 | const textArea = document.createElement('textarea') 19 | textArea.value = textToCopy 20 | textArea.style.position = 'fixed' 21 | textArea.style.opacity = '0' 22 | textArea.style.left = '-999999px' 23 | textArea.style.top = '-999999px' 24 | document.body.appendChild(textArea) 25 | textArea.focus() 26 | textArea.select() 27 | return new Promise((resolve, reject) => { 28 | setTimeout(() => { 29 | const exec = document.execCommand('copy') 30 | if (exec) { 31 | handleCopied() 32 | resolve('') 33 | } else { 34 | reject(new Error()) 35 | } 36 | textArea.remove() 37 | }) 38 | }) 39 | } 40 | } 41 | 42 | return { 43 | copy, 44 | copied, 45 | copyDuration, 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /web/src/hooks/useCurrentInstance.ts: -------------------------------------------------------------------------------- 1 | export default function useCurrentInstance() { 2 | const { proxy } = getCurrentInstance() as ComponentInternalInstance 3 | 4 | return { 5 | proxy: proxy!, 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/src/main.ts: -------------------------------------------------------------------------------- 1 | import App from '@/App.vue' 2 | 3 | import InstallGlobalComponents from '@/components' 4 | import { setupRouter } from '@/router' 5 | 6 | import { setupStore } from '@/store' 7 | 8 | import 'virtual:uno.css' 9 | 10 | const app = createApp(App) 11 | 12 | function setupPlugins() { 13 | app.use(InstallGlobalComponents) 14 | } 15 | 16 | async function setupApp() { 17 | setupStore(app) 18 | await setupRouter(app) 19 | app.mount('#app') 20 | } 21 | 22 | setupPlugins() 23 | setupApp() 24 | 25 | // 初始化用户状态 26 | const userStore = useUserStore() 27 | userStore.init() 28 | 29 | export default app 30 | -------------------------------------------------------------------------------- /web/src/router/child-routes.ts: -------------------------------------------------------------------------------- 1 | const LayoutDefault = () => import('@/components/Layout/default.vue') 2 | 3 | const childrenRoutes: Array = [ 4 | { 5 | path: 'chat', 6 | meta: { requiresAuth: true }, 7 | name: 'ChatRoot', 8 | redirect: { 9 | name: 'ChatIndex', 10 | }, 11 | children: [ 12 | { 13 | path: '', 14 | name: 'ChatIndex', 15 | component: () => import('@/views/chat.vue'), 16 | }, 17 | ], 18 | }, 19 | { 20 | path: 'testAssitant', 21 | name: 'TestAssitant', 22 | component: () => import('@/views/DemandManager.vue'), 23 | meta: { requiresAuth: true }, // 标记需要认证 24 | }, 25 | { 26 | path: 'uaDetail/:id', 27 | name: 'UaDetail', 28 | component: () => import('@/views/usassistant/UsDetail.vue'), 29 | meta: { requiresAuth: true }, 30 | }, 31 | // { 32 | // path: '/testAssitant', 33 | // name: 'TestAssitant', 34 | // component: () => import('@/views/TestAssistant.vue'), 35 | // meta: { requiresAuth: true } // 标记需要认证 36 | // }, 37 | { 38 | path: 'mcpChat', 39 | name: 'McpChat', 40 | component: () => import('@/views/mcp/MCPClient.vue'), 41 | meta: { requiresAuth: true }, // 标记需要认证 42 | }, 43 | ] 44 | 45 | export default childrenRoutes 46 | -------------------------------------------------------------------------------- /web/src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createWebHashHistory } from 'vue-router' 2 | import { isMockDevelopment } from '@/config' 3 | import { createRouterGuards } from '@/router/permission' 4 | import routes from './routes' 5 | 6 | const history = isMockDevelopment ? createWebHashHistory() : createWebHistory() 7 | 8 | const router = createRouter({ 9 | history, 10 | routes, 11 | }) 12 | 13 | // 全局前置守卫 14 | router.beforeEach((to, from, next) => { 15 | const userStore = useUserStore() 16 | if (to.meta.requiresAuth && !userStore.isLoggedIn) { 17 | // 如果目标路由需要认证且用户未登录,则重定向到登录页面 18 | next('/login') 19 | } else { 20 | next() 21 | } 22 | }) 23 | 24 | export async function setupRouter(app: App) { 25 | createRouterGuards(router) 26 | app.use(router) 27 | 28 | await router.isReady() 29 | } 30 | 31 | export default router 32 | -------------------------------------------------------------------------------- /web/src/router/permission.ts: -------------------------------------------------------------------------------- 1 | import type { Router } from 'vue-router' 2 | import NProgress from 'nprogress' 3 | 4 | NProgress.configure({ 5 | showSpinner: false, 6 | }) 7 | 8 | export function createRouterGuards(router: Router) { 9 | router.beforeEach(async (to, from, next) => { 10 | NProgress.start() 11 | next() 12 | }) 13 | 14 | router.afterEach(() => { 15 | NProgress.done() 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /web/src/router/routes.ts: -------------------------------------------------------------------------------- 1 | import childRoutes from '@/router/child-routes' 2 | 3 | const routes: Array = [ 4 | { 5 | path: '/', 6 | name: 'Root', 7 | redirect: { 8 | name: 'ChatRoot', 9 | }, 10 | component: () => import('@/components/Layout/SlotCenterPanel.vue'), 11 | meta: { requiresAuth: true }, // 标记需要认证 12 | children: childRoutes, 13 | }, 14 | { 15 | path: '/login', 16 | name: 'Login', 17 | component: () => import('@/views/Login.vue'), 18 | }, 19 | { 20 | path: '/:pathMatch(.*)', 21 | name: '404', 22 | component: () => import('@/components/404.vue'), 23 | }, 24 | ] 25 | 26 | export default routes 27 | -------------------------------------------------------------------------------- /web/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | type EmptyObject = Record 2 | declare module '*.vue' { 3 | import type { DefineComponent } from 'vue' 4 | 5 | const component: DefineComponent 6 | export default component 7 | } 8 | 9 | // 声明一个模块 '*.md',设置为字符串类型 10 | declare module '*.md' { 11 | const content: string 12 | export default content 13 | } 14 | -------------------------------------------------------------------------------- /web/src/store/business/userStore.ts: -------------------------------------------------------------------------------- 1 | // src/store/userStore.ts 2 | import { defineStore } from 'pinia' 3 | 4 | export const useUserStore = defineStore('user', { 5 | state: () => ({ 6 | user: null as null | { token: string }, 7 | }), 8 | actions: { 9 | login(user: { token: string }) { 10 | this.user = user 11 | // 将用户信息存储到 sessionStorage 12 | sessionStorage.setItem('user', JSON.stringify(user)) 13 | }, 14 | logout() { 15 | this.user = null 16 | // 清除 sessionStorage 中的用户信息 17 | sessionStorage.removeItem('user') 18 | }, 19 | init() { 20 | // 从 sessionStorage 中恢复用户信息 21 | const storedUser = sessionStorage.getItem('user') 22 | if (storedUser) { 23 | this.user = JSON.parse(storedUser) 24 | } 25 | }, 26 | getUserToken() { 27 | const storedUser = sessionStorage.getItem('user') 28 | if (storedUser) { 29 | this.user = JSON.parse(storedUser) 30 | } 31 | return this.user?.token 32 | }, 33 | }, 34 | getters: { 35 | isLoggedIn: (state) => !!state.user, 36 | }, 37 | }) 38 | -------------------------------------------------------------------------------- /web/src/store/hooks/useAppStore.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { store } from '@/store' 3 | 4 | export const useAppStore = defineStore('app-store', () => { 5 | const areaLoading = ref(false) 6 | 7 | return { 8 | areaLoading, 9 | } 10 | }) 11 | 12 | export function useAppStoreWithOut() { 13 | return useAppStore(store) 14 | } 15 | -------------------------------------------------------------------------------- /web/src/store/index.ts: -------------------------------------------------------------------------------- 1 | import { createPinia } from 'pinia' 2 | import { pluginPinia } from '@/store/plugins' 3 | 4 | const store = createPinia() 5 | 6 | export function setupStore(app: App) { 7 | app.use(store) 8 | } 9 | 10 | store.use(pluginPinia) 11 | export { store } 12 | -------------------------------------------------------------------------------- /web/src/store/plugins/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Plugins for Pinia 3 | */ 4 | 5 | import router from '@/router' 6 | import { getFilterResponse } from '@/store/utils/mixin' 7 | 8 | export const pluginPinia = ({ store }) => { 9 | store.filterResponse = getFilterResponse 10 | store.router = router 11 | } 12 | -------------------------------------------------------------------------------- /web/src/store/utils/mixin.ts: -------------------------------------------------------------------------------- 1 | 2 | export function getFilterResponse( 3 | res: globalThis.IRequestData, 4 | successCallback?: globalThis.IStoreFilterCallBack | null, 5 | errorCallback?: globalThis.IStoreFilterCallBack | null, 6 | ): Promise { 7 | return new Promise((resolve) => { 8 | if (res && res.error === 0) { 9 | successCallback && successCallback(res) 10 | } else { 11 | errorCallback 12 | ? errorCallback(res) 13 | : window.$ModalMessage.error(res.msg!, { 14 | closable: true, 15 | }) 16 | } 17 | resolve(res) 18 | }) 19 | } 20 | -------------------------------------------------------------------------------- /web/src/styles/global.scss: -------------------------------------------------------------------------------- 1 | .fade-enter-active, 2 | .fade-leave-active { 3 | transition: all 0.25s ease; 4 | } 5 | 6 | .fade-enter, 7 | .fade-enter-from, 8 | .fade-leave-to { 9 | opacity: 0; 10 | transform: translateX(-10px); 11 | } 12 | 13 | .fade-leave-active { 14 | position: absolute; 15 | } 16 | 17 | 18 | .fade-between-enter-active, 19 | .fade-between-leave-active { 20 | transition: all 0.25s ease; 21 | left: 0; 22 | right: 0; 23 | } 24 | 25 | .fade-between-enter, 26 | .fade-between-enter-from, 27 | .fade-between-leave-to { 28 | opacity: 0; 29 | transform: translateX(-10px); 30 | } 31 | 32 | .fade-between-leave-active { 33 | position: absolute; 34 | } 35 | 36 | 37 | .transfer-enter-active, 38 | .transfer-leave-active { 39 | transition: all 0.3s ease; 40 | } 41 | 42 | .transfer-enter, 43 | .transfer-enter-from, 44 | .transfer-leave-to { 45 | opacity: 0; 46 | transform: translateX(30px); 47 | } 48 | 49 | .transfer-leave-active { 50 | position: absolute; 51 | } 52 | 53 | .textarea-resize-none { 54 | 55 | .n-input-wrapper { 56 | resize: none !important; 57 | } 58 | 59 | .n-input__textarea-el { 60 | resize: none !important; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /web/src/styles/markdown.scss: -------------------------------------------------------------------------------- 1 | .markdown-code-wrapper { 2 | --at-apply: 'relative whitespace-initial'; 3 | --at-apply: 'bg-#f6f6f7'; 4 | --at-apply: 'line-height-24'; 5 | --at-apply: 'flex flex-col'; 6 | --at-apply: 'my-12px'; 7 | --at-apply: rounded-8 overflow-hidden; 8 | 9 | 10 | .markdown-code-header { 11 | --at-apply: flex justify-between items-center; 12 | --at-apply: 'b-b b-b-solid b-b-#3c3c43:10'; 13 | } 14 | 15 | .markdown-code-copy { 16 | --at-apply: px-14 py-8 rounded-4; 17 | --at-apply: 'flex items-center justify-center'; 18 | --at-apply: 'b-none bg-transparent'; 19 | --at-apply: 'c-#808080' cursor-pointer; 20 | --at-apply: transition-all-300 opacity-100 z-1; 21 | 22 | .markdown-copy-icon { 23 | --at-apply: text-16 pointer-events-none mr-4; 24 | --at-apply: 'i-ci:copy'; 25 | } 26 | 27 | .markdown-copy-text { 28 | --at-apply: pointer-events-none; 29 | 30 | &.default { 31 | display: initial; 32 | } 33 | 34 | &.done { 35 | display: none; 36 | } 37 | } 38 | 39 | &.copied { 40 | 41 | .markdown-copy-icon { 42 | --at-apply: 'i-ic:baseline-check'; 43 | } 44 | 45 | .markdown-copy-text { 46 | 47 | &.default { 48 | display: none; 49 | } 50 | 51 | &.done { 52 | display: initial; 53 | } 54 | } 55 | } 56 | } 57 | 58 | .markdown-code-lang { 59 | // --at-apply: absolute right-8 top-2; 60 | 61 | --at-apply: pl-14 text-14 font-500 'c-#3c3c43/56'; 62 | --at-apply: transition-all-300 opacity-100 z-0; 63 | } 64 | 65 | pre { 66 | 67 | code { 68 | --at-apply: 'bg-#f6f6f7'; 69 | --at-apply: whitespace-pre py-15; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /web/src/styles/naive-variables.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable rule-empty-line-before */ 2 | // Only variables can be placed here, 3 | // and other files such as themes cannot be introduced, 4 | // otherwise it will affect the packaging speed. 5 | 6 | /* theme color */ 7 | $color-primary: #692ee6; 8 | $color-success: #52c41a; 9 | $color-warning: #fe7d18; 10 | $color-danger: #fa5555; 11 | $color-info: #909399; 12 | $color-default: #536fec; 13 | -------------------------------------------------------------------------------- /web/src/styles/theme.scss: -------------------------------------------------------------------------------- 1 | @use "highlight.js/styles/lightfair.css" as *; 2 | @use "@/styles/naive-variables.scss" as *; 3 | 4 | #nprogress .bar { 5 | background: $color-primary !important; 6 | } 7 | 8 | #nprogress .peg { 9 | box-shadow: 0 0 10px $color-primary, 0 0 5px $color-primary !important; 10 | } 11 | 12 | #nprogress .spinner-icon { 13 | border-top-color: $color-primary; 14 | border-left-color: $color-primary; 15 | } 16 | -------------------------------------------------------------------------------- /web/src/types/global.d.ts: -------------------------------------------------------------------------------- 1 | interface Window { 2 | $ModalMessage: import('naive-ui').MessageProviderInst 3 | $ModalNotification: import('naive-ui').NotificationProviderInst 4 | $ModalDialog: import('naive-ui').DialogProviderInst 5 | $ModalLoadingBar: import('naive-ui').LoadingBarProviderInst 6 | } 7 | -------------------------------------------------------------------------------- /web/src/utils/location.ts: -------------------------------------------------------------------------------- 1 | const locationHost = { 2 | hostname: 'localhost', 3 | baseApiIp: 'http://10.30.10.54:10001', 4 | baseApi: 'http://10.30.10.54:10001/api', 5 | } 6 | 7 | const hostList = [ 8 | locationHost, 9 | ] 10 | 11 | /** 12 | * 获取当前服务的 host 前缀 13 | */ 14 | export const currentHost = hostList.find((hostItem) => { 15 | return window.location.hostname === hostItem.hostname 16 | }) || locationHost 17 | -------------------------------------------------------------------------------- /web/src/utils/number.ts: -------------------------------------------------------------------------------- 1 | // 千分符函数 【判断是否四舍五入】 2 | export const comma = (num: any, suffix = '') => { 3 | if (!num) { 4 | return 5 | } 6 | 7 | const strNum = _.isString(num) ? num : String(num) 8 | const intNum = _.isString(num) ? Number(num) : num 9 | 10 | if (isNaN(intNum)) { 11 | return num 12 | } 13 | 14 | let source = [] as Array 15 | if (strNum.includes('.')) { 16 | source = String(intNum.toFixed(2)).split('.') // 保留两位(四舍五入); 按小数点分成2部分 17 | source[0] = source[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,')// 只将整数部分进行都好分割 18 | return source.join('.') + suffix // 再将小数部分合并进来 19 | } 20 | 21 | return strNum.replace(/(\d)(?=(\d{3})+$)/g, '$1,') + suffix 22 | } 23 | 24 | export const generateYears = (startYear) => { 25 | const currentYear = new Date().getFullYear() 26 | const endYear = currentYear + 1 // 明年 27 | const years: string[] = [] 28 | 29 | let year = startYear 30 | for (; year <= endYear; year++) { 31 | years.push(year) 32 | } 33 | 34 | return years 35 | } 36 | -------------------------------------------------------------------------------- /web/src/utils/type.ts: -------------------------------------------------------------------------------- 1 | const originToString = Object.prototype.toString 2 | 3 | export function isFunction(obj: any) { 4 | return typeof (obj) === 'function' 5 | } 6 | 7 | export function isObject(obj: any) { 8 | return obj === Object(obj) 9 | } 10 | 11 | export function isArray(obj: any) { 12 | return originToString.call(obj) === '[object Array]' 13 | } 14 | 15 | export function isDate(obj: any) { 16 | return originToString.call(obj) === '[object Date]' 17 | } 18 | 19 | export function isRegExp(obj: any) { 20 | return originToString.call(obj) === '[object RegExp]' 21 | } 22 | 23 | export function isBoolean(obj: any) { 24 | return originToString.call(obj) === '[object Boolean]' 25 | } 26 | 27 | export function isString(obj: any): obj is string { 28 | return originToString.call(obj) === '[object String]' 29 | } 30 | 31 | export function isUndefined(obj: any) { 32 | return originToString.call(obj) === '[object Undefined]' 33 | } 34 | 35 | export function isNull(obj: any) { 36 | return originToString.call(obj) === '[object Null]' 37 | } 38 | 39 | export function isBigInt(obj: any) { 40 | return originToString.call(obj) === '[object BigInt]' 41 | } 42 | 43 | export function isNumberical(obj: any) { 44 | return !isNaN(Number.parseFloat(obj)) && isFinite(obj) 45 | } 46 | -------------------------------------------------------------------------------- /web/src/views/SuggestedPage.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 44 | 45 | 63 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "jsx": "preserve", 5 | "lib": ["esnext", "dom"], 6 | "noLib": false, 7 | "useDefineForClassFields": true, 8 | "experimentalDecorators": true, 9 | 10 | "baseUrl": "./", 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "paths": { 14 | "@/*": [ 15 | "src/*" 16 | ] 17 | }, 18 | "resolveJsonModule": true, 19 | "types": [ 20 | "vite/client", 21 | "node", 22 | "naive-ui/volar" 23 | ], 24 | "strict": true, 25 | "noImplicitAny": false, 26 | "declaration": false, 27 | "removeComments": true, 28 | "sourceMap": true, 29 | "allowSyntheticDefaultImports": true, 30 | "esModuleInterop": true, 31 | "forceConsistentCasingInFileNames": true, 32 | "skipLibCheck": true 33 | }, 34 | "include": [ 35 | "src/**/*.ts", 36 | "src/**/*.md", 37 | "src/**/*.d.ts", 38 | "src/**/*.tsx", 39 | "src/**/*.vue", 40 | "__tests__/**/*.ts", 41 | "./eslint.config.ts", 42 | "./auto-imports.d.ts", 43 | "./components.d.ts", 44 | "./components-instance.d.ts" 45 | ], 46 | "exclude": ["node_modules"] 47 | } 48 | -------------------------------------------------------------------------------- /web/uno.config.ts: -------------------------------------------------------------------------------- 1 | import path from 'node:path' 2 | import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders' 3 | import presetRemToPx from '@unocss/preset-rem-to-px' 4 | 5 | import { 6 | defineConfig, 7 | presetAttributify, 8 | presetIcons, 9 | presetWind3, 10 | transformerAttributifyJsx, 11 | transformerDirectives, 12 | } from 'unocss' 13 | 14 | 15 | export default defineConfig({ 16 | presets: [ 17 | presetWind3(), 18 | presetAttributify(), 19 | presetIcons({ 20 | customizations: { 21 | transform(svg) { 22 | return svg.replace(/#fff/, 'currentColor') 23 | }, 24 | }, 25 | collections: { 26 | 'my-svg': FileSystemIconLoader( 27 | path.join(__dirname, 'src/assets/svg'), 28 | ), 29 | }, 30 | }), 31 | presetRemToPx({ 32 | baseFontSize: 4, 33 | }), 34 | ], 35 | transformers: [ 36 | transformerDirectives(), 37 | transformerAttributifyJsx(), 38 | ], 39 | theme: { 40 | colors: { 41 | primary: '#692ee6', 42 | success: '#52c41a', 43 | warning: '#fe7d18', 44 | danger: '#fa5555', 45 | info: '#909399', 46 | bgcolor: '#f2ecee', 47 | }, 48 | }, 49 | rules: [ 50 | [ 51 | 'navbar-shadow', { 52 | 'box-shadow': '0 1px 4px rgb(0 21 41 / 8%)', 53 | }, 54 | ], 55 | ], 56 | }) 57 | --------------------------------------------------------------------------------