diff --git a/screw-core/src/main/java/cn/smallbun/screw/core/engine/EngineFileType.java b/screw-core/src/main/java/cn/smallbun/screw/core/engine/EngineFileType.java
index 0514070..47a638f 100644
--- a/screw-core/src/main/java/cn/smallbun/screw/core/engine/EngineFileType.java
+++ b/screw-core/src/main/java/cn/smallbun/screw/core/engine/EngineFileType.java
@@ -41,7 +41,11 @@ public enum EngineFileType implements Serializable {
/**
* MD
*/
- MD(".md", "documentation_md", "Markdown文件");
+ MD(".md", "documentation_md", "Markdown文件"),
+ /**
+ * EXCEL
+ */
+ XSL(".xls","documentation_xsl","Excel文件");
/**
* 文件后缀
diff --git a/screw-core/src/main/java/cn/smallbun/screw/core/process/AbstractProcess.java b/screw-core/src/main/java/cn/smallbun/screw/core/process/AbstractProcess.java
index cf78fe8..4b1a8a4 100644
--- a/screw-core/src/main/java/cn/smallbun/screw/core/process/AbstractProcess.java
+++ b/screw-core/src/main/java/cn/smallbun/screw/core/process/AbstractProcess.java
@@ -221,6 +221,18 @@ public void optimizeData(DataModel dataModel) {
columns.forEach(BeanUtils::beanAttributeValueEscapeXml);
});
}
+ if (config.getEngineConfig().getFileType().equals(EngineFileType.XSL)) {
+ //escape xml
+ beanAttributeValueReplaceBlank(dataModel);
+ //columns
+ tables.forEach(i -> {
+ //table escape xml
+ beanAttributeValueReplaceBlank(i);
+ List columns = i.getColumns();
+ //columns escape xml
+ columns.forEach(BeanUtils::beanAttributeValueReplaceBlank);
+ });
+ }
//if file type is markdown
if (config.getEngineConfig().getFileType().equals(EngineFileType.MD)) {
//escape xml
diff --git a/screw-core/src/main/resources/template/freemarker/documentation_xsl.ftl b/screw-core/src/main/resources/template/freemarker/documentation_xsl.ftl
new file mode 100644
index 0000000..deefb39
--- /dev/null
+++ b/screw-core/src/main/resources/template/freemarker/documentation_xsl.ftl
@@ -0,0 +1,101 @@
+
+
+
+
+ Microsoft Office User
+ Microsoft Office User
+ 2020-11-15T08:36:40Z
+ 2020-11-15T08:46:38Z
+ 16.00
+
+
+
+
+
+ 16120
+ 28240
+ 280
+ 460
+ 1
+ False
+ False
+
+
+
+
+ <#list tables><#items as t>
+
+
+
+ | xu序号 |
+ 名称 |
+ shu数据类型 |
+ chang长度 |
+ shu'z小数值 |
+ yun允许空值 |
+ zhu主键 |
+ mo'ren默认值 |
+ shuo说明 |
+
+ <#list t.columns>
+ <#items as c>
+
+ | ${c?index+1} |
+ ${c.columnName!''} |
+ ${c.typeName!''} |
+ ${c.columnSize!''} |
+ ${c.decimalDigits!'0'} |
+ ${c.nullable!''} |
+ ${c.primaryKey!''} |
+ ${c.columnDef!''} |
+ ${c.remarks!''} |
+
+ #items>
+ #list>
+
+
+
+
+
+
+
+
+<#-- -->
+<#-- -->
+<#-- 9-->
+<#-- 0-->
+<#-- -->
+
+
+ 3
+ 1
+
+
+ False
+ False
+
+
+
+ #items>
+ #list>
+
diff --git a/screw-core/src/test/java/cn/smallbun/screw/core/produce/MySQLDocumentationBuilderTest.java b/screw-core/src/test/java/cn/smallbun/screw/core/produce/MySQLDocumentationBuilderTest.java
index db3555d..2e894c8 100644
--- a/screw-core/src/test/java/cn/smallbun/screw/core/produce/MySQLDocumentationBuilderTest.java
+++ b/screw-core/src/test/java/cn/smallbun/screw/core/produce/MySQLDocumentationBuilderTest.java
@@ -64,7 +64,7 @@ void build() throws IOException {
//打开目录
.openOutputDir(true)
//文件类型
- .fileType(EngineFileType.HTML)
+ .fileType(EngineFileType.XSL)
//生成模板实现
.produceType(EngineTemplateType.freemarker).build();
diff --git a/screw-idea-plugin/.gitignore b/screw-idea-plugin/.gitignore
new file mode 100644
index 0000000..9c03f7b
--- /dev/null
+++ b/screw-idea-plugin/.gitignore
@@ -0,0 +1,3 @@
+/screw-idea-plugin.iml
+/out
+.idea
\ No newline at end of file
diff --git a/screw-idea-plugin/README.md b/screw-idea-plugin/README.md
new file mode 100644
index 0000000..c372ca3
--- /dev/null
+++ b/screw-idea-plugin/README.md
@@ -0,0 +1,31 @@
+该项目根据[screw][screw]由来,核心代码没改动,旨在通过 idea 插件快速创建数据库文档,只需简单配置数据库连接信息即可使用
+
+# 使用方法
+1. 安装screw插件
+2. Tools(或者编辑界面右键) --> Screw --> 选择对应数据库 --> 配置数据库信息 --> 确定 --> 选择文件路径
+3. 生成失败可以查看Event log 查看原因
+
+# 插件截图
+![plugin][plugin]
+
+![effect][effect]
+
+# 文档截图
+
+**html截图**
+
+![html][html]
+
+**word截图**
+![word][word]
+
+**markdown截图**
+![markdown][markdown]
+
+[screw]:https://github.com/pingfangushi/screw
+[plugin]: https://ftp.bmp.ovh/imgs/2020/08/e263d024bf46b9b1.png
+[effect]: https://ftp.bmp.ovh/imgs/2020/08/549f41f00a874188.png
+[html]: https://images.gitee.com/uploads/images/2020/0622/161414_74cd0b68_1407605.png
+[word]: https://images.gitee.com/uploads/images/2020/0625/200946_1dc0717f_1407605.png
+[markdown]: https://images.gitee.com/uploads/images/2020/0625/214749_7b15d8bd_1407605.png
+
diff --git a/screw-idea-plugin/lib/HikariCP-3.4.5.jar b/screw-idea-plugin/lib/HikariCP-3.4.5.jar
new file mode 100644
index 0000000..95247be
Binary files /dev/null and b/screw-idea-plugin/lib/HikariCP-3.4.5.jar differ
diff --git a/screw-idea-plugin/lib/freemarker-2.3.30.jar b/screw-idea-plugin/lib/freemarker-2.3.30.jar
new file mode 100644
index 0000000..222d14f
Binary files /dev/null and b/screw-idea-plugin/lib/freemarker-2.3.30.jar differ
diff --git a/screw-idea-plugin/lib/mariadb-java-client-2.6.2.jar b/screw-idea-plugin/lib/mariadb-java-client-2.6.2.jar
new file mode 100644
index 0000000..4845a5b
Binary files /dev/null and b/screw-idea-plugin/lib/mariadb-java-client-2.6.2.jar differ
diff --git a/screw-idea-plugin/lib/mssql-jdbc-8.2.1.jre8.jar b/screw-idea-plugin/lib/mssql-jdbc-8.2.1.jre8.jar
new file mode 100644
index 0000000..e15a1ab
Binary files /dev/null and b/screw-idea-plugin/lib/mssql-jdbc-8.2.1.jre8.jar differ
diff --git a/screw-idea-plugin/lib/mysql-connector-java-8.0.21.jar b/screw-idea-plugin/lib/mysql-connector-java-8.0.21.jar
new file mode 100644
index 0000000..51e270c
Binary files /dev/null and b/screw-idea-plugin/lib/mysql-connector-java-8.0.21.jar differ
diff --git a/screw-idea-plugin/lib/ojdbc8-19.3.0.0.jar b/screw-idea-plugin/lib/ojdbc8-19.3.0.0.jar
new file mode 100644
index 0000000..2ebb05e
Binary files /dev/null and b/screw-idea-plugin/lib/ojdbc8-19.3.0.0.jar differ
diff --git a/screw-idea-plugin/lib/postgresql-42.2.11.jar b/screw-idea-plugin/lib/postgresql-42.2.11.jar
new file mode 100644
index 0000000..eb607f1
Binary files /dev/null and b/screw-idea-plugin/lib/postgresql-42.2.11.jar differ
diff --git a/screw-idea-plugin/lib/screw-core-1.0.5.jar b/screw-idea-plugin/lib/screw-core-1.0.5.jar
new file mode 100644
index 0000000..c81e6c0
Binary files /dev/null and b/screw-idea-plugin/lib/screw-core-1.0.5.jar differ
diff --git a/screw-idea-plugin/resources/META-INF/plugin.xml b/screw-idea-plugin/resources/META-INF/plugin.xml
new file mode 100644
index 0000000..8895f9b
--- /dev/null
+++ b/screw-idea-plugin/resources/META-INF/plugin.xml
@@ -0,0 +1,48 @@
+
+ cn.smallbun.screw.idea.action
+ Screw
+ 1.0
+ yuanwj
+
+ 简洁好用的数据库表结构文档生成器
+
+ GitHub
+
+
+ 特点:
+
+ - 简洁、轻量、设计良好
+ - 多数据库支持
+ - 多种格式文档
+ - 多种格式文档
+ - 灵活扩展
+ - 支持自定义模板
+
+ ]]>
+
+ 首次提交
+ ]]>
+
+
+
+
+
+ com.intellij.modules.platform
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/screw-idea-plugin/resources/META-INF/screw.png b/screw-idea-plugin/resources/META-INF/screw.png
new file mode 100644
index 0000000..9c30665
Binary files /dev/null and b/screw-idea-plugin/resources/META-INF/screw.png differ
diff --git a/screw-idea-plugin/screw-idea-plugin.zip b/screw-idea-plugin/screw-idea-plugin.zip
new file mode 100644
index 0000000..7061d66
Binary files /dev/null and b/screw-idea-plugin/screw-idea-plugin.zip differ
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/action/ScrewAction.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/action/ScrewAction.java
new file mode 100644
index 0000000..174959f
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/action/ScrewAction.java
@@ -0,0 +1,18 @@
+package main.java.cn.smallbun.screw.idea.action;
+
+import cn.smallbun.screw.idea.wrapper.ScrewWrapper;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.project.Project;
+
+public class ScrewAction extends AnAction {
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ // TODO: insert action logic here
+ Project project = e.getProject();
+ ScrewWrapper screwWrapper = new ScrewWrapper(project);
+ screwWrapper.setResizable(true);
+ screwWrapper.showAndGet();
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/ConfigStatement.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/ConfigStatement.java
new file mode 100644
index 0000000..8c92b23
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/ConfigStatement.java
@@ -0,0 +1,13 @@
+package main.java.cn.smallbun.screw.idea.model;
+
+public class ConfigStatement {
+ public static DataSourceConfig dataSourceConfig;
+
+ public static DataSourceConfig getDataSourceConfig() {
+ return dataSourceConfig;
+ }
+
+ public static void setDataSourceConfig(DataSourceConfig dataSourceConfig) {
+ ConfigStatement.dataSourceConfig = dataSourceConfig;
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/DataSourceConfig.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/DataSourceConfig.java
new file mode 100644
index 0000000..2d2d79f
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/DataSourceConfig.java
@@ -0,0 +1,131 @@
+package main.java.cn.smallbun.screw.idea.model;
+
+import cn.smallbun.screw.core.engine.EngineFileType;
+
+import java.util.List;
+
+public class DataSourceConfig {
+
+ private String url;
+
+ private String driver;
+
+ private String userName;
+
+ private String password;
+
+ private EngineFileType engineFileType;
+
+ private String fileName;
+
+ private String filePath;
+
+ private Boolean isOpen = false;
+
+ //忽略表
+ private List ignoreTable;
+
+ //忽略表前缀
+ private List ignorePrefix;
+
+ //忽略表后缀
+ private List ignoreSuffix;
+
+ private String desc;
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public void setDriver(String driver) {
+ this.driver = driver;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public EngineFileType getEngineFileType() {
+ return engineFileType;
+ }
+
+ public void setEngineFileType(EngineFileType engineFileType) {
+ this.engineFileType = engineFileType;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public void setFilePath(String filePath) {
+ this.filePath = filePath;
+ }
+
+ public Boolean getOpen() {
+ return isOpen;
+ }
+
+ public void setOpen(Boolean open) {
+ isOpen = open;
+ }
+
+ public List getIgnoreTable() {
+ return ignoreTable;
+ }
+
+ public void setIgnoreTable(List ignoreTable) {
+ this.ignoreTable = ignoreTable;
+ }
+
+ public List getIgnorePrefix() {
+ return ignorePrefix;
+ }
+
+ public void setIgnorePrefix(List ignorePrefix) {
+ this.ignorePrefix = ignorePrefix;
+ }
+
+ public List getIgnoreSuffix() {
+ return ignoreSuffix;
+ }
+
+ public void setIgnoreSuffix(List ignoreSuffix) {
+ this.ignoreSuffix = ignoreSuffix;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/DataSourceEnum.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/DataSourceEnum.java
new file mode 100644
index 0000000..17cd29a
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/DataSourceEnum.java
@@ -0,0 +1,57 @@
+package main.java.cn.smallbun.screw.idea.model;
+
+public enum DataSourceEnum {
+ /**
+ * Mysql
+ * Oracle
+ * MariaDB
+ * TIDB
+ * SqlServer
+ * PostgreSQL
+ * Cache DB
+ */
+ Mysql("mysql","com.mysql.jdbc.Driver"),
+ Oracle("oracle","oracle.jdbc.driver.OracleDriver"),MariaDB("MariaDB","org.mariadb.jdbc.Driver"),
+ TIDB("TIDB","com.mysql.jdbc.Driver"),SqlServer("SqlServer","com.microsoft.sqlserver.jdbc.SQLServerDriver"),
+ PostgreSQL("PostgreSQL","org.postgresql.Driver")
+ /*,CacheDB("CacheDB","")*/;
+
+
+ DataSourceEnum(String database, String driverClass) {
+ this.database = database;
+ this.driverClass = driverClass;
+ }
+
+
+ private String database;
+
+ private String driverClass;
+
+ public String getDatabase() {
+ return database;
+ }
+
+ public void setDatabase(String database) {
+ this.database = database;
+ }
+
+ public String getDriverClass() {
+ return driverClass;
+ }
+
+ public void setDriverClass(String driverClass) {
+ this.driverClass = driverClass;
+ }
+
+ public static String getDatabase(String database) {
+ DataSourceEnum[] dataSourceEnums = DataSourceEnum.values();
+ for (DataSourceEnum dataSourceEnum : dataSourceEnums) {
+ if (dataSourceEnum.getDatabase().equalsIgnoreCase(database)) {
+ return dataSourceEnum.getDriverClass();
+ }
+ }
+
+ return null;
+
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/EngineFileTypeEnum.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/EngineFileTypeEnum.java
new file mode 100644
index 0000000..57cef3a
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/model/EngineFileTypeEnum.java
@@ -0,0 +1,46 @@
+package main.java.cn.smallbun.screw.idea.model;
+
+import cn.smallbun.screw.core.engine.EngineFileType;
+
+public enum EngineFileTypeEnum {
+
+ WORD("word",EngineFileType.WORD),
+ HTML("html",EngineFileType.HTML),
+ MD("md",EngineFileType.MD)
+ ;
+
+ private String name;
+
+ private EngineFileType engineFileType;
+
+ EngineFileTypeEnum(String name, EngineFileType engineFileType) {
+ this.name = name;
+ this.engineFileType = engineFileType;
+ }
+
+ public static EngineFileTypeEnum getByName(String name) {
+ EngineFileTypeEnum[] values = EngineFileTypeEnum.values();
+ for (EngineFileTypeEnum engineFileTypeEnum : values) {
+ if (engineFileTypeEnum.getName().equalsIgnoreCase(name)) {
+ return engineFileTypeEnum;
+ }
+ }
+ return null;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public EngineFileType getEngineFileType() {
+ return engineFileType;
+ }
+
+ public void setEngineFileType(EngineFileType engineFileType) {
+ this.engineFileType = engineFileType;
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/notify/ScrewNotifier.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/notify/ScrewNotifier.java
new file mode 100644
index 0000000..c429255
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/notify/ScrewNotifier.java
@@ -0,0 +1,22 @@
+package main.java.cn.smallbun.screw.idea.notify;
+
+import com.intellij.notification.Notification;
+import com.intellij.notification.NotificationDisplayType;
+import com.intellij.notification.NotificationGroup;
+import com.intellij.notification.NotificationType;
+import com.intellij.openapi.project.Project;
+
+public class ScrewNotifier {
+ private final NotificationGroup NOTIFICATION_GROUP =
+ new NotificationGroup("Screw errors", NotificationDisplayType.BALLOON, true);
+
+ public Notification notify(String content) {
+ return notify(null, content);
+ }
+
+ public Notification notify(Project project, String content) {
+ final Notification notification = NOTIFICATION_GROUP.createNotification(content, NotificationType.ERROR);
+ notification.notify(project);
+ return notification;
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/screw/ScrewExecutor.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/screw/ScrewExecutor.java
new file mode 100644
index 0000000..4953eaa
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/screw/ScrewExecutor.java
@@ -0,0 +1,87 @@
+package main.java.cn.smallbun.screw.idea.screw;
+
+import cn.smallbun.screw.core.Configuration;
+import cn.smallbun.screw.core.engine.EngineConfig;
+import cn.smallbun.screw.core.engine.EngineFileType;
+import cn.smallbun.screw.core.engine.EngineTemplateType;
+import cn.smallbun.screw.core.execute.DocumentationExecute;
+import cn.smallbun.screw.core.process.ProcessConfig;
+import cn.smallbun.screw.idea.model.DataSourceConfig;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
+import java.util.ArrayList;
+
+public class ScrewExecutor {
+
+ public static void executor(DataSourceConfig config) {
+ //数据源
+ HikariConfig hikariConfig = new HikariConfig();
+ hikariConfig.setDriverClassName(config.getDriver());
+ hikariConfig.setJdbcUrl(config.getUrl());
+ hikariConfig.setUsername(config.getUserName());
+ hikariConfig.setPassword(config.getPassword());
+ //设置可以获取tables remarks信息
+ hikariConfig.addDataSourceProperty("useInformationSchema", "true");
+ hikariConfig.setMinimumIdle(2);
+ hikariConfig.setMaximumPoolSize(5);
+ DataSource dataSource = new HikariDataSource(hikariConfig);
+ //生成配置
+ EngineConfig engineConfig = EngineConfig.builder()
+ //生成文件路径
+ .fileOutputDir(config.getFilePath())
+ //打开目录
+ .openOutputDir(config.getOpen())
+ //文件类型
+ .fileType(config.getEngineFileType())
+ //生成模板实现
+ .produceType(EngineTemplateType.freemarker)
+ //自定义文件名称
+ .fileName(config.getFileName()).build();
+
+ //忽略表
+ ArrayList ignoreTableName = new ArrayList<>();
+ ignoreTableName.add("test_user");
+ ignoreTableName.add("test_group");
+ //忽略表前缀
+ ArrayList ignorePrefix = new ArrayList<>();
+ ignorePrefix.add("test_");
+ //忽略表后缀
+ ArrayList ignoreSuffix = new ArrayList<>();
+ ignoreSuffix.add("_test");
+ ProcessConfig processConfig = ProcessConfig.builder()
+ //指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
+ //根据名称指定表生成
+ .designatedTableName(new ArrayList<>())
+ //根据表前缀生成
+ .designatedTablePrefix(new ArrayList<>())
+ //根据表后缀生成
+ .designatedTableSuffix(new ArrayList<>()).build();
+ if (config.getIgnoreTable()!=null&&config.getIgnoreTable().size()>0) {
+ processConfig.setIgnoreTableName(config.getIgnoreTable());
+ }
+ if (config.getIgnorePrefix() != null && config.getIgnorePrefix().size() > 0) {
+ processConfig.setIgnoreTablePrefix(config.getIgnorePrefix());
+ }
+ if (config.getIgnoreSuffix() != null && config.getIgnoreSuffix().size() > 0) {
+ processConfig.setDesignatedTableSuffix(config.getIgnoreSuffix());
+ }
+ //配置
+ Configuration configuration = Configuration.builder()
+ //版本
+ .version("1.0.0")
+ //描述
+ .description("数据库设计文档生成")
+ //数据源
+ .dataSource(dataSource)
+ //生成配置
+ .engineConfig(engineConfig)
+ //生成配置
+ .produceConfig(processConfig)
+ .build();
+ //执行生成
+ new DocumentationExecute(configuration).execute();
+ }
+
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/ui/DatasourcePanel.form b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/ui/DatasourcePanel.form
new file mode 100644
index 0000000..21dfc7d
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/ui/DatasourcePanel.form
@@ -0,0 +1,230 @@
+
+
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/ui/DatasourcePanel.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/ui/DatasourcePanel.java
new file mode 100644
index 0000000..0fc0f70
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/ui/DatasourcePanel.java
@@ -0,0 +1,177 @@
+package main.java.cn.smallbun.screw.idea.ui;
+
+import cn.smallbun.screw.idea.model.ConfigStatement;
+import cn.smallbun.screw.idea.model.DataSourceConfig;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.swing.*;
+import java.awt.event.*;
+
+public class DatasourcePanel extends JDialog {
+
+ private JPanel contentPane;
+ private JComboBox driver;
+ private JTextField url;
+ private JTextField username;
+ private JComboBox pattern;
+ private JTextField password;
+ private JTextField filename;
+ private JCheckBox isOpen;
+ private JTextArea ignoreTable;
+ private JTextArea ignorePrefix;
+ private JTextArea ignoreSuffix;
+ private JTextField desc;
+
+
+ public DatasourcePanel() {
+ setContentPane(contentPane);
+ setModal(true);
+ isOpen.setSelected(true);
+
+ DataSourceConfig config = ConfigStatement.getDataSourceConfig();
+ if (config != null) {
+ driver.setSelectedItem(config.getDriver());
+ url.setText(config.getUrl());
+ username.setText(config.getUserName());
+ password.setText(config.getPassword());
+ filename.setText(config.getFileName());
+ isOpen.setSelected(config.getOpen());
+ desc.setText(config.getDesc());
+ if (CollectionUtils.isNotEmpty(config.getIgnoreTable())) {
+ ignoreTable.setText(StringUtils.join(config.getIgnoreTable(),"\n"));
+ }
+ if (CollectionUtils.isNotEmpty(config.getIgnorePrefix())) {
+ ignorePrefix.setText(StringUtils.join(config.getIgnorePrefix(),"\n"));
+ }
+ if (CollectionUtils.isNotEmpty(config.getIgnoreSuffix())) {
+ ignoreSuffix.setText(StringUtils.join(config.getIgnoreSuffix(),"\n"));
+ }
+ }
+
+ // call onCancel() when cross is clicked
+ setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ onCancel();
+ }
+ });
+
+ // call onCancel() on ESCAPE
+ contentPane.registerKeyboardAction(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onCancel();
+ }
+ }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+ }
+
+ private void onOK() {
+ System.out.println("success");
+ // add your code here
+ dispose();
+ }
+
+ private void onCancel() {
+ // add your code here if necessary
+ dispose();
+ }
+
+ public static void main(String[] args) {
+ DatasourcePanel dialog = new DatasourcePanel();
+ dialog.pack();
+ dialog.setVisible(true);
+ System.exit(0);
+ }
+
+ public JPanel getCenter() {
+ return contentPane;
+ }
+
+ public JComboBox getDriver() {
+ return driver;
+ }
+
+ public void setDriver(JComboBox driver) {
+ this.driver = driver;
+ }
+
+ public JTextField getUrl() {
+ return url;
+ }
+
+ public void setUrl(JTextField url) {
+ this.url = url;
+ }
+
+ public JTextField getUsername() {
+ return username;
+ }
+
+ public void setUsername(JTextField username) {
+ this.username = username;
+ }
+
+ public JComboBox getPattern() {
+ return pattern;
+ }
+
+ public void setPattern(JComboBox pattern) {
+ this.pattern = pattern;
+ }
+
+ public JTextField getPassword() {
+ return password;
+ }
+
+ public void setPassword(JTextField password) {
+ this.password = password;
+ }
+
+ public JTextField getFilename() {
+ return filename;
+ }
+
+ public void setFilename(JTextField filename) {
+ this.filename = filename;
+ }
+
+ public JCheckBox getIsOpen() {
+ return isOpen;
+ }
+
+ public void setIsOpen(JCheckBox isOpen) {
+ this.isOpen = isOpen;
+ }
+
+ public JTextArea getIgnoreTable() {
+ return ignoreTable;
+ }
+
+ public void setIgnoreTable(JTextArea ignoreTable) {
+ this.ignoreTable = ignoreTable;
+ }
+
+ public JTextArea getIgnorePrefix() {
+ return ignorePrefix;
+ }
+
+ public void setIgnorePrefix(JTextArea ignorePrefix) {
+ this.ignorePrefix = ignorePrefix;
+ }
+
+ public JTextArea getIgnoreSuffix() {
+ return ignoreSuffix;
+ }
+
+ public void setIgnoreSuffix(JTextArea ignoreSuffix) {
+ this.ignoreSuffix = ignoreSuffix;
+ }
+
+ public JTextField getDesc() {
+ return desc;
+ }
+
+ public void setDesc(JTextField desc) {
+ this.desc = desc;
+ }
+}
diff --git a/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/wrapper/ScrewWrapper.java b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/wrapper/ScrewWrapper.java
new file mode 100644
index 0000000..c201f93
--- /dev/null
+++ b/screw-idea-plugin/src/main/java/cn/smallbun/screw/idea/wrapper/ScrewWrapper.java
@@ -0,0 +1,105 @@
+package main.java.cn.smallbun.screw.idea.wrapper;
+
+import cn.smallbun.screw.idea.model.ConfigStatement;
+import cn.smallbun.screw.idea.notify.ScrewNotifier;
+import com.intellij.openapi.fileChooser.FileChooser;
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.vfs.VirtualFile;
+import cn.smallbun.screw.idea.model.DataSourceConfig;
+import cn.smallbun.screw.idea.model.DataSourceEnum;
+import cn.smallbun.screw.idea.model.EngineFileTypeEnum;
+import cn.smallbun.screw.idea.screw.ScrewExecutor;
+import cn.smallbun.screw.idea.ui.DatasourcePanel;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.util.Arrays;
+import java.util.List;
+
+public class ScrewWrapper extends DialogWrapper {
+
+ DatasourcePanel datasourcePanel = new DatasourcePanel();
+ private Project project;
+ public ScrewWrapper(@Nullable Project project) {
+ super(project);
+ this.project = project;
+ init();
+
+ setTitle("自动生成数据库文档");
+ }
+
+ @Nullable
+ @Override
+ protected JComponent createCenterPanel() {
+ datasourcePanel.pack();
+
+ return datasourcePanel.getCenter();
+ }
+
+ @Override
+ protected void doOKAction() {
+ DataSourceConfig config = new DataSourceConfig();
+ if (StringUtils.isNoneEmpty(datasourcePanel.getUrl().getText())) {
+ config.setUrl(datasourcePanel.getUrl().getText());
+ }
+ if (datasourcePanel.getDriver().getSelectedItem() != null) {
+ String datasource = (String) datasourcePanel.getDriver().getSelectedItem();
+ config.setDriver(DataSourceEnum.getDatabase(datasource));
+
+ }
+ if (StringUtils.isNoneEmpty(datasourcePanel.getUsername().getText())) {
+ config.setUserName(datasourcePanel.getUsername().getText());
+ }
+ if (StringUtils.isNoneEmpty(datasourcePanel.getPassword().getText())) {
+ config.setPassword(datasourcePanel.getPassword().getText());
+ }
+
+ if (StringUtils.isNoneEmpty(datasourcePanel.getFilename().getText())) {
+ config.setFileName(datasourcePanel.getFilename().getText());
+ }
+ if (StringUtils.isNoneEmpty(datasourcePanel.getDesc().getText())) {
+ config.setDesc(datasourcePanel.getDesc().getText());
+ }
+ if (datasourcePanel.getPattern().getSelectedItem() != null) {
+ String item = (String) datasourcePanel.getPattern().getSelectedItem();
+ EngineFileTypeEnum engineFileTypeEnum = EngineFileTypeEnum.getByName(item);
+ if (engineFileTypeEnum != null) {
+ config.setEngineFileType(engineFileTypeEnum.getEngineFileType());
+ }
+ }
+ if (StringUtils.isNoneEmpty(datasourcePanel.getIgnoreTable().getText())) {
+ String tableStr = datasourcePanel.getIgnoreTable().getText();
+ List ignoreTable = Arrays.asList(tableStr.split("\n"));
+ config.setIgnoreTable(ignoreTable);
+ }
+ if ( StringUtils.isNoneEmpty(datasourcePanel.getIgnorePrefix().getText())) {
+ String prefix = datasourcePanel.getIgnorePrefix().getText();
+ List ignorePrefix = Arrays.asList(prefix.split("\n"));
+ config.setIgnorePrefix(ignorePrefix);
+ }
+ if (StringUtils.isNoneEmpty(datasourcePanel.getIgnoreSuffix().getText())) {
+ String suffix = datasourcePanel.getIgnoreSuffix().getText();
+ List ignoreSuffix = Arrays.asList(suffix.split("\n"));
+ config.setIgnoreSuffix(ignoreSuffix);
+ }
+ if (datasourcePanel.getIsOpen().isSelected()) {
+ config.setOpen(true);
+ }
+ ConfigStatement.setDataSourceConfig(config);
+ FileChooserDescriptor singleFileDescriptor = new FileChooserDescriptor(false, true, false, false, false, false);
+
+ VirtualFile virtualFile = FileChooser.chooseFile(singleFileDescriptor, project, null);
+ config.setFilePath(virtualFile.getPath());
+ try {
+ ScrewExecutor.executor(config);
+ }catch (Exception e){
+ ScrewNotifier screwNotifier = new ScrewNotifier();
+ screwNotifier.notify("生成文档异常,异常原因为" + e.getMessage());
+ }finally {
+ super.doOKAction();
+ }
+ }
+}