Repository: CodePhiliaX/Chat2DB
Branch: main
Commit: 15ec66005e92
Files: 1633
Total size: 4.7 MB
Directory structure:
gitextract_docf9pkb/
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yml
│ │ ├── optimized.md
│ │ └── suggest.md
│ └── workflows/
│ ├── pushdocker.yml
│ ├── release.yml
│ ├── release_test.yml
│ └── release_test_2.yml
├── .gitignore
├── .vscode/
│ └── settings.json
├── CHANGELOG.md
├── CHANGELOG_CN.md
├── CHAT2DB_AI_SQL.md
├── Chat2DB_LICENSE
├── LICENSE
├── README.md
├── README_CN.md
├── README_JA.md
├── chat2db-client/
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .npmrc
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── .umirc.prod.desktop.ts
│ ├── .umirc.prod.ts
│ ├── .umirc.ts
│ ├── .vscode/
│ │ └── settings.json
│ ├── mock/
│ │ └── sqlResult.json
│ ├── package.json
│ ├── readme.md
│ ├── src/
│ │ ├── assets/
│ │ │ ├── font/
│ │ │ │ ├── demo.css
│ │ │ │ ├── demo_index.html
│ │ │ │ ├── iconfont.css
│ │ │ │ ├── iconfont.js
│ │ │ │ └── iconfont.json
│ │ │ └── logo/
│ │ │ └── logo.icns
│ │ ├── blocks/
│ │ │ ├── AppTitleBar/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CreateConnection/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── DatabaseTableEditor/
│ │ │ │ ├── BaseInfo/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ColumnList/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── IncludeCol/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── IndexList/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── RealTimeSQL/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── SequenceEditor/
│ │ │ │ ├── BaseInfo/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── IncludeCol/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── RealTimeSQL/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Setting/
│ │ │ │ ├── About/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── AiSetting/
│ │ │ │ │ ├── aiTypeConfig.ts
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── BaseSetting/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ProxySetting/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── UpdateDetection/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── Tree/
│ │ │ ├── functions/
│ │ │ │ ├── deleteSequence.tsx
│ │ │ │ ├── deleteTable.less
│ │ │ │ ├── deleteTable.tsx
│ │ │ │ ├── openAsyncSql.ts
│ │ │ │ ├── pinTable.ts
│ │ │ │ ├── refresh.ts
│ │ │ │ ├── viewDDL.less
│ │ │ │ └── viewDDL.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useGetRightClickMenu.ts
│ │ │ │ └── useTreeNodeFocus.ts
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ ├── treeConfig.tsx
│ │ │ └── treeStore.ts
│ │ ├── components/
│ │ │ ├── BrandLogo/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CascaderDB/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ConnectionEdit/
│ │ │ │ ├── components/
│ │ │ │ │ └── Driver/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── config/
│ │ │ │ │ ├── dataSource.ts
│ │ │ │ │ ├── enum.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ConsoleEditor/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ChatInput/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── OperationLine/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── SelectBoundInfo/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useModuleData.ts
│ │ │ │ │ └── useSaveEditorData.ts
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CreateDatabase/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CustomLayout/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── CustomSelect/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── DraggableContainer/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── EditDialog/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ExecuteSQL/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Iconfont/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ImportBlock/
│ │ │ │ └── index.tsx
│ │ │ ├── ImportConnection/
│ │ │ │ └── index.tsx
│ │ │ ├── LayoutBasic/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Loading/
│ │ │ │ ├── LazyLoading/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Loading/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── LoadingContent/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── LoadingGracile/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── LoadingLiquid/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── MenuLabel/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Modal/
│ │ │ │ ├── BaseModal/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── MonacoEditorModal/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── TriggeredModal/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── MonacoEditor/
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ ├── monacoEditorConfig.ts
│ │ │ │ ├── syntax-parser/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── lexer/
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── token.ts
│ │ │ │ │ ├── parser/
│ │ │ │ │ │ ├── chain.ts
│ │ │ │ │ │ ├── define.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── match.ts
│ │ │ │ │ │ ├── scanner.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ └── plugin/
│ │ │ │ │ ├── monaco-plugin/
│ │ │ │ │ │ ├── default-opts.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── parser.worker.ts
│ │ │ │ │ └── sql-parser/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ ├── define.ts
│ │ │ │ │ │ ├── four-operations.ts
│ │ │ │ │ │ ├── parser.ts
│ │ │ │ │ │ ├── reader.ts
│ │ │ │ │ │ ├── reserve-keys.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── mysql/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── lexer.ts
│ │ │ │ │ └── parser.ts
│ │ │ │ └── useMonacoTheme.ts
│ │ │ ├── MyNotification/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Output/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Popularize/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── RefreshLoadingButton/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ScrollLoading/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── SearchResult/
│ │ │ │ ├── components/
│ │ │ │ │ ├── OperationalDataBar/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── Pagination/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── RightClickMenu/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── ScreeningResult/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── StatusBar/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── TableBox/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── hooks/
│ │ │ │ │ ├── useCurdTableData.ts
│ │ │ │ │ ├── useMultipleSelect.ts
│ │ │ │ │ └── usePasteData.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── utils.tsx
│ │ │ ├── ShortcutKey/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── SingleFileMonacoEditor/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── StateIndicator/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Tabs/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── UploadDriver/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── ViewDDL/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── XXXX_FN/
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── constants/
│ │ │ ├── IntelliSense/
│ │ │ │ ├── index.ts
│ │ │ │ ├── mysql.ts
│ │ │ │ ├── oracle.ts
│ │ │ │ ├── pgsql.ts
│ │ │ │ ├── redis.ts
│ │ │ │ └── sqlserver.ts
│ │ │ ├── appConfig.ts
│ │ │ ├── chat.ts
│ │ │ ├── common.ts
│ │ │ ├── console.ts
│ │ │ ├── database.ts
│ │ │ ├── editTable.ts
│ │ │ ├── environment.ts
│ │ │ ├── index.ts
│ │ │ ├── table.ts
│ │ │ ├── theme.ts
│ │ │ ├── tree.ts
│ │ │ └── workspace.ts
│ │ ├── hooks/
│ │ │ ├── getConnection.ts
│ │ │ ├── index.ts
│ │ │ ├── useClickAndDoubleClick.ts
│ │ │ ├── useEventSource.ts
│ │ │ ├── useFocusData.ts
│ │ │ ├── usePollRequestService.ts
│ │ │ ├── useTheme.ts
│ │ │ └── useUpdateEffect.ts
│ │ ├── i18n/
│ │ │ ├── en-us/
│ │ │ │ ├── chat.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── connection.ts
│ │ │ │ ├── dashboard.ts
│ │ │ │ ├── editSequence.ts
│ │ │ │ ├── editTable.ts
│ │ │ │ ├── editTableData.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── login.ts
│ │ │ │ ├── menu.ts
│ │ │ │ ├── setting.ts
│ │ │ │ ├── sqlEditor.ts
│ │ │ │ ├── team.ts
│ │ │ │ └── workspace.ts
│ │ │ ├── index.tsx
│ │ │ ├── ja-jp/
│ │ │ │ ├── chat.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── connection.ts
│ │ │ │ ├── dashboard.ts
│ │ │ │ ├── editSequence.ts
│ │ │ │ ├── editTable.ts
│ │ │ │ ├── editTableData.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── login.ts
│ │ │ │ ├── menu.ts
│ │ │ │ ├── setting.ts
│ │ │ │ ├── sqlEditor.ts
│ │ │ │ ├── team.ts
│ │ │ │ └── workspace.ts
│ │ │ ├── tr-tr/
│ │ │ │ ├── chat.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── connection.ts
│ │ │ │ ├── dashboard.ts
│ │ │ │ ├── editSequence.ts
│ │ │ │ ├── editTable.ts
│ │ │ │ ├── editTableData.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── login.ts
│ │ │ │ ├── menu.ts
│ │ │ │ ├── setting.ts
│ │ │ │ ├── sqlEditor.ts
│ │ │ │ ├── team.ts
│ │ │ │ └── workspace.ts
│ │ │ └── zh-cn/
│ │ │ ├── chat.ts
│ │ │ ├── common.ts
│ │ │ ├── connection.ts
│ │ │ ├── dashboard.ts
│ │ │ ├── editSequence.ts
│ │ │ ├── editTable.ts
│ │ │ ├── editTableData.ts
│ │ │ ├── index.ts
│ │ │ ├── login.ts
│ │ │ ├── menu.ts
│ │ │ ├── setting.ts
│ │ │ ├── sqlEditor.ts
│ │ │ ├── team.ts
│ │ │ └── workspace.ts
│ │ ├── indexedDB/
│ │ │ ├── index.ts
│ │ │ └── table.ts
│ │ ├── layouts/
│ │ │ ├── GlobalLayout/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── init/
│ │ │ ├── GlobalComponent.tsx
│ │ │ ├── init.ts
│ │ │ ├── initIndexedDB.ts
│ │ │ ├── registerElectronApi.ts
│ │ │ ├── registerMessage.ts
│ │ │ └── registerNotification.ts
│ │ ├── main/
│ │ │ ├── analysis.js
│ │ │ ├── constants.js
│ │ │ ├── ga4.js
│ │ │ ├── i18n/
│ │ │ │ ├── en/
│ │ │ │ │ └── index.js
│ │ │ │ ├── index.js
│ │ │ │ └── zh-cn/
│ │ │ │ └── index.js
│ │ │ ├── index.js
│ │ │ ├── main.js
│ │ │ ├── main.js.LICENSE.txt
│ │ │ ├── menu.js
│ │ │ ├── package.json
│ │ │ ├── preload.js
│ │ │ ├── store.js
│ │ │ ├── utils.js
│ │ │ └── webpack.config.js
│ │ ├── pages/
│ │ │ ├── demo/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── document.ejs
│ │ │ ├── login/
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── main/
│ │ │ │ ├── connection/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── chart/
│ │ │ │ │ │ ├── bar/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── line/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── pie/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── chart-item/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── left-block/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── functions/
│ │ │ │ │ └── getConnection.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ ├── store/
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── main/
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── monaco/
│ │ │ │ │ └── index.ts
│ │ │ │ ├── team/
│ │ │ │ │ ├── datasource-management/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── team-management/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── universal-add-modal/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── universal-drawer/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── user-management/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── workspace/
│ │ │ │ ├── components/
│ │ │ │ │ ├── OperationLine/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── SQLExecute/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── SaveList/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── TableList/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── ViewAllTable/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── WorkspaceExtend/
│ │ │ │ │ │ ├── GlobalExtendComponents/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── WorkspaceExtendBody/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── WorkspaceExtendNav/
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── config.tsx
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── WorkspaceLeft/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── WorkspaceLeftHeader/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── WorkspaceRight/
│ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── WorkspaceTabs/
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── functions/
│ │ │ │ │ └── shortcutKeyCreateConsole.ts
│ │ │ │ ├── index.less
│ │ │ │ ├── index.tsx
│ │ │ │ └── store/
│ │ │ │ ├── common.ts
│ │ │ │ ├── config.ts
│ │ │ │ ├── console.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── modal.ts
│ │ │ └── test/
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── service/
│ │ │ ├── ai.ts
│ │ │ ├── base.ts
│ │ │ ├── config.ts
│ │ │ ├── connection.ts
│ │ │ ├── dashboard.ts
│ │ │ ├── history.ts
│ │ │ ├── misc.tsx
│ │ │ ├── outside.ts
│ │ │ ├── sql.ts
│ │ │ ├── team.ts
│ │ │ └── user.ts
│ │ ├── store/
│ │ │ ├── common/
│ │ │ │ ├── appTitleBarConfig.ts
│ │ │ │ ├── components.ts
│ │ │ │ ├── copyFocusedContent.ts
│ │ │ │ └── index.ts
│ │ │ ├── config/
│ │ │ │ └── index.ts
│ │ │ ├── monaco/
│ │ │ │ └── index.ts
│ │ │ ├── setting/
│ │ │ │ └── index.ts
│ │ │ └── user/
│ │ │ └── index.ts
│ │ ├── styles/
│ │ │ ├── antd.less
│ │ │ ├── common.less
│ │ │ ├── global.less
│ │ │ └── var.less
│ │ ├── theme/
│ │ │ ├── abandon/
│ │ │ │ ├── demo/
│ │ │ │ │ ├── dark.less
│ │ │ │ │ └── light.less
│ │ │ │ └── primaryColor.less
│ │ │ ├── background/
│ │ │ │ ├── dark.ts
│ │ │ │ ├── darkDimmed.ts
│ │ │ │ └── light.ts
│ │ │ ├── common.ts
│ │ │ ├── custom/
│ │ │ │ ├── dark.less
│ │ │ │ ├── darkDimmed.less
│ │ │ │ └── light.less
│ │ │ └── index.ts
│ │ ├── typings/
│ │ │ ├── ai.ts
│ │ │ ├── common.ts
│ │ │ ├── connection.ts
│ │ │ ├── console.ts
│ │ │ ├── dashboard.ts
│ │ │ ├── database.ts
│ │ │ ├── editSequence.ts
│ │ │ ├── editTable.ts
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── resultTable.ts
│ │ │ ├── setting.ts
│ │ │ ├── team.ts
│ │ │ ├── theme.ts
│ │ │ ├── tree.ts
│ │ │ ├── user.ts
│ │ │ └── workspace.ts
│ │ └── utils/
│ │ ├── IntelliSense/
│ │ │ ├── database.ts
│ │ │ ├── field.ts
│ │ │ ├── index.ts
│ │ │ ├── keyword.ts
│ │ │ ├── table.ts
│ │ │ └── view.ts
│ │ ├── check.ts
│ │ ├── database.ts
│ │ ├── date.ts
│ │ ├── eventSource.ts
│ │ ├── file.ts
│ │ ├── getTree.ts
│ │ ├── index.ts
│ │ ├── localStorage.ts
│ │ ├── lodash.ts
│ │ ├── sort.ts
│ │ ├── sql.ts
│ │ ├── timezone.ts
│ │ ├── url.ts
│ │ └── webpack.ts
│ ├── tsconfig.json
│ └── typings.d.ts
├── chat2db-server/
│ ├── .apifox-helper.properties
│ ├── .easy.api.config
│ ├── .gitignore
│ ├── README.md
│ ├── chat2db-plugins/
│ │ ├── chat2db-clickhouse/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── clickhouse/
│ │ │ │ ├── ClickHouseDBManage.java
│ │ │ │ ├── ClickHouseMetaData.java
│ │ │ │ ├── ClickHousePlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── ClickHouseSqlBuilder.java
│ │ │ │ ├── clickhouse.json
│ │ │ │ └── type/
│ │ │ │ ├── ClickHouseColumnTypeEnum.java
│ │ │ │ ├── ClickHouseEngineTypeEnum.java
│ │ │ │ └── ClickHouseIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-db2/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── db2/
│ │ │ │ ├── DB2DBManage.java
│ │ │ │ ├── DB2MetaData.java
│ │ │ │ ├── DB2Plugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── DB2SqlBuilder.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── SQLConstant.java
│ │ │ │ ├── db2.json
│ │ │ │ └── type/
│ │ │ │ ├── DB2ColumnTypeEnum.java
│ │ │ │ ├── DB2DefaultValueEnum.java
│ │ │ │ └── DB2IndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-dm/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── dm/
│ │ │ │ ├── DMDBManage.java
│ │ │ │ ├── DMMetaData.java
│ │ │ │ ├── DMPlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── DMSqlBuilder.java
│ │ │ │ ├── dm.json
│ │ │ │ └── type/
│ │ │ │ ├── DMColumnTypeEnum.java
│ │ │ │ ├── DMDefaultValueEnum.java
│ │ │ │ └── DMIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-h2/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── h2/
│ │ │ │ ├── H2DBManage.java
│ │ │ │ ├── H2Meta.java
│ │ │ │ ├── H2Plugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── H2SqlBuilder.java
│ │ │ │ └── h2.json
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-hive/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── hive/
│ │ │ │ ├── HiveCommandExecutor.java
│ │ │ │ ├── HiveDBManage.java
│ │ │ │ ├── HiveMetaData.java
│ │ │ │ ├── HivePlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── HiveSqlBuilder.java
│ │ │ │ ├── hive.json
│ │ │ │ └── type/
│ │ │ │ ├── HiveColumnTypeEnum.java
│ │ │ │ └── HiveIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-kingbase/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── kingbase/
│ │ │ │ ├── KingBaseDBManage.java
│ │ │ │ ├── KingBaseMetaData.java
│ │ │ │ ├── KingBasePlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── KingBaseSqlBuilder.java
│ │ │ │ ├── kingbase.json
│ │ │ │ └── type/
│ │ │ │ ├── KingBaseColumnTypeEnum.java
│ │ │ │ ├── KingBaseDefaultValueEnum.java
│ │ │ │ └── KingBaseIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-mariadb/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── mariadb/
│ │ │ │ ├── MariaDBManage.java
│ │ │ │ ├── MariaDBMetaData.java
│ │ │ │ ├── MariaDBPlugin.java
│ │ │ │ ├── mariadb.json
│ │ │ │ └── value/
│ │ │ │ ├── MariaDBValueProcessor.java
│ │ │ │ ├── factory/
│ │ │ │ │ └── MariaDBValueProcessorFactory.java
│ │ │ │ └── sub/
│ │ │ │ ├── MariaDBBitProcessor.java
│ │ │ │ ├── MariaDBGeometryProcessor.java
│ │ │ │ ├── MariaDBTimestampProcessor.java
│ │ │ │ └── MariaDBYearProcessor.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-mongodb/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── mongodb/
│ │ │ │ ├── MongodbCommandExecutor.java
│ │ │ │ ├── MongodbManage.java
│ │ │ │ ├── MongodbMetaData.java
│ │ │ │ ├── MongodbPlugin.java
│ │ │ │ └── mongodb.json
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-mysql/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── mysql/
│ │ │ │ ├── MysqlDBManage.java
│ │ │ │ ├── MysqlMetaData.java
│ │ │ │ ├── MysqlPlugin.java
│ │ │ │ ├── MysqlValueHandler.java
│ │ │ │ ├── builder/
│ │ │ │ │ ├── MysqlSqlBuilder.java
│ │ │ │ │ └── form.json
│ │ │ │ ├── mysql.json
│ │ │ │ ├── type/
│ │ │ │ │ ├── MysqlCharsetEnum.java
│ │ │ │ │ ├── MysqlCollationEnum.java
│ │ │ │ │ ├── MysqlColumnTypeEnum.java
│ │ │ │ │ ├── MysqlDefaultValueEnum.java
│ │ │ │ │ └── MysqlIndexTypeEnum.java
│ │ │ │ └── value/
│ │ │ │ ├── GeometryValueHandler.java
│ │ │ │ ├── MysqlValueProcessor.java
│ │ │ │ ├── factory/
│ │ │ │ │ └── MysqlValueProcessorFactory.java
│ │ │ │ ├── sub/
│ │ │ │ │ ├── MysqlBinaryProcessor.java
│ │ │ │ │ ├── MysqlBitProcessor.java
│ │ │ │ │ ├── MysqlDecimalProcessor.java
│ │ │ │ │ ├── MysqlGeometryProcessor.java
│ │ │ │ │ ├── MysqlTextProcessor.java
│ │ │ │ │ ├── MysqlTimestampProcessor.java
│ │ │ │ │ ├── MysqlVarBinaryProcessor.java
│ │ │ │ │ └── MysqlYearProcessor.java
│ │ │ │ └── template/
│ │ │ │ └── MysqlDmlValueTemplate.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-oceanbase/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── oceanbase/
│ │ │ │ ├── OceanBaseDBManage.java
│ │ │ │ ├── OceanBaseMetaData.java
│ │ │ │ ├── OceanBasePlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── OceanBaseSqlBuilder.java
│ │ │ │ ├── oceanbase.json
│ │ │ │ └── type/
│ │ │ │ ├── OceanBaseColumnTypeEnum.java
│ │ │ │ └── OceanBaseIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-oracle/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── oracle/
│ │ │ │ ├── OracleDBManage.java
│ │ │ │ ├── OracleMetaData.java
│ │ │ │ ├── OraclePlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── OracleSqlBuilder.java
│ │ │ │ ├── oracle.json
│ │ │ │ ├── type/
│ │ │ │ │ ├── OracleColumnTypeEnum.java
│ │ │ │ │ ├── OracleDefaultValueEnum.java
│ │ │ │ │ └── OracleIndexTypeEnum.java
│ │ │ │ └── value/
│ │ │ │ ├── OracleValueProcessor.java
│ │ │ │ ├── factory/
│ │ │ │ │ └── OracleValueProcessorFactory.java
│ │ │ │ ├── sub/
│ │ │ │ │ ├── OracleAnyDataProcessor.java
│ │ │ │ │ ├── OracleBlobProcessor.java
│ │ │ │ │ ├── OracleClobProcessor.java
│ │ │ │ │ ├── OracleDateProcessor.java
│ │ │ │ │ ├── OracleIntervalDSProcessor.java
│ │ │ │ │ ├── OracleIntervalYMProcessor.java
│ │ │ │ │ ├── OracleLongRawProcessor.java
│ │ │ │ │ ├── OracleNumberProcessor.java
│ │ │ │ │ ├── OracleRawValueProcessor.java
│ │ │ │ │ ├── OracleTimeStampLTZProcessor.java
│ │ │ │ │ ├── OracleTimeStampProcessor.java
│ │ │ │ │ ├── OracleTimeStampTZProcessor.java
│ │ │ │ │ └── OracleXmlValueProcessor.java
│ │ │ │ └── template/
│ │ │ │ └── OracleDmlValueTemplate.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-postgresql/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── postgresql/
│ │ │ │ ├── PostgreSQLDBManage.java
│ │ │ │ ├── PostgreSQLMetaData.java
│ │ │ │ ├── PostgreSQLPlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── PostgreSQLSqlBuilder.java
│ │ │ │ ├── consts/
│ │ │ │ │ ├── SQLConst.java
│ │ │ │ │ └── SequenceCommonConst.java
│ │ │ │ ├── pg.json
│ │ │ │ └── type/
│ │ │ │ ├── PostgreSQLCharsetEnum.java
│ │ │ │ ├── PostgreSQLCollationEnum.java
│ │ │ │ ├── PostgreSQLColumnTypeEnum.java
│ │ │ │ ├── PostgreSQLDefaultValueEnum.java
│ │ │ │ └── PostgreSQLIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-presto/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── presto/
│ │ │ │ ├── PrestoDBManage.java
│ │ │ │ ├── PrestoMetaData.java
│ │ │ │ ├── PrestoPlugin.java
│ │ │ │ └── presto.json
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-sqlite/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── sqlite/
│ │ │ │ ├── SqliteDBManage.java
│ │ │ │ ├── SqliteMetaData.java
│ │ │ │ ├── SqlitePlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── SqliteBuilder.java
│ │ │ │ ├── sqlite.json
│ │ │ │ └── type/
│ │ │ │ ├── SqliteCharsetEnum.java
│ │ │ │ ├── SqliteCollationEnum.java
│ │ │ │ ├── SqliteColumnTypeEnum.java
│ │ │ │ ├── SqliteDefaultValueEnum.java
│ │ │ │ └── SqliteIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-sqlserver/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── sqlserver/
│ │ │ │ ├── SqlServerCommandExecutor.java
│ │ │ │ ├── SqlServerDBManage.java
│ │ │ │ ├── SqlServerMetaData.java
│ │ │ │ ├── SqlServerPlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── SqlServerSqlBuilder.java
│ │ │ │ ├── sqlserver.json
│ │ │ │ └── type/
│ │ │ │ ├── SqlServerColumnTypeEnum.java
│ │ │ │ ├── SqlServerDefaultValueEnum.java
│ │ │ │ └── SqlServerIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ ├── chat2db-timeplus/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── plugin/
│ │ │ │ └── timeplus/
│ │ │ │ ├── TimeplusDBManage.java
│ │ │ │ ├── TimeplusMetaData.java
│ │ │ │ ├── TimeplusPlugin.java
│ │ │ │ ├── builder/
│ │ │ │ │ └── TimeplusSqlBuilder.java
│ │ │ │ ├── timeplus.json
│ │ │ │ └── type/
│ │ │ │ ├── TimeplusColumnTypeEnum.java
│ │ │ │ ├── TimeplusEngineTypeEnum.java
│ │ │ │ └── TimeplusIndexTypeEnum.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── services/
│ │ │ └── ai.chat2db.spi.Plugin
│ │ └── pom.xml
│ ├── chat2db-server-domain/
│ │ ├── README.md
│ │ ├── chat2db-server-domain-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── domain/
│ │ │ └── api/
│ │ │ ├── chart/
│ │ │ │ ├── ChartCreateParam.java
│ │ │ │ ├── ChartListQueryParam.java
│ │ │ │ ├── ChartPageQueryParam.java
│ │ │ │ ├── ChartQueryParam.java
│ │ │ │ └── ChartUpdateParam.java
│ │ │ ├── enums/
│ │ │ │ ├── AccessObjectTypeEnum.java
│ │ │ │ ├── AiSqlSourceEnum.java
│ │ │ │ ├── DataSourceKindEnum.java
│ │ │ │ ├── DeletedTypeEnum.java
│ │ │ │ ├── EnvironmentEnum.java
│ │ │ │ ├── ExportFileSuffix.java
│ │ │ │ ├── ExportSizeEnum.java
│ │ │ │ ├── ExportTypeEnum.java
│ │ │ │ ├── OperationStatusEnum.java
│ │ │ │ ├── RoleCodeEnum.java
│ │ │ │ ├── TableVectorEnum.java
│ │ │ │ ├── TaskStatusEnum.java
│ │ │ │ ├── TaskTypeEnum.java
│ │ │ │ └── ValidStatusEnum.java
│ │ │ ├── model/
│ │ │ │ ├── AIConfig.java
│ │ │ │ ├── Chart.java
│ │ │ │ ├── ChatGptConfig.java
│ │ │ │ ├── Config.java
│ │ │ │ ├── Dashboard.java
│ │ │ │ ├── DataSource.java
│ │ │ │ ├── DataSourceAccess.java
│ │ │ │ ├── DataSourceAccessObject.java
│ │ │ │ ├── Environment.java
│ │ │ │ ├── IndexInfo.java
│ │ │ │ ├── Operation.java
│ │ │ │ ├── OperationLog.java
│ │ │ │ ├── TableParameter.java
│ │ │ │ ├── Task.java
│ │ │ │ ├── Team.java
│ │ │ │ ├── TeamUser.java
│ │ │ │ └── User.java
│ │ │ ├── param/
│ │ │ │ ├── ConsoleCloseParam.java
│ │ │ │ ├── ConsoleConnectParam.java
│ │ │ │ ├── ConsoleCreateParam.java
│ │ │ │ ├── DlCountParam.java
│ │ │ │ ├── DlExecuteParam.java
│ │ │ │ ├── DmlSqlCopyParam.java
│ │ │ │ ├── DropParam.java
│ │ │ │ ├── EnvironmentPageQueryParam.java
│ │ │ │ ├── GroupByParam.java
│ │ │ │ ├── MetaDataQueryParam.java
│ │ │ │ ├── OrderByParam.java
│ │ │ │ ├── PinTableParam.java
│ │ │ │ ├── SchemaOperationParam.java
│ │ │ │ ├── SchemaQueryParam.java
│ │ │ │ ├── SelectResultOperation.java
│ │ │ │ ├── SequencePageQueryParam.java
│ │ │ │ ├── SequenceQueryParam.java
│ │ │ │ ├── ShowCreateSequenceParam.java
│ │ │ │ ├── ShowCreateTableParam.java
│ │ │ │ ├── SqlAnalyseParam.java
│ │ │ │ ├── SystemConfigParam.java
│ │ │ │ ├── TablePageQueryParam.java
│ │ │ │ ├── TableQueryParam.java
│ │ │ │ ├── TableSelector.java
│ │ │ │ ├── TableVectorParam.java
│ │ │ │ ├── TaskCreateParam.java
│ │ │ │ ├── TaskPageParam.java
│ │ │ │ ├── TaskUpdateParam.java
│ │ │ │ ├── TypeQueryParam.java
│ │ │ │ ├── UpdateSelectResultParam.java
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── DashboardCreateParam.java
│ │ │ │ │ ├── DashboardPageQueryParam.java
│ │ │ │ │ ├── DashboardQueryParam.java
│ │ │ │ │ ├── DashboardSelector.java
│ │ │ │ │ └── DashboardUpdateParam.java
│ │ │ │ ├── datasource/
│ │ │ │ │ ├── DataSourceCloseParam.java
│ │ │ │ │ ├── DataSourceCreateParam.java
│ │ │ │ │ ├── DataSourcePageQueryParam.java
│ │ │ │ │ ├── DataSourcePreConnectParam.java
│ │ │ │ │ ├── DataSourceSelector.java
│ │ │ │ │ ├── DataSourceTestParam.java
│ │ │ │ │ ├── DataSourceUpdateParam.java
│ │ │ │ │ ├── DatabaseCreateParam.java
│ │ │ │ │ ├── DatabaseExportDataParam.java
│ │ │ │ │ ├── DatabaseExportParam.java
│ │ │ │ │ ├── DatabaseQueryAllParam.java
│ │ │ │ │ └── access/
│ │ │ │ │ ├── DataSourceAccessBatchCreatParam.java
│ │ │ │ │ ├── DataSourceAccessComprehensivePageQueryParam.java
│ │ │ │ │ ├── DataSourceAccessCreatParam.java
│ │ │ │ │ ├── DataSourceAccessObjectParam.java
│ │ │ │ │ ├── DataSourceAccessPageQueryParam.java
│ │ │ │ │ └── DataSourceAccessSelector.java
│ │ │ │ ├── message/
│ │ │ │ │ └── MessageCreateParam.java
│ │ │ │ ├── operation/
│ │ │ │ │ ├── OperationLogCreateParam.java
│ │ │ │ │ ├── OperationLogPageQueryParam.java
│ │ │ │ │ ├── OperationPageQueryParam.java
│ │ │ │ │ ├── OperationQueryParam.java
│ │ │ │ │ ├── OperationSavedParam.java
│ │ │ │ │ └── OperationUpdateParam.java
│ │ │ │ ├── team/
│ │ │ │ │ ├── TeamCreateParam.java
│ │ │ │ │ ├── TeamPageQueryParam.java
│ │ │ │ │ ├── TeamSelector.java
│ │ │ │ │ ├── TeamUpdateParam.java
│ │ │ │ │ └── user/
│ │ │ │ │ ├── TeamUserComprehensivePageQueryParam.java
│ │ │ │ │ ├── TeamUserCreatParam.java
│ │ │ │ │ ├── TeamUserPageQueryParam.java
│ │ │ │ │ └── TeamUserSelector.java
│ │ │ │ └── user/
│ │ │ │ ├── UserCreateParam.java
│ │ │ │ ├── UserPageQueryParam.java
│ │ │ │ ├── UserSelector.java
│ │ │ │ └── UserUpdateParam.java
│ │ │ └── service/
│ │ │ ├── ChartService.java
│ │ │ ├── ConfigService.java
│ │ │ ├── ConsoleService.java
│ │ │ ├── DashboardService.java
│ │ │ ├── DataSourceAccessBusinessService.java
│ │ │ ├── DataSourceAccessService.java
│ │ │ ├── DataSourceService.java
│ │ │ ├── DatabaseService.java
│ │ │ ├── DlTemplateService.java
│ │ │ ├── EnvironmentService.java
│ │ │ ├── FunctionService.java
│ │ │ ├── JdbcDriverService.java
│ │ │ ├── OperationLogService.java
│ │ │ ├── OperationService.java
│ │ │ ├── PinService.java
│ │ │ ├── ProcedureService.java
│ │ │ ├── SequenceService.java
│ │ │ ├── TableService.java
│ │ │ ├── TaskService.java
│ │ │ ├── TeamService.java
│ │ │ ├── TeamUserService.java
│ │ │ ├── TriggerService.java
│ │ │ ├── UserService.java
│ │ │ ├── ViewService.java
│ │ │ └── WebhookSender.java
│ │ ├── chat2db-server-domain-core/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── domain/
│ │ │ └── core/
│ │ │ ├── cache/
│ │ │ │ ├── CacheKey.java
│ │ │ │ ├── CacheManage.java
│ │ │ │ └── MemoryCacheManage.java
│ │ │ ├── converter/
│ │ │ │ ├── ChartConverter.java
│ │ │ │ ├── CommandConverter.java
│ │ │ │ ├── ConfigConverter.java
│ │ │ │ ├── DashboardConverter.java
│ │ │ │ ├── DataSourceAccessConverter.java
│ │ │ │ ├── DataSourceConverter.java
│ │ │ │ ├── DriverConfigConverter.java
│ │ │ │ ├── EnvironmentConverter.java
│ │ │ │ ├── OperationConverter.java
│ │ │ │ ├── OperationLogConverter.java
│ │ │ │ ├── PinTableConverter.java
│ │ │ │ ├── TableConverter.java
│ │ │ │ ├── TaskConverter.java
│ │ │ │ ├── TeamConverter.java
│ │ │ │ ├── TeamUserConverter.java
│ │ │ │ └── UserConverter.java
│ │ │ ├── enums/
│ │ │ │ └── ExternalNotificationTypeEnum.java
│ │ │ ├── impl/
│ │ │ │ ├── ChartServiceImpl.java
│ │ │ │ ├── ConfigServiceImpl.java
│ │ │ │ ├── ConsoleServiceImpl.java
│ │ │ │ ├── DashboardServiceImpl.java
│ │ │ │ ├── DataSourceAccessBusinessServiceImpl.java
│ │ │ │ ├── DataSourceAccessServiceImpl.java
│ │ │ │ ├── DataSourceServiceImpl.java
│ │ │ │ ├── DatabaseServiceImpl.java
│ │ │ │ ├── DlTemplateServiceImpl.java
│ │ │ │ ├── EnvironmentServiceImpl.java
│ │ │ │ ├── FunctionServiceImpl.java
│ │ │ │ ├── JdbcDriverServiceImpl.java
│ │ │ │ ├── OperationLogServiceImpl.java
│ │ │ │ ├── OperationServiceImpl.java
│ │ │ │ ├── PinServiceImpl.java
│ │ │ │ ├── ProcedureServiceImpl.java
│ │ │ │ ├── SequenceServiceImpl.java
│ │ │ │ ├── TableServiceImpl.java
│ │ │ │ ├── TaskServiceImpl.java
│ │ │ │ ├── TeamServiceImpl.java
│ │ │ │ ├── TeamUserServiceImpl.java
│ │ │ │ ├── TriggerServiceImpl.java
│ │ │ │ ├── UserServiceImpl.java
│ │ │ │ └── ViewServiceImpl.java
│ │ │ ├── notification/
│ │ │ │ ├── BaseWebhookSender.java
│ │ │ │ ├── DingTalkWebhookSender.java
│ │ │ │ ├── LarkWebhookSender.java
│ │ │ │ └── WeComWebhookSender.java
│ │ │ └── util/
│ │ │ ├── DesUtil.java
│ │ │ ├── H2Functions.java
│ │ │ ├── H2Triggers.java
│ │ │ ├── MetaNameUtils.java
│ │ │ └── PermissionUtils.java
│ │ ├── chat2db-server-domain-repository/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── server/
│ │ │ │ └── domain/
│ │ │ │ └── repository/
│ │ │ │ ├── Dbutils.java
│ │ │ │ ├── MapperUtils.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── ChartDO.java
│ │ │ │ │ ├── DashboardChartRelationDO.java
│ │ │ │ │ ├── DashboardDO.java
│ │ │ │ │ ├── DataSourceAccessDO.java
│ │ │ │ │ ├── DataSourceDO.java
│ │ │ │ │ ├── DbhubUserDO.java
│ │ │ │ │ ├── EnvironmentDO.java
│ │ │ │ │ ├── JdbcDriverDO.java
│ │ │ │ │ ├── OperationLogDO.java
│ │ │ │ │ ├── OperationSavedDO.java
│ │ │ │ │ ├── PinTableDO.java
│ │ │ │ │ ├── SystemConfigDO.java
│ │ │ │ │ ├── TableCacheDO.java
│ │ │ │ │ ├── TableCacheVersionDO.java
│ │ │ │ │ ├── TableVectorMappingDO.java
│ │ │ │ │ ├── TaskDO.java
│ │ │ │ │ ├── TeamDO.java
│ │ │ │ │ └── TeamUserDO.java
│ │ │ │ └── mapper/
│ │ │ │ ├── ChartMapper.java
│ │ │ │ ├── DashboardChartRelationMapper.java
│ │ │ │ ├── DashboardMapper.java
│ │ │ │ ├── DataSourceAccessCustomMapper.java
│ │ │ │ ├── DataSourceAccessMapper.java
│ │ │ │ ├── DataSourceCustomMapper.java
│ │ │ │ ├── DataSourceMapper.java
│ │ │ │ ├── DbhubUserMapper.java
│ │ │ │ ├── EnvironmentMapper.java
│ │ │ │ ├── JdbcDriverMapper.java
│ │ │ │ ├── OperationLogMapper.java
│ │ │ │ ├── OperationSavedMapper.java
│ │ │ │ ├── PinTableMapper.java
│ │ │ │ ├── SystemConfigMapper.java
│ │ │ │ ├── TableCacheMapper.java
│ │ │ │ ├── TableCacheVersionMapper.java
│ │ │ │ ├── TableVectorMappingMapper.java
│ │ │ │ ├── TaskMapper.java
│ │ │ │ ├── TeamMapper.java
│ │ │ │ ├── TeamUserCustomMapper.java
│ │ │ │ └── TeamUserMapper.java
│ │ │ └── resources/
│ │ │ ├── db/
│ │ │ │ ├── migration/
│ │ │ │ │ ├── V1_0_0__初始化信息.sql
│ │ │ │ │ ├── V1_0_2__修改Console.sql
│ │ │ │ │ ├── V1_0_3__增加SSH.sql
│ │ │ │ │ ├── V1_0_4__增加报表.sql
│ │ │ │ │ ├── V1_0_5__增加置顶表.sql
│ │ │ │ │ ├── V1_0_6__初始化demo信息.sql
│ │ │ │ │ ├── V1_0_7__自定义驱动.sql
│ │ │ │ │ ├── V1_0_8__操作保存类型.sql
│ │ │ │ │ ├── V2_1_0__支持环境、用户权限.sql
│ │ │ │ │ ├── V2_1_10__REMOVEdEMO.sql
│ │ │ │ │ ├── V2_1_1__TableCache.sql
│ │ │ │ │ ├── V2_1_2__OPERATION.sql
│ │ │ │ │ ├── V2_1_4__OPERATION.sql
│ │ │ │ │ ├── V2_1_5__TableVector.sql
│ │ │ │ │ ├── V2_1_6__TableVectorUpdate.sql
│ │ │ │ │ ├── V2_1_7__DATASOURCE.sql
│ │ │ │ │ ├── V2_1_8__Chart.sql
│ │ │ │ │ └── V2_1_9__task.sql
│ │ │ │ └── temp/
│ │ │ │ └── V2_1_0__补充.sql
│ │ │ └── mapper/
│ │ │ ├── ChartMapper.xml
│ │ │ ├── DashboardChartRelationMapper.xml
│ │ │ ├── DashboardMapper.xml
│ │ │ ├── DataSourceAccessCustomMapper.xml
│ │ │ ├── DataSourceAccessMapper.xml
│ │ │ ├── DataSourceCustomMapper.xml
│ │ │ ├── DataSourceMapper.xml
│ │ │ ├── DbhubUserMapper.xml
│ │ │ ├── EnvironmentMapper.xml
│ │ │ ├── JdbcDriverMapper.xml
│ │ │ ├── OperationLogMapper.xml
│ │ │ ├── OperationSavedMapper.xml
│ │ │ ├── PinTableMapper.xml
│ │ │ ├── SystemConfigMapper.xml
│ │ │ ├── TableCacheMapper.xml
│ │ │ ├── TableCacheVersionMapper.xml
│ │ │ ├── TableVectorMappingMapper.xml
│ │ │ ├── TaskMapper.xml
│ │ │ ├── TeamMapper.xml
│ │ │ ├── TeamUserCustomMapper.xml
│ │ │ └── TeamUserMapper.xml
│ │ └── pom.xml
│ ├── chat2db-server-start/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── server/
│ │ │ │ └── start/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── AsyncContextRefreshedListener.java
│ │ │ │ │ │ ├── Chat2dbForestConfiguration.java
│ │ │ │ │ │ ├── Chat2dbWebMvcConfigurer.java
│ │ │ │ │ │ ├── JarDownloadTask.java
│ │ │ │ │ │ └── WebLogConfiguration.java
│ │ │ │ │ ├── i18n/
│ │ │ │ │ │ └── I18nConfig.java
│ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ └── CorsFilter.java
│ │ │ │ │ ├── listener/
│ │ │ │ │ │ ├── DbhubTomcatConnectorCustomizer.java
│ │ │ │ │ │ ├── FailedEventApplicationListener.java
│ │ │ │ │ │ ├── ManageApplicationListener.java
│ │ │ │ │ │ └── manage/
│ │ │ │ │ │ ├── ManageMessage.java
│ │ │ │ │ │ └── MessageTypeEnum.java
│ │ │ │ │ └── mybatis/
│ │ │ │ │ └── MyBatisPlusConfig.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── oauth/
│ │ │ │ │ │ ├── OauthController.java
│ │ │ │ │ │ └── request/
│ │ │ │ │ │ └── LoginRequest.java
│ │ │ │ │ └── thymeleaf/
│ │ │ │ │ └── ThymeleafController.java
│ │ │ │ ├── exception/
│ │ │ │ │ ├── EasyControllerExceptionHandler.java
│ │ │ │ │ └── convertor/
│ │ │ │ │ ├── BindExceptionConvertor.java
│ │ │ │ │ ├── BusinessExceptionConvertor.java
│ │ │ │ │ ├── DefaultExceptionConvertor.java
│ │ │ │ │ ├── ExceptionConvertor.java
│ │ │ │ │ ├── ExceptionConvertorUtils.java
│ │ │ │ │ ├── MaxUploadSizeExceededExceptionConvertor.java
│ │ │ │ │ ├── MethodArgumentNotValidExceptionConvertor.java
│ │ │ │ │ ├── MethodArgumentTypeMismatchExceptionConvertor.java
│ │ │ │ │ └── ParamExceptionConvertor.java
│ │ │ │ └── log/
│ │ │ │ ├── EasyLogSink.java
│ │ │ │ ├── LogOncePerRequestFilter.java
│ │ │ │ └── WebLog.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── spring.factories
│ │ │ ├── application-dev.yml
│ │ │ ├── application-release.yml
│ │ │ ├── application-test.yml
│ │ │ ├── application.yml
│ │ │ ├── i18n/
│ │ │ │ ├── messages.properties
│ │ │ │ ├── messages_en_US.properties
│ │ │ │ └── messages_zh_CN.properties
│ │ │ ├── logback-spring.xml
│ │ │ └── thymeleaf/
│ │ │ └── template.html
│ │ └── test/
│ │ ├── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── start/
│ │ │ └── test/
│ │ │ ├── TestApplication.java
│ │ │ ├── common/
│ │ │ │ └── BaseTest.java
│ │ │ ├── core/
│ │ │ │ ├── ChartServiceTest.java
│ │ │ │ ├── ConfigServiceTest.java
│ │ │ │ ├── ConsoleServiceTest.java
│ │ │ │ ├── DashboardServiceTest.java
│ │ │ │ ├── DataSourceAccessBusinessServiceTest.java
│ │ │ │ ├── DataSourceAccessServiceTest.java
│ │ │ │ ├── DataSourceServiceTest.java
│ │ │ │ ├── DatabaseServiceTest.java
│ │ │ │ ├── DlTemplateServiceTest.java
│ │ │ │ ├── EnvironmentServiceTest.java
│ │ │ │ ├── FunctionServiceTest.java
│ │ │ │ ├── JdbcDriverServiceTest.java
│ │ │ │ ├── OperationLogServiceTest.java
│ │ │ │ ├── OperationServiceTest.java
│ │ │ │ ├── PinServiceTest.java
│ │ │ │ ├── ProcedureServiceTest.java
│ │ │ │ ├── TableServiceTest.java
│ │ │ │ ├── TaskServiceTest.java
│ │ │ │ ├── TeamServiceTest.java
│ │ │ │ ├── TeamUserServiceTest.java
│ │ │ │ ├── TriggerServiceTest.java
│ │ │ │ ├── UserServiceTest.java
│ │ │ │ ├── ViewServiceTest.java
│ │ │ │ └── WebhookServiceTest.java
│ │ │ ├── dialect/
│ │ │ │ ├── DialectProperties.java
│ │ │ │ ├── MariadbDialectProperties.java
│ │ │ │ ├── MongodbDialectProperties.java
│ │ │ │ ├── MysqlDialectProperties.java
│ │ │ │ ├── OracleDialectProperties.java
│ │ │ │ ├── PostgresqlDialectProperties.java
│ │ │ │ └── TestUtils.java
│ │ │ ├── druid/
│ │ │ │ ├── SerializationUtilsTest.java
│ │ │ │ ├── SqlUtilsTest.java
│ │ │ │ └── SqlUtilsTest2.java
│ │ │ ├── dto/
│ │ │ │ └── TestDTO.java
│ │ │ ├── mybatis/
│ │ │ │ └── MybatisGeneratorTest.java
│ │ │ └── sql/
│ │ │ └── DbhubJdbcTemplateTest.java
│ │ └── resources/
│ │ └── logback-test-spring.xml
│ ├── chat2db-server-test/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── test/
│ │ ├── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── test/
│ │ │ ├── common/
│ │ │ │ └── BaseTest.java
│ │ │ ├── domain/
│ │ │ │ └── data/
│ │ │ │ ├── service/
│ │ │ │ │ ├── ConfigServiceTest.java
│ │ │ │ │ ├── ConsoleOperationsTest.java
│ │ │ │ │ ├── DatabaseOperationsTest.java
│ │ │ │ │ ├── ExampleOperationsTest.java
│ │ │ │ │ ├── JdbcOperationsTest.java
│ │ │ │ │ ├── SQLExecutorOperationsTest.java
│ │ │ │ │ ├── TableOperationsTest.java
│ │ │ │ │ └── dialect/
│ │ │ │ │ ├── ClickHouseDialectProperties.java
│ │ │ │ │ ├── DialectProperties.java
│ │ │ │ │ ├── H2DialectProperties.java
│ │ │ │ │ ├── MysqlDialectProperties.java
│ │ │ │ │ ├── OracleDialectProperties.java
│ │ │ │ │ ├── PostgresqlDialectProperties.java
│ │ │ │ │ ├── SQLITEDialectProperties.java
│ │ │ │ │ └── SQLServerDialectProperties.java
│ │ │ │ └── utils/
│ │ │ │ └── TestUtils.java
│ │ │ └── temp/
│ │ │ ├── HttpTest.java
│ │ │ ├── SQLParseTest.java
│ │ │ ├── SqlTest.java
│ │ │ ├── TempTest.java
│ │ │ └── UserTest.java
│ │ └── resources/
│ │ ├── h2/
│ │ │ ├── init.sql
│ │ │ ├── init_close.sql
│ │ │ └── init_transaction.sql
│ │ └── logback-test-spring.xml
│ ├── chat2db-server-tools/
│ │ ├── chat2db-server-tools-base/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── tools/
│ │ │ └── base/
│ │ │ ├── constant/
│ │ │ │ ├── EasyToolsConstant.java
│ │ │ │ └── SymbolConstant.java
│ │ │ ├── enums/
│ │ │ │ ├── BaseEnum.java
│ │ │ │ ├── DataSourceTypeEnum.java
│ │ │ │ ├── DeletedIdEnum.java
│ │ │ │ ├── OperationEnum.java
│ │ │ │ ├── OrderByDirectionEnum.java
│ │ │ │ ├── StatusEnum.java
│ │ │ │ ├── SystemEnvironmentEnum.java
│ │ │ │ ├── WhiteListTypeEnum.java
│ │ │ │ └── YesOrNoEnum.java
│ │ │ ├── excption/
│ │ │ │ ├── BusinessException.java
│ │ │ │ └── SystemException.java
│ │ │ ├── handler/
│ │ │ │ └── EasyCallBackHandler.java
│ │ │ └── wrapper/
│ │ │ ├── Result.java
│ │ │ ├── Traceable.java
│ │ │ ├── param/
│ │ │ │ ├── OrderBy.java
│ │ │ │ ├── OrderCondition.java
│ │ │ │ ├── PageQueryParam.java
│ │ │ │ └── QueryParam.java
│ │ │ ├── request/
│ │ │ │ └── PageQueryRequest.java
│ │ │ └── result/
│ │ │ ├── ActionResult.java
│ │ │ ├── DataResult.java
│ │ │ ├── ListResult.java
│ │ │ ├── PageResult.java
│ │ │ └── web/
│ │ │ └── WebPageResult.java
│ │ ├── chat2db-server-tools-common/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── tools/
│ │ │ └── common/
│ │ │ ├── config/
│ │ │ │ ├── Chat2dbProperties.java
│ │ │ │ └── GlobalDict.java
│ │ │ ├── enums/
│ │ │ │ └── ModeEnum.java
│ │ │ ├── exception/
│ │ │ │ ├── ConnectionException.java
│ │ │ │ ├── DataAlreadyExistsBusinessException.java
│ │ │ │ ├── DataNotFoundException.java
│ │ │ │ ├── NeedLoggedInBusinessException.java
│ │ │ │ ├── ParamBusinessException.java
│ │ │ │ ├── PermissionDeniedBusinessException.java
│ │ │ │ └── RedirectBusinessException.java
│ │ │ ├── model/
│ │ │ │ ├── ConfigJson.java
│ │ │ │ ├── Context.java
│ │ │ │ ├── EasyLambdaQueryWrapper.java
│ │ │ │ ├── IntegerWrapper.java
│ │ │ │ └── LoginUser.java
│ │ │ └── util/
│ │ │ ├── ConfigUtils.java
│ │ │ ├── ContextUtils.java
│ │ │ ├── EasyBooleanUtils.java
│ │ │ ├── EasyCollectionUtils.java
│ │ │ ├── EasyEnumUtils.java
│ │ │ ├── EasyIntegerUtils.java
│ │ │ ├── EasyOptionalUtils.java
│ │ │ ├── EasySqlUtils.java
│ │ │ ├── EasyStringUtils.java
│ │ │ ├── I18nUtils.java
│ │ │ └── LogUtils.java
│ │ └── pom.xml
│ ├── chat2db-server-web/
│ │ ├── chat2db-server-admin-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── admin/
│ │ │ └── api/
│ │ │ └── controller/
│ │ │ ├── common/
│ │ │ │ ├── CommonAdminController.java
│ │ │ │ ├── converter/
│ │ │ │ │ └── CommonAdminConverter.java
│ │ │ │ ├── request/
│ │ │ │ │ └── TeamUserPageQueryRequest.java
│ │ │ │ └── vo/
│ │ │ │ └── TeamUserListVO.java
│ │ │ ├── datasource/
│ │ │ │ ├── DataSourceAccessAdminController.java
│ │ │ │ ├── DataSourceAdminController.java
│ │ │ │ ├── converter/
│ │ │ │ │ ├── DataSourceAccessAdminConverter.java
│ │ │ │ │ └── DataSourceAdminConverter.java
│ │ │ │ ├── request/
│ │ │ │ │ ├── DataSourceAccessBatchCreateRequest.java
│ │ │ │ │ ├── DataSourceAccessObjectRequest.java
│ │ │ │ │ ├── DataSourceAccessPageQueryRequest.java
│ │ │ │ │ ├── DataSourceCloneRequest.java
│ │ │ │ │ ├── DataSourceCreateRequest.java
│ │ │ │ │ └── DataSourceUpdateRequest.java
│ │ │ │ └── vo/
│ │ │ │ ├── DataSourceAccessObjectVO.java
│ │ │ │ ├── DataSourceAccessPageQueryVO.java
│ │ │ │ ├── DataSourcePageQueryVO.java
│ │ │ │ └── SimpleDataSourceVO.java
│ │ │ ├── team/
│ │ │ │ ├── TeamAdminController.java
│ │ │ │ ├── TeamDataSourceAdminController.java
│ │ │ │ ├── TeamUserAdminController.java
│ │ │ │ ├── converter/
│ │ │ │ │ ├── TeamAdminConverter.java
│ │ │ │ │ ├── TeamDataSourcesAdminConverter.java
│ │ │ │ │ └── TeamUserAdminConverter.java
│ │ │ │ ├── request/
│ │ │ │ │ ├── TeamCreateRequest.java
│ │ │ │ │ ├── TeamDataSourceBatchCreateRequest.java
│ │ │ │ │ ├── TeamPageCommonQueryRequest.java
│ │ │ │ │ ├── TeamUpdateRequest.java
│ │ │ │ │ └── TeamUserBatchCreateRequest.java
│ │ │ │ └── vo/
│ │ │ │ ├── SimpleTeamVO.java
│ │ │ │ ├── TeamDataSourcePageQueryVO.java
│ │ │ │ ├── TeamPageQueryVO.java
│ │ │ │ └── TeamUserPageQueryVO.java
│ │ │ └── user/
│ │ │ ├── UserAdminController.java
│ │ │ ├── UserDataSourceAdminController.java
│ │ │ ├── UserTeamAdminController.java
│ │ │ ├── converter/
│ │ │ │ ├── UserAdminConverter.java
│ │ │ │ ├── UserDataSourcesAdminConverter.java
│ │ │ │ └── UserTeamAdminConverter.java
│ │ │ ├── request/
│ │ │ │ ├── UserCreateRequest.java
│ │ │ │ ├── UserDataSourceBatchCreateRequest.java
│ │ │ │ ├── UserPageCommonQueryRequest.java
│ │ │ │ ├── UserTeamBatchCreateRequest.java
│ │ │ │ └── UserUpdateRequest.java
│ │ │ └── vo/
│ │ │ ├── SimpleUserVO.java
│ │ │ ├── UserDataSourcePageQueryVO.java
│ │ │ ├── UserPageQueryVO.java
│ │ │ └── UserTeamPageQueryVO.java
│ │ ├── chat2db-server-common-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── common/
│ │ │ └── api/
│ │ │ └── controller/
│ │ │ ├── CommonCommonController.java
│ │ │ ├── converter/
│ │ │ │ └── EnvironmentCommonConverter.java
│ │ │ ├── request/
│ │ │ │ ├── CommonPageQueryRequest.java
│ │ │ │ └── CommonQueryRequest.java
│ │ │ └── vo/
│ │ │ ├── SimpleEnvironmentVO.java
│ │ │ └── SimpleUserVO.java
│ │ ├── chat2db-server-web-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── ai/
│ │ │ │ └── chat2db/
│ │ │ │ └── server/
│ │ │ │ └── web/
│ │ │ │ └── api/
│ │ │ │ ├── aspect/
│ │ │ │ │ ├── ConnectionInfoAspect.java
│ │ │ │ │ └── ConnectionInfoHandler.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── PageController.java
│ │ │ │ │ ├── ai/
│ │ │ │ │ │ ├── AiConfigController.java
│ │ │ │ │ │ ├── ChatController.java
│ │ │ │ │ │ ├── DocParser/
│ │ │ │ │ │ │ ├── AbstractParser.java
│ │ │ │ │ │ │ └── PdfParse.java
│ │ │ │ │ │ ├── EmbeddingController.java
│ │ │ │ │ │ ├── KnowledgeController.java
│ │ │ │ │ │ ├── TextGenerationController.java
│ │ │ │ │ │ ├── azure/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── AzureOpenAIClient.java
│ │ │ │ │ │ │ │ └── AzureOpenAiStreamClient.java
│ │ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ │ └── AzureHeaderAuthorizationInterceptor.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── AzureOpenAIEventSourceListener.java
│ │ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ │ ├── AzureChatChoice.java
│ │ │ │ │ │ │ │ ├── AzureChatCompletions.java
│ │ │ │ │ │ │ │ ├── AzureChatCompletionsOptions.java
│ │ │ │ │ │ │ │ ├── AzureChatMessage.java
│ │ │ │ │ │ │ │ ├── AzureChatRole.java
│ │ │ │ │ │ │ │ ├── AzureChoice.java
│ │ │ │ │ │ │ │ ├── AzureCompletions.java
│ │ │ │ │ │ │ │ ├── AzureCompletionsFinishReason.java
│ │ │ │ │ │ │ │ ├── AzureCompletionsLogProbabilityModel.java
│ │ │ │ │ │ │ │ ├── AzureCompletionsUsage.java
│ │ │ │ │ │ │ │ └── AzureExpandableStringEnum.java
│ │ │ │ │ │ │ └── util/
│ │ │ │ │ │ │ └── AzureReflectionUtils.java
│ │ │ │ │ │ ├── baichuan/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── BaichuanAIClient.java
│ │ │ │ │ │ │ │ └── BaichuanAIStreamClient.java
│ │ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ │ └── BaichuanHeaderAuthorizationInterceptor.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── BaichuanChatAIEventSourceListener.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ ├── BaichuanChatCompletions.java
│ │ │ │ │ │ │ ├── BaichuanChatCompletionsOptions.java
│ │ │ │ │ │ │ ├── BaichuanChatCompletionsUsage.java
│ │ │ │ │ │ │ ├── BaichuanChatData.java
│ │ │ │ │ │ │ └── BaichuanChatMessage.java
│ │ │ │ │ │ ├── chat2db/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── Chat2DBAIStreamClient.java
│ │ │ │ │ │ │ │ └── Chat2dbAIClient.java
│ │ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ │ └── Chat2dbHeaderAuthorizationInterceptor.java
│ │ │ │ │ │ │ └── listener/
│ │ │ │ │ │ │ └── Chat2dbAIEventSourceListener.java
│ │ │ │ │ │ ├── claude/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── ClaudeAIClient.java
│ │ │ │ │ │ │ │ └── ClaudeAiStreamClient.java
│ │ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ │ └── ClaudeHeaderAuthorizationInterceptor.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── ClaudeAIEventSourceListener.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ ├── ClaudeChatCompletionsOptions.java
│ │ │ │ │ │ │ ├── ClaudeChatMessage.java
│ │ │ │ │ │ │ ├── ClaudeCompletionResponse.java
│ │ │ │ │ │ │ └── ClaudeMessageLimit.java
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ └── LocalCache.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ └── ChatConverter.java
│ │ │ │ │ │ ├── enums/
│ │ │ │ │ │ │ ├── GptVersionType.java
│ │ │ │ │ │ │ └── PromptType.java
│ │ │ │ │ │ ├── fastchat/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── FastChatAIClient.java
│ │ │ │ │ │ │ │ ├── FastChatAIStreamClient.java
│ │ │ │ │ │ │ │ └── FastChatOpenAiApi.java
│ │ │ │ │ │ │ ├── embeddings/
│ │ │ │ │ │ │ │ ├── FastChatEmbedding.java
│ │ │ │ │ │ │ │ ├── FastChatEmbeddingResponse.java
│ │ │ │ │ │ │ │ └── FastChatItem.java
│ │ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ │ └── FastChatHeaderAuthorizationInterceptor.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── FastChatAIEventSourceListener.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ ├── FastChatChoice.java
│ │ │ │ │ │ │ ├── FastChatCompletions.java
│ │ │ │ │ │ │ ├── FastChatCompletionsFinishReason.java
│ │ │ │ │ │ │ ├── FastChatCompletionsOptions.java
│ │ │ │ │ │ │ ├── FastChatCompletionsUsage.java
│ │ │ │ │ │ │ ├── FastChatExpandableStringEnum.java
│ │ │ │ │ │ │ ├── FastChatMessage.java
│ │ │ │ │ │ │ └── FastChatRole.java
│ │ │ │ │ │ ├── openai/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ └── OpenAIClient.java
│ │ │ │ │ │ │ └── listener/
│ │ │ │ │ │ │ └── OpenAIEventSourceListener.java
│ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ ├── ChatQueryRequest.java
│ │ │ │ │ │ │ └── ChatRequest.java
│ │ │ │ │ │ ├── response/
│ │ │ │ │ │ │ ├── ChatChoice.java
│ │ │ │ │ │ │ └── ChatCompletionResponse.java
│ │ │ │ │ │ ├── rest/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── RestAIClient.java
│ │ │ │ │ │ │ │ └── RestAIStreamClient.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── RestAIEventSourceListener.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ ├── RestAIChatCompletions.java
│ │ │ │ │ │ │ └── RestAiCompletion.java
│ │ │ │ │ │ ├── tongyi/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── TongyiChatAIClient.java
│ │ │ │ │ │ │ │ └── TongyiChatAIStreamClient.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── TongyiChatAIEventSourceListener.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ ├── TongyiChatCompletions.java
│ │ │ │ │ │ │ ├── TongyiChatCompletionsOptions.java
│ │ │ │ │ │ │ ├── TongyiChatCompletionsUsage.java
│ │ │ │ │ │ │ ├── TongyiChatMessage.java
│ │ │ │ │ │ │ └── TongyiChatOutput.java
│ │ │ │ │ │ ├── wenxin/
│ │ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ │ ├── WenxinAIClient.java
│ │ │ │ │ │ │ │ └── WenxinAIStreamClient.java
│ │ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ │ └── AccessTokenInterceptor.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ └── WenxinAIEventSourceListener.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ └── WenxinChatCompletions.java
│ │ │ │ │ │ └── zhipu/
│ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ ├── ZhipuChatAIClient.java
│ │ │ │ │ │ │ └── ZhipuChatAIStreamClient.java
│ │ │ │ │ │ ├── interceptor/
│ │ │ │ │ │ │ └── ZhipuChatHeaderAuthorizationInterceptor.java
│ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ └── ZhipuChatAIEventSourceListener.java
│ │ │ │ │ │ ├── model/
│ │ │ │ │ │ │ ├── ZhipuChatBody.java
│ │ │ │ │ │ │ ├── ZhipuChatCompletions.java
│ │ │ │ │ │ │ └── ZhipuChatCompletionsOptions.java
│ │ │ │ │ │ └── util/
│ │ │ │ │ │ └── ZhipuUtils.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ConfigController.java
│ │ │ │ │ │ └── request/
│ │ │ │ │ │ ├── AIConfigCreateRequest.java
│ │ │ │ │ │ ├── AISystemConfigRequest.java
│ │ │ │ │ │ └── SystemConfigRequest.java
│ │ │ │ │ ├── dashboard/
│ │ │ │ │ │ ├── ChartController.java
│ │ │ │ │ │ ├── DashboardController.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ ├── ChartWebConverter.java
│ │ │ │ │ │ │ └── DashboardWebConverter.java
│ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ ├── ChartCreateRequest.java
│ │ │ │ │ │ │ ├── ChartQueryRequest.java
│ │ │ │ │ │ │ ├── ChartUpdateRequest.java
│ │ │ │ │ │ │ ├── DashboardCreateRequest.java
│ │ │ │ │ │ │ └── DashboardUpdateRequest.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ ├── ChartVO.java
│ │ │ │ │ │ └── DashboardVO.java
│ │ │ │ │ ├── data/
│ │ │ │ │ │ └── source/
│ │ │ │ │ │ ├── DataSourceController.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ ├── DataSourceWebConverter.java
│ │ │ │ │ │ │ └── SSHWebConverter.java
│ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ ├── ConsoleCloseRequest.java
│ │ │ │ │ │ │ ├── ConsoleConnectRequest.java
│ │ │ │ │ │ │ ├── DataSourceAttachRequest.java
│ │ │ │ │ │ │ ├── DataSourceBaseRequest.java
│ │ │ │ │ │ │ ├── DataSourceBaseRequestInfo.java
│ │ │ │ │ │ │ ├── DataSourceCloneRequest.java
│ │ │ │ │ │ │ ├── DataSourceCloseRequest.java
│ │ │ │ │ │ │ ├── DataSourceConsoleRequestInfo.java
│ │ │ │ │ │ │ ├── DataSourceCreateRequest.java
│ │ │ │ │ │ │ ├── DataSourceQueryRequest.java
│ │ │ │ │ │ │ ├── DataSourceTestRequest.java
│ │ │ │ │ │ │ ├── DataSourceUpdateRequest.java
│ │ │ │ │ │ │ └── SSHTestRequest.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ ├── DataSourceVO.java
│ │ │ │ │ │ ├── DatabaseVO.java
│ │ │ │ │ │ └── EnvVO.java
│ │ │ │ │ ├── driver/
│ │ │ │ │ │ ├── JdbcDriverController.java
│ │ │ │ │ │ └── request/
│ │ │ │ │ │ └── JdbcDriverRequest.java
│ │ │ │ │ ├── ncx/
│ │ │ │ │ │ ├── ConverterController.java
│ │ │ │ │ │ ├── cipher/
│ │ │ │ │ │ │ ├── CommonCipher.java
│ │ │ │ │ │ │ ├── Navicat11Cipher.java
│ │ │ │ │ │ │ └── Navicat12Cipher.java
│ │ │ │ │ │ ├── dbeaver/
│ │ │ │ │ │ │ ├── DBSValueEncryptor.java
│ │ │ │ │ │ │ └── DefaultValueEncryptor.java
│ │ │ │ │ │ ├── enums/
│ │ │ │ │ │ │ ├── DataBaseType.java
│ │ │ │ │ │ │ ├── ExportConstants.java
│ │ │ │ │ │ │ └── VersionEnum.java
│ │ │ │ │ │ ├── factory/
│ │ │ │ │ │ │ └── CipherFactory.java
│ │ │ │ │ │ ├── service/
│ │ │ │ │ │ │ ├── ConverterService.java
│ │ │ │ │ │ │ └── impl/
│ │ │ │ │ │ │ └── ConverterServiceImpl.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ └── UploadVO.java
│ │ │ │ │ ├── operation/
│ │ │ │ │ │ ├── log/
│ │ │ │ │ │ │ ├── OperationLogController.java
│ │ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ │ └── OperationLogWebConverter.java
│ │ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ │ ├── OperationLogCreateRequest.java
│ │ │ │ │ │ │ │ └── OperationLogQueryRequest.java
│ │ │ │ │ │ │ └── vo/
│ │ │ │ │ │ │ └── OperationLogVO.java
│ │ │ │ │ │ └── saved/
│ │ │ │ │ │ ├── OperationSavedController.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ └── OperationWebConverter.java
│ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ ├── BatchTabCloseRequest.java
│ │ │ │ │ │ │ ├── OperationCreateRequest.java
│ │ │ │ │ │ │ ├── OperationQueryRequest.java
│ │ │ │ │ │ │ └── OperationUpdateRequest.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ └── OperationVO.java
│ │ │ │ │ ├── pin/
│ │ │ │ │ │ ├── PinController.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ └── PinWebConverter.java
│ │ │ │ │ │ └── request/
│ │ │ │ │ │ └── PinTableRequest.java
│ │ │ │ │ ├── rdb/
│ │ │ │ │ │ ├── DatabaseController.java
│ │ │ │ │ │ ├── FunctionController.java
│ │ │ │ │ │ ├── ProcedureController.java
│ │ │ │ │ │ ├── RdbDdlController.java
│ │ │ │ │ │ ├── RdbDmlController.java
│ │ │ │ │ │ ├── RdbDmlExportController.java
│ │ │ │ │ │ ├── RdbDocController.java
│ │ │ │ │ │ ├── SchemaController.java
│ │ │ │ │ │ ├── SequenceController.java
│ │ │ │ │ │ ├── TableController.java
│ │ │ │ │ │ ├── TriggerController.java
│ │ │ │ │ │ ├── ViewController.java
│ │ │ │ │ │ ├── converter/
│ │ │ │ │ │ │ ├── DatabaseConverter.java
│ │ │ │ │ │ │ ├── FunctionConverter.java
│ │ │ │ │ │ │ ├── ProcedureConverter.java
│ │ │ │ │ │ │ └── RdbWebConverter.java
│ │ │ │ │ │ ├── data/
│ │ │ │ │ │ │ ├── BaseDataExporter.java
│ │ │ │ │ │ │ ├── BaseDataImporter.java
│ │ │ │ │ │ │ ├── BaseExcelExporter.java
│ │ │ │ │ │ │ ├── BaseExcelImporter.java
│ │ │ │ │ │ │ ├── DataExportStrategy.java
│ │ │ │ │ │ │ ├── DataImportStrategy.java
│ │ │ │ │ │ │ ├── csv/
│ │ │ │ │ │ │ │ ├── CsvDataExporter.java
│ │ │ │ │ │ │ │ └── CsvDataImporter.java
│ │ │ │ │ │ │ ├── factory/
│ │ │ │ │ │ │ │ ├── DataExportFactory.java
│ │ │ │ │ │ │ │ └── DataImportFactory.java
│ │ │ │ │ │ │ ├── json/
│ │ │ │ │ │ │ │ ├── JsonDataExporter.java
│ │ │ │ │ │ │ │ └── JsonDataImporter.java
│ │ │ │ │ │ │ ├── service/
│ │ │ │ │ │ │ │ ├── DatabaseDataService.java
│ │ │ │ │ │ │ │ └── impl/
│ │ │ │ │ │ │ │ └── DatabaseDataImpl.java
│ │ │ │ │ │ │ ├── sql/
│ │ │ │ │ │ │ │ └── SqlDataExporter.java
│ │ │ │ │ │ │ ├── task/
│ │ │ │ │ │ │ │ ├── TaskManager.java
│ │ │ │ │ │ │ │ └── TaskState.java
│ │ │ │ │ │ │ ├── xls/
│ │ │ │ │ │ │ │ ├── XlsDataExporter.java
│ │ │ │ │ │ │ │ └── XlsDataImporter.java
│ │ │ │ │ │ │ └── xlsx/
│ │ │ │ │ │ │ ├── XlsxDataExporter.java
│ │ │ │ │ │ │ └── XlsxDataImporter.java
│ │ │ │ │ │ ├── doc/
│ │ │ │ │ │ │ ├── DatabaseExportService.java
│ │ │ │ │ │ │ ├── adaptive/
│ │ │ │ │ │ │ │ ├── CustomCellWriteHeightConfig.java
│ │ │ │ │ │ │ │ └── CustomCellWriteWidthConfig.java
│ │ │ │ │ │ │ ├── conf/
│ │ │ │ │ │ │ │ └── ExportOptions.java
│ │ │ │ │ │ │ ├── constant/
│ │ │ │ │ │ │ │ ├── CommonConstant.java
│ │ │ │ │ │ │ │ └── PatternConstant.java
│ │ │ │ │ │ │ ├── event/
│ │ │ │ │ │ │ │ └── TemplateEvent.java
│ │ │ │ │ │ │ ├── export/
│ │ │ │ │ │ │ │ ├── ExportExcelService.java
│ │ │ │ │ │ │ │ ├── ExportHtmlService.java
│ │ │ │ │ │ │ │ ├── ExportMarkdownService.java
│ │ │ │ │ │ │ │ ├── ExportPdfService.java
│ │ │ │ │ │ │ │ └── ExportWordSuperService.java
│ │ │ │ │ │ │ ├── merge/
│ │ │ │ │ │ │ │ └── MyMergeExcel.java
│ │ │ │ │ │ │ └── style/
│ │ │ │ │ │ │ └── CustomExcelStyle.java
│ │ │ │ │ │ ├── factory/
│ │ │ │ │ │ │ └── ExportServiceFactory.java
│ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ ├── ColumnRequest.java
│ │ │ │ │ │ │ ├── DataExportRequest.java
│ │ │ │ │ │ │ ├── DatabaseCreateRequest.java
│ │ │ │ │ │ │ ├── DatabaseExportDataRequest.java
│ │ │ │ │ │ │ ├── DatabaseExportRequest.java
│ │ │ │ │ │ │ ├── DdlCountRequest.java
│ │ │ │ │ │ │ ├── DdlExportRequest.java
│ │ │ │ │ │ │ ├── DdlRequest.java
│ │ │ │ │ │ │ ├── DmlRequest.java
│ │ │ │ │ │ │ ├── DmlSqlCopyRequest.java
│ │ │ │ │ │ │ ├── DmlTableRequest.java
│ │ │ │ │ │ │ ├── FunctionDetailRequest.java
│ │ │ │ │ │ │ ├── FunctionPageRequest.java
│ │ │ │ │ │ │ ├── FunctionUpdateRequest.java
│ │ │ │ │ │ │ ├── GroupByRequest.java
│ │ │ │ │ │ │ ├── IndexRequest.java
│ │ │ │ │ │ │ ├── NewTableSqlRequest.java
│ │ │ │ │ │ │ ├── OrderByRequest.java
│ │ │ │ │ │ │ ├── ProcedureDetailRequest.java
│ │ │ │ │ │ │ ├── ProcedurePageRequest.java
│ │ │ │ │ │ │ ├── ProcedureUpdateRequest.java
│ │ │ │ │ │ │ ├── SchemaCreateRequest.java
│ │ │ │ │ │ │ ├── SchemaQueryRequest.java
│ │ │ │ │ │ │ ├── SelectResultUpdateRequest.java
│ │ │ │ │ │ │ ├── SequenceBriefQueryRequest.java
│ │ │ │ │ │ │ ├── SequenceDeleteRequest.java
│ │ │ │ │ │ │ ├── SequenceDetailQueryRequest.java
│ │ │ │ │ │ │ ├── SequenceModifySqlRequest.java
│ │ │ │ │ │ │ ├── SequenceRequest.java
│ │ │ │ │ │ │ ├── TableBriefQueryRequest.java
│ │ │ │ │ │ │ ├── TableCreateDdlQueryRequest.java
│ │ │ │ │ │ │ ├── TableDeleteRequest.java
│ │ │ │ │ │ │ ├── TableDetailQueryRequest.java
│ │ │ │ │ │ │ ├── TableMilvusQueryRequest.java
│ │ │ │ │ │ │ ├── TableModifySqlRequest.java
│ │ │ │ │ │ │ ├── TableQueryRequest.java
│ │ │ │ │ │ │ ├── TableRequest.java
│ │ │ │ │ │ │ ├── TableUpdateDdlQueryRequest.java
│ │ │ │ │ │ │ ├── TriggerDetailRequest.java
│ │ │ │ │ │ │ ├── TriggerPageRequest.java
│ │ │ │ │ │ │ ├── TypeQueryRequest.java
│ │ │ │ │ │ │ ├── UpdateDatabaseRequest.java
│ │ │ │ │ │ │ └── UpdateSchemaRequest.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ ├── ColumnVO.java
│ │ │ │ │ │ ├── ExecuteResultVO.java
│ │ │ │ │ │ ├── IndexColumnVO.java
│ │ │ │ │ │ ├── IndexVO.java
│ │ │ │ │ │ ├── KeyVO.java
│ │ │ │ │ │ ├── MetaSchemaVO.java
│ │ │ │ │ │ ├── SchemaVO.java
│ │ │ │ │ │ ├── SequenceVO.java
│ │ │ │ │ │ ├── SqlVO.java
│ │ │ │ │ │ ├── TableVO.java
│ │ │ │ │ │ └── ViewVO.java
│ │ │ │ │ ├── redis/
│ │ │ │ │ │ ├── RedisKeyManageController.java
│ │ │ │ │ │ ├── RedisKeyValueManageController.java
│ │ │ │ │ │ ├── request/
│ │ │ │ │ │ │ ├── KeyCreateRequest.java
│ │ │ │ │ │ │ ├── KeyDeleteRequest.java
│ │ │ │ │ │ │ ├── KeyQueryRequest.java
│ │ │ │ │ │ │ ├── KeyUpdateRequest.java
│ │ │ │ │ │ │ ├── KeyValueManageRequest.java
│ │ │ │ │ │ │ └── ValueUpdateRequest.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ └── KeyVO.java
│ │ │ │ │ ├── sql/
│ │ │ │ │ │ ├── SqlController.java
│ │ │ │ │ │ └── request/
│ │ │ │ │ │ └── SqlFormatRequest.java
│ │ │ │ │ ├── system/
│ │ │ │ │ │ ├── SystemController.java
│ │ │ │ │ │ ├── util/
│ │ │ │ │ │ │ └── SystemUtils.java
│ │ │ │ │ │ └── vo/
│ │ │ │ │ │ ├── AppVersionVO.java
│ │ │ │ │ │ └── SystemVO.java
│ │ │ │ │ ├── task/
│ │ │ │ │ │ ├── ExportController.java
│ │ │ │ │ │ ├── TaskController.java
│ │ │ │ │ │ └── biz/
│ │ │ │ │ │ └── TaskBizService.java
│ │ │ │ │ └── user/
│ │ │ │ │ ├── UserController.java
│ │ │ │ │ ├── converter/
│ │ │ │ │ │ └── UserWebConverter.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── UserCreateRequest.java
│ │ │ │ │ │ ├── UserQueryRequest.java
│ │ │ │ │ │ └── UserUpdateRequest.java
│ │ │ │ │ └── vo/
│ │ │ │ │ └── UserVO.java
│ │ │ │ ├── http/
│ │ │ │ │ ├── GatewayClientService.java
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── EsTableSchema.java
│ │ │ │ │ │ ├── Knowledge.java
│ │ │ │ │ │ └── TableSchema.java
│ │ │ │ │ ├── request/
│ │ │ │ │ │ ├── EsTableSchemaRequest.java
│ │ │ │ │ │ ├── KnowledgeRequest.java
│ │ │ │ │ │ ├── SqlExecuteHistoryCreateRequest.java
│ │ │ │ │ │ ├── TableSchemaRequest.java
│ │ │ │ │ │ └── WhiteListRequest.java
│ │ │ │ │ └── response/
│ │ │ │ │ ├── ApiKeyResponse.java
│ │ │ │ │ ├── EsTableSchemaResponse.java
│ │ │ │ │ ├── InviteQrCodeResponse.java
│ │ │ │ │ ├── KnowledgeResponse.java
│ │ │ │ │ ├── QrCodeResponse.java
│ │ │ │ │ └── TableSchemaResponse.java
│ │ │ │ ├── util/
│ │ │ │ │ ├── AddToTopic.java
│ │ │ │ │ ├── ApplicationContextUtil.java
│ │ │ │ │ ├── FileUtils.java
│ │ │ │ │ ├── StringUtils.java
│ │ │ │ │ └── XMLUtils.java
│ │ │ │ └── ws/
│ │ │ │ ├── WsConfig.java
│ │ │ │ ├── WsMessage.java
│ │ │ │ ├── WsResult.java
│ │ │ │ ├── WsServer.java
│ │ │ │ └── WsService.java
│ │ │ └── resources/
│ │ │ └── template/
│ │ │ ├── sub_template_diy.docx
│ │ │ ├── template.html
│ │ │ └── template_diy.docx
│ │ └── pom.xml
│ ├── chat2db-server-web-start/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── ai/
│ │ │ └── chat2db/
│ │ │ └── server/
│ │ │ └── web/
│ │ │ └── start/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ ├── StdinReader.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── AsyncContextRefreshedListener.java
│ │ │ │ │ ├── Chat2dbForestConfiguration.java
│ │ │ │ │ ├── Chat2dbWebMvcConfigurer.java
│ │ │ │ │ ├── JarDownloadTask.java
│ │ │ │ │ └── WebLogConfiguration.java
│ │ │ │ ├── i18n/
│ │ │ │ │ └── I18nConfig.java
│ │ │ │ ├── interceptor/
│ │ │ │ │ └── CorsFilter.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── DbhubTomcatConnectorCustomizer.java
│ │ │ │ │ ├── FailedEventApplicationListener.java
│ │ │ │ │ ├── ManageApplicationListener.java
│ │ │ │ │ └── manage/
│ │ │ │ │ ├── ManageMessage.java
│ │ │ │ │ └── MessageTypeEnum.java
│ │ │ │ ├── mybatis/
│ │ │ │ │ └── MyBatisPlusConfig.java
│ │ │ │ └── oauth/
│ │ │ │ ├── SaLogForSlf4j.java
│ │ │ │ └── SaTokenConfigure.java
│ │ │ ├── controller/
│ │ │ │ ├── oauth/
│ │ │ │ │ ├── OauthController.java
│ │ │ │ │ └── request/
│ │ │ │ │ └── LoginRequest.java
│ │ │ │ └── thymeleaf/
│ │ │ │ └── ThymeleafController.java
│ │ │ ├── exception/
│ │ │ │ ├── EasyControllerExceptionHandler.java
│ │ │ │ └── convertor/
│ │ │ │ ├── BindExceptionConvertor.java
│ │ │ │ ├── BusinessExceptionConvertor.java
│ │ │ │ ├── DefaultExceptionConvertor.java
│ │ │ │ ├── ExceptionConvertor.java
│ │ │ │ ├── ExceptionConvertorUtils.java
│ │ │ │ ├── MaxUploadSizeExceededExceptionConvertor.java
│ │ │ │ ├── MethodArgumentNotValidExceptionConvertor.java
│ │ │ │ ├── MethodArgumentTypeMismatchExceptionConvertor.java
│ │ │ │ └── ParamExceptionConvertor.java
│ │ │ └── log/
│ │ │ ├── EasyLogSink.java
│ │ │ ├── LogOncePerRequestFilter.java
│ │ │ └── WebLog.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── spring.factories
│ │ ├── application-dev.yml
│ │ ├── application-release.yml
│ │ ├── application-test.yml
│ │ ├── application.yml
│ │ ├── i18n/
│ │ │ ├── messages.properties
│ │ │ ├── messages_en_US.properties
│ │ │ └── messages_zh_CN.properties
│ │ ├── logback-spring.xml
│ │ └── thymeleaf/
│ │ └── template.html
│ ├── chat2db-spi/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── ai/
│ │ └── chat2db/
│ │ └── spi/
│ │ ├── ColumnBuilder.java
│ │ ├── CommandExecutor.java
│ │ ├── DBManage.java
│ │ ├── MetaData.java
│ │ ├── Plugin.java
│ │ ├── SqlBuilder.java
│ │ ├── ValueHandler.java
│ │ ├── ValueProcessor.java
│ │ ├── config/
│ │ │ ├── DBConfig.java
│ │ │ └── DriverConfig.java
│ │ ├── enums/
│ │ │ ├── CellTypeEnum.java
│ │ │ ├── CollationEnum.java
│ │ │ ├── DataTypeEnum.java
│ │ │ ├── DmlType.java
│ │ │ ├── EditStatus.java
│ │ │ ├── IndexTypeEnum.java
│ │ │ └── SqlTypeEnum.java
│ │ ├── jdbc/
│ │ │ ├── BaseValueProcessor.java
│ │ │ ├── DefaultDBManage.java
│ │ │ ├── DefaultMetaService.java
│ │ │ ├── DefaultSqlBuilder.java
│ │ │ ├── DefaultValueHandler.java
│ │ │ └── DefaultValueProcessor.java
│ │ ├── model/
│ │ │ ├── AsyncCall.java
│ │ │ ├── AsyncContext.java
│ │ │ ├── Cell.java
│ │ │ ├── Charset.java
│ │ │ ├── Collation.java
│ │ │ ├── ColumnType.java
│ │ │ ├── Command.java
│ │ │ ├── CreateTableSql.java
│ │ │ ├── DataSourceConnect.java
│ │ │ ├── DataType.java
│ │ │ ├── Database.java
│ │ │ ├── DefaultValue.java
│ │ │ ├── DriverEntry.java
│ │ │ ├── EngineType.java
│ │ │ ├── ExecuteResult.java
│ │ │ ├── Function.java
│ │ │ ├── Header.java
│ │ │ ├── IndexType.java
│ │ │ ├── JDBCDataValue.java
│ │ │ ├── KeyValue.java
│ │ │ ├── MetaSchema.java
│ │ │ ├── OrderBy.java
│ │ │ ├── Procedure.java
│ │ │ ├── QueryResult.java
│ │ │ ├── ResultOperation.java
│ │ │ ├── SQLDataValue.java
│ │ │ ├── SSHInfo.java
│ │ │ ├── SSLInfo.java
│ │ │ ├── Schema.java
│ │ │ ├── Sequence.java
│ │ │ ├── ShowDatabaseResult.java
│ │ │ ├── SimpleColumn.java
│ │ │ ├── SimpleSequence.java
│ │ │ ├── SimpleTable.java
│ │ │ ├── Sql.java
│ │ │ ├── Table.java
│ │ │ ├── TableColumn.java
│ │ │ ├── TableIndex.java
│ │ │ ├── TableIndexColumn.java
│ │ │ ├── TableMeta.java
│ │ │ ├── Trigger.java
│ │ │ └── Type.java
│ │ ├── sql/
│ │ │ ├── Chat2DBContext.java
│ │ │ ├── ConnectInfo.java
│ │ │ ├── ConnectionPool.java
│ │ │ ├── DocumentUtils.java
│ │ │ ├── IDriverManager.java
│ │ │ ├── MongExtendedJsonObjectIdConverter.java
│ │ │ ├── ResultSetConsumer.java
│ │ │ ├── ResultSetFunction.java
│ │ │ ├── SQLExecutor.java
│ │ │ └── SqlParseUtils.java
│ │ ├── ssh/
│ │ │ ├── MyUserInfo.java
│ │ │ └── SSHManager.java
│ │ └── util/
│ │ ├── ExceptionUtils.java
│ │ ├── FileUtils.java
│ │ ├── Holder.java
│ │ ├── JdbcJarUtils.java
│ │ ├── JdbcUtils.java
│ │ ├── LexerFactories.java
│ │ ├── LexerFactory.java
│ │ ├── LexerTokenDefinition.java
│ │ ├── LexerTokenDefinitions.java
│ │ ├── OBOraclePLLexerDefinition.java
│ │ ├── OBOraclePLLexerFactory.java
│ │ ├── OracleLexerDefinition.java
│ │ ├── OracleLexerFactory.java
│ │ ├── ResultSetUtils.java
│ │ ├── SortUtils.java
│ │ ├── SplitSqlString.java
│ │ ├── SqlSplitProcessor.java
│ │ ├── SqlSplitter.java
│ │ ├── SqlStatementIterator.java
│ │ ├── SqlUtils.java
│ │ └── TableUtils.java
│ ├── lombok.config
│ └── pom.xml
├── docker/
│ ├── Dockerfile
│ ├── docker-build.sh
│ ├── docker-compose-start.sh
│ ├── docker-compose.yml
│ ├── docker-start.sh
│ └── test/
│ ├── docker-compose.yml
│ ├── redis/
│ │ ├── data/
│ │ │ └── dump.rdb
│ │ └── redis.conf
│ ├── start.sh
│ └── stop.sh
├── document/
│ ├── git/
│ │ └── git.sh
│ ├── sql/
│ │ └── mysql.sql
│ └── style/
│ └── Alibaba_CodeStyle.xml
└── script/
└── local-client-build.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.css linguist-language=java
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: 💣 Bug
title: 'Bug: '
description: bug template
labels: bug
body:
- type: input
id: version
attributes:
label: Chat2DB Version
validations:
required: true
- type: textarea
id: description
attributes:
label: Describe the bug
description: |
If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem and error log.
清晰的描述遇到的问题,并建议附上错误截图及错误日志。
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/optimized.md
================================================
---
name: "💫 Optimized"
about: optimized template
title: '优化: '
labels: 'optimized'
---
================================================
FILE: .github/ISSUE_TEMPLATE/suggest.md
================================================
---
name: "💌 Suggest"
about: suggest template
title: 'suggest: '
labels: 'suggest'
---
================================================
FILE: .github/workflows/pushdocker.yml
================================================
# When tagging a release, do two things
# 1.
name: Push To Docker
# Workflow's trigger
on:
release:
types: [ published ]
# Workflow's jobs
jobs:
docker:
strategy:
matrix:
include:
- arch: amd64
- arch: arm64
variant: v8
runs-on: ubuntu-latest
steps:
- name: Check out git repository
uses: actions/checkout@main
# Unable to obtain version number. Since the workflow doesn't support it, we'll use a plugin
- name: Create version
id: chat2db_version
uses: bhowell2/github-substring-action@1.0.1
with:
value: ${{ github.ref }}
index_of_str: "refs/tags/v"
# Outputting basic information
- name: Print basic information
run: |
echo "current version: ${{ steps.chat2db_version.outputs.substring }}"
# Install Node.js
- name: Install Node.js
uses: actions/setup-node@main
with:
node-version: 16
cache: "yarn"
cache-dependency-path: chat2db-client/yarn.lock
# Build static file information
- name: Yarn install & build & copy
run: |
cd chat2db-client
yarn install
yarn run build:web:prod --app_version=${{ steps.chat2db_version.outputs.substring }}
cp -r dist ../chat2db-server/chat2db-server-web-start/src/main/resources/static/front
cp -r dist/index.html ../chat2db-server/chat2db-server-web-start/src/main/resources/thymeleaf/
# Install java and maven
- name: Install Java and Maven
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "adopt"
cache: "maven"
# Compile server-side Java version
- name: Build Java
run: mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
with:
platforms: amd64,arm64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
# Log in docker hub
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Packaging and sending to Docker
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
platforms: linux/amd64,linux/arm64/v8
tags: chat2db/chat2db:${{ steps.chat2db_version.outputs.substring }},chat2db/chat2db:latest
file: docker/Dockerfile
================================================
FILE: .github/workflows/release.yml
================================================
# Workflow's name
name: Build Client
# Workflow's trigger
# Pack when creating tags
on:
push:
tags:
- v*
# Workflow's jobs
# A total of 3 computers are required to run
# windows
# macos-latest x86_64
# macos-latest arm64
jobs:
release:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
- os: macos-latest
arch: x86_64
- os: macos-latest
arch: arm64
- os: ubuntu-latest
runs-on: ${{ matrix.os }}
steps:
- name: Check out git repository
uses: actions/checkout@main
# Obtaining the version number is not supported by workflow, so a plug-in is used.
- name: Create version
id: chat2db_version
uses: bhowell2/github-substring-action@1.0.1
with:
value: ${{ github.ref }}
index_of_str: "refs/tags/v"
# Output basic information
- name: Print basic information
run: |
echo "current environment: ${{ env.CHAT2DB_ENVIRONMENT }}"
echo "current version: ${{ steps.chat2db_version.outputs.substring }}"
# Install jre Windows
- name: Install Jre for Windows
if: ${{ runner.os == 'Windows' }}
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
java-package: "jre"
# Install jre MacOS X64
- name: Install Jre MacOS X64
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
java-package: "jre"
architecture: "x64"
# Install jre MacOS arm64
- name: Install Jre MacOS arm64
if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
java-package: "jre"
architecture: "aarch64"
# Install jre Linux
- name: Install Jre for Linux
if: ${{ runner.os == 'Linux' }}
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
java-package: "jre"
# java.security open tls1 Windows
- name: Enable tls1
if: ${{ runner.os == 'Windows' }}
run: |
# sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\( TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "${{ env.JAVA_HOME }}\conf\security\java.security"
$filePath = "${{ env.JAVA_HOME }}\conf\security\java.security"
$content = Get-Content $filePath -Raw
$updatedContent = $content -replace '^(jdk.tls.disabledAlgorithms=)(.*)( TLSv1, TLSv1.1,)(.*)', '$1$2$4'
$updatedContent | Set-Content $filePath
shell: pwsh
# java.security open tls1 macOS
- name: Enable tls1
if: ${{ runner.os == 'macOS' }}
run: |
sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\( TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" $JAVA_HOME/conf/security/java.security
# Copy jre Windows
- name: Copy Jre for Windows
if: ${{ runner.os == 'Windows' }}
run: |
mkdir chat2db-client/static
cp -r "${{ env.JAVA_HOME }}" chat2db-client/static/jre
# Copy jre macOS
- name: Copy Jre for macOS
if: ${{ runner.os == 'macOS' }}
run: |
mkdir chat2db-client/static
cp -r $JAVA_HOME chat2db-client/static/jre
chmod -R 777 chat2db-client/static/jre/
# Copy jre Linux
- name: Copy Jre for Linux
if: ${{ runner.os == 'Linux' }}
run: |
mkdir chat2db-client/static
cp -r $JAVA_HOME chat2db-client/static/jre
chmod -R 777 chat2db-client/static/jre/
# Install node
- name: Install Node.js
uses: actions/setup-node@main
with:
node-version: 16
cache: "yarn"
cache-dependency-path: chat2db-client/yarn.lock
# Install java
- name: Install Java and Maven
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
cache: "maven"
# Build static file information
- name: Yarn install & build & copy
run: |
cd chat2db-client
yarn
yarn run build:web:prod --app_version=${{ steps.chat2db_version.outputs.substring }}
cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf/
cd src/main
yarn
yarn run build
# Compile server-side java version
- name: Build Java
run: mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
# touch versions
- name: touch versions
run: |
cd chat2db-client
mkdir versions
mkdir versions/${{ steps.chat2db_version.outputs.substring }}
mkdir versions/${{ steps.chat2db_version.outputs.substring }}/static
touch version
echo -n ${{ steps.chat2db_version.outputs.substring }} > version
cp -r version ./versions/
# Copy server-side java to the specified location
- name: Copy App
run: |
cp chat2db-server/chat2db-server-start/target/chat2db-server-start.jar chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/static/
# cp -r chat2db-server/chat2db-server-start/target/lib chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/static/lib
- name: Prepare Build Electron
run: |
cd chat2db-client
yarn run build:web:desktop --app_version=${{ steps.chat2db_version.outputs.substring }}
cp -r dist ./versions/${{ steps.chat2db_version.outputs.substring }}/
rm -r dist
# windows
- name: Build/release Electron app for Windows
if: ${{ runner.os == 'Windows' }}
uses: samuelmeuli/action-electron-builder@v1
with:
package_root: "chat2db-client/"
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
mac_certs: ${{ secrets.mac_certs }}
mac_certs_password: ${{ secrets.mac_certs_password }}
skip_build: true
args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --win --x64"
release: true
# macos x86_64
- name: Build/release Electron app for MacOS X64
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
uses: samuelmeuli/action-electron-builder@v1
with:
package_root: "chat2db-client/"
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
mac_certs: ${{ secrets.mac_certs }}
mac_certs_password: ${{ secrets.mac_certs_password }}
skip_build: true
args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --mac --x64"
release: true
# x86_64 notarization
- name: Notarization x86_64 App
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
run: |
xcrun notarytool store-credentials "Chat2DB" --apple-id "${{secrets.MAC_APPLE_ID}}" --password "${{secrets.MAC_APPLE_PASSWORD}}" --team-id "${{secrets.MAC_TEAM_ID}}"
xcrun notarytool submit chat2db-client/release/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.dmg --keychain-profile "Chat2DB"
# macos arm64
- name: Build/release Electron app for MacOS arm64
if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
uses: samuelmeuli/action-electron-builder@v1
with:
package_root: "chat2db-client/"
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
mac_certs: ${{ secrets.mac_certs }}
mac_certs_password: ${{ secrets.mac_certs_password }}
skip_build: true
args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --mac --arm64"
release: true
# arm notarization
- name: Notarization arm64 App
if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
run: |
xcrun notarytool store-credentials "Chat2DB" --apple-id "${{secrets.MAC_APPLE_ID}}" --password "${{secrets.MAC_APPLE_PASSWORD}}" --team-id "${{secrets.MAC_TEAM_ID}}"
xcrun notarytool submit chat2db-client/release/Chat2DB-${{ steps.chat2db_version.outputs.substring }}-arm64.dmg --keychain-profile "Chat2DB"
# Linux
- name: Delete File
if: ${{ runner.os == 'Linux' }}
run: |
cd chat2db-client/static/jre/
ls -la
rm -rf legal
ls -la
- name: Build/release Electron app for Linux
if: ${{ runner.os == 'Linux' }}
uses: samuelmeuli/action-electron-builder@v1
with:
package_root: "chat2db-client/"
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
skip_build: true
args: "-c.extraMetadata.version=${{ steps.chat2db_version.outputs.substring }} --linux"
release: true
# Prepare the required data Windows
- name: Prepare upload for Windows
if: runner.os == 'Windows'
run: |
mkdir oss_temp_file
cp -r chat2db-client/release/*Setup*.exe ./oss_temp_file
# Prepare the required data MacOS x86_64
- name: Prepare upload for MacOS x86_64
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
run: |
mkdir oss_temp_file
cp chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/static/chat2db-server-start.jar ./oss_temp_file
cp -r chat2db-client/release/*.dmg ./oss_temp_file
cp -r chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/dist ./oss_temp_file/dist
cd chat2db-client/versions/${{ steps.chat2db_version.outputs.substring }}/ && zip -r ${{ steps.chat2db_version.outputs.substring }}.zip ./
cp -r ${{ steps.chat2db_version.outputs.substring }}.zip ../../../oss_temp_file
cd static/ && zip -r chat2db-server-start.zip ./
cp -r chat2db-server-start.zip ../../../../oss_temp_file
# Prepare the required data MacOS arm64
- name: Prepare upload for MacOS arm64
if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
run: |
mkdir oss_temp_file
cp -r chat2db-client/release/*.dmg ./oss_temp_file
# Prepare the required data Linux
- name: Prepare upload for Linux
if: runner.os == 'Linux'
run: |
mkdir oss_temp_file
cp -r chat2db-client/release/*.AppImage ./oss_temp_file
# Upload files to OSS for easy downloading
- name: Set up oss utils
uses: yizhoumo/setup-ossutil@v1
with:
endpoint: "oss-accelerate.aliyuncs.com"
access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
ossutil-version: "1.7.16"
- name: Upload to oss
run: |
ossutil cp -rf --acl=public-read ./oss_temp_file/ oss://chat2db-client/release/${{ steps.chat2db_version.outputs.substring }}/
# Build completion notification
- name: Send dingtalk message for Windows
if: ${{ runner.os == 'Windows' }}
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "Windows-release-打包完成通知",
"text": "# Windows-release-打包完成通知 \n  \n ### 任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }}) \n ### Windows下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB%20Setup%20${{ steps.chat2db_version.outputs.substring }}.exe](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB%20Setup%20${{ steps.chat2db_version.outputs.substring }}.exe) "
}
# Build completion notification
- name: Send dingtalk message for MacOS x86_64
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "MacOS-x86_64-release-构建完成通知",
"text": "# MacOS-x86_64-release-打包完成通知 \n  \n ### 任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }}) \n ### Intel芯片下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.dmg](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.dmg) \n ### jar包下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/chat2db-server-start.zip](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/chat2db-server-start.zip) "
}
# Build completion notification
- name: Send dingtalk message for MacOS arm64
if: ${{ runner.os == 'macOS' && matrix.arch == 'arm64' }}
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "MacOS-arm64-release-构建完成通知",
"text": "# MacOS-arm64-release-打包完成通知 \n  \n ### 任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }}) \n ### Apple芯片下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}-arm64.dmg](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}-arm64.dmg) "
}
# Build completion notification
- name: Send dingtalk message for Linux
if: ${{ runner.os == 'Linux' }}
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "Linux-test-打包完成通知",
"text": "# Linux-test-打包完成通知 \n  \n ### 任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }}) \n ### Linux下载地址:[https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.AppImage](https://oss.sqlgpt.cn/release/${{ steps.chat2db_version.outputs.substring }}/Chat2DB-${{ steps.chat2db_version.outputs.substring }}.AppImage)"
}
================================================
FILE: .github/workflows/release_test.yml
================================================
name: Build Test Client
on:
push:
branches:
- "release_test"
jobs:
release:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
file_extension: ".exe"
file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test%20Setup%2099.0.${{ github.run_id }}-Test.exe"
build_arg: "--win --x64"
- os: macos-latest
arch: x86_64
file_name: "https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg"
file_extension: ".dmg"
build_arg: "--mac --x64"
- os: macos-latest
arch: arm64
file_name: "https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test-arm64.dmg"
file_extension: ".dmg"
build_arg: "--mac --arm64"
- os: ubuntu-latest
file_name: "https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.AppImage"
file_extension: ".AppImage"
build_arg: "--linux"
runs-on: ${{ matrix.os }}
steps:
- name: Check out git repository
uses: actions/checkout@main
# Install JRE
- name: Install JRE
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
java-package: "jre"
# architecture: ${{ matrix.arch == 'arm64' && 'aarch64' || 'x64' }}
# OpenTLS
- name: Enable TLS 1.0 and 1.1 in java.security
run: |
if [ "$RUNNER_OS" = "Windows" ]; then
sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
elif [ "$RUNNER_OS" = "Linux" ]; then
sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
elif [ "$RUNNER_OS" = "macOS" ]; then
sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
fi
shell: bash
env:
RUNNER_OS: ${{ runner.os }}
JAVA_HOME: ${{ env.JAVA_HOME }}
# Copy JRE to the front-end static directory
- name: Copy JRE to static directory
run: |
mkdir -p chat2db-client/static
cp -r "$JAVA_HOME"/ chat2db-client/static/jre
if [ "${{ runner.os }}" != "Windows" ]; then
chmod -R 777 chat2db-client/static/jre
fi
shell: bash
env:
JAVA_HOME: ${{ env.JAVA_HOME }}
# Delete related files in jre in Linux
- if: ${{ runner.os == 'Linux' }}
name: Delete File on Linux
run: |
cd chat2db-client/static/jre/
ls -la
rm -rf legal
ls -la
# Install Node.js
- name: Install Node.js
uses: actions/setup-node@main
with:
node-version: "16"
cache: "yarn"
cache-dependency-path: chat2db-client/yarn.lock
# Install Java
- name: Install Java and Maven
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
cache: "maven"
# Packaging web front-end resources
- name: Build FE Static
run: |
cd chat2db-client
yarn
yarn run build:web:prod --app_version=99.0.${{ github.run_id }} --app_port=10822
cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf/
cd src/main
yarn
yarn run build
# Package backend project & send to frontend
- name: Build BE Static
run: |
mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
mkdir -p chat2db-client/versions/99.0.${{ github.run_id }}/static
echo -n 99.0.${{ github.run_id }} > chat2db-client/version
cp -r chat2db-client/version chat2db-client/versions/
cp chat2db-server/chat2db-server-start/target/chat2db-server-start.jar chat2db-client/versions/99.0.${{ github.run_id }}/static/
# Packaging desktop front-end resources
- name: Prepare Build Electron
run: |
cd chat2db-client
yarn run build:web:desktop --app_version=99.0.${{ github.run_id }} --app_port=10822
cp -r dist ./versions/99.0.${{ github.run_id }}/
rm -r dist
# Packaging Electron
- name: Build/release Electron app
uses: samuelmeuli/action-electron-builder@v1
with:
package_root: "chat2db-client/"
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
mac_certs: ${{ secrets.mac_certs_temp }}
mac_certs_password: ${{ secrets.mac_certs_password_temp }}
skip_build: true
args: >
-c.appId=com.chat2db.test
-c.productName=Chat2DB-Test
-c.win.publisherName=Chat2DB-Test
-c.nsis.shortcutName=Chat2DB-Test
-c.extraMetadata.version=99.0.${{ github.run_id }}-Test
${{ matrix.build_arg}}
# Notarization & Signature Mac App
- name: Notarize MacOS x86_64 App
if: matrix.os == 'macos-latest' && matrix.arch == 'x86_64'
run: |
xcrun notarytool store-credentials "Chat2DB" --apple-id "${{ secrets.MAC_APPLE_ID }}" --password "${{ secrets.MAC_APPLE_PASSWORD }}" --team-id "${{ secrets.MAC_TEAM_ID }}"
xcrun notarytool submit chat2db-client/release/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg --keychain-profile "Chat2DB"
- name: Notarize MacOS ARM64 App
if: matrix.os == 'macos-latest' && matrix.arch == 'arm64'
run: |
xcrun notarytool store-credentials "Chat2DB" --apple-id "${{ secrets.MAC_APPLE_ID }}" --password "${{ secrets.MAC_APPLE_PASSWORD }}" --team-id "${{ secrets.MAC_TEAM_ID }}"
xcrun notarytool submit chat2db-client/release/Chat2DB-Test-99.0.${{ github.run_id }}-Test-arm64.dmg --keychain-profile "Chat2DB"
# Build Jar
- name: Prepare upload for Jar
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
run: |
mkdir -p oss_temp_file
cp chat2db-client/versions/99.0.${{ github.run_id }}/static/chat2db-server-start.jar ./oss_temp_file
cp -r chat2db-client/release/*.dmg ./oss_temp_file
cp -r chat2db-client/versions/99.0.${{ github.run_id }}/dist ./oss_temp_file/dist
cd chat2db-client/versions/99.0.${{ github.run_id }}/ && zip -r 99.0.${{ github.run_id }}.zip ./
cp -r 99.0.${{ github.run_id }}.zip ../../../oss_temp_file
cd static/ && zip -r chat2db-server-start.zip ./
cp -r chat2db-server-start.zip ../../../../oss_temp_file
# Prepare files to be sent to OSS
- name: Prepare upload for OSS
run: |
mkdir -p oss_temp_file
cp -r chat2db-client/release/*${{ matrix.file_extension }} ./oss_temp_file
# Set up OSS
- name: Set up oss utils
uses: yizhoumo/setup-ossutil@v1
with:
endpoint: "oss-accelerate.aliyuncs.com"
access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
ossutil-version: "1.7.16"
# Upload to OSS
- name: Upload to OSS
run: |
ossutil cp -rf --acl=public-read ./oss_temp_file/ oss://chat2db-client/test/99.0.${{ github.run_id }}/
# Configure SSH to be uploaded to the server
- name: Install ssh key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SERVER_DOWNLOAD_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -t rsa ${{ secrets.SERVER_DOWNLOAD_HOST }} >> ~/.ssh/known_hosts
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
# upload to server
- name: Upload package
run: |
ssh -t ${{ secrets.SERVER_DOWNLOAD_USERNAME }}@${{ secrets.SERVER_DOWNLOAD_HOST }} "mkdir -p ${{ secrets.SERVER_DOWNLOAD_PATH }}/test//99.0.${{ github.run_id }}"
scp ./oss_temp_file/* ${{ secrets.SERVER_DOWNLOAD_USERNAME }}@${{ secrets.SERVER_DOWNLOAD_HOST }}:${{ secrets.SERVER_DOWNLOAD_PATH }}/test//99.0.${{ github.run_id }}/
# Send to DingTalk
- name: Send dingtalk message
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "${{ matrix.os }}-test-打包完成通知",
"text": "# ${{ matrix.os }}-test-打包完成通知\n !\n ### 任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})\n ### 下载地址:[${{matrix.file_name}}](${{matrix.file_name}})"
}
# Send Jar package address to DingTalk
- if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
name: Send dingtalk message
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "Jar-test-构建完成通知",
"text": "### jar包下载地址:[https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip](https://download.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip) "
}
================================================
FILE: .github/workflows/release_test_2.yml
================================================
name: Build Test Client 2
on:
push:
branches:
- "release_test_2"
jobs:
release:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
file_extension: ".exe"
file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test%20Setup%2099.0.${{ github.run_id }}-Test.exe"
build_arg: "--win --x64"
- os: macos-latest
arch: x86_64
file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg"
file_extension: ".dmg"
build_arg: "--mac --x64"
- os: macos-latest
arch: arm64
file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test-arm64.dmg"
file_extension: ".dmg"
build_arg: "--mac --arm64"
- os: ubuntu-latest
file_name: "https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/Chat2DB-Test-99.0.${{ github.run_id }}-Test.AppImage"
file_extension: ".AppImage"
build_arg: "--linux"
runs-on: ${{ matrix.os }}
steps:
- name: Check out git repository
uses: actions/checkout@main
# Install JRE
- name: Install JRE
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
java-package: "jre"
# architecture: ${{ matrix.arch == 'arm64' && 'aarch64' || 'x64' }}
# Open TLS
- name: Enable TLS 1.0 and 1.1 in java.security
run: |
if [ "$RUNNER_OS" = "Windows" ]; then
sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
elif [ "$RUNNER_OS" = "Linux" ]; then
sed -i "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
elif [ "$RUNNER_OS" = "macOS" ]; then
sed -i '' "s/\(^jdk.tls.disabledAlgorithms=\)\(.*\)\(TLSv1, TLSv1.1,\)\(.*\)/\1\2\4/" "$JAVA_HOME/conf/security/java.security"
fi
shell: bash
env:
RUNNER_OS: ${{ runner.os }}
JAVA_HOME: ${{ env.JAVA_HOME }}
# Copy JRE to the front-end static directory
- name: Copy JRE to static directory
run: |
mkdir -p chat2db-client/static
cp -r "$JAVA_HOME"/ chat2db-client/static/jre
if [ "${{ runner.os }}" != "Windows" ]; then
chmod -R 777 chat2db-client/static/jre
fi
shell: bash
env:
JAVA_HOME: ${{ env.JAVA_HOME }}
# Delete related files in jre in Linux
- if: ${{ runner.os == 'Linux' }}
name: Delete File on Linux
run: |
cd chat2db-client/static/jre/
ls -la
rm -rf legal
ls -la
# Install Node.js
- name: Install Node.js
uses: actions/setup-node@main
with:
node-version: "16"
cache: "yarn"
cache-dependency-path: chat2db-client/yarn.lock
# Install Java
- name: Install Java and Maven
uses: actions/setup-java@main
with:
java-version: "17"
distribution: "temurin"
cache: "maven"
# Packaging web front-end resources
- name: Build FE Static
run: |
cd chat2db-client
yarn
yarn run build:web:prod --app_version=99.0.${{ github.run_id }} --app_port=10822
cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf/
cd src/main
yarn
yarn run build
# Package backend project & send to frontend
- name: Build BE Static
run: |
mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml
mkdir -p chat2db-client/versions/99.0.${{ github.run_id }}/static
echo -n 99.0.${{ github.run_id }} > chat2db-client/version
cp -r chat2db-client/version chat2db-client/versions/
cp chat2db-server/chat2db-server-start/target/chat2db-server-start.jar chat2db-client/versions/99.0.${{ github.run_id }}/static/
# Packaging desktop front-end resources
- name: Prepare Build Electron
run: |
cd chat2db-client
yarn run build:web:desktop --app_version=99.0.${{ github.run_id }} --app_port=10822
cp -r dist ./versions/99.0.${{ github.run_id }}/
rm -r dist
# Packing Electron
- name: Build/release Electron app
uses: samuelmeuli/action-electron-builder@v1
with:
package_root: "chat2db-client/"
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
mac_certs: ${{ secrets.mac_certs }}
mac_certs_password: ${{ secrets.mac_certs_password }}
skip_build: true
args: >
-c.appId=com.chat2db.test
-c.productName=Chat2DB-Test
-c.win.publisherName=Chat2DB-Test
-c.nsis.shortcutName=Chat2DB-Test
-c.extraMetadata.version=99.0.${{ github.run_id }}-Test
${{ matrix.build_arg}}
# Notarization & Signature Mac App
- name: Notarize MacOS x86_64 App
if: matrix.os == 'macos-latest' && matrix.arch == 'x86_64'
run: |
xcrun notarytool store-credentials "Chat2DB" --apple-id "${{ secrets.MAC_APPLE_ID }}" --password "${{ secrets.MAC_APPLE_PASSWORD }}" --team-id "${{ secrets.MAC_TEAM_ID }}"
xcrun notarytool submit chat2db-client/release/Chat2DB-Test-99.0.${{ github.run_id }}-Test.dmg --keychain-profile "Chat2DB"
# Build Jar
- name: Prepare upload for Jar
if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
run: |
mkdir -p oss_temp_file
cp chat2db-client/versions/99.0.${{ github.run_id }}/static/chat2db-server-start.jar ./oss_temp_file
cp -r chat2db-client/release/*.dmg ./oss_temp_file
cp -r chat2db-client/versions/99.0.${{ github.run_id }}/dist ./oss_temp_file/dist
cd chat2db-client/versions/99.0.${{ github.run_id }}/ && zip -r 99.0.${{ github.run_id }}.zip ./
cp -r 99.0.${{ github.run_id }}.zip ../../../oss_temp_file
cd static/ && zip -r chat2db-server-start.zip ./
cp -r chat2db-server-start.zip ../../../../oss_temp_file
# Prepare files to be sent to OSS
- name: Prepare upload for OSS
run: |
mkdir -p oss_temp_file
cp -r chat2db-client/release/*${{ matrix.file_extension }} ./oss_temp_file
# Set up OSS
- name: Set up oss utils
uses: yizhoumo/setup-ossutil@v1
with:
endpoint: "oss-accelerate.aliyuncs.com"
access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
ossutil-version: "1.7.16"
# Upload to OSS
- name: Upload to OSS
run: |
ossutil cp -rf --acl=public-read ./oss_temp_file/ oss://chat2db-client/test/99.0.${{ github.run_id }}/
# Send to DingTalk
- name: Send dingtalk message
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "${{ matrix.os }}-test-打包完成通知",
"text": "# ${{ matrix.os }}-test-打包完成通知\n \n ### 任务id:[${{ github.run_id }}](https://github.com/chat2db/Chat2DB/actions/runs/${{ github.run_id }})\n ### 下载地址:[${{matrix.file_name}}](${{matrix.file_name}})"
}
# Send Jar address to DingTalk
- if: ${{ runner.os == 'macOS' && matrix.arch == 'x86_64' }}
name: Send dingtalk message
uses: ghostoy/dingtalk-action@master
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
{
"title": "Jar-test-构建完成通知",
"text": "### jar包下载地址:[https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip](https://oss.sqlgpt.cn/test/99.0.${{ github.run_id }}/chat2db-server-start.zip) "
}
================================================
FILE: .gitignore
================================================
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.out
### Visual Studio Code ###
package-lock.json
### Mac
.DS_Store
/chat2db-server/ali-dbhub-server-start/src/main/resources/static/front/*
/chat2db-server/ali-dbhub-server-start/src/main/resources/thymeleaf
### docker 数据不用上传
/docker/redis/data/*
/docker/test/reds/*
/docker/test/mongodb/*
/chat2db-server/ali-dbhub-server-domain/ali-dbhub-server-domain-support/src/main/resources/lib/*
/chat2db-server/ali-dbhub-server-domain/ali-dbhub-server-domain-support/lib/*
/lib
/out/*
================================================
FILE: .vscode/settings.json
================================================
{
"cSpell.words": [
"aarch",
"ahooks",
"alicdn",
"aliyuncs",
"altool",
"andale",
"antd",
"asar",
"AZUREAI",
"bgcolor",
"blockmap",
"cascader",
"charsets",
"chmod",
"CLOB",
"Consolas",
"Datas",
"datasource",
"Datetime",
"DBAI",
"DBHUB",
"Dchat",
"dingtalk",
"Dloader",
"Dmaven",
"Dproject",
"Dserver",
"Dspring",
"echart",
"echarts",
"favicons",
"fulltext",
"ghostoy",
"hljs",
"iconfont",
"indexs",
"jdbc",
"kingbase",
"lucida",
"macos",
"Mddhhmmss",
"Menlo",
"mkdir",
"monaco",
"msgtype",
"Navciat",
"Navicat",
"nsis",
"OPENAI",
"ossutil",
"partialize",
"pgsql",
"plsql",
"pnpm",
"Popconfirm",
"Prec",
"quickinput",
"redownload",
"remaininguses",
"RESTAI",
"samuelmeuli",
"scroller",
"Sercurity",
"singlestoredb",
"sortablejs",
"SQLSERVER",
"temurin",
"thymeleaf",
"Tigger",
"togglefullscreen",
"transactsql",
"trino",
"umijs",
"umirc",
"USERANDPASSWORD",
"uuidv",
"VARCHAR",
"VIEWCOLUMN",
"VIEWCOLUMNS",
"wechat",
"wireframe",
"Wppk",
"xcrun",
"yapi",
"yizhoumo",
"zustand"
],
"java.compile.nullAnalysis.mode": "automatic"
}
================================================
FILE: CHANGELOG.md
================================================
## 3.1.19
`2024-1-3`
**Changelog**
- ⭐【New Features】Open table supports filtering sort
- ⚡️【Optimize】Optimize startup speed
- 🐞【Fixed】SQL error generated by modifying the table structure
- 🐞【Fixed】The problem of direct query table data error due to characters
- 🐞【Fixed】null point error
## 3.1.18
`2023-12-28`
**Changelog**
- 🐞【Fixed】 docker startup error
## 3.1.17
`2023-12-27`
**Changelog**
- ⭐【New Features】Connection replicable
- ⚡️【Optimize】Select the table to view the DDL of the table in Information on the right expansion bar
- 🐞【Fixed】 Modifying table sorting does not generate sorting SQL problems
- 🐞【Fixed】Home connection cannot switch pages
- 🐞【Fixed】Columns cannot be viewed or edited in some tables of the Oracle database
## 3.1.16
`2023-12-25`
**Changelog**
- ⭐【New Features】Execute the Record sql Add replication button
- ⭐【New Features】Execution records can be opened directly in the console
- ⭐【New Features】The SQL column on the right of execution record and save can be expanded and dragged
- 🐞【Fixed】Some databases could not display the Database/Schema structure
- 🐞【Fixed】During web deployment, a page error occurs after the page switching page is refreshed
- ⚡️【Optimize】The query result cancels in-cell scrolling and instead uses hover to view cell contents
## 3.1.15
`2023-12-20`
**Changelog**
- 🐞【Fixed】Every time I open the application, I occasionally cannot select the database problem
- 🐞【Fixed】Compatible with old data types can not show deletion problems
- 🐞【Fixed】Some databases cannot display the database /Schema structure
## 3.1.14
`2023-12-17`
**Changelog**
- 🐞【Fixed】Tree structure search for bugs
- 🐞【Fixed】Switching tab causes edit data reset problem
- 🐞【Fixed】Rename is reset after switching tab
## 3.1.12
`2023-12-15`
**Changelog**
- ⚡️【Optimize】Optimized tree structure search
- ⚡️【Optimize】Tree structure search box resident
## 3.1.11
`2023-12-13`
**Changelog**
- 🐞【Fixed】A chart with a Schema cannot be saved and executed
- 🐞【Fixed】Failure to start after the upgrade
## 3.1.1
`2023-12-13`
**Changelog**
- 🐞【Fixed】Table blank problem when switching Tabs
- 🐞【Fixed】DM or Oracle cannot display Schema
- 🐞【Fixed】The import connection is lost. Procedure
## 3.1.0
`2023-12-12`
**Changelog**
- 🔥🔥【Optimize】The first startup time has been increased by 65%
- 🔥🔥【Optimize】Changed the structure of the left tree
- 🔥🔥【Optimize】Optimized the tab switchover problem
- ⚡️ 【Optimize】All nodes are supported. The name of each node can be copied
- ⚡️【Optimize】The sql console input box supports switching databases, and will not change when the left database is switched
- ⭐ 【New Features】Save records moved to the right toolbar, you can directly modify the name in the list
- ⭐【New Features】Support mongoDB
- ⭐【New Features】Support for viewing all tables
## 3.0.14
`2023-11-20`
**Changelog**
- 🐞【Fixed】Team paging problem
- 🐞【Fixed】Oracle service name bug
- 🐞【Fixed】Oracle datatype error
- 🐞【Fixed】Fixed an issue where MySQL changed table structure without displaying comments.
- ⚡️【Optimize】Support database or schema
- 【Developer】Friends don't worry, the company has some things recently, and is preparing 3.1.0, be patient
## 3.0.13
`2023-11-15`
**Changelog**
- 🐞【Fixed】oracle datatype error
- 🐞【Fixed】DM index error
## 3.0.12
`2023-11-13`
**Changelog**
- 🐞【Fixed】Copy as insert first row lost problem
- 🐞【Fixed】DM database index bug
- 🐞【Fixed】Point Garbled code problem
- 🐞【Fixed】MariaDB connec database bug
- 🐞【Fixed】Issues 792 NullPointerException
- 🐞【Fixed】Kingbase8r6 error
## 3.0.11
`2023-11-08`
**Changelog**
- ⭐【New Features】Oracle connections support the Service name mode
- ⭐【New Features】【New function】 Edit table data to support batch copy, clone, delete (click 1X1 cell to select/cancel, hold down shift/ctrl/cmd to select multiple)
- ⚡️【Optimize】After the update is completed, click restart to close the problem that cannot be automatically opened (hot update cannot fix this problem, you need to download a new version to cover the client)
- 🐞【Fixed】database and schema searches support case ambiguity matching
- 🐞【Fixed】Where database was not displayed after being added
- 🐞【Fixed】sql formatting to ·now()· format error
## 3.0.10
`2023-11-06`
**Changelog**
- ⭐【New Features】Add multiple CN AI configurations Add multiple domestic AI configurations
- Supports single-row replication of Insert, Update, table header fields, and row data
- Clone the selected row
- Replication of cell data is supported
- You can set the cell to Null or Default
- Row deletion is supported
- Supports zooming in to view or modify data
- ⭐【New Features】Supports the ctrl/cmd+c shortcut to copy row data or cell data
- ⭐【New Features】Supports the shortcut key ctrl/cmd+v to paste and copy row data/cell data to row/cell
- ⭐【New Features】Edit table structure supports setting primary keys in columns
- ⭐【New Features】History is added to the foldable panel on the right
- ⭐【New Features】Edit data to support cell-level undo changes
- ⭐【New Features】The Table tree node operation menu on the left supports copying table, field, key, index, and function names
- ⭐【New Features】The node in the left Table tree supports ctrl/cmd+c to copy the node text
- ⭐【New Features】You can right-click to close tabs, close other tabs, or close all tabs
- ⭐【New Features】Top database and schema support search
- ⚡️【Optimize】Smart prompts for SQL editing
- ⚡️【Optimize】Edit the table structure to add loading
- ⚡️【Optimize】The tree node operation menu supports right-clicking
- 🐞【Fixed】Fixed table structure editing floating-point decimal Settings display exception
- 🐞【Fixed】Fixed switching the saved sql on the console will eliminate the problem
- 🐞【Fixed】After multiple tables are paged, the context cannot select a table other than the current page
- 🐞【Fixed】Console and resulting Tabs mouse wheel not scrolling
## 3.0.9
`2023-11-01`
**Changelog**
- ⭐【New Features】Query results can be refreshed
- ⚡️【Optimize】Console Tabs adaptive width
- 🐞【Fixed】console save bug
- 🐞【Fixed】sqlite can only retrieve one piece of data
## 3.0.5
`2023-10-23`
**Changelog**
- ⭐【New Features】Supports visual database creation
- ⭐【New Features】Support hot update
- ⭐【New Features】Double-click the table to open it directly
- ⚡️【Optimize】The search table supports size fuzzy matching
- ⚡️【Optimize】Sort Database and Schema at the top
- ⚡️【Optimize】The queried data supports editing and modification in the large popup window of the view
- ⚡️【Optimize】Example Query the page loading effect of data
- ⚡️【Optimize】Keep the top focused tab always in the viewable area
- ⚡️【Optimize】Query data cell does not have scroll bar problem
## 3.0.4
`2023-10-20`
**Changelog**
- 🐞【Fixed】Bugs are displayed when more than 100 data items are queried
## 3.0.1
`2023-10-19`
**Changelog**
- ⚡️【Optimize】Search result scroll bar
- ⚡️【Fixed】Oracle update result data bug
## 3.0.0
`2023-10-17`
**Changelog**
- 🔥【New Features】Support for team collaboration mode
- 🔥【New Features】Support for visual table structure creation, editing, and deletion
- 🔥【New Features】Support for editing, adding, and deleting query data results
- ⭐【New Features】Support the feature of importing Navicat/DBever data source links
- ⭐【New Features】Support for AI automatic sync table structure。
- ⭐【New Features】Support export table structure
- ⭐【New Features】Support importing SQL files
- ⭐【New Features】Support the connection supports adding an environment,better distinguishing between online and daily
- ⚡️【Optimize】Optimize Editor Intellisense
- ⚡️【Optimize】Optimize AI Input
- ⚡️【Optimize】Sql query support is stopped
- ⚡️【Optimize】Sql execution supports viewing the number of affected rows
- ⚡️【Optimize】Reclaiming non-administrator permissions to edit shared connections
- ⚡️【Optimize】`Cmd/Ctrl + R` Run SQL, `Cmd/Ctrl + Shift + R` Refresh Page
- 🐞【Fixed】Table operation columns are overridden by table comments
- 🐞【Fixed】The last Tab in the query result cannot be closed
## 2.1.0
## ⭐ New Features
- 🔥The team function is newly launched, supporting team collaboration. R&D does not require knowing the online database
password, solving the security issue of enterprise database accounts. It is recommended to directly deploy the team
function using 'docker'
- Added support for environment selection, better distinguishing between online and daily
## 2.0.14
## 🐞 Bug Fixes
- Fix the issue of 'Oracle' query 'Blob' reporting errors
- Modify the paging logic and fix some SQL queries that cannot be queried
## 2.0.13
## ⭐ New Features
## 🐞 Bug Fixes
- Fixed a bug where sql formatting was not selected
- Fixed open view lag issue
- Solve the white screen problem of connected non-relational databases (non-relational databases are not supported)
## 2.0.12
## ⭐ New Features
- 🔥Supports viewing views, functions, triggers, and procedures
- Support selected sql formatting
- Added new dark themes
## 🐞 Bug Fixes
- Fixed sql formatting failure issue
- Fixed an issue where locally stored theme colors and background colors are incompatible with the new version, causing
page crashes
- Logs desensitize sensitive data
- Fix the issue of 'CLOB' not displaying specific content 【Issue #440】(https://github.com/chat2db/Chat2DB/issues/440)
- Fix the problem that non-Select does not display query results
- Fix the problem that Oracle cannot query without schema
- Fix the problem of special type of SQL execution error reporting
- Fix the problem that the test link is successful, but the error is reported when saving the link
## 2.0.11
## 🐞 Bug Fixes
- Fix the issue where SSH does not support older versions of encryption algorithms
- Fix the issue of SQL Server 2008 not being able to connect
- Fix the issue of not being able to view table name notes and field notes
## 2.0.10
## 🐞 Bug Fixes
- Activate the console for the latest operation when you create or start a console、Records the last console used
- The replication function of the browser, such as edge, is unavailable
- table Indicates an error when ddl is exported after the search
- Adds table comments and column field types and comments
## 2.0.9
## 🐞 Bug Fixes
-Fix the issue of Windows flash back
## 2.0.8
## 🐞 Bug Fixes
- Repair the Scientific notation in some databases 【Issue #378】(https://github.com/chat2db/Chat2DB/issues/378)
- Fix some cases where data is not displayed
## 🐞 问题修复
- 修复部分数据库出现科学计数法的情况 【Issue #378】(https://github.com/chat2db/Chat2DB/issues/378)
- 修复部分情况数据不展示
## 2.0.7
## ⭐ New Features
- Export query result as file is supported
## 🐞 Bug Fixes
- Fixed ai config issues 【Issue #346】(https://github.com/chat2db/Chat2DB/issues/346)
## 2.0.6
## 🐞 Bug Fixes
- Fixed: When there are too many tables under the selected library, the "New Console" button at the bottom
disappears 【Issue #314】(https://github.com/chat2db/Chat2DB/issues/314)
## 2.0.5
## ⭐ New Features
- Supports 25 free uses of AIGC every day.
- Support for querying data pagination.
- Support switching between multiple databases in PostgreSQL.
- Support for hot updating of client-side code allows for rapid bug fixes.
## 🐞 Bug Fixes
- Default return alias for returned results 【Issue #270】(https://github.com/chat2db/Chat2DB/issues/270)
- Fixed around 100 bugs, of course, many were repetitive bugs.
## 2.0.4
## ⭐ New Features
- Support DB2 database
- Support renaming after console saving
- Support prompts during SQL execution
## 🐞 Bug Fixes
- Fix the bug that the database in sqlserver is all numbers
- Fix ssh connection bug
## 2.0.2
## ⭐ New Features
- Brand new AI binding process
- Support for custom drivers
## 🐞 Bug Fixes
- Optimized dataSource link editing
- Enhanced error messages
- Improved table selection interaction
- Enhanced table experience
## 2.0.1
## 🐞 Bug Fixes
- Fix bug where executing multiple SQL statements at once will prompt for exceptions
- Fix getJDBCDriver error: null 【Issue #123】(https://github.com/chat2db/Chat2DB/issues/123)
- Fixing the Hive connection and then viewing columns results in an
error. 【Issue #136】(https://github.com/chat2db/Chat2DB/issues/136)
## 2.0.0
## What's Changed
- 🔥An intelligent solution that perfectly integrates SQL queries, AI assistant, and data analysis.
- 🔥New focused mode experience for advanced datasource management.
- AI integration of more LLM.
- Bilingual in Chinese and English support for client.
## 1.0.11
- fixed: SQL 有特殊字符时 AI 功能无法正常使用
- 增减版本信息检测
## 1.0.10
- fixed: The formatted SQL is abnormal
- Optimized AI network connection exception message
- Custom AI Adds a local example
- Support OceanBase Presto DB2 Redis MongoDB Hive KingBase
## 1.0.9
- Fixed an issue where Open Ai could not connect
- Support domestic Dameng database
- Supports custom OPEN AI API_HOST
- 🔥 Supports custom AI interfaces
- Support theme color following system
## 1.0.6
- Fixed Oracle database character set issues
- Fix mac installation prompts for security issues
## 1.0.5
- 🔥 Optimizes the boot speed of Apple chips
- Rectify database connection problems on Windows
- The database modification does not take effect
- NullPointerException
## 1.0.4
- Fix ClickHouse jdbc issues
- Restore the NPE managed by the connection pool
- Fixed front-end edit data source error
- Added default database properties
## 1.0.3
- 🔥 Supports SSH connection to the database
- 🎉 Allows a client to view logs
- 🎉 Supports chat sessions on the Console
- Supports setting OPENAI agents on clients
- An application that has been started will not be started again
## 1.0.1
- Fixed oracle connection configuration editing and connection query issues
- Fix possible risks of Apikey output to logs
- Fixed the login bug of web version
## 1.0.0
- Fixed oracle connection configuration editing and connection query issues
- Fix possible risks of Apikey output to logs
- repair bugChat2DB login web version 1.0.0 release come 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉
- 🌈 AI intelligent assistant, supports natural language to SQL, SQL to natural language, and SQL optimization suggestions
- 👭 Support team collaboration, R & D does not need to know the online database password, to solve the security problem of enterprise database account
- ⚙️ Provides powerful data management capabilities, including data tables, views, stored procedures, functions, triggers, indexes, sequences, users, roles, and authorization
- 🔌 Powerful expansion ability, currently supports Mysql, PostgreSQL, Oracle, SQLServer, ClickHouse, Oceanbase, H2, SQLite and so on, the future will support more databases
- 🛡 The front-end is developed using Electron, providing an integrated solution of Windows, Mac, Linux clients, and web versions
- 🎁 Supports environment isolation and separation of online and daily data rights
## 0.0.0
`2023--`
**Changelog**
- ⭐【New Features】
- ⚡️【Optimize】
- 🐞【Fixed】
================================================
FILE: CHANGELOG_CN.md
================================================
## 3.1.19
`2024-1-3`
**更新日志**
- ⭐【新功能】打开表支持筛选排序
- ⚡️【优化】优化启动速度
- 🐞【修复】修改表结构生成SQL错误
- 🐞【修复】直接查询表因字符导致数据错误的问题
- 🐞【修复】null point error
## 3.1.18
`2023-12-28`
**更新日志**
- 🐞【修复】docker启动报错问题
## 3.1.17
`2023-12-27`
**更新日志**
- ⭐【新功能】连接可复制
- ⚡️【优化】选中表可直接在右侧拓展栏的“信息”中查看表DDL
- 🐞【修复】修改表排序无法生成排序SQL问题
- 🐞【修复】Oracle数据库部分表无法查看列、无法编辑问题
- 🐞【修复】团队管理归属连接无法切换分页
## 3.1.16
`2023-12-25`
**更新日志**
- ⭐【新功能】执行记录添加复制sql按钮
- ⭐【新功能】执行记录可直接在控制台打开
- ⭐【新功能】右侧执行记录、保存SQL栏展开大小可拖动
- 🐞【修复】部分数据库无法显示数据库/Schema结构的问题
- 🐞【修复】网页部署时,切换页面刷新后页面报错问题
- ⚡️【优化】查询结果取消单元格内滚动,改为hover查看单元格内容
## 3.1.15
`2023-12-20`
**更新日志**
- 🐞【修复】每次打开应用时,偶现无法选择数据库问题
- 🐞【修复】兼容老数据类型无法显示删除问题
## 3.1.14
`2023-12-17`
**更新日志**
- 🐞【修复】树结构搜索bug
- 🐞【修复】切换tab导致编辑数据重置问题
- 🐞【修复】切换tab后重命名被重置
## 3.1.12
`2023-12-15`
**更新日志**
- ⚡️【优化】优化树结构搜索
- ⚡️【优化】树结构搜索框常驻
## 3.1.11
`2023-12-13`
**更新日志**
- 🐞【修复】带Schema的图表无法保存和执行
- 🐞【修复】升级后无法启动问题
## 3.1.10
`2023-12-13`
**更新日志**
- 🐞【修复】切换Tabs时,表空白问题
- 🐞【修复】DM、Oracle无法显示Schema问题
- 🐞【修复】导入连接丢失问题
## 3.1.0
`2023-12-12`
**更新日志**
- 🔥🔥【优化】首次启动时间时间提升了65%
- 🔥🔥【优化】更改了左侧树的结构
- 🔥🔥【优化】优化切换tab卡顿问题
- ⚡️【优化】所有节点都支持选中,可以复制每个节点的名称
- ⚡️【优化】sql的console输入框支持切换数据库,不会在跟着左侧数据库的切换而改变了
- ⭐【新功能】保存记录移动到了右侧工具栏,可以直接在列表里修改名称
- ⭐【新功能】支持mongoDB
- ⭐【新功能】支持查看所有表
## 3.0.14
`2023-11-20`
**更新日志**
- 🐞【修复】团队分页问题
- 🐞【修复】Oracle服务名称错误
- 🐞【修复】Oracle数据类型错误
- 🐞【修复】修复MySQL修改表结构,不回显注释的问题。
- ⚡️【优化】支持数据库或模式
- 【开发者】友友们不要着急呀,最近公司有些事情,并且在准备3.1.0,耐心等待哦
## 3.0.13
`2023-11-15`
**更新日志**
- 🐞【修复】oracle datatype 错误
- 🐞【修复】DM index 错误
## 3.0.12
`2023-11-13`
**更新日志**
- 🐞【修复】复制为insert第一行丢失问题
- 🐞【修复】达梦数据库index问题
- 🐞【修复】Point 乱码问题
- 🐞【修复】MariaDB连接数据库错误
- 🐞【修复】#792 NullPointerException
- 🐞【修复】Kingbase8r6 错误
## 3.0.11
`2023-11-10`
**更新日志**
- ⭐【新功能】Oracle 连接支持 Service name 方式
- ⭐【新功能】编辑表数据支持批量复制、克隆、删除(点击1X1单元格全选/取消,按住shift/ctrl/cmd多选)
- ⚡️【优化】更新完成后点击重启关闭后无法自动打开问题(热更新无法修复该问题,需要下载新版版本覆盖客户端)
- 🐞【修复】database和schema搜索支持大小写模糊匹配
- 🐞【修复】添加database后不显示问题
- 🐞【修复】sql格式化对·now()·格式错误问题
## 3.0.10
`2023-11-06`
**更新日志**
- ⭐【新功能】增加多个国内 AI 配置
- ⭐【新功能】编辑数据支持右键操作
- 支持单行复制 Insert、Update、表头字段、行数据
- 支持克隆选中行
- 支持复制单元格数据
- 支持设置单元格为Null和Default
- 支持删除行
- 支持放大查看或修改数据
- ⭐【新功能】支持快捷键ctrl/cmd+c 复制行数据/单元格数据
- ⭐【新功能】支持快捷键ctrl/cmd+v 粘贴复制行数据/单元格数据到行/单元格
- ⭐【新功能】编辑表结构支持在列中设置主键
- ⭐【新功能】编辑数据支持单元格级别撤销修改
- ⭐【新功能】左侧Table树节点操作菜单支持复制表、字段、key、index、函数等名称
- ⭐【新功能】左侧Table树节点支持ctrl/cmd+c 复制节点文本
- ⭐【新功能】右侧可折叠面板中增加历史记录
- ⭐【新功能】支持右键关闭tab/关闭其他tab/关闭所有tab
- ⭐【新功能】顶部database和schema支持搜索
- ⚡️【优化】SQL 编辑时的智能提示
- ⚡️【优化】编辑表结构添加loading
- ⚡️【优化】树节点操作菜单支持右键唤出
- 🐞【修复】修复表结构编辑浮点数小数位设置显示异常
- 🐞【修复】修复切换控制台保存的sql会消失问题
- 🐞【修复】表多的分页后,上下文选不到当前分页以外的表
- 🐞【修复】console和结果的Tabs鼠标滚轮无法滚动的问题
## 3.0.9
`2023-11-01`
**更新日志**
- ⭐【新功能】查询结果支持刷新
- ⚡️【优化】控制台Tabs自适应宽度
- 🐞【修复】console保存bug
- 🐞【修复】sqlite只能查到一条数据问题
## 3.0.5
`2023-10-23`
**更新日志**
- ⭐【新功能】支持可视化创建数据库
- ⭐【新功能】支持热更新
- ⭐【新功能】双击表直接打开表
- ⚡️【优化】搜索表支持大小模糊匹配
- ⚡️【优化】Database 和 Schema 排序
- ⚡️【优化】查询的数据支持在查看的大的弹窗中编辑修改
- ⚡️【优化】查询数据翻页loading效果
- ⚡️【优化】保持顶部聚焦的tab永远在可视区域内
- ⚡️【优化】查询数据单元格没有滚动条问题
## 3.0.4
`2023-10-20`
**更新日志**
- 🐞【修复】查询数据超过100条时显示bug
## 3.0.1
`2023-10-19`
**更新日志**
- ⚡️【优化】查询结果滚动条
- 🐞【修复】Oracle更新结果数据错误
## 3.0.0
`2023-10-17`
**更新日志**
- 🔥【新功能】支持团队协作模式
- 🔥【新功能】支持可视化表结构新增、编辑、删除
- 🔥【新功能】支持查询数据结果编辑、新增、删除
- ⭐【新功能】支持导入Navicat/DBeaver数据源链接的功能
- ⭐【新功能】支持AI自动同步表结构
- ⭐【新功能】支持导出表结构
- ⭐【新功能】支持导入sql文件
- ⭐【新功能】连接支持添加环境标识,更好地区分在线和日常
- ⚡️【优化】优化编辑器提示功能
- ⚡️【优化】优化AI输入
- ⚡️【优化】sql查询支持停止
- ⚡️【优化】sql执行支持查看影响行数
- ⚡️【优化】回收非管理员编辑共享连接权限
- ⚡️【优化】`Cmd/Ctrl + R` 运行SQL, `Cmd/Ctrl + Shift + R` 刷新页面
- 🐞【修复】表操作列被表注释覆盖问题
- 🐞【修复】查询结果最后一个Tab无法关闭问题
## 2.1.0
## ⭐ 新特性
-🔥 新推出团队功能,支持团队协作。研发不需要知道在线数据库
密码,解决企业数据库帐号的安全问题。建议直接部署团队
使用'docker'的函数 -增加了环境选择的支持,更好地区分在线和日常
## 2.0.14
## ⭐ 新特性
- 🔥 团队功能全新上线,支持团队协作,研发无需知道线上数据库密码,解决企业数据库账号安全问题,团队功能建议直接使用 `docker` 部署
- 新增支持环境选择,更好的区分线上、日常环境
## 🐞 问题修复
- 修复 `Oracle` 查询 `Blob` 报错的问题
- 修改分页逻辑,修复部分 SQL 无法查询
## 2.0.13
## 🐞 问题修复
- 修复不选中 sql 格式化的 bug
- 修复打开视图卡顿问题
- 解决已连接的非关系型数据库打开白屏问题(暂不支持非关系性数据库)
## 2.0.12
## ⭐ 新特性
- 🔥 支持查看视图、函数、触发器、存储过程
- 支持选中 sql 格式化
- 增加新的暗色主题
## 🐞 问题修复
- 修复 sql 格式化会失败问题
- 修复本地存储的主题色、背景色与新版本不兼容时会导致页面崩溃问题
- 日志对敏感数据进行脱敏
- 修复 `CLOB` 不展示具体内容的问题 [Issue #440](https://github.com/chat2db/Chat2DB/issues/440)
- 修复非 Select 不展示查询结果的问题
- 修复 Oracle 不带 schema 无法查询的问题
- 修复特殊类型的 SQL 执行报错的问题
- 修复测试链接成功,但保存链接报错的问题
## 2.0.11
## 🐞 问题修复
- 修复 SSH 不支持老版本加密算法的问题
- 修复 SQLServer2008 无法连接的问题
- 修复无法查看表名备注、字段备注的问题
## 2.0.10
## 🐞 问题修复
- 新建、开打 console 时激活最新操作的 console、记录最后一次使用的 console
- edge 等浏览器复制功能无法正常使用
- table 搜索后导出 ddl 报错
- 增加表注释以及列字段类型和注释
- 当数据源添加了 database 默认选择第一个 database
## 2.0.9
## 🐞 问题修复
- 修复 windows 闪退的问题
## 2.0.8
## 🐞 问题修复
- 修复部分数据库出现科学计数法的情况 [Issue #378](https://github.com/chat2db/Chat2DB/issues/378)
- 修复部分情况数据不展示
## 2.0.7
## ⭐ 新特性
- 支持导出查询结果
## 🐞 问题修复
- 修复 ai 配置 [Issue #346](https://github.com/chat2db/Chat2DB/issues/346)
## 2.0.6
## 🐞 问题修复
- Fixed: 当选择的库下面表过多时最下面的“新建控制台”按钮消失 [Issue #314](https://github.com/chat2db/Chat2DB/issues/314)
## 2.0.5
## ⭐ 新特性
- 支持每天 25 次免费使用 AIGC
- 支持查询数据分页
- 支持 PostgreSQL 数据库多个 database 的切换
- 支持客户端代码热更新可以快速修复 bug
- 支持客户端字体放大缩小
## 🐞 问题修复
- 返回结果默认返回别名 [Issue #270](https://github.com/chat2db/Chat2DB/issues/270)
- 修复了 100 个左右的 bug,当然很多是重复 bug
## 2.0.4
## ⭐ 新特性
- 支持 DB2 数据库
- 支持控制台保存后重命名
- 支持 SQL 执行中提示
## 🐞 问题修复
- 修复 sqlserver 中 database 全是数字的 bug
- 修复 ssh 连接 bug
## 2.0.2
## ⭐ 新特性
- 全新的 AI 绑定流程
- 支持自定义驱动
## 🐞 问题修复
- 优化 dataSource 链接编辑
- 优化错误提示
- 优化选表交互
- 优化表格体验
## 2.0.1
## 🐞 问题修复
- 修复一次性执行多条 SQL 会提示异常的 BUG
- 修复 getJDBCDriver error: null [Issue #123](https://github.com/chat2db/Chat2DB/issues/123)
- 修复 hive 方式连接,然后查看 columns 报错 [Issue #136](https://github.com/chat2db/Chat2DB/issues/136)
## 2.0.0
## 更新内容
- 🔥SQL 查询、AI 查询和数据报表完美集成的一体化解决方案设计与实现
- 🔥 数据源连接和管理进阶为专注模式的全新体验设计与实现
- 🔥AI 对话 SQL 升级为极简模式的全新交互设计与实现
- 客户端 AI 体验重大升级,响应更多用户的诉求
- 集成更多 AI 模型
- 客户端双语支持
- SQL 查询基础功能优化
- Issue 问题修复
## 1.0.11
- fixed: SQL 有特殊字符时 AI 功能无法正常使用
- 增减版本信息检测
## 1.0.10
- fixed: 格式化 SQL 异常
- 优化 AI 网络连接异常提示
- 自定义 AI 添加本地样例
- Support OceanBase Presto DB2 Redis MongoDB Hive KingBase
## 1.0.9
- 修复 Open Ai 无法连接的问题
- 支持国产达梦数据库
- 支持自定义 OPEN AI API_HOST
- 🔥 支持自定义 AI 接口
- 支持主题色跟随系统
## 1.0.6
- 修复 Oracle 数据库字符集问题
- 修复 mac 安装提示的安全问题
## 1.0.5
- 🔥 优化 Apple 芯片的启动速度
- 修复 Windows 端数据库连接问题
- 修改 database 不生效
- NullPointerException
## 1.0.4
- 修复 ClickHouse jdbc 问题
- 修复连接池管理的 NPE
- 修复前端编辑数据源报错问题
- 增加数据库默认属性配置
## 1.0.3
- 🔥 支持 SSH 连接数据库
- 🎉 支持客户端查看日志
- 🎉 支持在 Console 中聊天对话
- 支持在客户端内设置 OPENAI 代理
- 已经启动过应用不会再重复启动
## 1.0.1
- 修复 oracle 连接配置编辑、以及连接查询问题
- 修复 Apikey 输出到日志可能存在的风险
- 修复 web 版本登录的 bug
## 1.0.0
Chat2DB 的 1.0.0 正式版来啦 🎉🎉🎉🎉🎉🎉🎉🎉🎉
- 🌈 AI 智能助手,支持自然语言转 SQL、SQL 转自然语言、SQL 优化建议
- 👭 支持团队协作,研发无需知道线上数据库密码,解决企业数据库账号安全问题
- ⚙️ 强大的数据管理能力,支持数据表、视图、存储过程、函数、触发器、索引、序列、用户、角色、授权等管理
- 🔌 强大的扩展能力,目前已经支持 Mysql、PostgreSQL、Oracle、SQLServer、ClickHouse、Oceanbase、H2、SQLite 等等,未来会支持更多的数据库
- 🛡 前端使用 Electron 开发,提供 Windows、Mac、Linux 客户端、网页版本一体化的解决方案
- 🎁 支持环境隔离、线上、日常数据权限分离
## 0.0.0
`2023--`
**更新日志**
- ⭐【新功能】
- ⚡️【优化】
- 🐞【修复】
================================================
FILE: CHAT2DB_AI_SQL.md
================================================
# Chat2DB AI SQL功能使用说明
Chat2DB包含一系列基于ChatGPT的AI SQL使用功能,主要包括自然语言转SQL、SQL解释、SQL优化和SQL转换。 使用这些AI功能,可以将自然语言转换成本地查询SQL,而不仅仅是SQL查询伪代码;可以将SQL解释成自然语言,帮助用户理解复杂的SQL;可以针对慢SQL提供全方位的优化建议,提升查询效率;可以转换不同数据库类型的SQL语言,降低数据库迁移难度等等。
## 使用配置
### 点击设置【UI旧】
### 配置AI
#### 配置OPENAI【UI旧】
使用OPENAI的ChatSql功能需要满足两个条件
- 配置OPENAI_API_KEY,如没有OPENAI_API_KEY可加入答疑群根据群公告指引获取chat2db自定义key
- 客户端网络可以连接到OPENAI官网,如果本地VPN未能全局生效,可以通过在客户端中设置网络代理HOST和PORT来保证网络连通性
#### 配置自定义AI【UI旧】
- 自定义AI可以是用户自己部署的任意AI模型,例如ChatGLM、ChatGPT、文心一言、通义千问等等,但是自定义的接口输入和输出需要符合自定义的协议规范才可快速使用,否则可能需要二次开发。代码中提供了两个DEMO,只需要配置自定义AI接口地址,以及接口是否流式输出即可查看。具体使用中可以参考DEMO接口来编写自定义接口,或者直接在DEMO接口中进行二次开发,封装自己的自定义接口
- 自定义的流式输出接口配置DEMO
- 自定义的非流式输出接口配置DEMO
## 自然语言转SQL【UI旧】
### 功能描述
输入自然语言,选中执行并传入查询相关的表结构信息,则会返回相应的SQL
- 输入样例:查询学生小明的各科目成绩,并传入关联数据表course,score,student,student_course
- 输出样例:
```sql
SELECT score.score
FROM score
INNER JOIN student_course ON score.course_id = student_course.course_id
INNER JOIN student ON student_course.student_id = student.id
WHERE student.name = '小明'
```
## SQL解释
### 功能描述
输入SQL,选中执行并传入附加信息,附加信息可以添加希望解释《输入SQL》哪方面的信息,如SQL执行目标,则会返回此条SQL附加信息相关的解释
- 输入样例:SELECT department_name FROM departments WHERE department_id IN (SELECT department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 10)
- 输出样例:这个SQL查询语句的意思是:从departments表中选择department_name列,其中department_id列的值在employees表中department_id列的值分组后,如果该组中的记录数大于10,则返回该department_id。换句话说,这个查询语句返回的是在employees表中有超过10个员工的部门名称。
## SQL优化
### 功能描述
输入SQL,选中执行并传入优化附加信息,附加信息可以添加希望具体优化方面和要求,则会返回此条SQL附加信息相关的优化建议
- 输入样例:SELECT * FROM department ORDER BY gmt_create DESC
- 输出样例:
1. 尽量避免使用SELECT *,应该明确指定需要查询的列,以减少不必要的数据传输和提高查询效率。
2. 对于ORDER BY语句,如果查询的结果集比较大,可以考虑添加LIMIT限制返回的行数,以减少排序的开销。
3. 对于gmt_create字段,可以考虑添加索引以提高排序的效率。
4. 如果查询的结果集经常被访问,可以考虑使用缓存技术,如Redis等,以减少数据库的访问次数。
## SQL转换
### 功能描述
输入SQL,选中执行并传入目标SQL类型和附加信息,附加信息中可以添加转换的自定义要求,则会返回目标SQL类型且符合附加要求的SQL语言
- 输入样例:SELECT IFNULL(NULL, "W3Schools.com"),目标SQL类型为Oracle SQL
- 输出样例:SELECT NVL(NULL, 'W3Schools.com') FROM dual;
## CHATBOT
### 功能描述
输入任意prompt,点击ChatRobot按钮即可根据prompt返回相应的结果,此处聊天对话默认支持上下文,默认上下文长度为4,可在application.yml文件中修改上下文长度
- 输入样例:针对第二条优化建议给出具体实现方法
- 输出样例:针对第二条优化建议,可以考虑在student表中添加一个索引,以加快查询速度。具体实现方法如下:
1. 查看student表中是否已经存在索引。可以使用以下命令查看:
```sql
SHOW INDEX FROM student;
```
如果已经存在索引,则可以跳过下一步。
2. 在student表中添加索引。可以使用以下命令添加:
```sql
ALTER TABLE student ADD INDEX name_index (name);
```
这里的name_index是索引的名称,name是需要建立索引的列名。
注意:如果student表中的数据量很大,添加索引可能需要一些时间。
3. 重新执行原始SQL语句,查看查询速度是否有所提升。
```sql
SELECT score.score FROM score INNER JOIN student ON score.student_id = student.id WHERE student.name = '小明';
```
如果查询速度有所提升,则说明索引建立成功。
================================================
FILE: Chat2DB_LICENSE
================================================
The Chat2DB License
一、定义
“许可方”是指分发其软件的 Chat2DB 软件团队。
“软件”是指根据本许可提供的 Chat2DB 软件。
2. 许可授予
根据本许可的条款和条件,许可方特此授予您非排他性、全球性、不可转让、不可再许可、可撤销、免版税的版权许可,仅用于您的非商业研究目的。
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。
3.限制
您不得出于任何商业、军事或非法目的使用、复制、修改、合并、发布、分发、复制或创建本软件的全部或部分衍生作品。
4.免责声明
本软件“按原样”提供,不提供任何明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和非侵权性的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为还是其他方面,由软件或软件的使用或其他交易引起、由软件引起或与之相关 软件。
5. 责任限制
除适用法律禁止的范围外,在任何情况下且根据任何法律理论,无论是基于侵权行为、疏忽、合同、责任或其他原因,任何许可方均不对您承担任何直接、间接、特殊、偶然、示范性、 或间接损害,或任何其他商业损失,即使许可人已被告知此类损害的可能性。
6.争议解决
本许可受中华人民共和国法律管辖并按其解释。 因本许可引起的或与本许可有关的任何争议应提交北京市海淀区人民法院。
请注意,许可证可能会更新到更全面的版本。 有关许可和版权的任何问题,请通过1558143046@qq.com 与我们联系。
1. Definitions
"Licensor" refers to the Chat2DB software team that distributes its software.
"Software" refers to the Chat2DB software provided under this license.
2. License Grant
Subject to the terms and conditions of this License, the Licensor hereby grants to you a non-exclusive, worldwide, non-transferable, non-sublicensable, revocable, royalty-free copyright license to use the Software solely for your non-commercial research purposes.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
3. Restriction
You will not use, copy, modify, merge, publish, distribute, reproduce, or create derivative works of the Software, in whole or in part, for any commercial, military, or illegal purposes.
4. Disclaimer
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5. Limitation of Liability
EXCEPT TO THE EXTENT PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL THEORY, WHETHER BASED IN TORT, NEGLIGENCE, CONTRACT, LIABILITY, OR OTHERWISE WILL ANY LICENSOR BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES, OR ANY OTHER COMMERCIAL LOSSES, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
6. Dispute Resolution
This license shall be governed and construed in accordance with the laws of People’s Republic of China. Any dispute arising from or in connection with this License shall be submitted to Haidian District People's Court in Beijing.
Note that the license is subject to update to a more comprehensive version. For any questions related to the license and copyright, please contact us at 1558143046@qq.com.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright Pengfei Ji
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
🚀 Zoer is Launching
Powered by Chat2DB Team - AI-powered app builder that creates professional applications in minutes, no coding required
---
[![ReadmeX][readmex-image]][readmex-url]
[![Discord][discord-image]][discord-url]
[![Twitter][twitter-image]][twitter-url]
[![Telegram][telegram-image]][telegram-url]
[![Whatsapp][whatsapp-image]][whatsapp-url]
[![Reddit][reddit-image]][reddit-url]
[![Gmail][gmail-image]][gmail-url]
[readmex-image]: https://raw.githubusercontent.com/CodePhiliaX/resource-trusteeship/main/readmex.svg
[readmex-url]: https://readmex.com/CodePhiliaX/Chat2DB
[discord-image]: https://img.shields.io/badge/-Join%20us%20on%20Discord-%237289DA.svg?style=flat&logo=discord&logoColor=white
[discord-url]: https://discord.com/invite/uNjb3n5JVN
[twitter-image]: https://img.shields.io/twitter/follow/_Chat2DB?label=Chat2DB
[twitter-url]: https://twitter.com/intent/tweet?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB&hashtags=ChatGPT,AGI,SQL%20Client,Reporting%20tool
[telegram-image]: https://img.shields.io/twitter/url?label=Telegram&logo=Telegram&style=social&url=https://github.com/chat2db/Chat2DB
[telegram-url]: https://t.me/share/url?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB
[whatsapp-image]: https://img.shields.io/twitter/url?label=whatsapp&logo=whatsapp&style=social&url=https://github.com/chat2db/Chat2DB
[whatsapp-url]: https://api.whatsapp.com/send?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%20https://github.com/chat2db/Chat2DB
[reddit-image]: https://img.shields.io/twitter/url?label=Reddit&logo=Reddit&style=social&url=https://github.com/chat2db/Chat2DB
[reddit-url]: https://www.reddit.com/submit?url=https://github.com/chat2db/Chat2DB&title=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.
[gmail-image]: https://img.shields.io/twitter/url?label=Gmail&logo=Gmail&style=social&url=https://github.com/chat2db/Chat2DB
[gmail-url]: mailto:?subject=Check%20this%20GitHub%20repository%20out.&body=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%3A%0Ahttps://github.com/chat2db/Chat2DB
**1. Intelligent SQL Generation**:
Chat2DB Pro supports AI-driven intelligent SQL development to help you write SQL queries faster.
**2. Database Management**:
Supports more than 10 databases, including MySQL, PostgreSQL, H2, Oracle, SQLServer, SQLite, MariaDB, ClickHouse, DM, Presto, DB2, OceanBase, Hive, KingBase, MongoDB, Redis, Snowflake, and more.
**3. Intelligent Report Generation**:
Chat2DB Pro supports AI-driven intelligent data reporting to help you generate dashboards faster.
**4. Data Structure Synchronization**:
Chat2DB Pro supports database table structure synchronization to help you sync database table structures faster.
## Feature Comparison
Feature
Community Open Source
Local
Pro
Database Types
16+
Target 100+
Target 100+
Supported AI
Requires AI Configuration
AI ready on installation
AI ready on installation
AI Capabilities
Basic
Varied
Varied
Visual Table Editor
✅
✅
✅
SQL Console
✅
✅
✅
SQL Formatting
✅
✅
✅
Save Query Records
✅
✅
✅
Theme Color Settings
✅
✅
✅
Data Structure Sync
❌
✅
✅
Database Grouping
❌
✅
✅
Database Structure Import/Export
❌
✅
✅
Data Import/Export
❌
✅
✅
Data Migration
❌
✅
✅
Copy/Clear Table
❌
✅
✅
Open and Run SQL Files
❌
✅
✅
UML Diagram
❌
In Development
In Development
Generate Code
❌
✅
✅
Copy Results as Insert/Update
❌
✅
✅
Modify Query Results
❌
✅
✅
Intelligent SQL Editor
❌
✅
✅
AI Table Creation
❌
✅
✅
AI Data Sets
❌
✅
✅
Chat2Excel
❌
✅
✅
Intelligent Dashboard
❌
✅
✅
Editor Settings
❌
✅
✅
Custom Shortcuts
❌
✅
✅
Cross-device Usage
❌
❌
✅
## Download and Installation
Chat2DB is a cross-platform application that supports Windows, MacOS, and Linux. You can download Chat2DB from the following links:
- [Download Pro Version](https://chat2db.ai/download)
- [Download Local Version](https://chat2db.ai/download)
- [Download Open Source Version](https://github.com/CodePhiliaX/Chat2DB/releases/tag/v0.3.6)
## Community Edition Docker Installation
### System Requirements
Before installing Chat2DB, ensure your system meets the following requirements:
- Docker 19.03.0 or later
- Docker Compose 1.25.0 or later
- CPU >= 2 Cores
- RAM >= 4 GiB
```bash
docker rm chat2db
docker run --name=chat2db -ti -p 10824:10824 -v ~/.chat2db-docker:/root/.chat2db chat2db/chat2db:latest
docker start chat2db
```
## Code Debugging
## Runtime Environment
Note:
If local debugging is needed:
- Java runtime: Open JDK 17
- Node.js runtime: Node 16 Node.js .
**Clone the repository locally**
```bash
$ git clone git@github.com:chat2db/Chat2DB.git
```
**Frontend Debugging**
```bash
Node version must be 16 or higher
Use yarn only, npm is not supported
$ cd Chat2DB/chat2db-client
$ yarn
$ yarn run start:web
```
**Backend Debugging**
```bash
$ cd ../chat2db-server
$ mvn clean install # Maven version 3.8 or higher is required
$ cd chat2db-server/chat2db-server-start/target/
$ java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar # 需要安装java 17以上版本,启动应用 chatgpt.apiKey 需要输入ChatGPT的key,如果不输入无法使用AIGC功能
```
**Standalone Deployment**
```bash
# chat2db-client
$ npm run build:web:prod
$ cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
$ cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf
```
## Contact Us
- Email: Chat2DB@ch2db.com
- Discord: [Join our Discord server](https://discord.gg/JDkwB6JS8A)
- Twitter: [@Chat2DB](https://x.com/Chat2DB_AI)
- YouTube: [Chat2DB Channel](https://www.youtube.com/@chat2db.tutorial)
- GitHub: [Chat2DB GitHub](https://github.com/codePhiliaX/chat2db)
## Acknowledgments
Thanks to everyone who has contributed to Chat2DB~~
## Star History
## License
The primary license used by this software is the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0), supplemented by the [Chat2DB License](./Chat2DB_LICENSE).
================================================
FILE: README_CN.md
================================================
[![ReadmeX][readmex-image]][readmex-url]
[![Discord][discord-image]][discord-url]
[![Twitter][twitter-image]][twitter-url]
[![Telegram][telegram-image]][telegram-url]
[![Whatsapp][whatsapp-image]][whatsapp-url]
[![Reddit][reddit-image]][reddit-url]
[![Gmail][gmail-image]][gmail-url]
[readmex-image]: https://raw.githubusercontent.com/CodePhiliaX/resource-trusteeship/main/readmex.svg
[readmex-url]: https://readmex.com/CodePhiliaX/Chat2DB
[discord-image]: https://img.shields.io/badge/-Join%20us%20on%20Discord-%237289DA.svg?style=flat&logo=discord&logoColor=white
[discord-url]: https://discord.com/invite/uNjb3n5JVN
[twitter-image]: https://img.shields.io/twitter/follow/_Chat2DB?label=Chat2DB
[twitter-url]: https://twitter.com/intent/tweet?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB&hashtags=ChatGPT,AGI,SQL%20Client,Reporting%20tool
[telegram-image]: https://img.shields.io/twitter/url?label=Telegram&logo=Telegram&style=social&url=https://github.com/chat2db/Chat2DB
[telegram-url]: https://t.me/share/url?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.&url=https://github.com/chat2db/Chat2DB
[whatsapp-image]: https://img.shields.io/twitter/url?label=whatsapp&logo=whatsapp&style=social&url=https://github.com/chat2db/Chat2DB
[whatsapp-url]: https://api.whatsapp.com/send?text=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%20https://github.com/chat2db/Chat2DB
[reddit-image]: https://img.shields.io/twitter/url?label=Reddit&logo=Reddit&style=social&url=https://github.com/chat2db/Chat2DB
[reddit-url]: https://www.reddit.com/submit?url=https://github.com/chat2db/Chat2DB&title=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.
[gmail-image]: https://img.shields.io/twitter/url?label=Gmail&logo=Gmail&style=social&url=https://github.com/chat2db/Chat2DB
[gmail-url]: mailto:?subject=Check%20this%20GitHub%20repository%20out.&body=Chat2DB-An%20intelligent%20and%20versatile%20general-purpose%20SQL%20client%20and%20reporting%20tool%20for%20databases%20which%20integrates%20ChatGPT%20capabilities.%3A%0Ahttps://github.com/chat2db/Chat2DB
https://github.com/user-attachments/assets/3c857883-8153-4bda-92b8-d25c6adb5b13
#
Chat2DB 是一个智能的通用SQL客户端和数据报表工具,它集成了AI的能力。Chat2DB可以帮助您更快地编写SQL查询、管理数据库、生成报告、探索数据、并且可以与多种数据库进行交互。Chat2DB是一个开源项目,我们欢迎您的贡献。
**1. 智能生成SQL**:
Chat2DB Pro支持AI驱动的智能SQL开发,可以帮助您更快地编写SQL查询。
**2. 数据库管理**:
支持多种10+数据库,包括MySQL、PostgreSQL、H2、Oracle、SQLServer、SQLite、MariaDB、ClickHouse、DM、Presto、DB2、OceanBase、Hive、KingBase、MongoDB、Redis、Snowflake等。
**3. 智能生成报表**:
Chat2DB Pro支持AI驱动的智能数据报表,可以帮助您更快地生成看板。
**4. 数据结构同步**:
Chat2DB Pro支持数据库表结构同步,可以帮助您更快地同步数据库表结构。
## 功能比较
功能
社区开源版
Local版(收费)
Pro版(收费)
数据库类型
16+
目标100+
目标100+
支持的 AI
需要配置AI
安装即可使用AI
安装即可使用AI
AI 能力
简单
多样
多样
可视化编辑表
✅
✅
✅
SQL控制台
✅
✅
✅
SQL格式化
✅
✅
✅
保存查询记录
✅
✅
✅
主题颜色设置
✅
✅
✅
数据结构同步
❌
✅
✅
数据库分组
❌
✅
✅
数据库结构导入导出
❌
✅
✅
数据导入导出
❌
✅
✅
数据迁移
❌
✅
✅
复制/清空表
❌
✅
✅
打开运行SQL文件
❌
✅
✅
UML图
❌
开发中
开发中
生成代码
❌
✅
✅
复制结果为
Insert/update
❌
✅
✅
修改查询结果
❌
✅
✅
智能SQL编辑器
❌
✅
✅
AI建表
❌
✅
✅
AI数据集
❌
✅
✅
Chat2Excel
❌
✅
✅
智能看板
❌
✅
✅
编辑器设置
❌
✅
✅
自定义快捷键
❌
✅
✅
跨多设备使用
❌
❌
✅
## 下载安装
Chat2DB 是一个跨平台的应用程序,支持Windows、MacOS和Linux。您可以从以下链接下载Chat2DB。
- [下载 Pro 版](https://chat2db.ai/download)
- [下载 Local 版](https://chat2db.ai/download)
- [下载开源版](https://github.com/CodePhiliaX/Chat2DB/releases/tag/v0.3.6)
## 社区版 Docker 安装
### 系统要求
在安装 Chat2DB 之前,请确保您的系统满足以下要求:
- Docker 19.03.0 或更高版本
- Docker Compose 1.25.0 或更高版本
- CPU >= 2 Core
- RAM >= 4 GiB
```bash
// 拉取最新客户端,然后运行docker,名字是 `chat2db` , 并且将 `/root/.chat2db` 挂载到 `~/.chat2db-docker`
docker run --name=chat2db -ti -p 10824:10824 -v ~/.chat2db-docker:/root/.chat2db chat2db/chat2db:latest
// 这里正常会提示`Tomcat started on port(s): 10824 (http) with context path` 就可以结束了
// 如果这里提示 `The container name "/chat2db" is already in use by container`, 代表已经存在容器了 运行
docker start chat2db
// 如果想更新chat2db 则需要先rm
docker rm chat2db
```
## 代码调试
## 运行环境
注意:
如果需要本地调试
- java 运行 Open JDK 17
- Node 运行环境 Node16 Node.js .
**git clone 到本地**
```bash
$ git clone git@github.com:chat2db/Chat2DB.git
```
**前端调试**
```bash
node版本必须为16及以上
一定要用yarn
$ cd Chat2DB/chat2db-client
$ yarn
$ yarn run start:web
```
**后端调试**
```bash
$ cd ../chat2db-server
$ mvn clean install # 需要安装maven 3.8以上版本
$ cd chat2db-server/chat2db-server-start/target/
$ java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar # 需要安装java 17以上版本,启动应用 chatgpt.apiKey 需要输入ChatGPT的key,如果不输入无法使用AIGC功能
```
**独立部署**
```bash
# chat2db-client
$ npm run build:web:prod
$ cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
$ cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf
# 再打包后端服务
```
## 联系我们
- Email: Chat2DB@ch2db.com
- Discord: [Join our Discord server](https://discord.gg/JDkwB6JS8A)
- Twitter: [@Chat2DB](https://x.com/Chat2DB_AI)
- YouTube: [Chat2DB Channel](https://www.youtube.com/@chat2db.tutorial)
- GitHub: [Chat2DB GitHub](https://github.com/codePhiliaX/chat2db)
## 致谢
感谢所有为 Chat2DB 贡献力量的同学们~~
## Star History
## License
The primary license used by this software is the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0), supplemented by the [Chat2DB License](./Chat2DB_LICENSE).
================================================
FILE: README_JA.md
================================================
https://github.com/user-attachments/assets/bd5d5f64-540f-4793-a801-17fa96c4766e
Chat2DBはAI機能を統合したインテリジェントで汎用的なSQLクライアントおよびデータ報告ツールです。Chat2DBは、SQLクエリの作成を迅速化し、データベースの管理、レポートの生成、データの探索、および複数のデータベースとのインタラクションをサポートします。Chat2DBはオープンソースプロジェクトであり、皆様の貢献を歓迎します。
**1. インテリジェントSQL生成**:
Chat2DB Proは、AI駆動によるインテリジェントなSQL開発をサポートし、SQLクエリをより速く作成する手助けをします。
**2. データベース管理**:
MySQL、PostgreSQL、H2、Oracle、SQLServer、SQLite、MariaDB、ClickHouse、DM、Presto、DB2、OceanBase、Hive、KingBase、MongoDB、Redis、Snowflakeなど、10種類以上のデータベースをサポートしています。
**3. インテリジェントレポート生成**:
Chat2DB Proは、AI駆動によるインテリジェントなデータ報告をサポートし、ダッシュボードの作成を迅速に行う手助けをします。
**4. データ構造の同期**:
Chat2DB Proは、データベーステーブル構造の同期をサポートし、データベーステーブルの構造を迅速に同期する手助けをします。
## 機能比較
機能
コミュニティ オープンソース
ローカル
Pro
データベースの種類
16種類以上
100種類以上を対象
100種類以上を対象
サポートされているAI
AI設定が必要
インストール時にAIが利用可能
インストール時にAIが利用可能
AI機能
基本的
多様
多様
視覚的テーブルエディタ
✅
✅
✅
SQLコンソール
✅
✅
✅
SQLフォーマット
✅
✅
✅
クエリ記録の保存
✅
✅
✅
テーマカラー設定
✅
✅
✅
データ構造の同期
❌
✅
✅
データベースのグループ化
❌
✅
✅
データベース構造のインポート/エクスポート
❌
✅
✅
データのインポート/エクスポート
❌
✅
✅
データ移行
❌
✅
✅
テーブルのコピー/削除
❌
✅
✅
SQLファイルのオープンと実行
❌
✅
✅
UMLダイアグラム
❌
開発中
開発中
コード生成
❌
✅
✅
インサート/アップデートとして結果をコピー
❌
✅
✅
クエリ結果の修正
❌
✅
✅
インテリジェントSQLエディタ
❌
✅
✅
AIによるテーブル作成
❌
✅
✅
AIデータセット
❌
✅
✅
Chat2Excel
❌
✅
✅
インテリジェントダッシュボード
❌
✅
✅
エディタ設定
❌
✅
✅
カスタムショートカット
❌
✅
✅
クロスデバイス使用
❌
❌
✅
## ダウンロードとインストール
Chat2DBは、Windows、MacOS、Linuxをサポートするクロスプラットフォームアプリケーションです。以下のリンクからChat2DBをダウンロードできます:
- [Proバージョンのダウンロード](https://chat2db.ai/download)
- [ローカルバージョンのダウンロード](https://chat2db.ai/download)
- [オープンソースバージョンのダウンロード](https://github.com/CodePhiliaX/Chat2DB/releases/tag/v0.3.6)
## コミュニティエディションのDockerインストール
### システム要件
Chat2DBをインストールする前に、システムが以下の要件を満たしていることを確認してください:
- Docker 19.03.0以上
- Docker Compose 1.25.0以上
- CPU >= 2コア
- RAM >= 4 GiB
```bash
docker rm chat2db
docker run --name=chat2db -ti -p 10824:10824 -v ~/.chat2db-docker:/root/.chat2db chat2db/chat2db:latest
docker start chat2db
```
## コードデバッグ
## 実行環境
注意: ローカルデバッグが必要な場合:
- Java runtime: Open JDK 17
- Node.js runtime: Node 16 Node.js .
**リポジトリをローカルにクローン**
```bash
$ git clone git@github.com:chat2db/Chat2DB.git
```
**フロントエンドデバッグ**
```bash
Node version must be 16 or higher
Use yarn only, npm is not supported
$ cd Chat2DB/chat2db-client
$ yarn
$ yarn run start:web
```
**バックエンドデバッグ**
```bash
$ cd ../chat2db-server
$ mvn clean install # Maven version 3.8 or higher is required
$ cd chat2db-server/chat2db-server-start/target/
$ java -jar -Dloader.path=./lib -Dchatgpt.apiKey=xxxxx chat2db-server-start.jar # 需要安装java 17以上版本,启动应用 chatgpt.apiKey 需要输入ChatGPT的key,如果不输入无法使用AIGC功能
```
**スタンドアロンデプロイ**
```bash
# chat2db-client
$ npm run build:web:prod
$ cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front
$ cp -r dist/index.html ../chat2db-server/chat2db-server-start/src/main/resources/thymeleaf
```
## お問い合わせ
- メール: Chat2DB@ch2db.com
- Discord: [Discordサーバーに参加](https://discord.gg/JDkwB6JS8A)
- Twitter: [@Chat2DB](https://x.com/Chat2DB_AI)
- YouTube: [Chat2DB チャンネル](https://www.youtube.com/@chat2db.tutorial)
- GitHub: [Chat2DB GitHub](https://github.com/codePhiliaX/chat2db)
## 謝辞
Chat2DBに貢献してくださったすべての方々に感謝します~~
## Star History
## License
このソフトウェアで使用されている主なライセンスは[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)であり、[Chat2DB License](./Chat2DB_LICENSE)が補完されています。
================================================
FILE: chat2db-client/.eslintrc.js
================================================
module.exports = {
parser: '@typescript-eslint/parser',
env: {
browser: true,
es2021: true,
},
plugins: ['@typescript-eslint', 'babel', 'react-hooks', 'react'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
// 'airbnb-base', // airbnb-base中已经包含了eslint-plugin-import
// 'prettier', // 使得eslint中的样式规范失效,遵循prettier中的样式规范
// 'prettier/@typescript-eslint', // 使得@typescript-eslint中的样式规范失效,遵循prettier中的样式规范
],
overrides: [
{
env: {
node: true,
},
files: ['.eslintrc.{js,cjs}'], //
parserOptions: {
sourceType: 'script',
},
},
],
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
ignorePatterns: ['src/main'],
rules: {
'func-names': 0, // 函数表达式必须有名字
'one-var': [1, 'never'], // 连续声明
'prefer-const': 1, // 首选const
'no-unused-expressions': 0, // 禁止无用的表达式
'new-cap': 2, // 构造函数首字母大写
'prefer-arrow-callback': 2, // 首选箭头函数
'arrow-body-style': 0, // 箭头函数体使用大括号
'max-len': [
// 一行最大长度
1,
{
code: 120,
ignoreStrings: true,
ignoreUrls: true,
ignoreRegExpLiterals: true,
},
],
'consistent-return': 'off', // return 后面是否允许省略
'default-case': 2, // switch 语句必须有 default
'prefer-rest-params': 2, // 必须使用解构 ...args 来代替 arguments
'no-script-url': 0, // 禁止使用 javascript:void(0)
// 'no-console': [ // 禁止使用 console
// 2,
// {
// allow: ['info', 'error', 'warn'],
// },
// ],
'no-duplicate-imports': [2], // 禁止重复 import
'newline-per-chained-call': 2, // 链式调用必须换行
// 'no-underscore-dangle': 2, // 禁止标识符中有悬空下划线
'eol-last': 2, // 文件以单一的换行符结束
'no-useless-rename': 2, // 禁止无用的重命名
'no-undef': 0, // 禁止使用未定义的变量
'class-methods-use-this': 0, // class 的非静态方法必须包含 this
'prefer-destructuring': 0, // 优先使用数组和对象解构
'no-unused-vars': 0, // 禁止未使用过的变量
'@typescript-eslint/no-unused-vars': 1, // 禁止未使用过的变量
'react/self-closing-comp': 2, // 非单行 JSX 必须使用括号包裹
'react/jsx-indent-props': [2, 2], // jsx props 缩进
'no-plusplus': 0, // 禁止使用 ++,--
'react/jsx-uses-vars': 1, // jsx 文件中禁止使用变量
// 'react/no-multi-comp': [ // 禁止一个文件中定义多个组件
// 2,
// {
// ignoreStateless: true,
// },
// ],
'react/jsx-uses-react': 2, // jsx 文件中禁止使用 React
'react/react-in-jsx-scope': 2, // jsx 文件中禁止使用 React
'react/sort-comp': 1, // 组件内方法顺序
'react/jsx-tag-spacing': 2, // jsx 中的属性禁止使用空格
'react/jsx-no-bind': 0, // jsx 中禁止使用 bind
'react/jsx-closing-bracket-location': 2, // jsx 中的右括号必须换行
'react/prefer-stateless-function': 0, // 优先使用无状态组件
'react/display-name': 0, // 组件必须写 displayName
'react/prop-types': 0, // 组件必须写 propTypes
'import/prefer-default-export': 0, // 优先使用 export default
'@typescript-eslint/no-var-requires': 2, // 禁止 require() 使用表达式
'no-use-before-define': 0, // 禁止定义前使用
'@typescript-eslint/no-use-before-define': [
// 禁止定义前使用
0,
// {
// functions: false,
// },
],
'@typescript-eslint/explicit-function-return-type': 0, // 函数必须有返回值
'@typescript-eslint/interface-name-prefix': 0, // 接口名称必须以 I 开头
'@typescript-eslint/explicit-module-boundary-types': 0, // 导出函数和类的公共方法必须声明返回类型
'no-shadow': 0, // 禁止变量名与上层作用域内的定义过的变量重复
'@typescript-eslint/no-shadow': 1, // 禁止变量名与上层作用域内的定义过的变量重复TODO: 为2是不是好点?
'no-invalid-this': 0, // 禁止 this 关键字出现在类和类对象之外
'no-await-in-loop': 'off', // 禁止在循环中出现 await
'array-callback-return': 'off', // 数组方法的回调函数中必须有 return 语句
'no-restricted-syntax': 'off', // 禁止使用特定的语法
'@typescript-eslint/no-explicit-any': 0, // 禁止使用 any
'import/no-extraneous-dependencies': 0, // 禁止使用无关的 package
'import/no-unresolved': 0, // 禁止使用无关的 package
'@typescript-eslint/explicit-member-accessibility': 0, // 类的成员之间是否需要空行
'@typescript-eslint/no-object-literal-type-assertion': 0, // 禁止使用 as Type
'react/no-find-dom-node': 0, // 禁止使用 findDOMNode
'no-param-reassign': [
// 禁止对函数参数再赋值
2,
{
props: false,
},
],
'arrow-parens': 0, // 箭头函数参数括号
indent: 0, // 缩进
'operator-linebreak': [0], // 换行符位置
'max-classes-per-file': [2, 10], // 一个文件最多定义几个类
'@typescript-eslint/no-empty-function': [0], // 禁止空函数
'import/extensions': 0, // 禁止导入文件时带上文件后缀
},
};
================================================
FILE: chat2db-client/.gitignore
================================================
/node_modules
/.env.local
/.umirc.local.ts
/config/config.local.ts
/src/.umi
/src/.umi-production
/src/.umi-test
/src/main/node_modules
/src/main/dist
/dist
.swc
./yarn-error.log
/release
/static
/versions
================================================
FILE: chat2db-client/.npmrc
================================================
registry=https://registry.npmmirror.com/
================================================
FILE: chat2db-client/.prettierignore
================================================
node_modules
.umi
.umi-production
================================================
FILE: chat2db-client/.prettierrc
================================================
{
"printWidth": 120,
"singleQuote": true,
"trailingComma": "all",
"proseWrap": "never",
"overrides": [{ "files": ".prettierrc", "options": { "parser": "json" } }],
"plugins": ["prettier-plugin-organize-imports", "prettier-plugin-packagejson"]
}
================================================
FILE: chat2db-client/.umirc.prod.desktop.ts
================================================
import { extractYarnConfig } from './src/utils/webpack';
import { defineConfig } from 'umi';
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const yarn_config = extractYarnConfig(process.argv);
const chainWebpack = (config: any, { webpack }: any) => {
config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
{
languages: ['mysql', 'pgsql', 'sql'],
},
]);
};
export default defineConfig({
history: {
type: 'hash',
},
publicPath: './',
chainWebpack,
define: {
'process.env.UMI_ENV': process.env.UMI_ENV,
},
headScripts: [
`window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-V8M4E5SF61', {
platform: 'DESKTOP',
version: '${yarn_config['app_version']}'
});`,
],
});
================================================
FILE: chat2db-client/.umirc.prod.ts
================================================
import { defineConfig } from 'umi';
import { extractYarnConfig } from './src/utils/webpack';
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const yarn_config = extractYarnConfig(process.argv);
const publicPath = yarn_config.public_path || './static/front/';
const chainWebpack = (config: any, { webpack }: any) => {
config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
{
languages: ['mysql', 'pgsql', 'sql'],
},
]);
};
export default defineConfig({
publicPath: publicPath,
chainWebpack,
define: {
'process.env.UMI_ENV': process.env.UMI_ENV,
},
headScripts: [
`window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-V8M4E5SF61', {
platform: 'WEB',
version: '${yarn_config['app_version']}'
});`,
],
});
================================================
FILE: chat2db-client/.umirc.ts
================================================
import { defineConfig } from 'umi';
import { extractYarnConfig, transitionTimezoneTimestamp } from './src/utils/webpack';
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
// yarn run build --app_port=xx 获取打包时命令行传入的参数
const yarn_config = extractYarnConfig(process.argv);
const chainWebpack = (config: any, { webpack }: any) => {
config.plugin('monaco-editor').use(MonacoWebpackPlugin, [
{
languages: ['mysql', 'pgsql', 'sql'],
},
]);
};
export default defineConfig({
title: 'Chat2DB',
base: '/',
publicPath: '/',
hash: true,
routes: [
{
path: '/',
component: '@/layouts/GlobalLayout',
routes: [
{
path: '/login',
component: '@/pages/login',
},
{
path: '/demo',
component: '@/pages/demo',
},
{
path: '/connections',
component: 'main',
},
{
path: '/dashboard',
component: 'main',
},
{
path: '/team',
component: 'main',
},
{
path: '/workspace',
component: 'main',
},
{
path: '/',
component: 'main',
},
],
},
],
npmClient: 'yarn',
dva: {},
plugins: ['@umijs/plugins/dist/dva'],
chainWebpack,
proxy: {
'/api': {
target: 'http://127.0.0.1:10821',
changeOrigin: true,
},
'/client/remaininguses/': {
target: 'http://127.0.0.1:1889',
changeOrigin: true,
},
},
targets: {
chrome: 80,
},
// links: [{
// rel: 'manifest',
// href: 'manifest.json',
// }],
links: [{ rel: 'icon', type: 'image/ico', sizes: '32x32', href: '/static/front/logo.ico' }],
headScripts: [
`if (localStorage.getItem('app-local-storage-versions') !== 'v4') {
localStorage.clear();
localStorage.setItem('app-local-storage-versions', 'v4');
}`,
// `if (window.electronApi) { window.electronApi.startServerForSpawn() }`,
// `if ("serviceWorker" in navigator) {
// window.addEventListener("load", function () {
// navigator.serviceWorker
// .register("sw.js")
// .then(res => console.log("service worker registered"))
// .catch(err => console.log("service worker not registered", err));
// })
// }`,
// `var deferredPrompt = null;
// window.addEventListener("beforeinstallprompt", e => {
// e.preventDefault();
// deferredPrompt = e;
// });
// window.addEventListener("appinstalled", () => {
// deferredPrompt = null;
// })`,
{
src: 'https://www.googletagmanager.com/gtag/js?id=G-V8M4E5SF61',
async: true,
},
// `window.dataLayer = window.dataLayer || [];
// function gtag() {
// window.dataLayer.push(arguments);
// }
// gtag('js', new Date());
// gtag('config', 'G-V8M4E5SF61', {
// platform: 'WEB',
// version: '1.0.0'
// });`,
],
favicons: ['logo.ico'],
define: {
__ENV__: process.env.UMI_ENV,
__BUILD_TIME__: transitionTimezoneTimestamp(new Date().getTime()),
__APP_VERSION__: yarn_config.app_version || '0.0.0',
__APP_PORT__: yarn_config.app_port,
},
esbuildMinifyIIFE: true,
});
================================================
FILE: chat2db-client/.vscode/settings.json
================================================
{
"workbench.colorTheme": "One Dark Pro",
"workbench.iconTheme": "vscode-icons-mac",
"editor.fontSize": 14,
"editor.tabSize": 2,
// 自动格式化
"editor.formatOnType": true,
"editor.formatOnSave": true,
"prettier.bracketSpacing": true, // 在对象,数组括号与文字之间加空格 "{ foo: bar }"
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"explorer.confirmDelete": true,
"emmet.includeLanguages": {
"javascript": "javascriptreact"
},
"git.mergeEditor": false,
"cSpell.words": [
"ahooks",
"antd",
"Appstore",
"asar",
"AZUREAI",
"bgcolor",
"Cascader",
"charsets",
"chatgpt",
"CLICKHOUSE",
"Consolas",
"datas",
"datasource",
"DATETIME",
"DBAI",
"dbhub",
"Dmaven",
"echart",
"echarts",
"favicons",
"findstr",
"fulltext",
"gtag",
"hexi",
"hljs",
"icns",
"Iconfont",
"IIFE",
"indexs",
"JDBC",
"KEYPAIR",
"KINGBASE",
"linebreak",
"lsof",
"MARIADB",
"Mddhhmmss",
"Menlo",
"netstat",
"NOCASE",
"nsis",
"OCEANBASE",
"OPENAI",
"packagejson",
"Parens",
"partialize",
"pgsql",
"plusplus",
"pnpm",
"POSTGRESQL",
"Prec",
"remaininguses",
"RESTAI",
"RTRIM",
"scrollbar",
"Sercurity",
"sortablejs",
"SQLSERVER",
"tailwindcss",
"Tigger",
"ueabe",
"ueabf",
"ueac",
"umijs",
"USERANDPASSWORD",
"uuidv",
"VARCHAR",
"VIEWCOLUMN",
"VIEWCOLUMNS",
"webp",
"wireframe",
"Wppk",
"yapi",
"zustand"
],
"typescript.tsdk": "/Users/wangjiaqi/Desktop/Chat2DB/chat2db-client/node_modules/typescript/lib"
}
================================================
FILE: chat2db-client/mock/sqlResult.json
================================================
{
"success": true,
"errorCode": null,
"errorMessage": null,
"data": [
{
"sql": "SELECT *\nFROM students\nLIMIT 500",
"description": "执行成功",
"message": null,
"success": true,
"headerList": [
{
"dataType": "NUMERIC",
"name": "id"
},
{
"dataType": "STRING",
"name": "name"
},
{
"dataType": "STRING",
"name": "gender"
},
{
"dataType": "DATETIME",
"name": "birthday"
},
{
"dataType": "STRING",
"name": "address"
},
{
"dataType": "STRING",
"name": "phone"
},
{
"dataType": "STRING",
"name": "email"
},
{
"dataType": "DATETIME",
"name": "create_time"
},
{
"dataType": "DATETIME",
"name": "update_time"
}
],
"dataList": [
[
"1",
"张三",
"男",
null,
"北京市海淀区",
"12345678901",
"zhangsan@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"2",
"李四",
"男",
null,
"上海市浦东新区",
"12345678902",
"lisi@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"3",
"王五",
"女",
null,
"广州市天河区",
"12345678903",
"wangwu@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"4",
"赵六",
"男",
null,
"深圳市南山区",
"12345678904",
"zhaoliu@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"5",
"陈七",
"女",
null,
"武汉市江汉区",
"12345678905",
"chenqi@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"6",
"刘八",
"男",
null,
"成都市高新区",
"12345678906",
"liuba@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"7",
"魏九",
"女",
null,
"重庆市渝北区",
"12345678907",
"weijiu@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"8",
"孙十",
"男",
null,
"南京市鼓楼区",
"12345678908",
"sunshi@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"9",
"郑十一",
"男",
null,
"西安市雁塔区",
"12345678909",
"zhengshiyi@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
],
[
"10",
"许十二",
"女",
null,
"苏州市姑苏区",
"12345678910",
"xushier@example.com",
"2023-05-31 10:41:56.000",
"2023-05-31 10:41:56.000"
]
],
"sqlType": "SELECT",
"hasNextPage": false,
"pageNo": 1,
"pageSize": 500,
"duration": 6
}
],
"traceId": null
}
================================================
FILE: chat2db-client/package.json
================================================
{
"name": "chat2db",
"version": "1.0.0",
"private": true,
"repository": {
"type": "git",
"url": "https://github.com/chat2db/Chat2DB"
},
"author": "fjy, hexi",
"main": "src/main/main.js",
"scripts": {
"build": "npm run build:web && npm run build:main",
"build:desktop": "npm run build:web:desktop && npm run build:main:prod",
"build:main": "cross-env NODE_ENV=development electron-builder",
"build:main:prod": "cross-env NODE_ENV=production electron-builder",
"build:prod": "npm run build:web:prod && npm run build:main:prod",
"build:web": "umi build",
"build:web:desktop": "cross-env UMI_ENV=desktop cross-env APP_VERSION=${npm_config_app_version} cross-env APP_PORT=${npm_config_app_port} umi build",
"build:web:prod": "cross-env UMI_ENV=prod cross-env APP_VERSION=${npm_config_app_version} cross-env APP_PORT=${npm_config_app_port} cross-env UMI_PublicPath=${npm_config_public_path} umi build",
"postinstall": "umi setup",
"lint": "umi lint",
"start": "concurrently \"npm run start:web\" \"npm run start:main\"",
"start:main": "cross-env NODE_ENV=development electron .",
"start:main:prod": "cross-env NODE_ENV=production electron .",
"start:web": "cross-env UMI_ENV=local HMR=none cross-env APP_VERSION=${npm_config_app_version} umi dev",
"start:web:hot": "cross-env UMI_ENV=local cross-env APP_VERSION=${npm_config_app_version} umi dev"
},
"dependencies": {
"@dnd-kit/modifiers": "^6.0.1",
"ahooks": "^3.7.8",
"ali-react-table": "^2.6.1",
"antd": "^5.12.1",
"copy-to-clipboard": "^3.3.3",
"echarts": "^5.4.2",
"echarts-for-react": "^3.0.2",
"event-source-polyfill": "^1.0.31",
"highlight.js": "^11.9.0",
"lodash": "^4.17.21",
"lucide-react": "^0.365.0",
"markdown-it-link-attributes": "^4.0.1",
"monaco-editor": "^0.44.0",
"monaco-editor-esm-webpack-plugin": "^2.1.0",
"monaco-editor-webpack-plugin": "^7.0.1",
"react-monaco-editor": "^0.54.0",
"react-sortablejs": "^6.1.4",
"sql-formatter": "^13.0.4",
"styled-components": "^6.0.1",
"umi": "^4.0.87",
"umi-request": "^1.4.0",
"uuid": "^9.0.0",
"zustand": "^4.4.4"
},
"devDependencies": {
"@types/event-source-polyfill": "^1.0.1",
"@types/lodash": "^4.14.195",
"@types/react": "^18.0.33",
"@types/react-dom": "^18.0.11",
"@types/uuid": "^9.0.1",
"@typescript-eslint/eslint-plugin": "^6.7.2",
"@typescript-eslint/parser": "^6.7.2",
"@umijs/plugins": "^4.0.55",
"concurrently": "^8.1.0",
"cross-env": "^7.0.3",
"electron": "^22.3.0",
"electron-builder": "^23.6.0",
"electron-debug": "^3.2.0",
"eslint": "^8.49.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^9.0.0",
"eslint-import-resolver-webpack": "^0.13.7",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.28.1",
"eslint-plugin-prettier": "^5.0.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"is-electron": "^2.2.2",
"prettier": "^2",
"prettier-plugin-organize-imports": "^2",
"prettier-plugin-packagejson": "^2",
"tailwindcss": "^3",
"typescript": "^5.0.3"
},
"peerDependencies": {
"react": "^16.8.0",
"react-dom": "^16.8.0"
},
"engines": {
"node": ">=16"
},
"build": {
"appId": "com.chat2db",
"directories": {
"output": "release/"
},
"productName": "Chat2DB",
"asar": false,
"files": [
"dist/**/*",
"src/main",
"static/",
"versions/**/*",
"package.json",
"!node_modules/**/*"
],
"nsis": {
"oneClick": false,
"perMachine": false,
"allowElevation": true,
"allowToChangeInstallationDirectory": true,
"createDesktopShortcut": true,
"deleteAppDataOnUninstall": false,
"shortcutName": "Chat2DB"
},
"mac": {
"icon": "src/assets/logo/logo.icns",
"target": [
"zip",
"dmg"
]
},
"win": {
"target": [
{
"target": "nsis"
}
],
"publisherName": "Chat2DB",
"icon": "src/assets/logo/logo.ico"
},
"linux": {
"maintainer": "Chat2DB, huanyueyaoqin@qq.com",
"category": "Network;",
"target": [
"AppImage"
]
}
}
}
================================================
FILE: chat2db-client/readme.md
================================================
## 技术选型
1. 脚手架:umi v4
2. 组件库:antd v5
3. 状态管理库 dva
4. 图表库
5. 国际化
目录结构 tree ./ -L 2 -I node_modules
## 启动项目
强制使用 yarn,因为环境变量、lock 文件只维护了 yarn,npm/pnpm 可能会产生意想不到的 bug node 版本要求 16 以上 `npm i -g yarn` `yarn` `yarn run build:web:prod` `cp -r dist ../chat2db-server/chat2db-server-start/src/main/resources/static/front` (复制打包结果到指定目录。windows 可能命令不一样,可以手动复制下) 之后就可以启动后端了 `mvn clean package -B '-Dmaven.test.skip=true' -f chat2db-server/pom.xml`
启动前端项目调试 `yarn run start:web` 注意:因为 electron 包比较难下载,如果 yarn 时 electron 下载失败或超时,可以删除掉 chat2db-client/package.json 下的 electron,再次 yarn
## TS书写规范
1. 所有的interface 与 type 必须已I开头
`interface IState { name: string }` // good
`interface State { name: string }` // bad
## 如何在 js 与 css 中使用颜色
具体转换在 /theme/index.ts 中的 injectThemeVar
- js 在 window.\_AppThemePack 中去取 eg:`window._AppThemePack.controlItemBgActive` // good
- css eg: `background: var(--control-item-bg-active)` // good
- css `color: #fff` // bad
## 如何使用国际化
所有 key 参考格式为 `模块名称.文案类型.文案描述`。若文案包含可变部分,可使用 `{1}`、`{2}`、`{3}` 代替。
`src/i18n/index.ts` 中默认导出 `i18n` 转换方法,可以将 key 转换为对应的实际文案。文案中的 `{1}` 将被替换为第二个入参,以此类推。例如:
```tsx
// 'home.tip.welcome': '欢迎您,{1}!'
i18n('home.tip.welcome', user.name); // => '欢迎您,张三!'
```
也可以使用 `src/i18n/index.ts` 中导出的 `i18nElement` 方法,可以将文案中的占位符替换为 JSX 元素。例如:
```tsx
i18nElement('home.tip.welcome', {user.name} ); // => <>欢迎您,张三 !>'
```
```code
├── dist
│ ├── index.html
│ ├── layouts__index.async.js
│ ├── layouts__index.chunk.css
│ ├── p__docs.async.js
│ ├── p__index.async.js
│ └── umi.js
├── package.json
├── readme.md
├── release
│ ├── Chat2DB-1.0.0-arm64-mac.zip
│ ├── Chat2DB-1.0.0-arm64-mac.zip.blockmap
│ ├── Chat2DB-1.0.0-arm64.dmg
│ ├── Chat2DB-1.0.0-arm64.dmg.blockmap
│ ├── builder-debug.yml
│ ├── builder-effective-config.yaml
│ └── mac-arm64
├── src
│ ├── assets
│ ├── blocks
│ ├── components
│ ├── config
│ ├── constant
│ ├── layouts
│ ├── locales
│ ├── main
│ ├── models
│ ├── pages
│ ├── typings
│ └── utils
├── tsconfig.json
├── typings.d.ts
└── yarn.lock
```
================================================
FILE: chat2db-client/src/assets/font/demo.css
================================================
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
================================================
FILE: chat2db-client/src/assets/font/demo_index.html
================================================
iconfont Demo
Unicode
Font class
Symbol
查看项目
Unicode 引用
Unicode 是字体在网页端最原始的应用方式,特点是:
支持按字体的方式去动态调整图标大小,颜色等等。
默认情况下不支持多色,直接添加多色图标会自动去色。
注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)
Unicode 使用步骤如下:
第一步:拷贝项目下面生成的 @font-face
@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1704794525154') format('woff2'),
url('iconfont.woff?t=1704794525154') format('woff'),
url('iconfont.ttf?t=1704794525154') format('truetype');
}
第二步:定义使用 iconfont 的样式
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
第三步:挑选相应图标并获取字体编码,应用于页面
<span class="iconfont">3</span>
"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
right_on_5
.icon-right_on_5
right_off_5-01
.icon-right_off_5-01
left_on_2
.icon-a-left_on_huaban11
left_off
.icon-a-left_off_huaban1
minimize21
.icon-minimize21
restore
.icon-restore_button2
resize
.icon-resize_button2
close
.icon-close_button2
筛选
.icon-shaixuan
排序
.icon-a-44tubiao-122
305信息-线性圆框
.icon-xinxi-xianxingyuankuang
加号
.icon-jiahao
列表
.icon-liebiao
减去
.icon-jianqu
database
.icon-database
筛选
.icon-shaixuan1
刷新
.icon-shuaxin2
加号_o
.icon-jiahao_o
数据库_jurassic
.icon-jurassic_data
权限
.icon-quanxian
sharpicons_add-database
.icon-sharpicons_add-database
组织管理
.icon-zuzhiguanli-
空间
.icon-moxing-miaobian
下箭头-copy
.icon-xiajiantou1-copy
查看
.icon-chakan2
clone
.icon-clone
提交
.icon-tijiao
查看
.icon-chakan1
复制
.icon-fuzhi
icon_answer
.icon-icon_answer
icon_question
.icon-icon_question
发送
.icon-fasong
重启
.icon-zhongqi
提醒
.icon-tixing2
提醒
.icon-tixing3
提醒
.icon-tixing1
升级
.icon-shengji
全局_升级
.icon-quanju_shengji
关于我们
.icon-guanyuwomen1
ico版本更新
.icon-icobanbengengxin
对话气泡
.icon-duihuaqipao
角色权限
.icon-jiaosequanxian
preview
.icon-preview1
导入
.icon-daoru
终止
.icon-zhongzhi
退出
.icon-tuichu
控桩终端
.icon-kongzhuangzhongduan
撤销
.icon-chexiao1
向上
.icon-xiangshang
查看
.icon-chakan-copy
编辑数据_编辑录入操作_jurassic
.icon-jurassic_edit-data
编辑表格_编辑录入操作_jurassic
.icon-jurassic_edit-table
报表数据录入
.icon-baobiaoshujuluru
播放5
.icon-bofang5
清空@3x
.icon-a-qingkong3x
删除
.icon-shanchu
new-document-worksheet
.icon-newdocumentworksheet
file-excel
.icon-file-excel
file-markdown
.icon-file-markdown
file-word
.icon-file-word
HTML5
.icon-HTML
HTML
.icon-HTML1
pdf
.icon-pdf
个人用户
.icon-gerenyonghu
后台管理
.icon-houtaiguanli
字体代码
.icon-zitidaima
版本
.icon-banben
车位管理
.icon-cheweiguanli
dictate
.icon-dianzhelidaochu
circle-f
.icon-circle-f
图表-函数
.icon-tubiao-hanshu
视图管理器
.icon-shituguanliqi
回车
.icon-huiche
缺省
.icon-quesheng
进入箭头
.icon-jinrujiantou
右箭头
.icon-youjiantou_huaban
向右箭头
.icon-xiangyoujiantou1
数据源
.icon-shujuyuan
question
.icon-question
星星-copy
.icon-xingxing
控制台
.icon-kongzhitai
星系
.icon-xingxi
暂无数据 (1)
.icon-a-zanwushuju1
开始
.icon-kaishi
关闭
.icon-guanbi
下箭头
.icon-xiajiantou
more
.icon-gengduo
设置
.icon-shezhi
对话-未选
.icon-duihua-weixuan
图表-未选
.icon-tubiao-weixuan
编组 13备份 3
.icon-a-bianzu13beifen3
编组备份
.icon-bianzubeifen
表格
.icon-biaoge1
收藏 (1)
.icon-a-shoucang1
guthub-未选
.icon-guthub-weixuan1
数据-未选
.icon-shuju-weixuan
编组 4
.icon-a-bianzu4
编组 14备份
.icon-a-bianzu14beifen
guthub-未选
.icon-guthub-weixuan
24gl-folderMinus
.icon-24gl-folderMinus
24gl-folderOpen
.icon-24gl-folderOpen
24gf-folderOpen
.icon-24gf-folderOpen
云数据库
.icon-yunshujuku
报表
.icon-baobiao
工作台
.icon-gongzuotai
mongodb
.icon-mongodb
Redis
.icon-Redis
HIVE_2
.icon-HIVE
Kingbase
.icon-Kingbase
仪表盘
.icon-yibiaopan
presto
.icon-presto_sql
DB2
.icon-shujukuleixingtubiao-kuozhan-
oceanbase
.icon-oceanbase
达梦
.icon-dameng1
proxy
.icon-proxy
openai
.icon-openai
关于
.icon-guanyu
衣服
.icon-yifu
数据库
.icon-shujuku4
数据源配置
.icon-shujuyuanpeizhi
服务器_数据库_jurassic
.icon-jurassic_server
数据库
.icon-shujuku2
数据库
.icon-shujuku3
数据库数据
.icon-shujukushuju
数据库
.icon-shujuku1
配置数据源
.icon-peizhishujuyuan
SQL历史查询
.icon-SQLlishichaxun
重命名
.icon-zhongmingming
ico_数据查询与统计_预约情况查询
.icon-ico_shujuchaxunyutongji_yuyueqingkuangchaxun
clickhouse-云数据库ClickHouse
.icon-clickhouse-yunshujukuClickHouse
rds_mariadb
.icon-rds_mariadb
减少减去减号
.icon-jianshaojianqujianhao
sqlserver
.icon-sqlserver
sqlite
.icon-sqlite
缺省页_暂无数据
.icon-queshengye_zanwushuju
未完成
.icon-weiwancheng
完成-01
.icon-wancheng-
成功
.icon-chenggong1
机器人
.icon-jiqiren
换一换
.icon-huanyihuan
icon_infomation
.icon-icon_infomation
key
.icon-key1
mysql
.icon-mysql
oracle
.icon-oracle
postgresql
.icon-postgresql
h2
.icon-h2
cc-schema
.icon-cc-schema
新建表格
.icon-xinjianbiaoge
export
.icon-export
角色管理
.icon-jiaoseguanli
console
.icon-console
24gf-folderMinus
.icon-24gf-folderMinus
查看
.icon-chakan
复制_o
.icon-fuzhi_o
执行
.icon-zhihang
m-格式化文字
.icon-m-geshihuawenzi
github-fill
.icon-github-fill
保存
.icon-baocun2
箭头_向左两次_o
.icon-jiantou_xiangzuoliangci_o
新建窗口
.icon-xinjianchuangkou
loading
.icon-loading2
链接克隆
.icon-lianjiekelong
SQL升级文件
.icon-SQLshengjiwenjian
sql
.icon-sql
连接流
.icon-lianjieliu
跳转/退出
.icon-tiaozhuan
key
.icon-key
播放记录
.icon-bofangjilu
成功
.icon-chenggong
失败
.icon-shibai
收回 上下
.icon-shouhuishangxia
展开 上下
.icon-zhankaishangxia
数据库
.icon-shujuku
保存
.icon-baocun
查询
.icon-chaxun
对勾
.icon-duigou11
check
.icon-check1
概览
.icon-gailan
概览
.icon-huaban2
编辑
.icon-bianji
刷新
.icon-shuaxin1
菜单/列表
.icon-caidan
表格
.icon-biaoge
展开
.icon-zhankai
收起
.icon-shouqi
主题_o
.icon-zhuti_o
断开连接
.icon-duankailianjie
修改
.icon-xiugai
删除
.icon-delete
更多
.icon-gengduo1
减少
.icon-jianshao
加
.icon-jia
加号
.icon-hao
arrow drop down
.icon-right
search
.icon-search1
download
.icon-download1
向右箭头
.icon-xiangyoujiantou
删除线型
.icon-shanchuxianxing
cross
.icon-cross-copy
刷新
.icon-shuaxin
提醒
.icon-tixing
138设置、系统设置、功能设置、属性
.icon-shezhixitongshezhigongnengshezhishuxing
执行sql脚本
.icon-zhihangsqljiaoben
虚拟数据库管理
.icon-xunishujukuguanli
font-class 引用
font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。
与 Unicode 使用方式相比,具有如下特点:
相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
使用步骤如下:
第一步:引入项目下面生成的 fontclass 代码:
<link rel="stylesheet" href="./iconfont.css">
第二步:挑选相应图标并获取类名,应用于页面:
<span class="iconfont icon-xxx"></span>
"
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
right_on_5
#icon-right_on_5
right_off_5-01
#icon-right_off_5-01
left_on_2
#icon-a-left_on_huaban11
left_off
#icon-a-left_off_huaban1
minimize21
#icon-minimize21
restore
#icon-restore_button2
resize
#icon-resize_button2
close
#icon-close_button2
筛选
#icon-shaixuan
排序
#icon-a-44tubiao-122
305信息-线性圆框
#icon-xinxi-xianxingyuankuang
加号
#icon-jiahao
列表
#icon-liebiao
减去
#icon-jianqu
database
#icon-database
筛选
#icon-shaixuan1
刷新
#icon-shuaxin2
加号_o
#icon-jiahao_o
数据库_jurassic
#icon-jurassic_data
权限
#icon-quanxian
sharpicons_add-database
#icon-sharpicons_add-database
组织管理
#icon-zuzhiguanli-
空间
#icon-moxing-miaobian
下箭头-copy
#icon-xiajiantou1-copy
查看
#icon-chakan2
clone
#icon-clone
提交
#icon-tijiao
查看
#icon-chakan1
复制
#icon-fuzhi
icon_answer
#icon-icon_answer
icon_question
#icon-icon_question
发送
#icon-fasong
重启
#icon-zhongqi
提醒
#icon-tixing2
提醒
#icon-tixing3
提醒
#icon-tixing1
升级
#icon-shengji
全局_升级
#icon-quanju_shengji
关于我们
#icon-guanyuwomen1
ico版本更新
#icon-icobanbengengxin
对话气泡
#icon-duihuaqipao
角色权限
#icon-jiaosequanxian
preview
#icon-preview1
导入
#icon-daoru
终止
#icon-zhongzhi
退出
#icon-tuichu
控桩终端
#icon-kongzhuangzhongduan
撤销
#icon-chexiao1
向上
#icon-xiangshang
查看
#icon-chakan-copy
编辑数据_编辑录入操作_jurassic
#icon-jurassic_edit-data
编辑表格_编辑录入操作_jurassic
#icon-jurassic_edit-table
报表数据录入
#icon-baobiaoshujuluru
播放5
#icon-bofang5
清空@3x
#icon-a-qingkong3x
删除
#icon-shanchu
new-document-worksheet
#icon-newdocumentworksheet
file-excel
#icon-file-excel
file-markdown
#icon-file-markdown
file-word
#icon-file-word
HTML5
#icon-HTML
HTML
#icon-HTML1
pdf
#icon-pdf
个人用户
#icon-gerenyonghu
后台管理
#icon-houtaiguanli
字体代码
#icon-zitidaima
版本
#icon-banben
车位管理
#icon-cheweiguanli
dictate
#icon-dianzhelidaochu
circle-f
#icon-circle-f
图表-函数
#icon-tubiao-hanshu
视图管理器
#icon-shituguanliqi
回车
#icon-huiche
缺省
#icon-quesheng
进入箭头
#icon-jinrujiantou
右箭头
#icon-youjiantou_huaban
向右箭头
#icon-xiangyoujiantou1
数据源
#icon-shujuyuan
question
#icon-question
星星-copy
#icon-xingxing
控制台
#icon-kongzhitai
星系
#icon-xingxi
暂无数据 (1)
#icon-a-zanwushuju1
开始
#icon-kaishi
关闭
#icon-guanbi
下箭头
#icon-xiajiantou
more
#icon-gengduo
设置
#icon-shezhi
对话-未选
#icon-duihua-weixuan
图表-未选
#icon-tubiao-weixuan
编组 13备份 3
#icon-a-bianzu13beifen3
编组备份
#icon-bianzubeifen
表格
#icon-biaoge1
收藏 (1)
#icon-a-shoucang1
guthub-未选
#icon-guthub-weixuan1
数据-未选
#icon-shuju-weixuan
编组 4
#icon-a-bianzu4
编组 14备份
#icon-a-bianzu14beifen
guthub-未选
#icon-guthub-weixuan
24gl-folderMinus
#icon-24gl-folderMinus
24gl-folderOpen
#icon-24gl-folderOpen
24gf-folderOpen
#icon-24gf-folderOpen
云数据库
#icon-yunshujuku
报表
#icon-baobiao
工作台
#icon-gongzuotai
mongodb
#icon-mongodb
Redis
#icon-Redis
HIVE_2
#icon-HIVE
Kingbase
#icon-Kingbase
仪表盘
#icon-yibiaopan
presto
#icon-presto_sql
DB2
#icon-shujukuleixingtubiao-kuozhan-
oceanbase
#icon-oceanbase
达梦
#icon-dameng1
proxy
#icon-proxy
openai
#icon-openai
关于
#icon-guanyu
衣服
#icon-yifu
数据库
#icon-shujuku4
数据源配置
#icon-shujuyuanpeizhi
服务器_数据库_jurassic
#icon-jurassic_server
数据库
#icon-shujuku2
数据库
#icon-shujuku3
数据库数据
#icon-shujukushuju
数据库
#icon-shujuku1
配置数据源
#icon-peizhishujuyuan
SQL历史查询
#icon-SQLlishichaxun
重命名
#icon-zhongmingming
ico_数据查询与统计_预约情况查询
#icon-ico_shujuchaxunyutongji_yuyueqingkuangchaxun
clickhouse-云数据库ClickHouse
#icon-clickhouse-yunshujukuClickHouse
rds_mariadb
#icon-rds_mariadb
减少减去减号
#icon-jianshaojianqujianhao
sqlserver
#icon-sqlserver
sqlite
#icon-sqlite
缺省页_暂无数据
#icon-queshengye_zanwushuju
未完成
#icon-weiwancheng
完成-01
#icon-wancheng-
成功
#icon-chenggong1
机器人
#icon-jiqiren
换一换
#icon-huanyihuan
icon_infomation
#icon-icon_infomation
key
#icon-key1
mysql
#icon-mysql
oracle
#icon-oracle
postgresql
#icon-postgresql
h2
#icon-h2
cc-schema
#icon-cc-schema
新建表格
#icon-xinjianbiaoge
export
#icon-export
角色管理
#icon-jiaoseguanli
console
#icon-console
24gf-folderMinus
#icon-24gf-folderMinus
查看
#icon-chakan
复制_o
#icon-fuzhi_o
执行
#icon-zhihang
m-格式化文字
#icon-m-geshihuawenzi
github-fill
#icon-github-fill
保存
#icon-baocun2
箭头_向左两次_o
#icon-jiantou_xiangzuoliangci_o
新建窗口
#icon-xinjianchuangkou
loading
#icon-loading2
链接克隆
#icon-lianjiekelong
SQL升级文件
#icon-SQLshengjiwenjian
sql
#icon-sql
连接流
#icon-lianjieliu
跳转/退出
#icon-tiaozhuan
key
#icon-key
播放记录
#icon-bofangjilu
成功
#icon-chenggong
失败
#icon-shibai
收回 上下
#icon-shouhuishangxia
展开 上下
#icon-zhankaishangxia
数据库
#icon-shujuku
保存
#icon-baocun
查询
#icon-chaxun
对勾
#icon-duigou11
check
#icon-check1
概览
#icon-gailan
概览
#icon-huaban2
编辑
#icon-bianji
刷新
#icon-shuaxin1
菜单/列表
#icon-caidan
表格
#icon-biaoge
展开
#icon-zhankai
收起
#icon-shouqi
主题_o
#icon-zhuti_o
断开连接
#icon-duankailianjie
修改
#icon-xiugai
删除
#icon-delete
更多
#icon-gengduo1
减少
#icon-jianshao
加
#icon-jia
加号
#icon-hao
arrow drop down
#icon-right
search
#icon-search1
download
#icon-download1
向右箭头
#icon-xiangyoujiantou
删除线型
#icon-shanchuxianxing
cross
#icon-cross-copy
刷新
#icon-shuaxin
提醒
#icon-tixing
138设置、系统设置、功能设置、属性
#icon-shezhixitongshezhigongnengshezhishuxing
执行sql脚本
#icon-zhihangsqljiaoben
虚拟数据库管理
#icon-xunishujukuguanli
Symbol 引用
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:
支持多色图标了,不再受单色限制。
通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
兼容性较差,支持 IE9+,及现代浏览器。
浏览器渲染 SVG 的性能一般,还不如 png。
使用步骤如下:
第一步:引入项目下面生成的 symbol 代码:
<script src="./iconfont.js"></script>
第二步:加入通用 CSS 代码(引入一次就行):
<style>
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
第三步:挑选相应图标并获取类名,应用于页面:
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xxx"></use>
</svg>
================================================
FILE: chat2db-client/src/assets/font/iconfont.css
================================================
@font-face {
font-family: "iconfont"; /* Project id 3633546 */
src: url('iconfont.woff2?t=1704794525154') format('woff2'),
url('iconfont.woff?t=1704794525154') format('woff'),
url('iconfont.ttf?t=1704794525154') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-right_on_5:before {
content: "\e672";
}
.icon-right_off_5-01:before {
content: "\e673";
}
.icon-a-left_on_huaban11:before {
content: "\e674";
}
.icon-a-left_off_huaban1:before {
content: "\e670";
}
.icon-minimize21:before {
content: "\e671";
}
.icon-restore_button2:before {
content: "\e66b";
}
.icon-resize_button2:before {
content: "\e66e";
}
.icon-close_button2:before {
content: "\e66f";
}
.icon-shaixuan:before {
content: "\e66a";
}
.icon-a-44tubiao-122:before {
content: "\e69a";
}
.icon-xinxi-xianxingyuankuang:before {
content: "\e8e8";
}
.icon-jiahao:before {
content: "\e726";
}
.icon-liebiao:before {
content: "\ec6b";
}
.icon-jianqu:before {
content: "\e65d";
}
.icon-database:before {
content: "\e669";
}
.icon-shaixuan1:before {
content: "\e888";
}
.icon-shuaxin2:before {
content: "\e668";
}
.icon-jiahao_o:before {
content: "\eb78";
}
.icon-jurassic_data:before {
content: "\e6a9";
}
.icon-quanxian:before {
content: "\e667";
}
.icon-sharpicons_add-database:before {
content: "\e816";
}
.icon-zuzhiguanli-:before {
content: "\e663";
}
.icon-moxing-miaobian:before {
content: "\e691";
}
.icon-xiajiantou1-copy:before {
content: "\100be";
}
.icon-chakan2:before {
content: "\e788";
}
.icon-clone:before {
content: "\e8db";
}
.icon-tijiao:before {
content: "\e687";
}
.icon-chakan1:before {
content: "\e665";
}
.icon-fuzhi:before {
content: "\ec7a";
}
.icon-icon_answer:before {
content: "\e686";
}
.icon-icon_question:before {
content: "\e6a8";
}
.icon-fasong:before {
content: "\100bd";
}
.icon-zhongqi:before {
content: "\e662";
}
.icon-tixing2:before {
content: "\e6cc";
}
.icon-tixing3:before {
content: "\e661";
}
.icon-tixing1:before {
content: "\e716";
}
.icon-shengji:before {
content: "\e69c";
}
.icon-quanju_shengji:before {
content: "\e659";
}
.icon-guanyuwomen1:before {
content: "\e65c";
}
.icon-icobanbengengxin:before {
content: "\e67d";
}
.icon-duihuaqipao:before {
content: "\e657";
}
.icon-jiaosequanxian:before {
content: "\e658";
}
.icon-preview1:before {
content: "\e654";
}
.icon-daoru:before {
content: "\e653";
}
.icon-zhongzhi:before {
content: "\e652";
}
.icon-tuichu:before {
content: "\e6b2";
}
.icon-kongzhuangzhongduan:before {
content: "\e6bb";
}
.icon-chexiao1:before {
content: "\e6e2";
}
.icon-xiangshang:before {
content: "\e650";
}
.icon-chakan-copy:before {
content: "\e651";
}
.icon-jurassic_edit-data:before {
content: "\e6f2";
}
.icon-jurassic_edit-table:before {
content: "\e6f3";
}
.icon-baobiaoshujuluru:before {
content: "\e7b5";
}
.icon-bofang5:before {
content: "\e656";
}
.icon-a-qingkong3x:before {
content: "\e64f";
}
.icon-shanchu:before {
content: "\e64e";
}
.icon-newdocumentworksheet:before {
content: "\e792";
}
.icon-file-excel:before {
content: "\e7b7";
}
.icon-file-markdown:before {
content: "\e7b8";
}
.icon-file-word:before {
content: "\e7ba";
}
.icon-HTML:before {
content: "\e87d";
}
.icon-HTML1:before {
content: "\e64d";
}
.icon-pdf:before {
content: "\e67a";
}
.icon-gerenyonghu:before {
content: "\e64c";
}
.icon-houtaiguanli:before {
content: "\e64b";
}
.icon-zitidaima:before {
content: "\ec83";
}
.icon-banben:before {
content: "\e70c";
}
.icon-cheweiguanli:before {
content: "\e73c";
}
.icon-dianzhelidaochu:before {
content: "\e64a";
}
.icon-circle-f:before {
content: "\e76a";
}
.icon-tubiao-hanshu:before {
content: "\e6fd";
}
.icon-shituguanliqi:before {
content: "\e647";
}
.icon-huiche:before {
content: "\e643";
}
.icon-quesheng:before {
content: "\e642";
}
.icon-jinrujiantou:before {
content: "\e88e";
}
.icon-youjiantou_huaban:before {
content: "\e641";
}
.icon-xiangyoujiantou1:before {
content: "\e660";
}
.icon-shujuyuan:before {
content: "\e640";
}
.icon-question:before {
content: "\e67c";
}
.icon-xingxing:before {
content: "\e63a";
}
.icon-kongzhitai:before {
content: "\e69f";
}
.icon-xingxi:before {
content: "\e639";
}
.icon-a-zanwushuju1:before {
content: "\e638";
}
.icon-kaishi:before {
content: "\e637";
}
.icon-guanbi:before {
content: "\e634";
}
.icon-xiajiantou:before {
content: "\eb6d";
}
.icon-gengduo:before {
content: "\e633";
}
.icon-shezhi:before {
content: "\e630";
}
.icon-duihua-weixuan:before {
content: "\e628";
}
.icon-tubiao-weixuan:before {
content: "\e629";
}
.icon-a-bianzu13beifen3:before {
content: "\e62b";
}
.icon-bianzubeifen:before {
content: "\e616";
}
.icon-biaoge1:before {
content: "\e618";
}
.icon-a-shoucang1:before {
content: "\e61d";
}
.icon-guthub-weixuan1:before {
content: "\e621";
}
.icon-shuju-weixuan:before {
content: "\e622";
}
.icon-a-bianzu4:before {
content: "\e624";
}
.icon-a-bianzu14beifen:before {
content: "\e627";
}
.icon-guthub-weixuan:before {
content: "\e615";
}
.icon-24gl-folderMinus:before {
content: "\eabe";
}
.icon-24gl-folderOpen:before {
content: "\eabf";
}
.icon-24gf-folderOpen:before {
content: "\eac7";
}
.icon-yunshujuku:before {
content: "\e744";
}
.icon-baobiao:before {
content: "\e612";
}
.icon-gongzuotai:before {
content: "\e614";
}
.icon-mongodb:before {
content: "\ec21";
}
.icon-Redis:before {
content: "\e6a2";
}
.icon-HIVE:before {
content: "\e60e";
}
.icon-Kingbase:before {
content: "\e6a0";
}
.icon-yibiaopan:before {
content: "\e60d";
}
.icon-presto_sql:before {
content: "\e60b";
}
.icon-shujukuleixingtubiao-kuozhan-:before {
content: "\e60a";
}
.icon-oceanbase:before {
content: "\e982";
}
.icon-dameng1:before {
content: "\e655";
}
.icon-proxy:before {
content: "\e63f";
}
.icon-openai:before {
content: "\e646";
}
.icon-guanyu:before {
content: "\e60c";
}
.icon-yifu:before {
content: "\e666";
}
.icon-shujuku4:before {
content: "\e609";
}
.icon-shujuyuanpeizhi:before {
content: "\e649";
}
.icon-jurassic_server:before {
content: "\e6a6";
}
.icon-shujuku2:before {
content: "\e607";
}
.icon-shujuku3:before {
content: "\e625";
}
.icon-shujukushuju:before {
content: "\e63c";
}
.icon-shujuku1:before {
content: "\e636";
}
.icon-peizhishujuyuan:before {
content: "\e62f";
}
.icon-SQLlishichaxun:before {
content: "\e80a";
}
.icon-zhongmingming:before {
content: "\e623";
}
.icon-ico_shujuchaxunyutongji_yuyueqingkuangchaxun:before {
content: "\e8ff";
}
.icon-clickhouse-yunshujukuClickHouse:before {
content: "\e8f4";
}
.icon-rds_mariadb:before {
content: "\e6f5";
}
.icon-jianshaojianqujianhao:before {
content: "\e62a";
}
.icon-sqlserver:before {
content: "\e664";
}
.icon-sqlite:before {
content: "\e65a";
}
.icon-queshengye_zanwushuju:before {
content: "\e760";
}
.icon-weiwancheng:before {
content: "\e755";
}
.icon-wancheng-:before {
content: "\e62e";
}
.icon-chenggong1:before {
content: "\e620";
}
.icon-jiqiren:before {
content: "\e70e";
}
.icon-huanyihuan:before {
content: "\e635";
}
.icon-icon_infomation:before {
content: "\e65b";
}
.icon-key1:before {
content: "\e775";
}
.icon-mysql:before {
content: "\ec6d";
}
.icon-oracle:before {
content: "\ec48";
}
.icon-postgresql:before {
content: "\ec5d";
}
.icon-h2:before {
content: "\e61c";
}
.icon-cc-schema:before {
content: "\e696";
}
.icon-xinjianbiaoge:before {
content: "\e6b6";
}
.icon-export:before {
content: "\e613";
}
.icon-jiaoseguanli:before {
content: "\e66d";
}
.icon-console:before {
content: "\e619";
}
.icon-24gf-folderMinus:before {
content: "\eac5";
}
.icon-chakan:before {
content: "\e606";
}
.icon-fuzhi_o:before {
content: "\eb4e";
}
.icon-zhihang:before {
content: "\e626";
}
.icon-m-geshihuawenzi:before {
content: "\e7f8";
}
.icon-github-fill:before {
content: "\e885";
}
.icon-baocun2:before {
content: "\e645";
}
.icon-jiantou_xiangzuoliangci_o:before {
content: "\eb93";
}
.icon-xinjianchuangkou:before {
content: "\e603";
}
.icon-loading2:before {
content: "\e6cd";
}
.icon-lianjiekelong:before {
content: "\e6ca";
}
.icon-SQLshengjiwenjian:before {
content: "\e63b";
}
.icon-sql:before {
content: "\e610";
}
.icon-lianjieliu:before {
content: "\ec57";
}
.icon-tiaozhuan:before {
content: "\e685";
}
.icon-key:before {
content: "\e648";
}
.icon-bofangjilu:before {
content: "\e8ad";
}
.icon-chenggong:before {
content: "\e605";
}
.icon-shibai:before {
content: "\e87c";
}
.icon-shouhuishangxia:before {
content: "\e790";
}
.icon-zhankaishangxia:before {
content: "\e7b1";
}
.icon-shujuku:before {
content: "\e62c";
}
.icon-baocun:before {
content: "\e936";
}
.icon-chaxun:before {
content: "\ec4c";
}
.icon-duigou11:before {
content: "\e61f";
}
.icon-check1:before {
content: "\e617";
}
.icon-gailan:before {
content: "\e632";
}
.icon-huaban2:before {
content: "\e63d";
}
.icon-bianji:before {
content: "\e602";
}
.icon-shuaxin1:before {
content: "\ec08";
}
.icon-caidan:before {
content: "\e611";
}
.icon-biaoge:before {
content: "\e63e";
}
.icon-zhankai:before {
content: "\e65f";
}
.icon-shouqi:before {
content: "\e61e";
}
.icon-zhuti_o:before {
content: "\eb6f";
}
.icon-duankailianjie:before {
content: "\e65e";
}
.icon-xiugai:before {
content: "\e60f";
}
.icon-delete:before {
content: "\e604";
}
.icon-gengduo1:before {
content: "\e601";
}
.icon-jianshao:before {
content: "\e644";
}
.icon-jia:before {
content: "\e61b";
}
.icon-hao:before {
content: "\e631";
}
.icon-right:before {
content: "\e608";
}
.icon-search1:before {
content: "\e600";
}
.icon-download1:before {
content: "\e66c";
}
.icon-xiangyoujiantou:before {
content: "\e79c";
}
.icon-shanchuxianxing:before {
content: "\e6a7";
}
.icon-cross-copy:before {
content: "\ec8e";
}
.icon-shuaxin:before {
content: "\e62d";
}
.icon-tixing:before {
content: "\e913";
}
.icon-shezhixitongshezhigongnengshezhishuxing:before {
content: "\e795";
}
.icon-zhihangsqljiaoben:before {
content: "\e759";
}
.icon-xunishujukuguanli:before {
content: "\e61a";
}
================================================
FILE: chat2db-client/src/assets/font/iconfont.js
================================================
window._iconfont_svg_string_3633546=' ',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],c=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var l,t,i,o,v,z=function(a,c){c.parentNode.insertBefore(a,c)};if(c&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}l=function(){var a,c=document.createElement("div");c.innerHTML=h._iconfont_svg_string_3633546,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(a=document.body).firstChild?z(c,a.firstChild):a.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),l()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(i=l,o=h.document,v=!1,s(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,p())})}function p(){v||(v=!0,i())}function s(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(s,50)}p()}}(window);
================================================
FILE: chat2db-client/src/assets/font/iconfont.json
================================================
{
"id": "3633546",
"name": "chat2db",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "38884431",
"name": "right_on_5",
"font_class": "right_on_5",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "38884432",
"name": "right_off_5-01",
"font_class": "right_off_5-01",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "38883914",
"name": "left_on_2",
"font_class": "a-left_on_huaban11",
"unicode": "e674",
"unicode_decimal": 58996
},
{
"icon_id": "38882655",
"name": "left_off",
"font_class": "a-left_off_huaban1",
"unicode": "e670",
"unicode_decimal": 58992
},
{
"icon_id": "38873585",
"name": "minimize21",
"font_class": "minimize21",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "38872025",
"name": "restore",
"font_class": "restore_button2",
"unicode": "e66b",
"unicode_decimal": 58987
},
{
"icon_id": "38872027",
"name": "resize",
"font_class": "resize_button2",
"unicode": "e66e",
"unicode_decimal": 58990
},
{
"icon_id": "38872028",
"name": "close",
"font_class": "close_button2",
"unicode": "e66f",
"unicode_decimal": 58991
},
{
"icon_id": "8721198",
"name": "筛选",
"font_class": "shaixuan",
"unicode": "e66a",
"unicode_decimal": 58986
},
{
"icon_id": "38644725",
"name": "排序",
"font_class": "a-44tubiao-122",
"unicode": "e69a",
"unicode_decimal": 59034
},
{
"icon_id": "1727525",
"name": "305信息-线性圆框",
"font_class": "xinxi-xianxingyuankuang",
"unicode": "e8e8",
"unicode_decimal": 59624
},
{
"icon_id": "577312",
"name": "加号",
"font_class": "jiahao",
"unicode": "e726",
"unicode_decimal": 59174
},
{
"icon_id": "5961366",
"name": "列表",
"font_class": "liebiao",
"unicode": "ec6b",
"unicode_decimal": 60523
},
{
"icon_id": "6318169",
"name": "减去",
"font_class": "jianqu",
"unicode": "e65d",
"unicode_decimal": 58973
},
{
"icon_id": "5729483",
"name": "database",
"font_class": "database",
"unicode": "e669",
"unicode_decimal": 58985
},
{
"icon_id": "2076240",
"name": "筛选",
"font_class": "shaixuan1",
"unicode": "e888",
"unicode_decimal": 59528
},
{
"icon_id": "2787037",
"name": "刷新",
"font_class": "shuaxin2",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "5387866",
"name": "加号_o",
"font_class": "jiahao_o",
"unicode": "eb78",
"unicode_decimal": 60280
},
{
"icon_id": "10594610",
"name": "数据库_jurassic",
"font_class": "jurassic_data",
"unicode": "e6a9",
"unicode_decimal": 59049
},
{
"icon_id": "12515461",
"name": "权限",
"font_class": "quanxian",
"unicode": "e667",
"unicode_decimal": 58983
},
{
"icon_id": "10573069",
"name": "sharpicons_add-database",
"font_class": "sharpicons_add-database",
"unicode": "e816",
"unicode_decimal": 59414
},
{
"icon_id": "6789097",
"name": "组织管理",
"font_class": "zuzhiguanli-",
"unicode": "e663",
"unicode_decimal": 58979
},
{
"icon_id": "15568801",
"name": "空间",
"font_class": "moxing-miaobian",
"unicode": "e691",
"unicode_decimal": 59025
},
{
"icon_id": "37968169",
"name": "下箭头-copy",
"font_class": "xiajiantou1-copy",
"unicode": "100be",
"unicode_decimal": 65726
},
{
"icon_id": "22941156",
"name": "查看",
"font_class": "chakan2",
"unicode": "e788",
"unicode_decimal": 59272
},
{
"icon_id": "7735962",
"name": "clone",
"font_class": "clone",
"unicode": "e8db",
"unicode_decimal": 59611
},
{
"icon_id": "15488863",
"name": "提交",
"font_class": "tijiao",
"unicode": "e687",
"unicode_decimal": 59015
},
{
"icon_id": "12331656",
"name": "查看",
"font_class": "chakan1",
"unicode": "e665",
"unicode_decimal": 58981
},
{
"icon_id": "5993150",
"name": "复制",
"font_class": "fuzhi",
"unicode": "ec7a",
"unicode_decimal": 60538
},
{
"icon_id": "1624922",
"name": "icon_answer",
"font_class": "icon_answer",
"unicode": "e686",
"unicode_decimal": 59014
},
{
"icon_id": "1625000",
"name": "icon_question",
"font_class": "icon_question",
"unicode": "e6a8",
"unicode_decimal": 59048
},
{
"icon_id": "29290564",
"name": "发送",
"font_class": "fasong",
"unicode": "100bd",
"unicode_decimal": 65725
},
{
"icon_id": "8765142",
"name": "重启",
"font_class": "zhongqi",
"unicode": "e662",
"unicode_decimal": 58978
},
{
"icon_id": "673801",
"name": "提醒",
"font_class": "tixing2",
"unicode": "e6cc",
"unicode_decimal": 59084
},
{
"icon_id": "13646873",
"name": "提醒",
"font_class": "tixing3",
"unicode": "e661",
"unicode_decimal": 58977
},
{
"icon_id": "3457210",
"name": "提醒",
"font_class": "tixing1",
"unicode": "e716",
"unicode_decimal": 59158
},
{
"icon_id": "3814162",
"name": "升级",
"font_class": "shengji",
"unicode": "e69c",
"unicode_decimal": 59036
},
{
"icon_id": "3141572",
"name": "全局_升级",
"font_class": "quanju_shengji",
"unicode": "e659",
"unicode_decimal": 58969
},
{
"icon_id": "4171088",
"name": "关于我们",
"font_class": "guanyuwomen1",
"unicode": "e65c",
"unicode_decimal": 58972
},
{
"icon_id": "1285185",
"name": "ico版本更新",
"font_class": "icobanbengengxin",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "5203239",
"name": "对话气泡",
"font_class": "duihuaqipao",
"unicode": "e657",
"unicode_decimal": 58967
},
{
"icon_id": "12694416",
"name": "角色权限",
"font_class": "jiaosequanxian",
"unicode": "e658",
"unicode_decimal": 58968
},
{
"icon_id": "1462912",
"name": "preview",
"font_class": "preview1",
"unicode": "e654",
"unicode_decimal": 58964
},
{
"icon_id": "11399566",
"name": "导入",
"font_class": "daoru",
"unicode": "e653",
"unicode_decimal": 58963
},
{
"icon_id": "10933419",
"name": "终止",
"font_class": "zhongzhi",
"unicode": "e652",
"unicode_decimal": 58962
},
{
"icon_id": "29570629",
"name": "退出",
"font_class": "tuichu",
"unicode": "e6b2",
"unicode_decimal": 59058
},
{
"icon_id": "25071396",
"name": "控桩终端",
"font_class": "kongzhuangzhongduan",
"unicode": "e6bb",
"unicode_decimal": 59067
},
{
"icon_id": "4890374",
"name": "撤销",
"font_class": "chexiao1",
"unicode": "e6e2",
"unicode_decimal": 59106
},
{
"icon_id": "1204",
"name": "向上",
"font_class": "xiangshang",
"unicode": "e650",
"unicode_decimal": 58960
},
{
"icon_id": "5793838",
"name": "查看",
"font_class": "chakan-copy",
"unicode": "e651",
"unicode_decimal": 58961
},
{
"icon_id": "10792673",
"name": "编辑数据_编辑录入操作_jurassic",
"font_class": "jurassic_edit-data",
"unicode": "e6f2",
"unicode_decimal": 59122
},
{
"icon_id": "10792678",
"name": "编辑表格_编辑录入操作_jurassic",
"font_class": "jurassic_edit-table",
"unicode": "e6f3",
"unicode_decimal": 59123
},
{
"icon_id": "10465899",
"name": "报表数据录入",
"font_class": "baobiaoshujuluru",
"unicode": "e7b5",
"unicode_decimal": 59317
},
{
"icon_id": "1004675",
"name": "播放5",
"font_class": "bofang5",
"unicode": "e656",
"unicode_decimal": 58966
},
{
"icon_id": "34080274",
"name": "清空@3x",
"font_class": "a-qingkong3x",
"unicode": "e64f",
"unicode_decimal": 58959
},
{
"icon_id": "4880413",
"name": "删除",
"font_class": "shanchu",
"unicode": "e64e",
"unicode_decimal": 58958
},
{
"icon_id": "586995",
"name": "new-document-worksheet",
"font_class": "newdocumentworksheet",
"unicode": "e792",
"unicode_decimal": 59282
},
{
"icon_id": "4766469",
"name": "file-excel",
"font_class": "file-excel",
"unicode": "e7b7",
"unicode_decimal": 59319
},
{
"icon_id": "4766474",
"name": "file-markdown",
"font_class": "file-markdown",
"unicode": "e7b8",
"unicode_decimal": 59320
},
{
"icon_id": "4766477",
"name": "file-word",
"font_class": "file-word",
"unicode": "e7ba",
"unicode_decimal": 59322
},
{
"icon_id": "4936958",
"name": "HTML5",
"font_class": "HTML",
"unicode": "e87d",
"unicode_decimal": 59517
},
{
"icon_id": "12904096",
"name": "HTML",
"font_class": "HTML1",
"unicode": "e64d",
"unicode_decimal": 58957
},
{
"icon_id": "15838516",
"name": "pdf",
"font_class": "pdf",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "37118827",
"name": "个人用户",
"font_class": "gerenyonghu",
"unicode": "e64c",
"unicode_decimal": 58956
},
{
"icon_id": "37118908",
"name": "后台管理",
"font_class": "houtaiguanli",
"unicode": "e64b",
"unicode_decimal": 58955
},
{
"icon_id": "6337464",
"name": "字体代码",
"font_class": "zitidaima",
"unicode": "ec83",
"unicode_decimal": 60547
},
{
"icon_id": "27193693",
"name": "版本",
"font_class": "banben",
"unicode": "e70c",
"unicode_decimal": 59148
},
{
"icon_id": "10021618",
"name": "车位管理",
"font_class": "cheweiguanli",
"unicode": "e73c",
"unicode_decimal": 59196
},
{
"icon_id": "31775147",
"name": "dictate",
"font_class": "dianzhelidaochu",
"unicode": "e64a",
"unicode_decimal": 58954
},
{
"icon_id": "33841930",
"name": "circle-f",
"font_class": "circle-f",
"unicode": "e76a",
"unicode_decimal": 59242
},
{
"icon_id": "2966901",
"name": "图表-函数",
"font_class": "tubiao-hanshu",
"unicode": "e6fd",
"unicode_decimal": 59133
},
{
"icon_id": "11121428",
"name": "视图管理器",
"font_class": "shituguanliqi",
"unicode": "e647",
"unicode_decimal": 58951
},
{
"icon_id": "12685114",
"name": "回车",
"font_class": "huiche",
"unicode": "e643",
"unicode_decimal": 58947
},
{
"icon_id": "36566502",
"name": "缺省",
"font_class": "quesheng",
"unicode": "e642",
"unicode_decimal": 58946
},
{
"icon_id": "2076256",
"name": "进入箭头",
"font_class": "jinrujiantou",
"unicode": "e88e",
"unicode_decimal": 59534
},
{
"icon_id": "12754142",
"name": "右箭头",
"font_class": "youjiantou_huaban",
"unicode": "e641",
"unicode_decimal": 58945
},
{
"icon_id": "630094",
"name": "向右箭头",
"font_class": "xiangyoujiantou1",
"unicode": "e660",
"unicode_decimal": 58976
},
{
"icon_id": "11520190",
"name": "数据源",
"font_class": "shujuyuan",
"unicode": "e640",
"unicode_decimal": 58944
},
{
"icon_id": "11891865",
"name": "question",
"font_class": "question",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "32077818",
"name": "星星-copy",
"font_class": "xingxing",
"unicode": "e63a",
"unicode_decimal": 58938
},
{
"icon_id": "6560687",
"name": "控制台",
"font_class": "kongzhitai",
"unicode": "e69f",
"unicode_decimal": 59039
},
{
"icon_id": "22785129",
"name": "星系",
"font_class": "xingxi",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "36197034",
"name": "暂无数据 (1)",
"font_class": "a-zanwushuju1",
"unicode": "e638",
"unicode_decimal": 58936
},
{
"icon_id": "33940358",
"name": "开始",
"font_class": "kaishi",
"unicode": "e637",
"unicode_decimal": 58935
},
{
"icon_id": "5643512",
"name": "关闭",
"font_class": "guanbi",
"unicode": "e634",
"unicode_decimal": 58932
},
{
"icon_id": "4175511",
"name": "下箭头",
"font_class": "xiajiantou",
"unicode": "eb6d",
"unicode_decimal": 60269
},
{
"icon_id": "5978833",
"name": "more",
"font_class": "gengduo",
"unicode": "e633",
"unicode_decimal": 58931
},
{
"icon_id": "36150033",
"name": "设置",
"font_class": "shezhi",
"unicode": "e630",
"unicode_decimal": 58928
},
{
"icon_id": "36137656",
"name": "对话-未选",
"font_class": "duihua-weixuan",
"unicode": "e628",
"unicode_decimal": 58920
},
{
"icon_id": "36137657",
"name": "图表-未选",
"font_class": "tubiao-weixuan",
"unicode": "e629",
"unicode_decimal": 58921
},
{
"icon_id": "36137693",
"name": "编组 13备份 3",
"font_class": "a-bianzu13beifen3",
"unicode": "e62b",
"unicode_decimal": 58923
},
{
"icon_id": "36134221",
"name": "编组备份",
"font_class": "bianzubeifen",
"unicode": "e616",
"unicode_decimal": 58902
},
{
"icon_id": "36134222",
"name": "表格",
"font_class": "biaoge1",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "36134223",
"name": "收藏 (1)",
"font_class": "a-shoucang1",
"unicode": "e61d",
"unicode_decimal": 58909
},
{
"icon_id": "36134224",
"name": "guthub-未选",
"font_class": "guthub-weixuan1",
"unicode": "e621",
"unicode_decimal": 58913
},
{
"icon_id": "36134225",
"name": "数据-未选",
"font_class": "shuju-weixuan",
"unicode": "e622",
"unicode_decimal": 58914
},
{
"icon_id": "36134226",
"name": "编组 4",
"font_class": "a-bianzu4",
"unicode": "e624",
"unicode_decimal": 58916
},
{
"icon_id": "36134227",
"name": "编组 14备份",
"font_class": "a-bianzu14beifen",
"unicode": "e627",
"unicode_decimal": 58919
},
{
"icon_id": "36134208",
"name": "guthub-未选",
"font_class": "guthub-weixuan",
"unicode": "e615",
"unicode_decimal": 58901
},
{
"icon_id": "7594805",
"name": "24gl-folderMinus",
"font_class": "24gl-folderMinus",
"unicode": "eabe",
"unicode_decimal": 60094
},
{
"icon_id": "7594806",
"name": "24gl-folderOpen",
"font_class": "24gl-folderOpen",
"unicode": "eabf",
"unicode_decimal": 60095
},
{
"icon_id": "7594875",
"name": "24gf-folderOpen",
"font_class": "24gf-folderOpen",
"unicode": "eac7",
"unicode_decimal": 60103
},
{
"icon_id": "2611804",
"name": "云数据库",
"font_class": "yunshujuku",
"unicode": "e744",
"unicode_decimal": 59204
},
{
"icon_id": "6607912",
"name": "报表",
"font_class": "baobiao",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "6977892",
"name": "工作台",
"font_class": "gongzuotai",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "15378610",
"name": "mongodb",
"font_class": "mongodb",
"unicode": "ec21",
"unicode_decimal": 60449
},
{
"icon_id": "3172491",
"name": "Redis",
"font_class": "Redis",
"unicode": "e6a2",
"unicode_decimal": 59042
},
{
"icon_id": "16300754",
"name": "HIVE_2",
"font_class": "HIVE",
"unicode": "e60e",
"unicode_decimal": 58894
},
{
"icon_id": "35572498",
"name": "Kingbase",
"font_class": "Kingbase",
"unicode": "e6a0",
"unicode_decimal": 59040
},
{
"icon_id": "35892480",
"name": "仪表盘",
"font_class": "yibiaopan",
"unicode": "e60d",
"unicode_decimal": 58893
},
{
"icon_id": "13487185",
"name": "presto",
"font_class": "presto_sql",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "5978710",
"name": "DB2",
"font_class": "shujukuleixingtubiao-kuozhan-",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "35222282",
"name": "oceanbase",
"font_class": "oceanbase",
"unicode": "e982",
"unicode_decimal": 59778
},
{
"icon_id": "15192821",
"name": "达梦",
"font_class": "dameng1",
"unicode": "e655",
"unicode_decimal": 58965
},
{
"icon_id": "2995206",
"name": "proxy",
"font_class": "proxy",
"unicode": "e63f",
"unicode_decimal": 58943
},
{
"icon_id": "33483666",
"name": "openai",
"font_class": "openai",
"unicode": "e646",
"unicode_decimal": 58950
},
{
"icon_id": "11542846",
"name": "关于",
"font_class": "guanyu",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "1301391",
"name": "衣服",
"font_class": "yifu",
"unicode": "e666",
"unicode_decimal": 58982
},
{
"icon_id": "6850413",
"name": "数据库",
"font_class": "shujuku4",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "12993182",
"name": "数据源配置",
"font_class": "shujuyuanpeizhi",
"unicode": "e649",
"unicode_decimal": 58953
},
{
"icon_id": "10594601",
"name": "服务器_数据库_jurassic",
"font_class": "jurassic_server",
"unicode": "e6a6",
"unicode_decimal": 59046
},
{
"icon_id": "1817682",
"name": "数据库",
"font_class": "shujuku2",
"unicode": "e607",
"unicode_decimal": 58887
},
{
"icon_id": "8765123",
"name": "数据库",
"font_class": "shujuku3",
"unicode": "e625",
"unicode_decimal": 58917
},
{
"icon_id": "9710796",
"name": "数据库数据",
"font_class": "shujukushuju",
"unicode": "e63c",
"unicode_decimal": 58940
},
{
"icon_id": "1305114",
"name": "数据库",
"font_class": "shujuku1",
"unicode": "e636",
"unicode_decimal": 58934
},
{
"icon_id": "1472570",
"name": "配置数据源",
"font_class": "peizhishujuyuan",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "31104431",
"name": "SQL历史查询",
"font_class": "SQLlishichaxun",
"unicode": "e80a",
"unicode_decimal": 59402
},
{
"icon_id": "6550626",
"name": "重命名",
"font_class": "zhongmingming",
"unicode": "e623",
"unicode_decimal": 58915
},
{
"icon_id": "6607690",
"name": "ico_数据查询与统计_预约情况查询",
"font_class": "ico_shujuchaxunyutongji_yuyueqingkuangchaxun",
"unicode": "e8ff",
"unicode_decimal": 59647
},
{
"icon_id": "27571255",
"name": "clickhouse-云数据库ClickHouse",
"font_class": "clickhouse-yunshujukuClickHouse",
"unicode": "e8f4",
"unicode_decimal": 59636
},
{
"icon_id": "13592725",
"name": "rds_mariadb",
"font_class": "rds_mariadb",
"unicode": "e6f5",
"unicode_decimal": 59125
},
{
"icon_id": "8817896",
"name": "减少减去减号",
"font_class": "jianshaojianqujianhao",
"unicode": "e62a",
"unicode_decimal": 58922
},
{
"icon_id": "7119672",
"name": "sqlserver",
"font_class": "sqlserver",
"unicode": "e664",
"unicode_decimal": 58980
},
{
"icon_id": "12600909",
"name": "sqlite",
"font_class": "sqlite",
"unicode": "e65a",
"unicode_decimal": 58970
},
{
"icon_id": "26519722",
"name": "缺省页_暂无数据",
"font_class": "queshengye_zanwushuju",
"unicode": "e760",
"unicode_decimal": 59232
},
{
"icon_id": "1330772",
"name": "未完成",
"font_class": "weiwancheng",
"unicode": "e755",
"unicode_decimal": 59221
},
{
"icon_id": "5979977",
"name": "完成-01",
"font_class": "wancheng-",
"unicode": "e62e",
"unicode_decimal": 58926
},
{
"icon_id": "24056325",
"name": "成功",
"font_class": "chenggong1",
"unicode": "e620",
"unicode_decimal": 58912
},
{
"icon_id": "16323142",
"name": "机器人",
"font_class": "jiqiren",
"unicode": "e70e",
"unicode_decimal": 59150
},
{
"icon_id": "6234556",
"name": "换一换",
"font_class": "huanyihuan",
"unicode": "e635",
"unicode_decimal": 58933
},
{
"icon_id": "26130627",
"name": "icon_infomation",
"font_class": "icon_infomation",
"unicode": "e65b",
"unicode_decimal": 58971
},
{
"icon_id": "6150969",
"name": "key",
"font_class": "key1",
"unicode": "e775",
"unicode_decimal": 59253
},
{
"icon_id": "5961392",
"name": "mysql",
"font_class": "mysql",
"unicode": "ec6d",
"unicode_decimal": 60525
},
{
"icon_id": "15378663",
"name": "oracle",
"font_class": "oracle",
"unicode": "ec48",
"unicode_decimal": 60488
},
{
"icon_id": "15378704",
"name": "postgresql",
"font_class": "postgresql",
"unicode": "ec5d",
"unicode_decimal": 60509
},
{
"icon_id": "19657927",
"name": "h2",
"font_class": "h2",
"unicode": "e61c",
"unicode_decimal": 58908
},
{
"icon_id": "372246",
"name": "cc-schema",
"font_class": "cc-schema",
"unicode": "e696",
"unicode_decimal": 59030
},
{
"icon_id": "1789259",
"name": "新建表格",
"font_class": "xinjianbiaoge",
"unicode": "e6b6",
"unicode_decimal": 59062
},
{
"icon_id": "15550146",
"name": "export",
"font_class": "export",
"unicode": "e613",
"unicode_decimal": 58899
},
{
"icon_id": "693661",
"name": "角色管理",
"font_class": "jiaoseguanli",
"unicode": "e66d",
"unicode_decimal": 58989
},
{
"icon_id": "11348953",
"name": "console",
"font_class": "console",
"unicode": "e619",
"unicode_decimal": 58905
},
{
"icon_id": "7594874",
"name": "24gf-folderMinus",
"font_class": "24gf-folderMinus",
"unicode": "eac5",
"unicode_decimal": 60101
},
{
"icon_id": "201556",
"name": "查看",
"font_class": "chakan",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "5387764",
"name": "复制_o",
"font_class": "fuzhi_o",
"unicode": "eb4e",
"unicode_decimal": 60238
},
{
"icon_id": "10936703",
"name": "执行",
"font_class": "zhihang",
"unicode": "e626",
"unicode_decimal": 58918
},
{
"icon_id": "21164516",
"name": "m-格式化文字",
"font_class": "m-geshihuawenzi",
"unicode": "e7f8",
"unicode_decimal": 59384
},
{
"icon_id": "4937000",
"name": "github-fill",
"font_class": "github-fill",
"unicode": "e885",
"unicode_decimal": 59525
},
{
"icon_id": "8626141",
"name": "保存",
"font_class": "baocun2",
"unicode": "e645",
"unicode_decimal": 58949
},
{
"icon_id": "5387931",
"name": "箭头_向左两次_o",
"font_class": "jiantou_xiangzuoliangci_o",
"unicode": "eb93",
"unicode_decimal": 60307
},
{
"icon_id": "1371",
"name": "新建窗口",
"font_class": "xinjianchuangkou",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "4503683",
"name": "loading",
"font_class": "loading2",
"unicode": "e6cd",
"unicode_decimal": 59085
},
{
"icon_id": "2505938",
"name": "链接克隆",
"font_class": "lianjiekelong",
"unicode": "e6ca",
"unicode_decimal": 59082
},
{
"icon_id": "11661836",
"name": "SQL升级文件",
"font_class": "SQLshengjiwenjian",
"unicode": "e63b",
"unicode_decimal": 58939
},
{
"icon_id": "15214527",
"name": "sql",
"font_class": "sql",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "5961312",
"name": "连接流",
"font_class": "lianjieliu",
"unicode": "ec57",
"unicode_decimal": 60503
},
{
"icon_id": "16853978",
"name": "跳转/退出",
"font_class": "tiaozhuan",
"unicode": "e685",
"unicode_decimal": 59013
},
{
"icon_id": "1433771",
"name": "key",
"font_class": "key",
"unicode": "e648",
"unicode_decimal": 58952
},
{
"icon_id": "11372646",
"name": "播放记录",
"font_class": "bofangjilu",
"unicode": "e8ad",
"unicode_decimal": 59565
},
{
"icon_id": "3640170",
"name": "成功",
"font_class": "chenggong",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "9626932",
"name": "失败",
"font_class": "shibai",
"unicode": "e87c",
"unicode_decimal": 59516
},
{
"icon_id": "688104",
"name": "收回 上下",
"font_class": "shouhuishangxia",
"unicode": "e790",
"unicode_decimal": 59280
},
{
"icon_id": "688143",
"name": "展开 上下",
"font_class": "zhankaishangxia",
"unicode": "e7b1",
"unicode_decimal": 59313
},
{
"icon_id": "970749",
"name": "数据库",
"font_class": "shujuku",
"unicode": "e62c",
"unicode_decimal": 58924
},
{
"icon_id": "5399558",
"name": "保存",
"font_class": "baocun",
"unicode": "e936",
"unicode_decimal": 59702
},
{
"icon_id": "5961297",
"name": "查询",
"font_class": "chaxun",
"unicode": "ec4c",
"unicode_decimal": 60492
},
{
"icon_id": "150096",
"name": "对勾",
"font_class": "duigou11",
"unicode": "e61f",
"unicode_decimal": 58911
},
{
"icon_id": "1288113",
"name": "check",
"font_class": "check1",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "14151855",
"name": "概览",
"font_class": "gailan",
"unicode": "e632",
"unicode_decimal": 58930
},
{
"icon_id": "21918566",
"name": "概览",
"font_class": "huaban2",
"unicode": "e63d",
"unicode_decimal": 58941
},
{
"icon_id": "201638",
"name": "编辑",
"font_class": "bianji",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "4686545",
"name": "刷新",
"font_class": "shuaxin1",
"unicode": "ec08",
"unicode_decimal": 60424
},
{
"icon_id": "8084544",
"name": "菜单/列表",
"font_class": "caidan",
"unicode": "e611",
"unicode_decimal": 58897
},
{
"icon_id": "1305461",
"name": "表格",
"font_class": "biaoge",
"unicode": "e63e",
"unicode_decimal": 58942
},
{
"icon_id": "4867114",
"name": "展开",
"font_class": "zhankai",
"unicode": "e65f",
"unicode_decimal": 58975
},
{
"icon_id": "4942664",
"name": "收起",
"font_class": "shouqi",
"unicode": "e61e",
"unicode_decimal": 58910
},
{
"icon_id": "5387845",
"name": "主题_o",
"font_class": "zhuti_o",
"unicode": "eb6f",
"unicode_decimal": 60271
},
{
"icon_id": "11195023",
"name": "断开连接",
"font_class": "duankailianjie",
"unicode": "e65e",
"unicode_decimal": 58974
},
{
"icon_id": "6010907",
"name": "修改",
"font_class": "xiugai",
"unicode": "e60f",
"unicode_decimal": 58895
},
{
"icon_id": "10142371",
"name": "删除",
"font_class": "delete",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "77822",
"name": "更多",
"font_class": "gengduo1",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "4511969",
"name": "减少",
"font_class": "jianshao",
"unicode": "e644",
"unicode_decimal": 58948
},
{
"icon_id": "5334173",
"name": "加",
"font_class": "jia",
"unicode": "e61b",
"unicode_decimal": 58907
},
{
"icon_id": "7424757",
"name": "加号",
"font_class": "hao",
"unicode": "e631",
"unicode_decimal": 58929
},
{
"icon_id": "11364467",
"name": "arrow drop down",
"font_class": "right",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "11931077",
"name": "search",
"font_class": "search1",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "15838464",
"name": "download",
"font_class": "download1",
"unicode": "e66c",
"unicode_decimal": 58988
},
{
"icon_id": "22303251",
"name": "向右箭头",
"font_class": "xiangyoujiantou",
"unicode": "e79c",
"unicode_decimal": 59292
},
{
"icon_id": "27901498",
"name": "删除线型",
"font_class": "shanchuxianxing",
"unicode": "e6a7",
"unicode_decimal": 59047
},
{
"icon_id": "28093125",
"name": "cross",
"font_class": "cross-copy",
"unicode": "ec8e",
"unicode_decimal": 60558
},
{
"icon_id": "5667975",
"name": "刷新",
"font_class": "shuaxin",
"unicode": "e62d",
"unicode_decimal": 58925
},
{
"icon_id": "22303207",
"name": "提醒",
"font_class": "tixing",
"unicode": "e913",
"unicode_decimal": 59667
},
{
"icon_id": "6129178",
"name": "138设置、系统设置、功能设置、属性",
"font_class": "shezhixitongshezhigongnengshezhishuxing",
"unicode": "e795",
"unicode_decimal": 59285
},
{
"icon_id": "19113301",
"name": "执行sql脚本",
"font_class": "zhihangsqljiaoben",
"unicode": "e759",
"unicode_decimal": 59225
},
{
"icon_id": "20104543",
"name": "虚拟数据库管理",
"font_class": "xunishujukuguanli",
"unicode": "e61a",
"unicode_decimal": 58906
}
]
}
================================================
FILE: chat2db-client/src/blocks/AppTitleBar/index.less
================================================
@import '../../styles/var.less';
.appTitleBar {
background-color: var(--color-bg-subtle);
-webkit-app-region: drag;
-webkit-user-select: none;
border-bottom: 1px solid var(--color-border);
display: flex;
justify-content: space-between;
align-items: center;
height: 30px;
.appTitleBarGlobal{
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0px 10px;
height: 100%;
.appName {
flex: 1;
text-align: start;
font-weight: bold;
padding-left: 6px;
}
.rightSlot,.leftSlot{
height: 100%;
display: flex;
align-items: center;
-webkit-app-region: no-drag;
}
}
.spacer {
width: 126px;
flex-shrink: 0;
}
.windowsCloseBar {
display: flex;
height: 100%;
flex-shrink: 0;
width: 126px;
-webkit-app-region: no-drag;
.windowsCloseBarItem {
width: 42px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
&:hover {
background-color: var(--color-hover-bg);
}
}
}
}
================================================
FILE: chat2db-client/src/blocks/AppTitleBar/index.tsx
================================================
import React, { memo, useState, useMemo } from 'react';
import styles from './index.less';
import classnames from 'classnames';
import { useCommonStore } from '@/store/common';
import Iconfont from '@/components/Iconfont';
import BrandLogo from '@/components/BrandLogo';
interface IProps {
className?: string;
}
export default memo((props) => {
const { className } = props;
const [isMaximized, setIsMaximize] = useState(window.electronApi?.isMaximized());
const { appTitleBarRightComponent } = useCommonStore((state) => {
return {
appTitleBarRightComponent: state.appTitleBarRightComponent,
};
});
const isMac = useMemo(() => {
return window.electronApi?.getPlatform().isMac;
}, []);
// const isMac = false;
const handleDoubleClick = () => {
window.electronApi?.setMaximize();
setIsMaximize(!isMaximized);
};
const handelMinimizeWindow = (e) => {
e.stopPropagation();
window.electronApi?.minimizeWindow();
};
const handelMaximize = (e) => {
e.stopPropagation();
window.electronApi?.setMaximize();
setIsMaximize(!isMaximized);
};
const handelCloseWindow = (e) => {
e.stopPropagation();
window.electronApi?.closeWindow();
};
if(isMac === void 0){
return false
}
return (
Chat2DB
{appTitleBarRightComponent}
{(!isMac && isMac !== void 0) && (
)}
);
});
================================================
FILE: chat2db-client/src/blocks/CreateConnection/index.less
================================================
@import '../../styles/var.less';
.box {
width: 100%;
height: 100%;
overflow-y: auto;
}
.dataBaseListBox{
display: flex;
justify-content: center;
align-items: center;
min-height: 100%;
}
.dataBaseList {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
max-width: 800px;
}
.databaseItem {
flex-grow: 1;
border-radius: 4px;
height: 50px;
width: 210px;
margin: 10px 20px;
padding: 0px 16px;
border-radius: 8px;
overflow: hidden;
box-sizing: border-box;
border: 1px solid var(--color-border);
.databaseItemMain {
display: flex;
justify-content: space-between;
align-items: center;
height: 50px;
border-radius: 8px;
}
.databaseItemLeft {
display: flex;
align-items: center;
}
.databaseItemRight {
display: none;
i {
font-size: 16px;
}
}
&:hover {
background-color: var(--color-bg-medium);
color: var(--color-primary);
border: 1px solid var(--color-primary);
cursor: pointer;
.databaseItemRight {
display: block;
i {
color: var(--color-primary);
}
}
}
.logoBox {
display: flex;
justify-content: center;
align-items: center;
height: 28px;
width: 28px;
border-radius: 8px;
margin-right: 16px;
i {
font-size: 16px;
}
}
}
.databaseItemSpacer {
flex-grow: 1;
width: 210px;
margin: 0px 20px;
padding: 0px 16px;
box-sizing: border-box;
}
.createConnections {
min-height: 100%;
display: flex;
justify-content: center;
align-items: center;
background-color: var(--color-bg);
transform: scale(0.2);
transition: 0.1s ease-in-out;
}
.showCreateConnections {
transform: scale(1);
transition: transform 0.3s ease-in-out;
}
.notPermission {
display: flex;
flex-direction: column;
.notPermissionIconTips {
color: var(--color-text-tertiary);
text-align: center;
width: 340px;
}
.notPermissionIconBox,
.connectButtonBox {
display: flex;
justify-content: center;
}
.notPermissionIcon {
font-size: 200px;
color: var(--color-text-quaternary);
margin: 20px 0px;
}
.connectButton {
margin-top: 20px;
}
}
================================================
FILE: chat2db-client/src/blocks/CreateConnection/index.tsx
================================================
import React, { memo, useEffect, useState } from 'react';
import styles from './index.less';
import classnames from 'classnames';
import { IConnectionDetails, IDatabase } from '@/typings';
import ConnectionEdit from '@/components/ConnectionEdit';
import { databaseTypeList } from '@/constants';
import Iconfont from '@/components/Iconfont';
import i18n from '@/i18n';
import FileUploadModal from '@/components/ImportConnection';
import {getConnectionList} from '@/pages/main/store/connection';
// IConnectionDetails 全部信息代表修改
// null 展示因增列表
// { type: string } 只有数据库类型代表新增
type IEditConnectionDetail = IConnectionDetails | null | Pick;
interface IProps {
className?: string;
onSubmit?: (data: IConnectionDetails) => Promise; // 点击保存或修改的回调,我会把数据给你
connectionDetail: IEditConnectionDetail | null | undefined;
noPermission?: boolean;
}
export default memo((props) => {
const { className, onSubmit, connectionDetail: externalConnectionDetail } = props;
const [connectionDetail, setConnectionDetail] = useState(
externalConnectionDetail,
);
const [isFileUploadModalOpen, setIsFileUploadModalOpen] = useState(false);
useEffect(() => {
setConnectionDetail(externalConnectionDetail);
}, [externalConnectionDetail]);
function handleCreateConnections(database: IDatabase) {
setConnectionDetail({
type: database.code,
});
}
// function handleSubmit(data: IConnectionDetails) {
// return onSubmit?.(data);
// }
return (
<>
{connectionDetail && (
{
setConnectionDetail(null);
}}
connectionData={connectionDetail as any}
submit={onSubmit}
/>
)}
{connectionDetail === null && (
{databaseTypeList.map((t) => {
return (
);
})}
{setIsFileUploadModalOpen(true)}}>
{i18n('connection.title.importConnection')}
{Array.from({ length: 20 }).map((t, index) => {
return
;
})}
)}
{
setIsFileUploadModalOpen(false);
}}
onConfirm={() => {
setIsFileUploadModalOpen(false);
getConnectionList()
}}
/>
>
);
});
{
/*
{i18n('connection.tips.noConnectionTips')}
}
onClick={() => {
handleMenuItemDoubleClick(curConnection);
}}
>
{i18n('connection.button.connect')}
*/
}
================================================
FILE: chat2db-client/src/blocks/DatabaseTableEditor/BaseInfo/index.less
================================================
@import '../../../styles/var.less';
.baseInfo {
padding: 20px 10px 0px;
display: flex;
// justify-content: center;
height: 100%;
}
.formBox {
width: 50%;
}
================================================
FILE: chat2db-client/src/blocks/DatabaseTableEditor/BaseInfo/index.tsx
================================================
import React, { useContext, useEffect, useImperativeHandle, ForwardedRef, forwardRef } from 'react';
import styles from './index.less';
import classnames from 'classnames';
import { Form, Input } from 'antd';
import { Context } from '../index';
import { IBaseInfo } from '@/typings';
import { DatabaseTypeCode } from '@/constants';
import i18n from '@/i18n';
export interface IBaseInfoRef {
getBaseInfo: () => IBaseInfo;
}
interface IProps {
className?: string;
}
const BaseInfo = forwardRef((props: IProps, ref: ForwardedRef) => {
const { className } = props;
const { tableDetails, databaseType } = useContext(Context);
const [form] = Form.useForm();
useEffect(() => {
form.setFieldsValue({
name: tableDetails.name,
comment: tableDetails.comment,
charset: tableDetails.charset,
engine: tableDetails.engine,
incrementValue: tableDetails.incrementValue,
});
}, [tableDetails]);
function getBaseInfo(): IBaseInfo {
return form.getFieldsValue();
}
useImperativeHandle(ref, () => ({
getBaseInfo,
}));
return (
);
});
export default BaseInfo;
================================================
FILE: chat2db-client/src/blocks/DatabaseTableEditor/ColumnList/index.less
================================================
@import '../../../styles/var.less';
.columnList {
height: 100%;
padding: 10px;
box-sizing: border-box;
display: flex;
flex-direction: column;
}
.columnListHeader {
margin: 0px -5px 10px;
flex-shrink: 0;
button {
margin: 0px 5px;
}
}
.formBox {
height: 0px;
flex: 1;
display: flex;
flex-direction: column;
}
.tableBox {
flex: 1;
display: flex;
flex-direction: column;
border-radius: 8px 8px 0px 0px;
overflow: hidden;
}
.addColumnButton {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
border: 1px dashed var(--color-border);
line-height: 30px;
margin-top: 10px;
color: var(--color-text-secondary);
cursor: pointer;
i {
margin-right: 5px;
}
&:hover {
color: var(--color-primary);
border-color: var(--color-primary);
}
}
.otherInfo {
flex-shrink: 0;
margin: 10px -10px 0px;
padding: 10px;
height: 200px;
display: flex;
align-items: center;
justify-content: center;
border-top: 1px solid var(--color-border);
}
.otherInfoFormBox {
min-height: 140px;
width: 400px;
}
.editableCell {
height: 28px;
line-height: 26px;
padding: 0px 7px;
box-sizing: border-box;
border: 1px solid transparent;
.f-single-line();
width: 100%;
cursor: pointer;
}
// .cellContent {
// border: 1px solid transparent;
// margin: -1px;
// &:hover {
// border: 1px solid var(--color-primary);
// }
// }
.keyBox {
width: 26px;
height: 26px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
position: relative;
i {
color: var(--color-warning);
}
span {
position: absolute;
font-weight: bold;
right: 4px;
bottom: -2px;
transform: scale(0.8);
}
}
.disabledKeyBox {
cursor: default;
}
.operationBar {
display: flex;
justify-content: end;
.deleteIconBox {
height: 26px;
width: 26px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
color: var(--color-primary);
}
}
}
.columnList {
:global {
.ant-table-body {
border: 1px solid var(--color-border);
border-top: 0px;
border-bottom: 0px;
}
.ant-table-header {
border: 1px solid var(--color-border);
border-bottom: 0px;
}
.ant-table {
border-radius: 10px;
border-bottom: 0px;
}
.ant-table-wrapper .ant-table-tbody > tr > td {
// border: 0px;
padding: 4px 2px;
}
.ant-table-wrapper .ant-table-thead > tr > th {
padding: 8px 4px;
&::before {
display: none;
}
}
.ant-table-wrapper .ant-table-thead > tr > td {
&::before {
display: none;
}
}
// antd无法设置最小宽度,所以在这里设置最小列宽为100px
colgroup col:nth-last-child(2) {
min-width: 100px;
}
}
}
================================================
FILE: chat2db-client/src/blocks/DatabaseTableEditor/ColumnList/index.tsx
================================================
import React, { useContext, useEffect, useState, useRef, forwardRef, ForwardedRef, useImperativeHandle } from 'react';
import styles from './index.less';
import classnames from 'classnames';
import { MenuOutlined } from '@ant-design/icons';
import { DndContext, type DragEndEvent } from '@dnd-kit/core';
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
import { Table, InputNumber, Input, Form, Select, Checkbox } from 'antd';
import { v4 as uuidv4 } from 'uuid';
import { arrayMove, SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import { Context } from '../index';
import { IColumnItemNew, IColumnTypes } from '@/typings';
import i18n from '@/i18n';
import { EditColumnOperationType, DatabaseTypeCode, NullableType } from '@/constants';
import CustomSelect from '@/components/CustomSelect';
import Iconfont from '@/components/Iconfont';
interface RowProps extends React.HTMLAttributes {
'data-row-key': string;
}
interface IProps {}
// 编辑配置
interface IEditingConfig extends IColumnTypes {
editKey: string;
}
// 本组件暴露给父组件的方法
export interface IColumnListRef {
getColumnListInfo: () => IColumnItemNew[];
}
const Row = ({ children, ...props }: RowProps) => {
const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({
id: props['data-row-key'],
});
const style: React.CSSProperties = {
...props.style,
transform: CSS.Transform.toString(transform && { ...transform, scaleY: 1 }),
transition,
...(isDragging ? { position: 'relative', zIndex: 9999 } : {}),
};
return (
{React.Children.map(children, (child) => {
if ((child as React.ReactElement).key === 'sort') {
return React.cloneElement(child as React.ReactElement, {
children: (
),
});
}
return child;
})}
);
};
// 创建一个空的数据结构
const createInitialData = () => {
return {
key: uuidv4(),
oldName: null,
name: null,
tableName: null,
columnType: null,
dataType: null,
defaultValue: null,
autoIncrement: null,
comment: null,
primaryKey: null,
primaryKeyOrder: null,
schemaName: null,
databaseName: null,
typeName: null,
columnSize: null,
bufferLength: null,
decimalDigits: null,
numPrecRadix: null,
nullableInt: null,
sqlDataType: null,
sqlDatetimeSub: null,
charOctetLength: null,
ordinalPosition: null,
nullable: null,
generatedColumn: null,
charSetName: null,
collationName: null,
value: null,
editStatus: EditColumnOperationType.Add,
};
};
const ColumnList = forwardRef((props: IProps, ref: ForwardedRef) => {
const { databaseSupportField, databaseName, schemaName, tableDetails, databaseType } = useContext(Context);
const [dataSource, setDataSource] = useState([createInitialData()]);
const [form] = Form.useForm();
const [editingData, setEditingData] = useState(null);
const [editingConfig, setEditingConfig] = useState(null);
const tableRef = useRef(null);
const isEditing = (record: IColumnItemNew) => record.key === editingData?.key;
const edit = (record: IColumnItemNew) => {
if (record.key) {
form.setFieldsValue({ ...record });
setEditingData(record);
// 根据当前字段类型,设置编辑配置
databaseSupportField.columnTypes.forEach((i) => {
if (i.typeName === record.columnType) {
setEditingConfig({
...i,
editKey: record.key!,
});
}
});
}
};
// 整理服务端返回的数据,构造为前端需要的数据结构
useEffect(() => {
if (tableDetails) {
const list =
tableDetails?.columnList?.map((t) => {
return {
...t,
oldName: t.name,
key: uuidv4(),
};
}) || [];
setEditingConfig(null);
setDataSource(list);
}
}, [tableDetails]);
const columns = [
{
key: 'sort',
width: '40px',
align: 'center',
fixed: 'left',
},
// {
// title: 'O T',
// dataIndex: 'editStatus',
// width: '60px',
// align: 'center',
// render: (text: EditColumnOperationType) => {
// return text === EditColumnOperationType.Add ? (
// 新
// ) : (
// 原
// );
// },
// },
{
title: i18n('editTable.label.columnName'),
dataIndex: 'name',
width: '160px',
fixed: 'left',
render: (text: string, record: IColumnItemNew) => {
const editable = isEditing(record);
return (
{editable ? (
) : (
{text}
)}
);
},
},
{
title: i18n('editTable.label.columnType'),
dataIndex: 'columnType',
width: '200px',
render: (text: string, record: IColumnItemNew) => {
const editable = isEditing(record);
return (
{editable ? (
) : (
{text}
)}
);
},
},
{
title: i18n('editTable.label.columnSize'),
dataIndex: 'columnSize',
width: '120px',
render: (text: string, record: IColumnItemNew) => {
const editable = isEditing(record);
return editable ? (
) : (
{text}
);
},
},
{
title: i18n('editTable.label.nullable'),
dataIndex: 'nullable',
width: '100px',
render: (nullable: NullableType | null, record: IColumnItemNew) => {
// const editable = isEditing(record);
return (
{
if (databaseType === DatabaseTypeCode.SQLITE && record.editStatus !== EditColumnOperationType.Add) {
return null;
}
handelNullable(record);
}}
checked={nullable === NullableType.Null}
disabled={
editingConfig?.supportNullable === false ||
!!record.primaryKey ||
(databaseType === DatabaseTypeCode.SQLITE && record.editStatus !== EditColumnOperationType.Add)
}
/>
);
},
},
{
title: i18n('editTable.label.primaryKey'),
dataIndex: 'primaryKey',
width: '50px',
render: (primaryKey: boolean, record: IColumnItemNew) => {
return (
{
if (databaseType === DatabaseTypeCode.SQLITE && record.editStatus !== EditColumnOperationType.Add) {
return null;
}
handelPrimaryKey(record);
}}
>
{primaryKey && }
{primaryKey && {record.primaryKeyOrder} }
);
},
},
{
title: i18n('editTable.label.comment'),
dataIndex: 'comment',
render: (text: string, record: IColumnItemNew) => {
const editable = isEditing(record);
return editable ? (
) : (
{text}
);
},
},
{
width: '40px',
render: (text: string, record: IColumnItemNew) => {
// sqlLite不支持删除字段,新增的字段可以删除
if (databaseType === DatabaseTypeCode.SQLITE && record.editStatus !== EditColumnOperationType.Add) {
return null;
}
return (
{
deleteData(record);
}}
>
);
},
},
];
const handelPrimaryKey = (_data: IColumnItemNew) => {
const newData = dataSource.map((item) => {
let primaryKeyOrder: null | number = item.primaryKeyOrder;
// 取消主键if
if (_data.primaryKey) {
// 如果取消的时当前的字段,主键顺序为null
if (_data.key === item.key) {
primaryKeyOrder = null;
} else {
// 如果当前字段是主键,取消主键的时候,比当前字段顺序大的字段顺序-1
if (_data.primaryKeyOrder && item.primaryKeyOrder && item.primaryKeyOrder >= _data.primaryKeyOrder) {
primaryKeyOrder = item.primaryKeyOrder - 1;
}
}
} else {
// 增加主键if
// 增加主键的时候,主键顺序为当前表的最大主键顺序+1
if (_data.key === item.key) {
primaryKeyOrder =
Math.max(
...dataSource.map((i) => {
return i.primaryKeyOrder || 0;
}),
) + 1;
}
// 对于当前字段之前的字段,主键顺序不变
}
if (item.key === _data?.key) {
// 判断当前数据是新增的数据还是编辑后的数据
let editStatus = item.editStatus;
if (editStatus !== EditColumnOperationType.Add) {
editStatus = EditColumnOperationType.Modify;
}
const editingDataItem = {
...item,
primaryKey: !item.primaryKey,
primaryKeyOrder,
nullable: !item.primaryKey ? NullableType.NotNull : item.nullable,
editStatus,
};
return editingDataItem;
}
return {
...item,
primaryKeyOrder,
};
});
setDataSource(newData);
};
const handelNullable = (_data: IColumnItemNew) => {
const newData = dataSource.map((item) => {
if (item.key === _data?.key) {
// 判断当前数据是新增的数据还是编辑后的数据
let editStatus = item.editStatus;
if (editStatus !== EditColumnOperationType.Add) {
editStatus = EditColumnOperationType.Modify;
}
const editingDataItem = {
...item,
nullable: !item.nullable ? NullableType.Null : NullableType.NotNull,
editStatus,
};
return editingDataItem;
}
return item;
});
setDataSource(newData);
};
const onDragEnd = ({ active, over }: DragEndEvent) => {
if (active.id !== over?.id) {
setDataSource((previous) => {
const activeIndex = previous.findIndex((i) => i.key === active.id);
const overIndex = previous.findIndex((i) => i.key === over?.id);
return arrayMove(previous, activeIndex, overIndex);
});
}
};
const handleFieldsChange = (field: any) => {
let { value } = field[0];
const { name: nameList } = field[0];
const name = nameList[0];
if (name === 'nullable') {
value = value ? NullableType.Null : NullableType.NotNull;
}
const newData = dataSource.map((item) => {
if (item.key === editingData?.key) {
// 判断当前数据是新增的数据还是编辑后的数据
let editStatus = item.editStatus;
if (editStatus !== EditColumnOperationType.Add) {
editStatus = EditColumnOperationType.Modify;
}
const editingDataItem = {
...item,
[name]: value,
editStatus,
};
if (name === 'columnType') {
// 根据当前字段类型,设置编辑配置
databaseSupportField.columnTypes.forEach((i) => {
if (i.typeName === value) {
setEditingConfig({
...editingConfig!,
...i,
});
}
});
// 特殊处理VARCHAR的默认长度 为255
if (value === 'VARCHAR' && editingDataItem.columnSize === null) {
editingDataItem.columnSize = 255;
form.setFieldsValue({
columnSize: 255,
});
}
}
return editingDataItem;
}
return item;
});
setDataSource(newData);
};
const addData = () => {
const newData = {
...createInitialData(),
};
setDataSource([...dataSource, newData]);
edit(newData);
setTimeout(() => {
tableRef.current?.scrollTo(0, tableRef.current?.scrollHeight + 100);
}, 0);
};
const deleteData = (record) => {
let list: any = [];
if (record?.editStatus === EditColumnOperationType.Add) {
list = dataSource.filter((i) => i.key !== record?.key);
} else {
list = dataSource.map((i) => {
if (i.key === record?.key) {
setEditingData(null);
setEditingConfig(null);
return {
...i,
editStatus: EditColumnOperationType.Delete,
};
}
return i;
});
}
setDataSource(list);
};
function getColumnListInfo(): IColumnItemNew[] {
return dataSource.map((i) => {
const data = {
...i,
tableName: tableDetails?.name,
databaseName,
schemaName: schemaName || null,
};
delete data.key;
return data;
});
}
useImperativeHandle(ref, () => ({
getColumnListInfo,
}));
const renderOtherInfoForm = () => {
const labelCol = {
style: { width: 100 },
};
return (
<>
{editingConfig?.supportAutoIncrement && (
)}
{databaseType === DatabaseTypeCode.SQLSERVER && (
)}
{editingConfig?.supportDefaultValue && (
)}
{editingConfig?.supportCharset && (
)}
{editingConfig?.supportCollation && (
)}
{editingConfig?.supportScale && (
)}
{editingConfig?.supportUnit && (
{['CHAR', 'BYTE'].map((i) => (
{i}
))}
)}
{editingConfig?.supportValue && (
)}
>
);
};
const onRow = (record: any) => {
return {
onClick: () => {
// sqlLite不支持修改字段,新增的字段可以修改
if (databaseType === DatabaseTypeCode.SQLITE && record.editStatus !== EditColumnOperationType.Add) {
return;
}
if (editingData?.key !== record.key) {
edit(record);
}
},
};
};
return (
{/*
{i18n('editTable.button.add')}
{i18n('editTable.button.delete')}
{i18n('editTable.button.up')}
{i18n('editTable.button.down')}
*/}