├── .gitignore
├── LICENSE
├── README.md
├── app
├── .gitignore
├── pom.xml
└── src
│ └── main
│ ├── java
│ ├── SQLucky
│ │ └── app.java
│ ├── module-info.java
│ └── net
│ │ └── tenie
│ │ ├── fx
│ │ ├── Action
│ │ │ ├── CommonEventHandler.java
│ │ │ ├── CommonListener.java
│ │ │ ├── Log4jPrintStream.java
│ │ │ ├── LogSystem.java
│ │ │ ├── RunSQLHelper.java
│ │ │ ├── SettingKeyBinding.java
│ │ │ └── sqlExecute
│ │ │ │ ├── ProcedureAction.java
│ │ │ │ ├── RunSqlStatePo.java
│ │ │ │ ├── SelectAction.java
│ │ │ │ └── SqlExecuteOption.java
│ │ ├── component
│ │ │ ├── InfoTree
│ │ │ │ ├── DBInfoTreeContextMenu.java
│ │ │ │ ├── DBInfoTreeContextMenuAction.java
│ │ │ │ ├── DBinfoTree.java
│ │ │ │ ├── DBinfoTreeButtonFactory.java
│ │ │ │ ├── DBinfoTreeFilter.java
│ │ │ │ ├── DBinfoTreeTitledPane.java_bak
│ │ │ │ └── TreeNodeCellFactory.java
│ │ │ ├── ScriptTree
│ │ │ │ ├── ScriptTabNodeCellFactory.java
│ │ │ │ ├── ScriptTabTree.java
│ │ │ │ ├── ScriptTreeAction.java
│ │ │ │ ├── ScriptTreeButtonPanel.java
│ │ │ │ └── ScriptTreeContextMenu.java
│ │ │ ├── UserAccount
│ │ │ │ ├── SqluckyUser.java
│ │ │ │ └── UserAccountAction.java
│ │ │ └── container
│ │ │ │ ├── AppHeadContainer.java
│ │ │ │ ├── AppWindow.java
│ │ │ │ ├── AppWindowReStyleByWinOS.java
│ │ │ │ ├── CodeContainer.java
│ │ │ │ ├── DBinfoContainer.java
│ │ │ │ ├── MenuBarContainer.java
│ │ │ │ ├── OperateContainer.java
│ │ │ │ └── WinOsAppBox.java_bak
│ │ ├── config
│ │ │ └── DbVendor.java
│ │ ├── controller
│ │ │ ├── DbDiffTools.java
│ │ │ └── TransferDataController.java
│ │ ├── dao
│ │ │ ├── ConnectionDao.java
│ │ │ └── DmlDdlDao.java
│ │ ├── factory
│ │ │ ├── ButtonFactory.java
│ │ │ ├── ServiceLoad.java
│ │ │ └── TextFieldFactory.java
│ │ ├── main
│ │ │ ├── MyAppTest.java
│ │ │ ├── MyPreloader.java
│ │ │ ├── MyPreloaderGif.java
│ │ │ ├── MyPreloaderMp4.java
│ │ │ ├── NotificationPaneApp.java
│ │ │ ├── NotificationsApp.java
│ │ │ ├── Restart.java
│ │ │ └── SQLucky.javaBAK
│ │ ├── plugin
│ │ │ ├── PluginManageAction.java
│ │ │ ├── PluginManageWindow.java
│ │ │ ├── PluginUploadWindow.java
│ │ │ ├── ReadJarLoadSqluckyPluginDelegate.java
│ │ │ └── SqluckyPluginInfo.java
│ │ ├── utility
│ │ │ ├── ResourceBundleUtil.java
│ │ │ └── SelectDataToPo.java
│ │ └── window
│ │ │ ├── CheckUpdateWindow.java
│ │ │ ├── ConnectionEditor.java
│ │ │ ├── DataTransferWindow.java
│ │ │ ├── KeyBindingSubWindow.java
│ │ │ ├── KeysBindWindow.java
│ │ │ ├── ProcedureExecuteWindow.java
│ │ │ ├── SignInAdvancedSettingsWindow.java
│ │ │ ├── SignInWindow.java
│ │ │ └── SignUpWindow.java
│ │ ├── lib
│ │ ├── db
│ │ │ ├── CommonFetchDBInfo.java
│ │ │ ├── ConnectionPool.java
│ │ │ ├── DriverShim.java
│ │ │ ├── FetchDBInfo.java
│ │ │ ├── JDBCUtils.java
│ │ │ └── h2
│ │ │ │ ├── AppDao.java
│ │ │ │ ├── SqluckyAppendSqlPO.java
│ │ │ │ └── UpdateScript.java
│ │ └── reflex
│ │ │ └── BuildObject.java
│ │ └── sdkImp
│ │ └── SqluckyAppComponent.java
│ └── resources
│ ├── css
│ ├── MonaspaceArgonVarVF.ttf
│ ├── MonaspaceXenonVarVF.ttf
│ ├── ProgressBar.css
│ ├── application.css
│ ├── dark
│ │ ├── TableView.css
│ │ ├── common.css
│ │ ├── sql-keywords.css
│ │ ├── tabPane.css
│ │ └── treeView.css
│ ├── light
│ │ ├── common-light.css
│ │ ├── sql-keywords-light.css
│ │ └── tabPane-light.css
│ └── yellow
│ │ ├── TableView-yellow.css
│ │ ├── common-yellow.css
│ │ ├── sql-keywords-yellow.css
│ │ ├── tabPane-yellow.css
│ │ └── treeView-yellow.css
│ ├── db
│ ├── app.sql
│ └── keysBinding.sql
│ ├── fxml
│ └── transferData.fxml
│ ├── icon
│ ├── 128.icns
│ ├── 128.ico
│ ├── 128.png
│ ├── 16.png
│ ├── 24.png
│ ├── 32.png
│ ├── 48.png
│ ├── 512.png
│ ├── 64.png
│ ├── jetbrains.svg
│ └── 未标题-2.png
│ ├── image
│ ├── 2logo.png
│ ├── SQL6.png
│ ├── SQL61.ico
│ ├── SQL6preLoad.png
│ ├── SQL_mac.icns
│ ├── logo2.svg
│ ├── logo32.png
│ ├── s.png
│ ├── sqlucky.gif
│ ├── sqlucky_hd2.mp4
│ ├── sqlucky_hd2_bak.mp4
│ ├── sqlucky_img.jpg
│ └── ss.png
│ ├── language
│ ├── massage_en.properties
│ └── massage_zh_CN.properties
│ └── log4j2.xml
├── demo.png
├── plugin
├── .gitignore
├── DB2_connector
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── DB2Connector
│ │ └── impl
│ │ ├── DB2ConnectorDelegateImpl.java
│ │ ├── Db2Connector.java
│ │ ├── Db2ErrorCode.java
│ │ ├── Db2Register.java
│ │ ├── ExportSqlDB2Imp.java
│ │ └── FetchDB2InfoImp.java
├── Data_model
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── DataModel
│ │ ├── DataModelGenerateWindow.java
│ │ ├── DataModelImportWindow.java
│ │ ├── DataModelNodeCellFactory.java
│ │ ├── DataModelOperate.java
│ │ ├── DataModelTabTree.java
│ │ ├── DataModelTabTreeContextMenu.java
│ │ ├── impl
│ │ └── DataModelDelegateImpl.java
│ │ ├── po
│ │ ├── DataModelInfoMapper.java
│ │ ├── DataModelInfoPo.java
│ │ ├── DataModelTableFieldsPo.java
│ │ ├── DataModelTablePo.java
│ │ ├── DataModelTreeNodePo.java
│ │ ├── ModelDBType.java
│ │ └── ModelFileType.java
│ │ ├── tools
│ │ ├── DataModelDAO.java
│ │ ├── DataModelMySQLDao.java
│ │ └── DataModelUtility.java
│ │ └── xmlPDM
│ │ ├── OptionPdmFile.java
│ │ ├── xmlPdmModel.java
│ │ ├── xmlPdmOColumn.java
│ │ ├── xmlPdmOIndex.java
│ │ ├── xmlPdmOModel.java
│ │ ├── xmlPdmOPackage.java
│ │ ├── xmlPdmOTable.java
│ │ └── xmlPdmRootObject.java
├── H2_connector
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── H2Connector
│ │ └── impl
│ │ ├── ExportSqlH2Imp.java
│ │ ├── H2Connector.java
│ │ ├── H2ConnectorDelegateImpl.java
│ │ ├── H2ErrorCode.java
│ │ ├── H2FileConnector.java
│ │ ├── H2FileRegister.java
│ │ └── H2Register.java
├── Mariadb_connector
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── MariadbConnector
│ │ └── impl
│ │ ├── ExportSqlMariadbImp.java
│ │ ├── MariadbConnector.java
│ │ ├── MariadbConnectorDelegateImpl.java
│ │ ├── MariadbErrorCode.java
│ │ └── MariadbRegister.java
├── Mybatis_generator
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── MybatisGenerator
│ │ ├── DataModelImportWindow.java
│ │ ├── DataModelNodeCellFactory.java
│ │ ├── DataModelOption.java
│ │ ├── DataModelTabTree.java
│ │ ├── DataModelTabTreeContextMenu.java
│ │ ├── impl
│ │ └── MybatisGeneratorDelegateImpl.java
│ │ ├── po
│ │ ├── DataModelInfoMapper.java
│ │ ├── DataModelInfoPo.java
│ │ ├── DataModelTableFieldsPo.java
│ │ ├── DataModelTablePo.java
│ │ └── DataModelTreeNodePo.java
│ │ └── tools
│ │ ├── DataModelDAO.java
│ │ └── DataModelUtility.java
├── Mysql_connector
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── mysqlConnector
│ │ └── impl
│ │ ├── ExportSqlMySqlImp.java
│ │ ├── MysqlConnector.java
│ │ ├── MysqlConnectorDelegateImpl.java
│ │ ├── MysqlErrorCode.java
│ │ └── MysqlRegister.java
├── Postgresql_connector
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── PostgresqlConnector
│ │ └── impl
│ │ ├── ExportSqlPostgresqlImp.java
│ │ ├── PostgresqlConnector.java
│ │ ├── PostgresqlConnectorDelegateImpl.java
│ │ ├── PostgresqlErrorCode.java
│ │ └── PostgresqlRegister.java
├── Sqlite_connector
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ ├── module-info.java
│ │ └── net
│ │ └── tenie
│ │ └── plugin
│ │ └── sqliteConnector
│ │ └── impl
│ │ ├── ExportSqlSqliteImp.java
│ │ ├── SqliteConnector.java
│ │ ├── SqliteConnectorDelegateImpl.java
│ │ ├── SqliteErrorCode.java
│ │ └── SqliteRegister.java
├── WorkDataBackup
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ ├── module-info.java
│ │ └── net
│ │ │ └── tenie
│ │ │ └── plugin
│ │ │ └── backup
│ │ │ ├── component
│ │ │ ├── QueryBackupController.java
│ │ │ ├── WorkDataBackupAction.java
│ │ │ └── WorkDataBackupController.java
│ │ │ ├── impl
│ │ │ └── WorkDataBackupDelegateImpl.java
│ │ │ └── po
│ │ │ ├── BackupInfoPO.java
│ │ │ ├── DownloadBackupPo.java
│ │ │ └── SqluckyBackup.java
│ │ └── resources
│ │ └── workBackupFxml
│ │ ├── queryBackup.fxml
│ │ └── workdataBackup.fxml
└── note
│ ├── .gitignore
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ ├── module-info.java
│ └── net
│ └── tenie
│ └── plugin
│ └── note
│ ├── component
│ ├── MyNoteEditorSheet.java
│ ├── NoteOptionPanel.java
│ ├── NoteTabNodeCellFactory.java
│ ├── NoteTabTree.java
│ └── NoteTreeCell.java
│ ├── impl
│ └── NoteDelegateImpl.java
│ └── utility
│ ├── NoteSearchAction.java
│ └── NoteUtility.java
├── pom.xml
└── sdk
├── .gitignore
├── pom.xml
└── src
└── main
├── java
├── module-info.java
├── net
│ └── tenie
│ │ └── Sqlucky
│ │ └── sdk
│ │ ├── AppComponent.java
│ │ ├── AutoComplete.java
│ │ ├── SqluckyDbTableDatePo.java
│ │ ├── SqluckyEditor.java
│ │ ├── SqluckyLineNumberNode.java
│ │ ├── SqluckyPluginDelegate.java
│ │ ├── component
│ │ ├── CacheDataTableViewShapeChange.java
│ │ ├── CommonButtons.java
│ │ ├── ComponentGetter.java
│ │ ├── DataViewContainer.java
│ │ ├── FindReplaceTextPanel.java_bak
│ │ ├── MyCellOperateButton.java
│ │ ├── MyCodeArea.java
│ │ ├── MyEditorSheet.java
│ │ ├── MyEditorSheetHelper.java
│ │ ├── MyNoLineNumberEditor.java
│ │ ├── MyNumberParser.java
│ │ ├── MyPopupNumberFilter.java
│ │ ├── MyTableCellButton.java
│ │ ├── MyTableCellTextField2.java
│ │ ├── MyTableCellTextField2ReadOnly.java
│ │ ├── MyTableCellTextField3.java
│ │ ├── MyTextEditor.java
│ │ ├── MyTooltipTool.java
│ │ ├── ResultSetCellValueFactory.java
│ │ ├── SdkComponent.java
│ │ ├── SqluckyTableView.java
│ │ ├── SqluckyTitledPane.java
│ │ ├── StringPropertyListValueFactory.java
│ │ ├── TabStack.java
│ │ ├── TabStackObj.java
│ │ ├── editor
│ │ │ ├── AutoCompleteCellFactory.java
│ │ │ ├── FindReplaceTextBox.java
│ │ │ ├── HighLightingEditor.java
│ │ │ ├── HighLightingEditorContextMenu.java
│ │ │ ├── HighLightingEditorUtils.java
│ │ │ ├── InputMethodRequestsObject.java
│ │ │ ├── MyAutoComplete.java
│ │ │ ├── MyCodeAreaKeyPressedEvent.java
│ │ │ └── MyLineNumberNode.java
│ │ └── sheet
│ │ │ └── bottom
│ │ │ ├── MyBottomSheet.java
│ │ │ ├── MyBottomSheetAction.java
│ │ │ ├── MyBottomSheetButton.java
│ │ │ ├── MyBottomSheetUtility.java
│ │ │ ├── SelectBottomSheet.java_bak
│ │ │ └── TextBottomSheet.java_bak
│ │ ├── config
│ │ ├── CommonConst.java
│ │ ├── ConfigVal.java
│ │ └── KeyBindingCache.java
│ │ ├── db
│ │ ├── DBConns.java
│ │ ├── DBOptionHelper.java
│ │ ├── DBTools.java
│ │ ├── DaoTools.java
│ │ ├── Dbinfo.java
│ │ ├── DeleteDao.java
│ │ ├── ExportDBObjects.java
│ │ ├── ExportDBObjectsAb.java
│ │ ├── ExportDefaultImp.java
│ │ ├── InsertDao.java
│ │ ├── InsertPreparedStatementDao.java
│ │ ├── PoDao.java
│ │ ├── PoDaoUtil.java
│ │ ├── ResultSetCellPo.java
│ │ ├── ResultSetPo.java
│ │ ├── ResultSetRowPo.java
│ │ ├── SelectDao.java
│ │ ├── SelectInfoTableDao.java
│ │ ├── SqluckyAppDB.java
│ │ ├── SqluckyConnector.java
│ │ ├── SqluckyConnector2.java_bak
│ │ ├── SqluckyDbRegister.java
│ │ ├── SqluckySqliteConnector.java
│ │ ├── SqluckySqliteRegister.java
│ │ └── UpdateDao.java
│ │ ├── excel
│ │ ├── CsvToDB.java
│ │ ├── CsvUtil.java
│ │ ├── ExcelDataPo.java
│ │ ├── ExcelHeadCellInfo.java
│ │ ├── ExcelToDB.java
│ │ ├── ExcelUtil.java
│ │ ├── ReadExcel.java
│ │ └── WriteExcel.java
│ │ ├── po
│ │ ├── BDConnJsonObj.java
│ │ ├── DBConnectorInfoPo.java
│ │ ├── DBNodeInfoPo.java
│ │ ├── DataModelPo.java
│ │ ├── DataTableViewShapePo.java
│ │ ├── DbSchemaPo.java
│ │ ├── DbTableDatePo.java
│ │ ├── DbTableDatePoNoCache.java
│ │ ├── DocumentPo.java
│ │ ├── DynaPo.java
│ │ ├── DynaProperty.java
│ │ ├── ImportFieldMapDetailPo.java
│ │ ├── ImportFieldMapPo.java
│ │ ├── ImportFieldPo.java
│ │ ├── KeyBindingItemPo.java
│ │ ├── MyRange.java
│ │ ├── MyTableCellPo.java
│ │ ├── PluginInfoPO.java
│ │ ├── PoInfo.java
│ │ ├── RsData.java
│ │ ├── RsVal.java
│ │ ├── SelectExecInfo.java
│ │ ├── SheetDataValue.java
│ │ ├── SheetFieldPo.java
│ │ ├── SheetTableData.java
│ │ ├── SqlcukyTitledPaneInfoPo.java_bak
│ │ ├── TreeItemType.java
│ │ ├── TreeObjCache.java
│ │ ├── component
│ │ │ ├── ConnItemContainer.java
│ │ │ ├── ConnItemDbObjects.java
│ │ │ ├── DataTableContextMenu.java
│ │ │ ├── DataTableContextMenuAction.java
│ │ │ ├── MyTreeItem.java
│ │ │ ├── SqluckyTextField.java
│ │ │ ├── TableFieldProperty.java
│ │ │ ├── TableProperty.java
│ │ │ └── TreeNodePo.java
│ │ ├── db
│ │ │ ├── FuncProcTriggerPo.java
│ │ │ ├── KeysBindingPO.java
│ │ │ ├── ProcedureFieldPo.java
│ │ │ ├── SqlData.java
│ │ │ ├── TableFieldPo.java
│ │ │ ├── TableForeignKeyPo.java
│ │ │ ├── TableIndexPo.java
│ │ │ ├── TablePo.java
│ │ │ ├── TablePrimaryKeyPo.java
│ │ │ └── TablePrimaryKeysPo.java
│ │ └── myEntry.java
│ │ ├── sql
│ │ ├── SqlParser.java
│ │ └── SqlUtils.java
│ │ ├── subwindow
│ │ ├── DialogTools.java
│ │ ├── DockSideTabPaneWindow.java
│ │ ├── DockSideWindow.java
│ │ ├── ImportCsvNextWindow.java
│ │ ├── ImportCsvWindow.java
│ │ ├── ImportExcelNextWindow.java
│ │ ├── ImportExcelWindow.java
│ │ ├── ImportSQLWindow.java
│ │ ├── MyAlert.java
│ │ ├── QueryHistoryImportFieldMap.java
│ │ ├── QueryWindow.java
│ │ └── TableDataDetail.java
│ │ ├── ui
│ │ ├── CodeAreaHighLightingHelper.java
│ │ ├── CodeAreaHighLightingHelperForJava.java
│ │ ├── CodeAreaHighLightingNoKeyWordHelper.java
│ │ ├── IconGenerator.java
│ │ ├── LoadingAnimation.java
│ │ ├── SqluckyStage.java
│ │ ├── SvgIcon.java
│ │ └── UiTools.java
│ │ └── utility
│ │ ├── AppCommonAction.java
│ │ ├── CodeRunTimeCalculate.java
│ │ ├── CommonUtils.java
│ │ ├── DateUtils.java
│ │ ├── DesUtil.java
│ │ ├── DraggingTabPaneSupport.java
│ │ ├── FetchDBInfoCommonTools.java
│ │ ├── FileOrDirectoryChooser.java
│ │ ├── FileTools.java
│ │ ├── FinderAction.java
│ │ ├── GenerateSQLString.java
│ │ ├── JsonTools.java
│ │ ├── MyOption.java
│ │ ├── ObjFormater.java
│ │ ├── ParseSQL.java
│ │ ├── SplitAndMergeFile.java
│ │ ├── SplitTextFileUtils.java
│ │ ├── StrUtils.java
│ │ ├── TableViewUtils.java
│ │ ├── TextFieldSetup.java
│ │ ├── TransferDataUtils.java
│ │ ├── TreeObjAction.java
│ │ ├── XmlUtils.java
│ │ ├── YamlParser.java
│ │ ├── ZipUtils.java
│ │ ├── myEvent.java
│ │ └── net
│ │ ├── HttpDownloadFile.java
│ │ └── HttpUtil.java
└── org
│ └── girod
│ └── javafx
│ └── svgimage
│ ├── AwtImageConverter.java
│ ├── ExceptionsHandling.java
│ ├── GlobalConfig.java
│ ├── LoaderContext.java
│ ├── LoaderParameters.java
│ ├── Main.java
│ ├── SVGContent.java
│ ├── SVGImage.java
│ ├── SVGLoader.java
│ ├── ScaleQuality.java
│ ├── fxsvgimage.properties
│ ├── package.html
│ └── xml
│ ├── builders
│ ├── AnimationBuilder.java
│ ├── MarkerBuilder.java
│ ├── SVGShapeBuilder.java
│ ├── SVGStyleBuilder.java
│ └── package.html
│ ├── parsers
│ ├── AbstractPathParser.java
│ ├── ClippingFactory.java
│ ├── LengthParser.java
│ ├── MarkerContextPathParser.java
│ ├── ParserUtils.java
│ ├── PathParser.java
│ ├── PercentParser.java
│ ├── SVGLibraryException.java
│ ├── SVGParsingException.java
│ ├── SVGTags.java
│ ├── TransformUtils.java
│ ├── XMLNode.java
│ ├── XMLRoot.java
│ ├── XMLTreeHandler.java
│ └── package.html
│ └── specs
│ ├── ExtendedFontPosture.java
│ ├── FilterSpec.java
│ ├── GradientSpec.java
│ ├── LinearGradientSpec.java
│ ├── MarkerContext.java
│ ├── MarkerSpec.java
│ ├── RadialGradientSpec.java
│ ├── SpanGroup.java
│ ├── Styles.java
│ ├── SymbolSpec.java
│ ├── Viewbox.java
│ ├── Viewport.java
│ └── package.html
└── resources
├── logo16.svg
├── logo2.svg
└── s.svg
/.gitignore:
--------------------------------------------------------------------------------
1 | scenicView.properties
2 | */target/
3 | *.class
4 | *build/
5 | *.classpath
6 | *.classpath_bak
7 | *.factorypath
8 | *target/
9 | *.settings/
10 | *.vscode/
11 | *.project
12 | .idea/
13 | .sts4-cache/
14 | *.iml
15 | dependency-reduced-pom.xml
16 | .apt_generated/
17 | .apt_generated_tests/
18 | *.db
19 | *_hd.mp4
20 | *.eml
21 | */SQLucky-Plugin/
22 | *.log
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | #
SQLucky
3 |
4 | > 数据库可视化操作工具, 多平台支持, 以插件形式支持各种数据库.
5 | 为平替同类付费软件而生.
6 |
7 | ---
8 |
9 | > 下载:
10 |
11 | - [Releases 页面下载](https://github.com/tenie/SQLucky/releases/)
12 | > 3.3.0-Beta 下载
13 | - [Ubuntu amd64 (deb安装包)](https://github.com/tenie/SQLucky/releases/download/3.3.0-Beta/sqlucky_ubuntu-x64.deb)
14 | - [Windows amd64 (msi安装包)](https://github.com/tenie/SQLucky/releases/download/3.3.0-Beta/SQLucky-windows-x64.msi)
15 | - [Windows amd64 (zip压缩包)](https://github.com/tenie/SQLucky/releases/download/3.3.0-Beta/SQLucky-windows-x64.zip)
16 | - [Mac amd64 (dmg安装包)](https://github.com/tenie/SQLucky/releases/download/3.3.0-Beta/SQLucky-mac-x64.dmg)
17 |
18 | > 开发依赖:
19 |
20 | Java 21
21 | maven latest
22 |
23 | > 源码快速启动:
24 |
25 |
26 | $ git clone git@github.com:tenie/SQLucky.git
27 | $ cd SQLucky
28 | $ mvn -N install
29 | $ mvn install
30 | $ cd app
31 | $ mvn javafx:run
32 |
33 |
34 |
35 | ## 界面截图 ##
36 |
37 |
38 | ---
39 |
40 | > [wiki 页面](https://github.com/tenie/SQLucky/wiki)
41 |
42 | ---
43 | This project is supported by:
44 |
45 | [
](https://www.jetbrains.com/)
46 |
47 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | scenicView.properties
2 | */target/
3 | *.class
4 | *build/
5 | *.classpath
6 | *.classpath_bak
7 | *.factorypath
8 | *target/
9 | *.settings/
10 | *.project
11 | .idea/
12 | .sts4-cache/
13 | *.iml
14 | dependency-reduced-pom.xml
15 | .apt_generated/
16 | .apt_generated_tests/
17 | *.db
--------------------------------------------------------------------------------
/app/src/main/java/module-info.java:
--------------------------------------------------------------------------------
1 | open module SQLucky.app {
2 | requires java.desktop;
3 | // requires java.naming;
4 | // requires java.security.jgss;
5 | // requires java.transaction.xa;
6 | requires java.compiler;
7 | requires java.logging;
8 | requires java.management;
9 | // requires java.rmi;
10 | // requires java.scripting;
11 | requires java.xml;
12 | requires java.sql;
13 | requires java.sql.rowset;
14 |
15 | requires jasypt;
16 | requires cn.hutool;
17 | requires javafx.base;
18 | requires javafx.graphics;
19 | requires javafx.controls;
20 | requires javafx.fxml;
21 | requires javafx.media;
22 | // requires javafx.web;
23 | requires javafx.swing;
24 | // requires mybatis.plus.annotation;
25 | // requires mybatis.plus.generator;
26 |
27 | // mods
28 | requires com.jfoenix;
29 | requires org.controlsfx.controls;
30 | requires org.apache.logging.log4j;
31 |
32 | requires org.dom4j;
33 | requires com.fasterxml.jackson.dataformat.xml;
34 | requires com.fasterxml.jackson.core;
35 | requires com.fasterxml.jackson.databind;
36 | requires com.fasterxml.jackson.annotation;
37 | requires lombok;
38 |
39 |
40 | requires org.apache.httpcomponents.client5.httpclient5;
41 | requires org.apache.httpcomponents.client5.httpclient5.fluent;
42 | requires org.apache.httpcomponents.core5.httpcore5;
43 |
44 | requires com.github.albfernandez.juniversalchardet;
45 | requires org.apache.poi.poi;
46 | requires org.apache.poi.ooxml;
47 |
48 | // non-mods
49 | requires org.apache.commons.io;
50 | requires org.fxmisc.richtext;
51 | // requires com.h2database;
52 | requires h2;
53 | requires reactfx;
54 | requires flowless;
55 | requires sql.formatter;
56 | requires org.slf4j;
57 | // requires batik.transcoder;
58 | // requires batik.script;
59 | // requires org.girod.javafx.svgimage;
60 |
61 | requires SQLucky.sdk;
62 |
63 |
64 |
65 |
66 | uses net.tenie.Sqlucky.sdk.SqluckyPluginDelegate;
67 | exports net.tenie.fx.controller to javafx.fxml;
68 | exports net.tenie.fx.main to javafx.graphics;
69 | }
70 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/Action/LogSystem.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.Action;
2 |
3 | public class LogSystem {
4 | static {
5 | Log4jPrintStream.redirectSystemOut();
6 | }
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/Action/sqlExecute/SqlExecuteOption.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.Action.sqlExecute;
2 |
3 | public class SqlExecuteOption {}
4 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/component/InfoTree/DBinfoTreeTitledPane.java_bak:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.component.InfoTree;
2 |
3 | import net.tenie.Sqlucky.sdk.component.SqluckyTitledPane;
4 |
5 | public class DBinfoTreeTitledPane extends SqluckyTitledPane {
6 | public DBinfoTreeTitledPane(){
7 |
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/component/ScriptTree/ScriptTreeAction.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.component.ScriptTree;
2 |
3 | import java.io.File;
4 |
5 | import javafx.scene.control.TreeItem;
6 | import net.tenie.Sqlucky.sdk.component.MyEditorSheet;
7 | import net.tenie.Sqlucky.sdk.component.MyEditorSheetHelper;
8 | import net.tenie.Sqlucky.sdk.utility.CommonUtils;
9 | import net.tenie.Sqlucky.sdk.utility.StrUtils;
10 |
11 | public class ScriptTreeAction {
12 |
13 | public static void showInFloder() {
14 | TreeItem ctt = ScriptTabTree.ScriptTreeView.getSelectionModel().getSelectedItem();
15 | MyEditorSheet sheet = ctt.getValue();
16 | String fn = sheet.getDocumentPo().getExistFileFullName();
17 | if (StrUtils.isNotNullOrEmpty(fn)) {
18 | File file = new File(fn);
19 | CommonUtils.openExplorer(file.getParentFile());
20 | }
21 | }
22 |
23 | public static void saveAction() {
24 | TreeItem ctt = ScriptTabTree.ScriptTreeView.getSelectionModel().getSelectedItem();
25 | MyEditorSheet sheet = ctt.getValue();
26 | // CommonAction.saveSqlAction(sheet);
27 | MyEditorSheetHelper.saveSqlToFileAction(sheet);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/component/ScriptTree/ScriptTreeContextMenu.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.component.ScriptTree;
2 |
3 | import javafx.scene.control.ContextMenu;
4 | import javafx.scene.control.MenuItem;
5 | import javafx.scene.control.SeparatorMenuItem;
6 | import javafx.scene.control.TreeItem;
7 | import net.tenie.Sqlucky.sdk.component.MyEditorSheet;
8 | import net.tenie.Sqlucky.sdk.component.MyEditorSheetHelper;
9 | import net.tenie.Sqlucky.sdk.utility.AppCommonAction;
10 |
11 | /**
12 | *
13 | * @author tenie
14 | *
15 | */
16 | public class ScriptTreeContextMenu {
17 | private ContextMenu contextMenu;
18 | private MenuItem close;
19 |
20 | public ScriptTreeContextMenu(TreeItem rootNode) {
21 |
22 | contextMenu = new ContextMenu();
23 |
24 | close = new MenuItem("Close");
25 | close.setOnAction(e -> {
26 | ScriptTabTree.closeAction(rootNode);
27 | });
28 |
29 | MenuItem Open = new MenuItem("Open");
30 | Open.setOnAction(e -> {
31 | ScriptTabTree.openEditor();
32 | });
33 |
34 | MenuItem New = new MenuItem("New");
35 | New.setOnAction(e -> {
36 | // MyAreaTab.addCodeEmptyTabMethod();
37 | MyEditorSheetHelper.addEmptyHighLightingEditor();
38 |
39 | });
40 |
41 | MenuItem save = new MenuItem("Save");
42 | save.setOnAction(e -> {
43 | ScriptTreeAction.saveAction();
44 | // TreeItem ctt = ScriptTabTree.ScriptTreeView.getSelectionModel().getSelectedItem();
45 | // MyTab mtab = ctt.getValue();
46 | // CommonAction.saveSqlAction(mtab);
47 | });
48 |
49 | MenuItem Import = new MenuItem("Import...");
50 | Import.setOnAction(e -> {
51 | AppCommonAction.openSqlFile();
52 | });
53 |
54 | MenuItem folder = new MenuItem("Show In Folder");
55 | folder.setOnAction(e -> {
56 | ScriptTreeAction.showInFloder();
57 | // TreeItem ctt = ScriptTabTree.ScriptTreeView.getSelectionModel().getSelectedItem();
58 | // MyTab tb = ctt.getValue();
59 | // String fn = tb.getDocumentPo().getFileFullName();
60 | // if(StrUtils.isNotNullOrEmpty(fn)) {
61 | // File file = new File(fn);
62 | // CommonUtility.openExplorer(file.getParentFile());
63 | // }
64 |
65 | });
66 |
67 | contextMenu.getItems().addAll(folder, Import, new SeparatorMenuItem(), New, Open, save, close);
68 |
69 | }
70 |
71 | public ContextMenu getContextMenu() {
72 | return contextMenu;
73 | }
74 |
75 | public void setContextMenu(ContextMenu contextMenu) {
76 | this.contextMenu = contextMenu;
77 | }
78 |
79 | }
80 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/component/UserAccount/SqluckyUser.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.component.UserAccount;
2 |
3 | import java.util.Date;
4 |
5 | public class SqluckyUser {
6 | private Long id;
7 | private String userName;
8 | private String email;
9 | private String password;
10 | private Integer isVip;
11 | private Date vipExpirationTime;
12 |
13 | private Date createdAt;
14 | private Date updatedAt;
15 |
16 |
17 | public Long getId() {
18 | return id;
19 | }
20 | public void setId(Long id) {
21 | this.id = id;
22 | }
23 | public Date getCreatedAt() {
24 | return createdAt;
25 | }
26 | public void setCreatedAt(Date createdAt) {
27 | this.createdAt = createdAt;
28 | }
29 | public Date getUpdatedAt() {
30 | return updatedAt;
31 | }
32 | public void setUpdatedAt(Date updatedAt) {
33 | this.updatedAt = updatedAt;
34 | }
35 | public String getUserName() {
36 | return userName;
37 | }
38 | public void setUserName(String userName) {
39 | this.userName = userName;
40 | }
41 | public String getEmail() {
42 | return email;
43 | }
44 | public void setEmail(String email) {
45 | this.email = email;
46 | }
47 | public String getPassword() {
48 | return password;
49 | }
50 | public void setPassword(String password) {
51 | this.password = password;
52 | }
53 | public Integer getIsVip() {
54 | return isVip;
55 | }
56 | public void setIsVip(Integer isVip) {
57 | this.isVip = isVip;
58 | }
59 | public Date getVipExpirationTime() {
60 | return vipExpirationTime;
61 | }
62 | public void setVipExpirationTime(Date vipExpirationTime) {
63 | this.vipExpirationTime = vipExpirationTime;
64 | }
65 |
66 |
67 |
68 |
69 | }
70 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/component/container/OperateContainer.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.component.container;
2 |
3 | import org.controlsfx.control.MasterDetailPane;
4 |
5 | import javafx.geometry.Side;
6 | import javafx.scene.layout.HBox;
7 | import javafx.scene.layout.Priority;
8 | import net.tenie.Sqlucky.sdk.component.ComponentGetter;
9 | import net.tenie.Sqlucky.sdk.utility.CommonUtils;
10 |
11 | /**
12 | * 操作容器, 左侧窗口, 代码编辑窗口
13 | */
14 | public class OperateContainer extends HBox {
15 | private MasterDetailPane treeAreaDetailPane;
16 | private DBinfoContainer dbinfoCtr; // 连接管理窗口
17 | private CodeContainer codeCtr; // 代码编辑窗口
18 |
19 | public OperateContainer() {
20 | super();
21 |
22 | codeCtr = new CodeContainer();
23 | dbinfoCtr = new DBinfoContainer();
24 |
25 | treeAreaDetailPane = new MasterDetailPane(Side.LEFT);
26 | treeAreaDetailPane.setShowDetailNode(true);
27 | treeAreaDetailPane.setMasterNode(codeCtr);
28 | treeAreaDetailPane.setDetailNode(dbinfoCtr);
29 |
30 | this.getChildren().add(treeAreaDetailPane);
31 |
32 | HBox.setHgrow(treeAreaDetailPane, Priority.ALWAYS);
33 | ComponentGetter.treeAreaDetailPane = treeAreaDetailPane;
34 |
35 | // CommonUtils.fadeTransition(codeCtr, 1000);
36 | // CommonUtils.fadeTransition(dbinfoCtr, 1000);
37 | }
38 |
39 | public MasterDetailPane getTreeAreaDetailPane() {
40 | return treeAreaDetailPane;
41 | }
42 |
43 | public void setTreeAreaDetailPane(MasterDetailPane treeAreaDetailPane) {
44 | this.treeAreaDetailPane = treeAreaDetailPane;
45 | }
46 |
47 | public DBinfoContainer getDbinfoCtr() {
48 | return dbinfoCtr;
49 | }
50 |
51 | public void setDbinfoCtr(DBinfoContainer dbinfoCtr) {
52 | this.dbinfoCtr = dbinfoCtr;
53 | }
54 |
55 | public CodeContainer getCodeCtr() {
56 | return codeCtr;
57 | }
58 |
59 | public void setCodeCtr(CodeContainer codeCtr) {
60 | this.codeCtr = codeCtr;
61 | }
62 |
63 | }
64 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/config/DbVendor.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.config;
2 |
3 | import java.util.HashMap;
4 | import java.util.LinkedHashSet;
5 | import java.util.Map;
6 |
7 | import net.tenie.Sqlucky.sdk.db.SqluckyDbRegister;
8 |
9 | /**
10 | * 数据库厂家 和对应的启动字符串
11 | * @author tenie
12 | *
13 | */
14 | public class DbVendor {
15 |
16 |
17 | private static LinkedHashSet keys = new LinkedHashSet();
18 | private static Map data = new HashMap();
19 |
20 | // static {
21 | //// add( db2, "com.ibm.db2.jcc.DB2Driver");
22 | //// add( mysql, "com.mysql.jdbc.Driver");
23 | //// add( mariadb, "");
24 | //// add( h2, "org.h2.Driver");
25 | //// add( postgresql, "");
26 | //// // 新版的jdbc 不需要手动注册驱动了
27 | //// add(sqlite, "");
28 | // }
29 |
30 | public static void add(String name, SqluckyDbRegister val) {
31 | var tmpName = name.toUpperCase();
32 | keys.add(tmpName);
33 | data.put(tmpName, val);
34 | }
35 |
36 | public static LinkedHashSet getAll() {
37 | return keys;
38 | }
39 |
40 | public static String getDriver(String name) {
41 |
42 | return data.get(name.toUpperCase()).getDriver();
43 | }
44 |
45 | // 获取注册的 db 对象
46 | public static SqluckyDbRegister register(String name) {
47 | for(var key :data.keySet()) {
48 | if(key.toUpperCase().equals(name.toUpperCase())) {
49 | return data.get(key);
50 | }
51 | }
52 | return null;
53 | }
54 |
55 |
56 | public static void clear() {
57 | keys.clear();
58 | data.clear();
59 | }
60 |
61 | public static void registerDbConnection( SqluckyDbRegister db) {
62 | if(db == null) {
63 | return;
64 | }
65 | String name = db.getName();
66 | add( name, db);
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/controller/DbDiffTools.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.controller;
2 |
3 | /**
4 | * 2个数据库表字段比较
5 | */
6 | public class DbDiffTools {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/factory/TextFieldFactory.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.factory;
2 |
3 | import javafx.scene.control.TextField;
4 |
5 | public class TextFieldFactory {
6 |
7 | // 只能输入数字的输入框
8 | public static TextField numTextField(int limit) {
9 | TextField rows = new TextField() {
10 | @Override
11 | public void replaceText(int start, int end, String text) {
12 | if (!text.matches("[a-z, A-Z]")) {
13 | super.replaceText(start, end, text);
14 | }
15 | // label.setText("Enter a numeric value");
16 | }
17 |
18 | @Override
19 | public void replaceSelection(String text) {
20 | if (!text.matches("[a-z, A-Z]")) {
21 | super.replaceSelection(text);
22 | }
23 | }
24 | };
25 | return rows;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/main/MyAppTest.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.main;
2 |
3 | import javafx.application.Application;
4 | import javafx.scene.Scene;
5 | import javafx.scene.control.Label;
6 | import javafx.scene.control.Menu;
7 | import javafx.scene.control.MenuBar;
8 | import javafx.scene.layout.StackPane;
9 | import javafx.scene.layout.VBox;
10 | import javafx.stage.Stage;
11 |
12 | public class MyAppTest extends Application {
13 | @Override
14 | public void start(Stage primaryStage) throws Exception {
15 | String javaVersion = System.getProperty("java.version");
16 | String javafxVersion = System.getProperty("javafx.version");
17 | Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
18 | MenuBar menuBar = new MenuBar(new Menu("TEST"));
19 | menuBar.setUseSystemMenuBar(true);
20 | Scene scene = new Scene(new VBox(menuBar, new StackPane(l)), 640, 480);
21 | primaryStage.setScene(scene);
22 | primaryStage.show();
23 | }
24 |
25 | public static void runApp(String[] args) {
26 | launch(args);
27 | }
28 |
29 | public static void main(String[] args) {
30 | MyAppTest.runApp(args);
31 | }
32 | }
--------------------------------------------------------------------------------
/app/src/main/java/net/tenie/fx/main/Restart.java:
--------------------------------------------------------------------------------
1 | package net.tenie.fx.main;
2 |
3 | import java.io.File;
4 | import java.io.IOException;
5 | import java.lang.management.ManagementFactory;
6 | import java.util.List;
7 |
8 | import SQLucky.app;
9 | import org.apache.logging.log4j.LogManager;
10 | import org.apache.logging.log4j.Logger;
11 |
12 | import net.tenie.Sqlucky.sdk.subwindow.MyAlert;
13 | import net.tenie.Sqlucky.sdk.utility.CommonUtils;
14 | import net.tenie.Sqlucky.sdk.utility.StrUtils;
15 |
16 | /**
17 | * @author tenie
18 | */
19 | public class Restart {
20 | private static Logger logger = LogManager.getLogger(Restart.class);
21 | // 重启应用
22 | public static void reboot(){
23 | try {
24 | String SqluckyAppPath = CommonUtils.sqluckyAppPath();
25 | if(SqluckyAppPath != null && !"".equals(SqluckyAppPath)) {
26 | execCmdAndExit(SqluckyAppPath);
27 | runDev();
28 | }else {
29 | MyAlert.errorAlert("Error!");
30 | }
31 |
32 | } catch (Exception e) {
33 | logger.error(" Exception = " + e.getMessage());
34 | MyAlert.errorAlert(e.getMessage());
35 | e.printStackTrace();
36 | }
37 | }
38 |
39 | @SuppressWarnings("deprecation")
40 | private static void execCmdAndExit(String cmd) throws IOException {
41 | if(StrUtils.isNotNullOrEmpty(cmd)) {
42 | if ( CommonUtils.checkFileExist(cmd) ) {
43 | Runtime.getRuntime().exec(cmd);
44 | logger.info(" 执行 app {}", cmd);
45 | System.exit(0);
46 | }else {
47 | runDev();
48 | }
49 | }
50 | }
51 | // 开发环境时候从其
52 | @SuppressWarnings("deprecation")
53 | private static void runDev( ) throws IOException {
54 | List