Browse Source

初始git

heqinwei 7 years ago
commit
7df5e3fa23
100 changed files with 4264 additions and 0 deletions
  1. 1 0
      .idea/.name
  2. 13 0
      .idea/compiler.xml
  3. 6 0
      .idea/encodings.xml
  4. 14 0
      .idea/misc.xml
  5. 124 0
      .idea/uiDesigner.xml
  6. 6 0
      .idea/vcs.xml
  7. 11 0
      .project
  8. 37 0
      README.md
  9. 275 0
      charts/README.md
  10. BIN
      charts/doc/img/aggregate.png
  11. BIN
      charts/doc/img/bar.png
  12. BIN
      charts/doc/img/basic_settings.png
  13. BIN
      charts/doc/img/charts.png
  14. BIN
      charts/doc/img/data_structure.png
  15. BIN
      charts/doc/img/data_view.png
  16. BIN
      charts/doc/img/line.png
  17. BIN
      charts/doc/img/pie.png
  18. BIN
      charts/doc/img/scatter.png
  19. 15 0
      dashboards/README.md
  20. BIN
      dashboards/doc/img/dashboard.png
  21. BIN
      dashboards/doc/img/dashboards.png
  22. 59 0
      data_connectors/README.md
  23. BIN
      data_connectors/doc/img/basic_settings.png
  24. BIN
      data_connectors/doc/img/data_connetors.png
  25. BIN
      data_connectors/doc/img/data_type.png
  26. BIN
      doc/UI.rp
  27. 282 0
      doc/chart/README.md
  28. BIN
      doc/chart/doc/img/aggregate.png
  29. BIN
      doc/chart/doc/img/bar.png
  30. BIN
      doc/chart/doc/img/basic_settings.png
  31. BIN
      doc/chart/doc/img/charts.png
  32. BIN
      doc/chart/doc/img/data_structure.png
  33. BIN
      doc/chart/doc/img/data_view.png
  34. BIN
      doc/chart/doc/img/line.png
  35. BIN
      doc/chart/doc/img/pie.png
  36. BIN
      doc/chart/doc/img/scatter.png
  37. 465 0
      doc/config_databases/Bi-data_v2.ldm
  38. 84 0
      doc/config_databases/README.md
  39. BIN
      doc/config_databases/img/View.png
  40. 15 0
      doc/dashboard/README.md
  41. 465 0
      doc/dashboard/config_databases/Bi-data_v2.ldm
  42. 84 0
      doc/dashboard/config_databases/README.md
  43. BIN
      doc/dashboard/config_databases/img/View.png
  44. BIN
      doc/dashboard/doc/img/dashboard.png
  45. BIN
      doc/dashboard/doc/img/dashboards.png
  46. 58 0
      doc/data_connector/README.md
  47. BIN
      doc/data_connector/doc/img/basic_settings.png
  48. BIN
      doc/data_connector/doc/img/data_connectors.png
  49. BIN
      doc/data_connector/doc/img/data_type.png
  50. BIN
      lib/aopalliance-1.0.jar
  51. BIN
      lib/commons-logging-1.2.jar
  52. BIN
      lib/spring-aop-4.3.16.RELEASE.jar
  53. BIN
      lib/spring-aspects-4.3.16.RELEASE.jar
  54. BIN
      lib/spring-beans-4.3.16.RELEASE.jar
  55. BIN
      lib/spring-context-4.3.16.RELEASE.jar
  56. BIN
      lib/spring-context-support-4.3.16.RELEASE.jar
  57. BIN
      lib/spring-core-4.3.16.RELEASE.jar
  58. BIN
      lib/spring-expression-4.3.16.RELEASE.jar
  59. BIN
      lib/spring-instrument-4.3.16.RELEASE.jar
  60. BIN
      lib/spring-instrument-tomcat-4.3.16.RELEASE.jar
  61. BIN
      lib/spring-jdbc-4.3.16.RELEASE.jar
  62. BIN
      lib/spring-jms-4.3.16.RELEASE.jar
  63. BIN
      lib/spring-messaging-4.3.16.RELEASE.jar
  64. BIN
      lib/spring-orm-4.3.16.RELEASE.jar
  65. BIN
      lib/spring-oxm-4.3.16.RELEASE.jar
  66. BIN
      lib/spring-test-4.3.16.RELEASE.jar
  67. BIN
      lib/spring-tx-4.3.16.RELEASE.jar
  68. BIN
      lib/spring-web-4.3.16.RELEASE.jar
  69. BIN
      lib/spring-webmvc-4.3.16.RELEASE.jar
  70. BIN
      lib/spring-webmvc-portlet-4.3.16.RELEASE.jar
  71. BIN
      lib/spring-websocket-4.3.16.RELEASE.jar
  72. 215 0
      pom.xml
  73. 11 0
      src/main/java/com/Application.java
  74. 73 0
      src/main/java/com/controller/ChartsConfigController.java
  75. 19 0
      src/main/java/com/controller/DashboardsController.java
  76. 106 0
      src/main/java/com/controller/DataConnectorController.java
  77. 23 0
      src/main/java/com/controller/ShowChartsController.java
  78. 24 0
      src/main/java/com/database1/dao/ChartsConfigMapper.java
  79. 17 0
      src/main/java/com/database1/dao/DashboardsMapper.java
  80. 134 0
      src/main/java/com/database1/dao/DataConnectorMapper.java
  81. 167 0
      src/main/java/com/database1/server/ChartsConfigService.java
  82. 30 0
      src/main/java/com/database1/server/DashboardsService.java
  83. 224 0
      src/main/java/com/database1/server/DataConnectorService.java
  84. 24 0
      src/main/java/com/database2/dao/DataColumnMapper.java
  85. 75 0
      src/main/java/com/database2/dao/ShowChartsMapper.java
  86. 28 0
      src/main/java/com/database2/server/ImplementSqlService.java
  87. 170 0
      src/main/java/com/database2/server/ShowChartsService.java
  88. 140 0
      src/main/java/com/database2/server/TimeConverterUtil.java
  89. 123 0
      src/main/java/com/model/bo/AggregateTable.java
  90. 40 0
      src/main/java/com/model/bo/Column.java
  91. 53 0
      src/main/java/com/model/bo/DataView.java
  92. 80 0
      src/main/java/com/model/bo/DatabaseConfig.java
  93. 40 0
      src/main/java/com/model/bo/Histogram.java
  94. 60 0
      src/main/java/com/model/bo/Layout.java
  95. 30 0
      src/main/java/com/model/bo/Line.java
  96. 30 0
      src/main/java/com/model/bo/Pages.java
  97. 20 0
      src/main/java/com/model/bo/Pie.java
  98. 42 0
      src/main/java/com/model/bo/Series.java
  99. 212 0
      src/main/java/com/model/po/ChartConfig.java
  100. 40 0
      src/main/java/com/model/po/ColumnData.java

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+BI

+ 13 - 0
.idea/compiler.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="BI" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>

+ 6 - 0
.idea/encodings.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$" charset="UTF-8" />
+  </component>
+</project>

+ 14 - 0
.idea/misc.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 11 - 0
.project

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>platform-bi</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+=优软UAS商业BI模块阶段一开发文档=
+
+
+
+==阶段一计划实现业务流程==
+1.  前端调用数据接口,获得数据的元信息
+2.  前端根据数据的元信息,判断可用的可视化模式
+3.  前端调用选用的可视化模式接口,获得该可视化模式的所需参数字段和数据预处理代码
+4.  前端向后端传入以下参数:
+        - 所调用的可视化模式
+        - 该可视化模式所需参数
+        - 筛选规则、所选数据列向后台请求数据
+5.	后台按照传入的参数产生SQL语句,向数据库获取数据后传回前端
+6.	前端解析传入的数据,执行相应的数据预处理代码
+7.	前端将预处理好的数据、图表通用配置档、可视化模式配置档打包生成Echarts配置档
+8.	按照Echarts配置档生成图表
+9.	点击图表中相应位置可以改变筛选规则或分组规则,重新生成子图表
+
+
+==阶段一模块结构==
+- [数据接口 Data Connector](/source/platform-bi/browse/master/data_connectors)
+    - 数据接口配置档储存
+    - 元数据Metadata生成
+    - 按参数产生SQL语句,从数据库获取原生数据,和元数据一起打包成JSON
+- [图表 Charts](/source/platform-bi/browse/master/charts/)
+    - [可视化模式接口 Visualization](/charts/visualization/)
+    - 可视化模式配置档储存
+    - 向图表传递预处理数据方式与可视化配置档
+    - 图表通用配置档生成向导与储存
+    - 传入参数,向后台请求数据
+    - 按照所选可视化模式的设置预处理传回的参数
+    - 基于预处理好的数据、图表通用配置档、可视化模式配置档生成Echarts配置档
+    - 根据Echarts配置档调用Echarts生成图表
+    - 点击图表中相应位置可以改变筛选规则或分组规则,重新生成子图表
+- [报告与看板 Dashboards](/source/platform-bi/browse/master/dashboards)
+    - 报告和看板结构相同,只是报告不会定期刷新,页面大小限制(比如A4)
+    - 作为整体框架装载任意多个图表;图表的位置与大小可以直接在界面拖拽

+ 275 - 0
charts/README.md

@@ -0,0 +1,275 @@
+= 图表 Charts =
+=====备忘:=====
+- 图表配置档分为通用配置和可视化模式配置两部分
+    - 每个图表只能选择一个可视化模式
+    - 不同的可视化模式的配置档格式不同
+- Echarts还支持很多其他选项(大部分是外观相关),若未表明则使用默认配置
+
+==通用配置 ==
+{img url=/file/data/rud6eb2bldtiyrzt52qe/PHID-FILE-wn6gm5znqhm7oba35s5l/basic_settings.png}
+{img url=/file/data/tnomsbaxe63bcrxofvhk/PHID-FILE-w45fxewshkt2rho2737d/data_structure.png}
+1. 标题:
+    - 主标题文本
+    - 副标题文本
+2. 权限:
+    - 访问权限
+    - 修改权限
+3. 数据接口 *(选择后自动读取该接口的元数据获取默认数据类型)*
+4. 时间跨度
+5. 以勾选的方式选择关注的数据列(数据结构)
+    - 允许临时改变数据类型
+6. 筛选规则
+7. 可视化模式: *(根据所选的数据列的数据类型自动判断可用的可视化模式)*
+8. 其他:
+    - 图例 legend
+    - 提示框 tooltip
+    - 区域缩放 datazoom
+    - 工具箱 toolbox:
+        - 还原按钮
+        - 导出为图片
+
+
+= 可视化模式 = 
+===== 备注 =====
+- 阶段一仅开放这六个可视化模式
+  - 总体统计数据表 aggregate_table
+  - 个体统计数据表 data_view
+  - 折线图 line_chart
+  - 柱状图 bar_chart
+  - 饼状图 pie_chart
+  - 散点图 scatter_plot 
+- 不同的可视化模式需要进行不同的数据预处理
+- 所有可视化模式都提供分组的选项
+    - 生效时相当于筛选出各分组后分别进行可视化
+    - 一般会按类别分组
+    - 分段 Bucketization: 可以将标量或者时间分成多个片段后进行分段分组
+        - 分段后产生的数据属于序值
+    - 分组规则应当可以排序
+        - 分组规则的顺序只影响表格产生的顺序
+    - 分组后可定义组标题
+- 部分可视化模式允许堆叠
+
+
+___
+
+==总体统计数据表==
+
+1. 数据预处理选项
+    - 数据分组(可选) 
+    - 分段
+    - 根据各列数据类型判断可生成的总体统计数据:
+        - 条数 count
+        - 百分比 proportion (限分组)
+        - 总和 sum (限标量)
+        - 平均数 mean (限标量)
+        - 最小值 min (限标量)
+        - 25th% 值(限标量)
+        - 中位数 median(限标量)
+        - 75th% 值(限标量)
+        - 最大值 max(限标量)
+        - 标准差 standard deviation (限标量)
+2. 为每个关注的列数据生成一个可勾选列表
+
+
+===== 总体统计数据表配置界面草案示例:=====
+{img url=/file/data/mzlulhgjik5hufqdlvdp/PHID-FILE-e5473ixo6rnsp47qjxwk/aggregate.png}
+
+===== 总体统计数据表样式示例 =====    
+
+
+|订单类型 : "categorical"|||
+|---:|---|---:|
+|总体|条数|470|
+|"国内销售"|条数|244| 
+||百分比|51.91%|
+|"不冲销预测"|条数|129|
+||百分比|27.45%|
+|"初始化"|条数|83|
+||百分比|17.66%|
+|"国外销售"|条数|10|
+||百分比|2.13%|
+|"样品订单"|条数|4|
+||百分比|0.85%|
+
+|币别 : "categorical"|||
+|---:|---|---:|
+|总体|条数|470|
+|"RMB"|条数|460|
+||百分比|97.87%|
+|"USD"|条数|10|
+||百分比|2.13%|
+
+ 分组 - 业务员:"张三"
+|金额 : "scale"||
+|---|---:|
+|条数|288|
+|总和|11790045.000|
+|平均值|40937.6583|
+|标准差|55159.1981|
+|最小值|0.000|
+|25^th%值|5416.3500|
+|中位数|21202.7000|
+|75^th%值|55075.0000|
+|最大值|405000.3500|
+
+|订单类型 : "categorical|||
+|---:|---|---:|
+|总体|条数|288|
+|"国内销售"|条数|144| 
+||百分比|50.00%|
+|"不冲销预测"|条数|129|
+||百分比|44.79%|
+|"初始化"|条数|13|
+||百分比|4.51%|
+|"国外销售"|条数|0|
+||百分比|0.00%|
+|"样品订单"|条数|2|
+||百分比|0.69%|
+
+|币别 : "categorical"|||
+|---:|---|---:|
+|总体|条数|288|
+|"RMB"|条数|288|
+||百分比|100.00%|
+|"USD"|条数|0|
+||百分比|0%|
+
+
+|金额 : "scale"||
+|---|---:|
+|条数|86|
+|总和|2803270.8500|
+|平均值|32596.1727|
+|标准差|46825.9726|
+|最小值|0.000|
+|25^th%值|539.5000|
+|中位数|15675.0000|
+|75^th%值|45982.5000|
+|最大值|265330.0000|
+
+
+|订单类型 : "categorical|||
+|---:|---|---:|
+|总体|条数|86|
+|"国内销售"|条数|50| 
+||百分比|58.14%|
+|"不冲销预测"|条数|0|
+||百分比|0.00%|
+|"初始化"|条数|34|
+||百分比|39.53%|
+|"国外销售"|条数|0|
+||百分比|0.00%|
+|"样品订单"|条数|2|
+||百分比|2.33%|
+
+
+|币别 : "categorical"|||
+|---:|---|---:|
+|总体|条数|86|
+|"RMB"|条数|86|
+||百分比|100.00%|
+|"USD"|条数|0|
+||百分比|0%|
+
+___
+== 个体统计数据表 ==
+1. 数据预处理选项:
+    - 排序方式(可选)
+        - 选择显示行数(如前5行 前30行)
+    - 分组方式(可选)
+2. 勾选选择需要显示的原生数据列
+3. 勾选可供添加的个体统计数据列
+        - 偏差值 z-score: 适用于标量
+            - z-score = (value - mean(x))/std(x)
+        
+            
+===== 个体统计数据表配置界面草案示例: =====
+{img url=/file/data/ymhpaxwinad2cuauzcmb/PHID-FILE-t4ypd53aihddvsf6avxm/data_view.png}
+        
+===== 个体统计表样式草案示例 =====
+| 不良率 | 偏差值 | 日期     | 处理温度 | 偏差值 | 配件A不良率 | 偏差值 | 处理时长 | 偏差值 |
+|--------|--------|----------|----------|--------|-------------|--------|----------|--------|
+| 83%    | 11.67  | 2017/2/1 | 125      | 3.57   | 45%         | 17.50  | 407      | 7.13   |
+| 79%    | 11.00  | 2017/3/8 | 119      | 2.71   | 30%         | 10.00  | 365      | 4.33   |
+| 62%    | 8.17   | 2017/1/1 | 108      | 1.14   | 32%         | 11.00  | 377      | 5.13   |
+| 54%    | 6.83   | 2017/7/2 | 93       | -1.00  | 8%          | -1.00  | 150      | -10.00 |
+| 53%    | 6.67   | 2017/7/3 | 95       | -0.71  | 10%         | 0.00   | 378      | 5.20   |
+| 51%    | 6.33   | 2017/3/1  | 107      | 1.00   | 15%         | 2.50   | 320      | 1.33   |
+| 43%    | 5.00   | 2017/4/1 | 100      | 0.00   | 12%         | 1.00   | 350      | 3.33   |
+| 30%    | 2.83   | 2017/11/2 | 101      | 0.14   | 10%         | 0.00   | 332      | 2.13   |
+| 28%    | 2.50   | 2017/12/1| 104      | 0.57   | 9%          | -0.50  | 301      | 0.07   |
+| 27%    | 2.33   | 2017/7/5| 100      | 0.00   | 8%          | -1.00  | 285      | -1.00  |
+
+___
+== 折线图 ==
+1. 数据预处理选项:
+    - 分组方式(可选)
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积
+2. 定义x轴:
+    - 只可定义一个x轴,且x轴没有重复值
+    - 可选类型:时间、标量、序量
+    - 分段(可选):
+        - 时间可按年月日分段
+        - 标量可平均分段
+3. 定义y轴:
+    - 可以定义多个同类y轴堆叠
+    - 分组也可以堆叠
+    - 但每个x值在每个y轴上对应的y值应当是唯一的
+    - 可选类型:标量(包括计数和累计)
+        
+===== 折线图样式配置界面草案示例 =====
+
+{img url=file/data/lzkkh2byb3vwk5b5lznz/PHID-FILE-nhcysd3nyvmomnhmnynp/line.png}
+___
+
+
+== 柱状图 ==
+1. 数据预处理选项:
+    - 分组方式(可选)
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积
+2. 定义x轴:
+    - 只可定义一个x轴,且x轴没有重复值
+    - 可选类型:序量、类别
+3. 定义y轴:
+    - 可以定义多个同类y轴堆叠
+    - 分组也可以堆叠
+    - 但每个x值在每个y轴上对应的y值应当是唯一的
+    - 可选类型:标量(包括计数和累积)
+        
+_____    
+
+== 饼状图 ==
+1. 数据预处理选项:
+    - 分组方式(可选)
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积
+2. 定义扇区索引:
+    - 只可定义一个扇区索引,且没有重复值
+    - 可选类型:类别        
+    
+===== 饼状图样式配置界面草案示例 =====
+
+{img url=/file/data/vtitnimpxpjv4e3yng72/PHID-FILE-qhh74k4yd7dawbtizt23/pie.png}
+
+______
+        
+== 散点图 ==
+1. 数据预处理选项:
+    - 分组方式(可选)
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积
+2. 定义x轴:
+    - 只可定义一个x轴,x轴可以有重复值
+    - 可选类型:标量、序量    
+3. 定义y轴:
+    - 分组不可以堆叠
+    - 每个x值在每个y轴上对应的y值应当是唯一的
+    - 可选类型:标量(包括计数和累积)
+    
+===== 散点图样式配置界面草案示例 =====
+
+{img url=/file/data/adt3whqdtiecxepxqtpu/PHID-FILE-4nm5nnf6njdzibv4sb4a/scatter.png}
+
+______

BIN
charts/doc/img/aggregate.png


BIN
charts/doc/img/bar.png


BIN
charts/doc/img/basic_settings.png


BIN
charts/doc/img/charts.png


BIN
charts/doc/img/data_structure.png


BIN
charts/doc/img/data_view.png


BIN
charts/doc/img/line.png


BIN
charts/doc/img/pie.png


BIN
charts/doc/img/scatter.png


+ 15 - 0
dashboards/README.md

@@ -0,0 +1,15 @@
+=报告与看板Dashboards=
+=====备忘=====
+- 报告和看板结构相同,只是报告不会定期刷新,页面大小限制(比如A4)以及允许导出
+
+==Dashboard属性参数==
+1. 标题
+2. 修改权限
+3. 访问权限
+4. 位置参数
+
+=====Dashboards列表界面草案=====
+{img url=/file/data/6kvxtyuaoyrdggo7dpyg/PHID-FILE-bzqedhlqdprjge4yhe7f/dashboard.png}
+
+=====Dashboard属性配置界面草案=====
+{img url=file/data/qysm5cba4ykoehjbr4ln/PHID-FILE-4c4l3m7rd3z7ui2y66gu/dashboards.png}

BIN
dashboards/doc/img/dashboard.png


BIN
dashboards/doc/img/dashboards.png


+ 59 - 0
data_connectors/README.md

@@ -0,0 +1,59 @@
+=数据接口=
+=====备忘=====
+    1. 应该有机制保证每次获取数据时访问量不会对数据库所在服务器产生过大负荷
+    2. 数据接口修改权限应当只分配给管理员,使用权限应当和图表一致并继承系统的权限配置
+    3. 数据接口最终应该只传递单一的一个表
+    
+==数据接口配置档内容==
+    1. 数据来源:
+        - 可按名称关联数据库中的一个或多个表
+        - 可上传CSV(或xls转CSV)
+        - 应当
+    2. 获取表头,判断原生数据各列数据的默认类型并写入元数据metadata:
+        - index 索引(编号)
+        - time 时间戳:
+        - categorical 类别
+        - scale 标量
+        - ordinal 序值
+        - string 字符串
+    3. 种类标签 tag
+    4. 其他元信息:
+        - created_by 创建人
+        - created_time 创建时间
+        - used 使用中: 正在使用这个数据接口的图表数量
+
+
+==数据接口API==
+
+  get_data(data_connector, time_span=all, filter=none, columns=all)
+        - 按参数产生SQL语句,从数据库获取原生数据,和元数据一起打包成JSON。
+        - 可以接受以下参数:
+            - data_connector: 调用的数据接口
+            - time_span:时间跨度
+            - filter:筛选规则
+            - columns: 所选数据列
+
+
+
+===== 数据接口配置界面草案示例:=====
+{img url=/file/data/xf73gj6xcrndybmwo65c/PHID-FILE-5wdlo3dpcp6htbovznom/data_connetors.png}
+{img url=/file/data/2rqmmkcnornhcehaxke5/PHID-FILE-lexgyzngemyi42itsew5/basic_settings.png}
+{img url=/file/data/d6f2j5dz25hi246gzlom/PHID-FILE-7pukzfd4qcjcqhdcxosq/data_type.png}
+
+
+===== 传回JSON格式草案示例:======
+
+```
+lang=json
+{
+    "metadata": ['index', 'categorical', 'time', 'categorical', 'categorical', 'categorical', 'index', 'index', 'string', 'string', 'scale', 'scale', 'scale', 'scale', 'time', 'time', 'scale', 'scale', 'scale', 'scale', 'categorical', 'index', 'index', 'categorical', 'string', 'string', 'string', 'string', 'string', 'string', 'time', 'string', 'string', 'scale', 'scale', 'scale'
+    ],
+    "data": [
+        ['订单编号', '单据状态', '日期',  订单类型', '客户名称', '打印状态', '订单序号', '物料编号', '物料名称', '物料规格', '数量', '已出货数', '未发货数', '已转数量', '交货日期', 'PMC回复交期','定价', '单价','金额', '不含税单价', '明细状态', '预测单号', '预测序号', '币别', '业务员', '部门', '应收客户', '收货客户', '收款条件', '录入人','录入日期', '明细备注', '主表备注', '已转制造数量', '毛利率%', '成本单价'],
+        ['SS20180508001', '已审核', '2018/5/8', '国内销售', '合肥雪祺电器有限公司', '未打印', '7', '88101716', '冰箱控制板', '雪祺基本型定频66K(DA000714301),RoHS', 73, 0, 73, 0, '2018/5/9', '2018/5/9', 57.7, 57.7, 4212.1, 49.741379, '已审核', '0', 'RMB', '马成雨', '合肥雪祺电器有限公司', '合肥雪祺电器有限公司', '票到1月后付6个月承兑', '徐小秀', '2018/5/8', '', '', 73, 100, 0],
+        ['SS20180508001', '已审核', '2018/5/8', '国内销售', '合肥雪祺电器有限公司', '未打印', '6', '88101486', '冰箱显示板', '美菱窄屏DA000418212,雪祺,RoHS', 129, 0, ,129 ,0, '2018/5/9', '2018/5/9', 32.2, 32.2, 4153.8, 27.758621, '已审核', '0', 'RMB', '马成雨', '合肥雪祺电器有限公司', '合肥雪祺电器有限公司', '票到1月后付6个月承兑', '徐小秀', '2018/5/8', '', '', 129, 100, 0]
+    ]
+}
+
+```
+

BIN
data_connectors/doc/img/basic_settings.png


BIN
data_connectors/doc/img/data_connetors.png


BIN
data_connectors/doc/img/data_type.png


BIN
doc/UI.rp


+ 282 - 0
doc/chart/README.md

@@ -0,0 +1,282 @@
+# 图表 Charts 
+##### 备忘
+- 图表配置档分为通用配置和可视化模式配置两部分
+    - 每个图表只能选择一个可视化模式
+    - 不同的可视化模式的配置档格式不同
+- Echarts还支持很多其他选项(大部分是外观相关),若未表明则使用默认配置
+
+### 通用配置 
+![Image](.\doc\img\basic_settings.png)
+![Image](.\doc\img\data_structure.png)
+1. 主标题文本 title
+2. 副标题文本 subtitle
+3. 访问权限 access_permission
+4. 修改权限 edit_permission
+5. 数据接口 data_connector *(选择后自动读取该接口的元数据获取默认数据类型)* 
+6. 时间跨度 time_span
+7. 筛选规则 filter
+8. 可视化模式 visualization *(根据所选的数据列的数据类型自动判断可用的可视化模式)*
+9. 图例 legend
+10. 提示框 tooltip
+11. 区域缩放 datazoom
+12. 工具箱 toolbox:
+        - 还原按钮
+        - 导出为图片
+
+
+# 可视化模式  
+##### 备注
+- 阶段一仅开放这六个可视化模式
+  - 总体统计数据表 aggregate_table
+  - 个体统计数据表 data_view
+  - 折线图 line_chart
+  - 柱状图 bar_chart
+  - 饼状图 pie_chart
+  - 散点图 scatter_plot 
+- 不同的可视化模式需要进行不同的数据预处理
+- 预处理时,需要先进行会增加数据列的操作(如分段、计数、累积),然后进行不增加数据列但会改变表结构的操作(如分组),然后进行表内操作(如排序)
+- 所有可视化模式都提供分组的选项
+    - 生效时相当于筛选出各分组后分别进行可视化
+    - 一般会按类别分组
+    - 分段 Bucketization: 可以将标量或者时间分成多个片段后进行分段分组
+        - 分段后产生的数据属于序值
+    - 分组规则应当可以排序
+        - 分组规则的顺序只影响表格产生的顺序
+    - 分组后可定义组标题
+- 部分可视化模式允许堆叠
+
+
+___
+
+### 总体统计数据表 aggregate_table
+
+1. 数据预处理选项
+    - 分段 bucketization
+    - 根据各列数据类型判断可生成的总体统计数据:aggregate_stats
+        - 条数 count
+        - 百分比 proportion (限分组)
+        - 总和 sum (限标量)
+        - 平均数 mean (限标量)
+        - 最小值 min (限标量)
+        - 25th% 值(限标量)
+        - 中位数 median(限标量)
+        - 75th% 值(限标量)
+        - 最大值 max(限标量)
+        - 标准差 standard deviation (限标量)
+    - 数据分组(可选) group_by
+2. 验证规则 validator
+
+
+### 总体统计数据表配置界面草案示例
+![Image](.\doc\img\aggregate.png)
+##### 总体统计数据表样式示例   
+
+
+|订单类型 : "categorical"|||
+|---:|---|---:|
+|总体|条数|470|
+|"国内销售"|条数|244| 
+||百分比|51.91%|
+|"不冲销预测"|条数|129|
+||百分比|27.45%|
+|"初始化"|条数|83|
+||百分比|17.66%|
+|"国外销售"|条数|10|
+||百分比|2.13%|
+|"样品订单"|条数|4|
+||百分比|0.85%|
+
+|币别 : "categorical"|||
+|---:|---|---:|
+|总体|条数|470|
+|"RMB"|条数|460|
+||百分比|97.87%|
+|"USD"|条数|10|
+||百分比|2.13%|
+
+ 分组 - 业务员:"张三"
+|金额 : "scale"||
+|---|---:|
+|条数|288|
+|总和|11790045.000|
+|平均值|40937.6583|
+|标准差|55159.1981|
+|最小值|0.000|
+|25^th%值|5416.3500|
+|中位数|21202.7000|
+|75^th%值|55075.0000|
+|最大值|405000.3500|
+
+|订单类型 : "categorical|||
+|---:|---|---:|
+|总体|条数|288|
+|"国内销售"|条数|144| 
+||百分比|50.00%|
+|"不冲销预测"|条数|129|
+||百分比|44.79%|
+|"初始化"|条数|13|
+||百分比|4.51%|
+|"国外销售"|条数|0|
+||百分比|0.00%|
+|"样品订单"|条数|2|
+||百分比|0.69%|
+
+|币别 : "categorical"|||
+|---:|---|---:|
+|总体|条数|288|
+|"RMB"|条数|288|
+||百分比|100.00%|
+|"USD"|条数|0|
+||百分比|0%|
+
+
+|金额 : "scale"||
+|---|---:|
+|条数|86|
+|总和|2803270.8500|
+|平均值|32596.1727|
+|标准差|46825.9726|
+|最小值|0.000|
+|25^th%值|539.5000|
+|中位数|15675.0000|
+|75^th%值|45982.5000|
+|最大值|265330.0000|
+
+
+|订单类型 : "categorical|||
+|---:|---|---:|
+|总体|条数|86|
+|"国内销售"|条数|50| 
+||百分比|58.14%|
+|"不冲销预测"|条数|0|
+||百分比|0.00%|
+|"初始化"|条数|34|
+||百分比|39.53%|
+|"国外销售"|条数|0|
+||百分比|0.00%|
+|"样品订单"|条数|2|
+||百分比|2.33%|
+
+
+|币别 : "categorical"|||
+|---:|---|---:|
+|总体|条数|86|
+|"RMB"|条数|86|
+||百分比|100.00%|
+|"USD"|条数|0|
+||百分比|0%|
+
+___
+### 个体统计数据表 data_view
+1. 数据预处理选项:
+    - 排序方式(可选) sort_by
+        - 选择显示行数(如前5行 前30行)
+    - 分组方式(可选)group_by
+2. 勾选所显示的数据列 data_view_columns
+        - 原生数据
+        - 可供添加的个体统计数据列
+            - 偏差值 z-score: 适用于标量
+                - z-score = (value - mean(x))/std(x)
+        
+            
+##### 个体统计数据表配置界面草案示例
+![Image](.\doc\img\data_view.png)
+        
+ 个体统计表样式草案示例
+| 不良率 | 偏差值 | 日期     | 处理温度 | 偏差值 | 配件A不良率 | 偏差值 | 处理时长 | 偏差值 |
+|--------|--------|----------|----------|--------|-------------|--------|----------|--------|
+| 83%    | 11.67  | 2017/2/1 | 125      | 3.57   | 45%         | 17.50  | 407      | 7.13   |
+| 79%    | 11.00  | 2017/3/8 | 119      | 2.71   | 30%         | 10.00  | 365      | 4.33   |
+| 62%    | 8.17   | 2017/1/1 | 108      | 1.14   | 32%         | 11.00  | 377      | 5.13   |
+| 54%    | 6.83   | 2017/7/2 | 93       | -1.00  | 8%          | -1.00  | 150      | -10.00 |
+| 53%    | 6.67   | 2017/7/3 | 95       | -0.71  | 10%         | 0.00   | 378      | 5.20   |
+| 51%    | 6.33   | 2017/3/1  | 107      | 1.00   | 15%         | 2.50   | 320      | 1.33   |
+| 43%    | 5.00   | 2017/4/1 | 100      | 0.00   | 12%         | 1.00   | 350      | 3.33   |
+| 30%    | 2.83   | 2017/11/2 | 101      | 0.14   | 10%         | 0.00   | 332      | 2.13   |
+| 28%    | 2.50   | 2017/12/1| 104      | 0.57   | 9%          | -0.50  | 301      | 0.07   |
+| 27%    | 2.33   | 2017/7/5| 100      | 0.00   | 8%          | -1.00  | 285      | -1.00  |
+
+___
+### 折线图
+1. 数据预处理选项:
+    - 分组方式(可选)group_by
+    - 分段(可选):bucketization
+        - 时间可按年月日分段
+        - 标量可平均分段
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数 count_columns
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积 sum_columns
+2. 定义x轴:x_axis
+    - 只可定义一个x轴,且x轴没有重复值
+    - 可选类型:时间、标量、序量
+
+3. 定义y轴:y_axis
+    - 可以定义多个同类y轴堆叠 (命名为yaxis_0, yaxis_1,以此类推)
+    - 分组也可以堆叠
+    - 但每个x值在每个y轴上对应的y值应当是唯一的
+    - 可选类型:标量(包括计数和累计)
+4. 验证规则 validator
+        
+##### 折线图样式配置界面草案示例
+
+![Image](.\doc\img\line.png)
+___
+
+
+### 柱状图
+1. 数据预处理选项:
+    - 分段(可选):bucketization
+    - 分组方式(可选)group_by
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数 count_columns
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积 sum_columns
+2. 定义x轴:x_axis
+    - 只可定义一个x轴,且x轴没有重复值 
+    - 可选类型:序量、类别
+3. 定义y轴:y_axis
+    - 可以定义多个同类y轴堆叠 (命名为yaxis_0, yaxis_1,以此类推)
+    - 分组也可以堆叠
+    - 但每个x值在每个y轴上对应的y值应当是唯一的
+    - 可选类型:标量(包括计数和累积)
+4. 验证规则
+        
+##### 柱状图样式配置界面草案示例
+
+![Image](.\doc\img\bar.png)
+____    
+
+### 饼状图 
+1. 数据预处理选项:
+    - 分组方式(可选)group_by
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积
+    - 分段(可选):bucketization
+2. 定义扇区索引:
+    - 只可定义一个扇区索引,且没有重复值
+    - 可选类型:类别        
+3. 验证规则
+    
+##### 饼状图样式配置界面草案示例
+
+![Image](.\doc\img\pie.png)
+
+______
+        
+### 散点图
+1. 数据预处理选项:
+    - 分段 bucketization
+    - 计数(可选):在定义好x轴后,可以选择一个类别数据列对其中符合特定判断条件的项进行计数
+    - 累积(可选):在定义好x轴后,可以选择一个标量数据列沿着x轴累积
+    - 分组方式(可选)
+3. 定义x轴:
+    - 只可定义一个x轴,x轴可以有重复值
+    - 可选类型:标量、序量    
+4. 定义y轴:
+    - 分组不可以堆叠
+    - 每个x值在每个y轴上对应的y值应当是唯一的
+    - 可选类型:标量(包括计数和累积)
+5. 验证规则
+
+##### 散点图样式配置界面草案示例
+
+![Image](.\doc\img\scatter.png)
+
+______

BIN
doc/chart/doc/img/aggregate.png


BIN
doc/chart/doc/img/bar.png


BIN
doc/chart/doc/img/basic_settings.png


BIN
doc/chart/doc/img/charts.png


BIN
doc/chart/doc/img/data_structure.png


BIN
doc/chart/doc/img/data_view.png


BIN
doc/chart/doc/img/line.png


BIN
doc/chart/doc/img/pie.png


BIN
doc/chart/doc/img/scatter.png


File diff suppressed because it is too large
+ 465 - 0
doc/config_databases/Bi-data_v2.ldm


+ 84 - 0
doc/config_databases/README.md

@@ -0,0 +1,84 @@
+# 数据库表设计文档
+![Image](./img/View.png)
+t_data_connectors 数据接口
+- id
+- name
+- notes 说明
+- configuration 配置
+- created_by 
+- create_time
+- update_time
+
+t_charts 图表
+- id
+- title 标题
+- subtitle 副标题
+- notes 说明
+- access_permission 访问权限
+- edit_permission 修改权限
+- data_connector 数据接口
+- time_span 时间跨度
+- filter 筛选规则
+- visualization 可视化模式
+- legend 图例
+- tooltip 提示框
+- datazoom 数据缩放
+- toolbox 工具箱
+- created_by
+- create_time
+- update_time
+
+t_aggregate_tables 总体统计数据表
+- chart_id
+- bucketization 分段
+- group_by 分组
+- aggregate_stats 总体统计数据
+- validator 验证规则
+
+t_data_view 个体统计数据图
+- chart_id
+- group_by
+- sort_by 排序方式
+- data_view_columns 显示的个体统计数据
+- validator 
+
+t_line_charts 折线图
+- chart_id
+- bucketization 
+- count_columns 计数列
+- sum_columns 累积列
+- group_by 
+- x_axis x轴
+- y_axis y轴
+- validator
+- 
+
+
+t_bar_charts 柱状图
+- chart_id
+- group_by
+- bucketization
+- count_columns
+- sum_columns
+- x_axis
+- y_axis
+- validator
+
+t_pie_charts 饼状图
+- chart_id
+- bucketization
+- count_columns
+- sum_columns
+- group_by
+- section_index 扇区索引
+- validator
+
+t_scatter_plots 散点图
+- chart_id
+- bucketization
+- count_columns
+- sum_columns
+- group_by
+- x_axis
+- y_axis
+- validator

BIN
doc/config_databases/img/View.png


+ 15 - 0
doc/dashboard/README.md

@@ -0,0 +1,15 @@
+# 报告与看板Dashboards
+##### 备忘
+- 报告和看板结构相同,只是报告不会定期刷新,页面大小限制(比如A4)以及允许导出
+
+### Dashboard属性参数
+1. 标题
+2. 修改权限
+3. 访问权限
+4. 位置参数
+
+##### Dashboards列表界面草案
+![Image](.\doc\img\dashboard.png)
+
+##### Dashboard属性配置界面草案
+![Image](.\doc\img\dashboards.png)

File diff suppressed because it is too large
+ 465 - 0
doc/dashboard/config_databases/Bi-data_v2.ldm


+ 84 - 0
doc/dashboard/config_databases/README.md

@@ -0,0 +1,84 @@
+# 数据库表设计文档
+![Image](./img/View.png)
+t_data_connectors 数据接口
+- id
+- name
+- notes 说明
+- configuration 配置
+- created_by 
+- create_time
+- update_time
+
+t_charts 图表
+- id
+- title 标题
+- subtitle 副标题
+- notes 说明
+- access_permission 访问权限
+- edit_permission 修改权限
+- data_connector 数据接口
+- time_span 时间跨度
+- filter 筛选规则
+- visualization 可视化模式
+- legend 图例
+- tooltip 提示框
+- datazoom 数据缩放
+- toolbox 工具箱
+- created_by
+- create_time
+- update_time
+
+t_aggregate_tables 总体统计数据表
+- chart_id
+- bucketization 分段
+- group_by 分组
+- aggregate_stats 总体统计数据
+- validator 验证规则
+
+t_data_view 个体统计数据图
+- chart_id
+- group_by
+- sort_by 排序方式
+- data_view_columns 显示的个体统计数据
+- validator 
+
+t_line_charts 折线图
+- chart_id
+- bucketization 
+- count_columns 计数列
+- sum_columns 累积列
+- group_by 
+- x_axis x轴
+- y_axis y轴
+- validator
+- 
+
+
+t_bar_charts 柱状图
+- chart_id
+- group_by
+- bucketization
+- count_columns
+- sum_columns
+- x_axis
+- y_axis
+- validator
+
+t_pie_charts 饼状图
+- chart_id
+- bucketization
+- count_columns
+- sum_columns
+- group_by
+- section_index 扇区索引
+- validator
+
+t_scatter_plots 散点图
+- chart_id
+- bucketization
+- count_columns
+- sum_columns
+- group_by
+- x_axis
+- y_axis
+- validator

BIN
doc/dashboard/config_databases/img/View.png


BIN
doc/dashboard/doc/img/dashboard.png


BIN
doc/dashboard/doc/img/dashboards.png


+ 58 - 0
doc/data_connector/README.md

@@ -0,0 +1,58 @@
+# 数据接口=
+##### 备忘
+    1. 应该有机制保证每次获取数据时访问量不会对数据库所在服务器产生过大负荷
+    2. 数据接口修改权限应当只分配给管理员,使用权限应当和图表一致并继承系统的权限配置
+    3. 数据接口最终应该只传递单一的一个表
+    
+### 数据接口配置档内容
+1. 数据来源:
+    - 可按名称关联数据库中的一个或多个表
+    - 可上传CSV(或xls转CSV)
+2. 获取表头,判断原生数据各列数据的默认类型并写入元数据metadata:
+    - index 索引(编号)
+    - time 时间戳:
+    - categorical 类别
+    - scale 标量
+    - ordinal 序值
+    - string 字符串
+3. 种类标签 tag
+4. 其他元信息:
+    - created_by 创建人
+    - created_time 创建时间
+    - used 使用中: 正在使用这个数据接口的图表数量
+
+
+### 数据接口API
+
+  get_data(data_connector, time_span=all, filter=none, columns=all)
+        - 按参数产生SQL语句,从数据库获取原生数据,和元数据一起打包成JSON。
+        - 可以接受以下参数:
+            - data_connector: 调用的数据接口
+            - time_span:时间跨度
+            - filter:筛选规则
+            - columns: 所选数据列
+
+
+
+##### 数据接口配置界面草案示例
+![Image](.\doc\img\data_connectors.png)
+
+![Image](.\doc\img\basic_settings.png)
+
+![Image](.\doc\img\data_type.png)
+
+##### 传回JSON格式草案示例
+
+```json
+{
+    "metadata": ["index", "categorical", "time", "categorical", "categorical", "categorical", "index", "index", "string", "string", "scale", "scale", "scale", "scale", "time", "time", "scale", "scale", "scale", "scale", "categorical", "index", "index", "categorical", "string", "string", "string", "string", "string", "string", "time", "string", "string", "scale", "scale", "scale"
+    ],
+    "data": [
+        ["订单编号", "单据状态", "日期",  "订单类型", "客户名称", "打印状态", "订单序号", "物料编号", "物料名称", "物料规格", "数量", "已出货数", "未发货数", "已转数量", "交货日期", "PMC回复交期","定价", "单价","金额", "不含税单价", "明细状态", "预测单号", "预测序号", "币别", "业务员", "部门", "应收客户", "收货客户", "收款条件", "录入人","录入日期", "明细备注", "主表备注", "已转制造数量", "毛利率%", "成本单价"],
+        ["SS20180508001", "已审核", "2018/5/8", "国内销售", "合肥雪祺电器有限公司", "未打印", "7", "88101716", "冰箱控制板", "雪祺基本型定频66K(DA000714301),RoHS", 73, 0, 73, 0, "2018/5/9", "2018/5/9", 57.7, 57.7, 4212.1, 49.741379, "已审核", "0", "RMB", "马成雨", "合肥雪祺电器有限公司", "合肥雪祺电器有限公司", "票到1月后付6个月承兑", "徐小秀", "2018/5/8", "", "", 73, 100, 0],
+        ["SS20180508001", "已审核", "2018/5/8", "国内销售", "合肥雪祺电器有限公司", "未打印", "6", "88101486", "冰箱显示板", "美菱窄屏DA000418212,雪祺,RoHS", 129, 0, 129 ,0, "2018/5/9", "2018/5/9", 32.2, 32.2, 4153.8, 27.758621, "已审核", "0", "RMB", "马成雨", "合肥雪祺电器有限公司", "合肥雪祺电器有限公司", "票到1月后付6个月承兑", "徐小秀", "2018/5/8", "", "", 129, 100, 0]
+    ]
+}
+
+```
+

BIN
doc/data_connector/doc/img/basic_settings.png


BIN
doc/data_connector/doc/img/data_connectors.png


BIN
doc/data_connector/doc/img/data_type.png


BIN
lib/aopalliance-1.0.jar


BIN
lib/commons-logging-1.2.jar


BIN
lib/spring-aop-4.3.16.RELEASE.jar


BIN
lib/spring-aspects-4.3.16.RELEASE.jar


BIN
lib/spring-beans-4.3.16.RELEASE.jar


BIN
lib/spring-context-4.3.16.RELEASE.jar


BIN
lib/spring-context-support-4.3.16.RELEASE.jar


BIN
lib/spring-core-4.3.16.RELEASE.jar


BIN
lib/spring-expression-4.3.16.RELEASE.jar


BIN
lib/spring-instrument-4.3.16.RELEASE.jar


BIN
lib/spring-instrument-tomcat-4.3.16.RELEASE.jar


BIN
lib/spring-jdbc-4.3.16.RELEASE.jar


BIN
lib/spring-jms-4.3.16.RELEASE.jar


BIN
lib/spring-messaging-4.3.16.RELEASE.jar


BIN
lib/spring-orm-4.3.16.RELEASE.jar


BIN
lib/spring-oxm-4.3.16.RELEASE.jar


BIN
lib/spring-test-4.3.16.RELEASE.jar


BIN
lib/spring-tx-4.3.16.RELEASE.jar


BIN
lib/spring-web-4.3.16.RELEASE.jar


BIN
lib/spring-webmvc-4.3.16.RELEASE.jar


BIN
lib/spring-webmvc-portlet-4.3.16.RELEASE.jar


BIN
lib/spring-websocket-4.3.16.RELEASE.jar


+ 215 - 0
pom.xml

@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>BI</groupId>
+  <artifactId>BI</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>BI Maven Webapp</name>
+  <!-- FIXME change it to the project's website -->
+  <url>http://www.example.com</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>1.7</maven.compiler.source>
+  </properties>
+
+  <repositories><!-- 代码库 -->
+    <repository>
+      <id>maven-ali</id>
+      <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>true</enabled>
+        <updatePolicy>always</updatePolicy>
+        <checksumPolicy>fail</checksumPolicy>
+      </snapshots>
+    </repository>
+  </repositories>
+
+
+
+  <!-- Spring boot 父引用-->
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.0.2.RELEASE</version>
+  </parent>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+
+    <!-- Spring boot 核心web-->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+
+    <!-- dao-generator自动生成工具-->
+    <!--<dependency>-->
+      <!--<groupId>org.mybatis.generator</groupId>-->
+      <!--<artifactId>mybatis-generator-core</artifactId>-->
+      <!--<version>1.3.6</version>-->
+    <!--</dependency>-->
+
+    <!-- springboot 热加载 -->
+    <!--<dependency>-->
+      <!--<groupId>org.springframework.boot</groupId>-->
+      <!--<artifactId>spring-boot-devtools</artifactId>-->
+      <!--<optional>true</optional>-->
+      <!--&lt;!&ndash;<scope>true</scope>&ndash;&gt;-->
+    <!--</dependency>-->
+
+    <!--dao -->
+      <dependency>
+          <groupId>org.mybatis.spring.boot</groupId>
+          <artifactId>mybatis-spring-boot-starter</artifactId>
+          <version>1.3.0</version>
+      </dependency>
+
+
+
+    <!--mysql 驱动-->
+    <!--<dependency>-->
+      <!--<groupId>mysql</groupId>-->
+      <!--<artifactId>mysql-connector-java</artifactId>-->
+    <!--</dependency>-->
+
+    <!-- oracle -->
+    <dependency>
+      <groupId>com.oracle</groupId>
+      <artifactId>ojdbc6</artifactId>
+      <version>11.2.0</version>
+    </dependency>
+
+    <!-- 引入json处理包 -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>1.2.35</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger2</artifactId>
+      <version>2.7.0</version>
+    </dependency>
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger-ui</artifactId>
+      <version>2.7.0</version>
+    </dependency>
+
+    <!-- springboot分页插件 -->
+    <dependency>
+      <groupId>com.github.pagehelper</groupId>
+      <artifactId>pagehelper-spring-boot-starter</artifactId>
+      <version>5.0.2</version>
+    </dependency>
+
+
+
+  </dependencies>
+
+  <build>
+    <finalName>BI</finalName>
+
+    <!--<resources>-->
+      <!--<resource>-->
+        <!--<directory>src/main/java</directory>-->
+        <!--<includes>-->
+          <!--<include>**/*.properties</include>-->
+          <!--<include>**/*.xml</include>-->
+        <!--</includes>-->
+        <!--<filtering>false</filtering>-->
+      <!--</resource>-->
+      <!--<resource>-->
+        <!--<directory>src/main/resources</directory>-->
+        <!--<includes>-->
+          <!--<include>application.properties</include>-->
+          <!--&lt;!&ndash;<include>config/dao-config.xml</include>&ndash;&gt;-->
+          <!--<include>config/mybatis/*.xml</include>-->
+        <!--</includes>-->
+        <!--<filtering>false</filtering>-->
+      <!--</resource>-->
+    <!--</resources>-->
+
+    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
+      <plugins>
+        <plugin>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>3.0.0</version>
+        </plugin>
+        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
+        <plugin>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>3.0.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.7.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.20.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-war-plugin</artifactId>
+          <version>3.2.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>2.5.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>2.8.2</version>
+        </plugin>
+
+        <!--<plugin>-->
+          <!--<groupId>org.mybatis.generator</groupId>-->
+          <!--<artifactId>mybatis-generator-maven-plugin</artifactId>-->
+          <!--<version>1.3.6</version>-->
+          <!--<executions>-->
+            <!--<execution>-->
+              <!--<id>Generate MyBatis Artifacts</id>-->
+              <!--<phase>package</phase>-->
+              <!--<goals>-->
+                <!--<goal>generate</goal>-->
+              <!--</goals>-->
+            <!--</execution>-->
+          <!--</executions>-->
+          <!--<configuration>-->
+            <!--&lt;!&ndash; generator 工具配置文件的位置 &ndash;&gt;-->
+            <!--<configurationFile>src/main/resources/config/generatorConfig.xml</configurationFile>-->
+            <!--&lt;!&ndash;允许移动生成的文件 &ndash;&gt;-->
+            <!--<verbose>true</verbose>-->
+            <!--&lt;!&ndash; 是否覆盖 &ndash;&gt;-->
+            <!--<overwrite>true</overwrite>-->
+          <!--</configuration>-->
+        <!--</plugin>-->
+
+        <plugin>
+          <groupId>org.springframework.boot</groupId>
+          <artifactId>spring-boot-maven-plugin</artifactId>
+          <configuration>
+            <!--fork :  如果没有该项配置,devtools不会起作用,即应用不会restart加载器 -->
+            <fork>true</fork>
+          </configuration>
+        </plugin>
+
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>

+ 11 - 0
src/main/java/com/Application.java

@@ -0,0 +1,11 @@
+package com;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}

+ 73 - 0
src/main/java/com/controller/ChartsConfigController.java

@@ -0,0 +1,73 @@
+package com.controller;
+
+import com.model.bo.*;
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.ChartConfigInfo;
+import com.database1.server.ChartsConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ChartsConfigController {
+    @Autowired
+    ChartsConfigService chartsConfigService;
+
+//    /*
+//    保存基本信息配置
+//     */
+//    @RequestMapping("/inputBase")
+//    public RepEntity inputBase(@RequestBody BaseDataInfo body){
+//        return chartsConfigService.setChartBase(body);
+//    }
+//
+//    /*
+//    删除基本配置
+//     */
+//    @RequestMapping("/delBase")
+//    public RepEntity delBase(@RequestBody int body){
+//        return chartsConfigService.delChartBase(body);
+//    }
+
+    /*
+    总体统计数据表
+     */
+    @RequestMapping("/inputAggregate")
+   public RepEntity inputAggregate(@RequestBody ChartConfigInfo<AggregateTable> body){
+        return chartsConfigService.setChartsConfig(body);
+   }
+
+   /*
+   个人统计数据表
+    */
+   @RequestMapping("/inputDataView")
+   public RepEntity inputDataView(@RequestBody ChartConfigInfo<DataView> body){
+       return chartsConfigService.setChartsConfig(body);
+   }
+
+   /*
+   柱状
+    */
+   @RequestMapping("/inputHistogram")
+   public RepEntity inputHistogram(@RequestBody ChartConfigInfo<Histogram> body){
+       return chartsConfigService.setChartsConfig(body);
+   }
+
+  /*
+  折线
+  */
+    @RequestMapping("/inputLine")
+    public RepEntity inputLine(@RequestBody ChartConfigInfo<Line> body){
+        return chartsConfigService.setChartsConfig(body);
+    }
+
+    /*
+   饼图配置
+    */
+    @RequestMapping("/inputPie")
+    public RepEntity inputPie(@RequestBody ChartConfigInfo<Pie> body){
+        return chartsConfigService.setChartsConfig(body);
+    }
+
+}

+ 19 - 0
src/main/java/com/controller/DashboardsController.java

@@ -0,0 +1,19 @@
+package com.controller;
+
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.DashboardsInfo;
+import com.database1.server.DashboardsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class DashboardsController {
+    @Autowired
+    DashboardsService dashboardsService;
+    @RequestMapping("/inputDashboards")
+    public RepEntity inputDashboards(@RequestBody DashboardsInfo body){
+        return dashboardsService.setDashboards(body);
+    }
+}

+ 106 - 0
src/main/java/com/controller/DataConnectorController.java

@@ -0,0 +1,106 @@
+package com.controller;
+
+import com.database2.server.ImplementSqlService;
+import com.model.bo.Pages;
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.DataConnectorInfo;
+import com.model.vo.configVo.DatabasesInfo;
+import com.database1.server.DataConnectorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class DataConnectorController {
+    @Autowired
+    DataConnectorService dataConnectorService;
+
+    @Autowired
+    ImplementSqlService implementSqlService;
+
+    /*
+    执行数据源配置
+     */
+    @RequestMapping("/implementSql")
+    public RepEntity implementSql(@RequestBody String body){
+        return implementSqlService.implementSql(body);
+    }
+
+    /*
+    保存数据源配置
+     */
+    @RequestMapping("/inputDataConnector")
+    public RepEntity inputDataConnector(@RequestBody DataConnectorInfo body) {
+        System.out.println("-----------");
+        System.out.println(body);
+        return dataConnectorService.setDataConnector(body);
+    }
+
+    /*
+    查看数据源列表
+     */
+    @RequestMapping("/getListDataConnector")
+    public RepEntity getListDataConnector(@RequestBody Pages body){
+        return dataConnectorService.getListConnector(body);
+    }
+
+    /*
+    查看单个数据源配置
+     */
+    @RequestMapping("/getDataConnector")
+    public RepEntity getDataConnector(@RequestBody int body){
+        return dataConnectorService.getConnector(body);
+    }
+
+    /*
+    更新数据源配置
+     */
+    @RequestMapping("/updateData")
+    public RepEntity updateData(@RequestBody DataConnectorInfo body){
+        return dataConnectorService.updateData(body);
+    }
+
+    /*
+    删除配置
+     */
+    @RequestMapping("/delDataConnector")
+    public RepEntity delDataConnector(@RequestBody List<Integer> body){
+        return dataConnectorService.delDataConnector(body);
+    }
+
+    /*
+    数据库
+    保存数据库配置
+    */
+    @RequestMapping("/inputDatabases")
+    public RepEntity inputDatabases(@RequestBody DatabasesInfo body){
+        return dataConnectorService.inputDatabases(body);
+    }
+
+    /*
+    查看数据库配置列表
+     */
+    @RequestMapping("/getDatabases")
+    public RepEntity getDatabases(@RequestBody Pages body){
+        return dataConnectorService.getListDatabases(body);
+    }
+
+    /*
+    删除数据库配置
+     */
+    @RequestMapping("/delDatabases")
+    public RepEntity delDatabases(@RequestBody List<Integer> body){
+        return dataConnectorService.delDatabases(body);
+    }
+
+    /*
+    更新数据库配置
+     */
+    @RequestMapping("/updatabases")
+    public RepEntity updatabases(@RequestBody DatabasesInfo databasesInfo){
+        return dataConnectorService.updatabases(databasesInfo);
+    }
+}

+ 23 - 0
src/main/java/com/controller/ShowChartsController.java

@@ -0,0 +1,23 @@
+package com.controller;
+
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.HistogramConfigInfo;
+import com.database2.server.ShowChartsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ShowChartsController {
+
+    @Autowired
+    ShowChartsService showChartsService;
+    /*
+    展示柱状图
+     */
+    @RequestMapping("/showHistogram")
+    public RepEntity showHistogram(@RequestBody HistogramConfigInfo body){
+        return showChartsService.showHistogram(body);
+    }
+}

+ 24 - 0
src/main/java/com/database1/dao/ChartsConfigMapper.java

@@ -0,0 +1,24 @@
+package com.database1.dao;
+
+import com.model.po.ChartConfig;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+
+@Mapper
+@Repository
+public interface ChartsConfigMapper {
+
+    @Insert("insert into bi_charts(CHART_NAME,CHART_TYPE,BD_DATA_ID,BD_ID,CHART_CONFIG,GROUP_BY,SUBSECTIONS,ACCESS_AUTHORITY,UPDATE_AUTHORITY,CHART_DESCRIBES,is_legend,is_tooltip,is_datazoom,is_toolbox,create_by,create_date) " +
+            "VALUES (#{chartName},#{chartType}, #{dataId}, #{dashboardsId}, #{chartConfig}, #{groupBy}, #{subsections}, #{accessAuthority}, #{updateAuthority}, #{describes},#{isLegend},#{isToolTip}, #{isDataZoom}, #{isToolBox}, #{createBy},to_date(#{createDate},'YYYY-MM-DD hh24:mi:ss'))")
+    void insertCharts(ChartConfig chartConfig);
+
+    @Delete("delete from t_chart where id = #{id}")
+    void deleteCharts(int id);
+
+    @Select("select * from t_chart where id = #{id}")
+    ChartConfig getOneChart(int id);
+}

+ 17 - 0
src/main/java/com/database1/dao/DashboardsMapper.java

@@ -0,0 +1,17 @@
+package com.database1.dao;
+
+import com.model.po.Dashboards;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+
+@Mapper
+@Repository
+public interface DashboardsMapper {
+
+    @Insert("insert into " +
+            "bi_dashboards(bd_name,bd_note,configuration,create_by,create_date)" +
+            "values(#{bdName},#{bdNote},#{bdConfiguration},#{createBy},to_date(#{createDate},'YYYY-MM-DD hh24:mi:ss'))")
+    void setDashboards(Dashboards dashboards);
+}

+ 134 - 0
src/main/java/com/database1/dao/DataConnectorMapper.java

@@ -0,0 +1,134 @@
+package com.database1.dao;
+
+import com.model.po.*;
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface DataConnectorMapper {
+
+    @Select("select d.column_name as columnName, d.DATA_TYPE as columnType, b.comments as remarks from " +
+            "(select column_name,DATA_TYPE from user_tab_cols where Table_Name = #{tableName}) d," +
+            "(select * from user_col_comments where Table_Name = #{tableName}) b" +
+            " where d.column_name = b.column_name order by columnName")
+    List<ColumnData> getColumn(@Param("tableName") String tableName);
+
+    @Select("<script>" +
+            "select * from bi_data_connectors where" + "1=1" +
+            "<if test=\"id != null\"> and id = #{id} </if>" +
+            "<if test=\"dataName != null\"> and data_name = #{dataName} </if>" +
+            "<if test=\"dataTag != null\"> and data_tag = #{dataTag} </if>" +
+            "<if test=\"configuration != null\"> and configuration = #{configuration} </if>" +
+            "<if test=\"columnConfig != null\"> and columns_config = #{columnConfig} </if>"  +
+            "<if test=\"usedNumber != null\"> and used_number = #{usedNumber} </if>" +
+            "<if test=\"createBy != null\">and create_by = #{createBy}</if>" +
+            "</script>")
+    List<DataConnector> getAllData(DataConnector dataConnector);
+
+    /*
+    查询单个数据源
+     */
+    @Select("select ID as dataId, DATA_NAME as dataName, DATA_NOTE as note, DATA_TAG as dataTag, COLUMNS_CONFIG as columnConfig, LOAD_OBJECT as loadObject," +
+            "CREATE_BY as createBy, USED_NUMBER as userNumber, CREATE_DATE as createDate,DB_CONFIG as dbConfig, " +
+            "CON_TYPE as type from bi_data_connectors where id = #{id}")
+    DataConnector getOneData(int id);
+
+    /*
+    查询数据源列表
+     */
+    @Select("select id as dataId, con_type as type, data_name as dataName, data_tag as dataTag, data_note as note, create_by as createBy, create_date as createDate," +
+            " used_number as usedNumber, db_config as dbConfig from bi_data_connectors")
+    List<DataConnectorList> getDataConnectorList();
+
+    /*
+    插入数据源配置
+     */
+    @Insert("INSERT INTO bi_data_connectors(data_name,data_note,data_tag,con_type,LOAD_OBJECT,DB_CONFIG,columns_config,used_number,create_by,create_date, table_name) " +
+            "VALUES (#{dataName}, #{note}, #{dataTag}, #{type}, #{loadObject}, #{dbConfig},#{columnConfig}, #{usedNumber},#{createBy}, to_date(#{createDate},'YYYY-MM-DD hh24:mi:ss'), #{tableName})")
+    void insertDataConnector(DataConnector dataConnector);
+
+    /*
+    更新数据源配置
+     */
+    @Update("<script>" +
+            "UPDATE bi_data_connectors set "  +
+            "data_name = #{dataName}" +
+            "<if test=\"dataTag != null\"> , data_tag = #{dataTag} </if>" +
+            "<if test=\"loadObject != null\"> , LOAD_OBJECT = #{loadObject} </if>" +
+            "<if test=\"columnConfig != null\"> , columns_config = #{columnConfig} </if>" +
+            "<if test=\"dbConfig != null\"> , DB_CONFIG = #{dbConfig} </if>" +
+            "<if test=\"usedNumber != null\"> , used_number = #{usedNumber} </if>" +
+            "<if test=\"createBy != null\"> , create_by = #{createBy} </if>" +
+            "<if test=\"type != null\"> , con_TYPE = #{type} </if>" +
+            "<if test=\"note != null\"> , DATA_NOTE = #{note} </if>" +
+            "<if test=\"tableName != null\"> , table_name = #{tableName} </if>" +
+            "where id = #{dataId}" +
+            "</script>")
+    void updateData(DataConnector dataConnector);
+
+    /*
+    删除数据源
+     */
+    @Delete("<script>" +
+            "delete from bi_data_connectors where id in " +
+            "("+
+            "<foreach collection=\"list\" index=\"index\" item=\"item\"  separator=\",\">" +
+            "#{item, jdbcType = NUMERIC}"+
+            "</foreach>" +
+            ")"+
+            "</script>")
+    void deleteData(List<Integer> idList);
+
+    /*
+    保存数据库连接
+     */
+    @Insert("insert into BI_DATABASES(ADDRASS, CREATE_DATE, DATABASE_TYPE, DATA_NAME, bases_NAME, PASS_WORD, PORT, USER_NAME, note)" +
+            "values(#{addrass}, to_date(#{createDate},'YYYY-MM-DD hh24:mi:ss'), #{databaseType}, #{dataName}, #{name}, #{passWord}, #{port}, #{userName}, #{note})")
+    void inputDataBases(Databases databases);
+
+    /*
+    查询单个数据库连接ID
+     */
+    @Select("select id from BI_DATABASES where  id= #{id}")
+    int getBasesById(int id);
+
+    /*
+    查询数据库配置列表
+     */
+    @Select("select id, bases_name as name, note, addrass, data_name as dataName, DATABASE_TYPE as databaseType," +
+            " PASS_WORD as passWord, USER_NAME as userName, PORT, CREATE_DATE as createDate from bi_databases")
+    List<Databases> getDatabasesList();
+
+    /*
+    修改数据库配置列表
+     */
+    @Update("<script>"+
+            "UPDATE BI_DATABASES set "  +
+            "BASES_NAME = #{name}" +
+            "<if test=\"addrass != null\"> , ADDRASS = #{addrass} </if>" +
+            "<if test=\"port != null\"> , PORT = #{port} </if>" +
+            "<if test=\"databaseType != null\"> , DATABASE_TYPE = #{databaseType} </if>" +
+            "<if test=\"dataName != null\"> , DATA_NAME = #{dataName} </if>" +
+            "<if test=\"userName != null\"> , USER_NAME = #{userName} </if>" +
+            "<if test=\"passWord != null\"> , PASS_WORD = #{passWord} </if>" +
+            "<if test=\"note != null\"> , NOTE = #{note} </if>" +
+            "where id = #{id}" +
+            "</script>")
+    void updatabases(Databases databases);
+
+    /*
+    删除数据库配置
+     */
+    @Delete("<script>" +
+            "delete from bi_databases where id in " +
+            "("+
+            "<foreach collection=\"list\" index=\"index\" item=\"item\"  separator=\",\">" +
+            "#{item, jdbcType = NUMERIC}"+
+            "</foreach>" +
+            ")"+
+            "</script>")
+    void deleteDatabases(List<Integer> idList);
+}

+ 167 - 0
src/main/java/com/database1/server/ChartsConfigService.java

@@ -0,0 +1,167 @@
+package com.database1.server;
+
+import com.database1.dao.ChartsConfigMapper;
+import com.model.po.ChartConfig;
+import com.model.pojo.RepCode;
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.ChartConfigInfo;
+import com.util.TimeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ChartsConfigService {
+
+    @Autowired
+    TimeUtil timeUtil;
+    @Autowired
+    ChartsConfigMapper chartsConfigMapper;
+//    @Autowired
+//    private AggregateMapper aggregateMapper;
+//    @Autowired
+//    private DataViewMapper dataViewMapper;
+//    @Autowired
+//    private LineMapper lineMapper;
+//    @Autowired
+//    private ScatterMapper scatterMapper;
+//    @Autowired
+//    private HistogramMapper histogramMapper;
+//    @Autowired
+//    private PieMapper pieMapper;
+
+    /*
+    保存基本设置
+     */
+//    public RepEntity setChartBase(BaseDataInfo baseDataInfo){
+//        ChartConfig chartConfig = new ChartConfig();
+//        BeanUtils.copyProperties(baseDataInfo, chartConfig);
+//
+////        chartConfig.setCreateTime(timeUtil.SystemTime());
+//        System.out.println(chartConfig);
+//
+//        chartsConfigMapper.insertCharts(chartConfig);
+//        return new RepEntity(RepCode.success);
+//    }
+//
+//    /*
+//    删除基本配置
+//     */
+//    public RepEntity delChartBase(int id){
+//        if (chartsConfigMapper.getOneChart(id) == null){
+//            return new RepEntity(RepCode.Null);
+//        }
+//        chartsConfigMapper.deleteCharts(id);
+//        return new RepEntity(RepCode.success);
+//    }
+
+    /*
+    保存表设置
+     */
+    public RepEntity setChartsConfig(ChartConfigInfo chartConfigInfo){
+
+
+        ChartConfig chartConfig = new ChartConfig();
+        BeanUtils.copyProperties(chartConfigInfo, chartConfig);
+        chartConfig.setGroupBy(chartConfigInfo.getGroupBy().toString());
+        chartConfig.setSubsections(chartConfigInfo.getSubsections().toString());
+        chartConfig.setChartConfig(chartConfigInfo.getChartConfig().toString());
+        chartConfig.setAccessAuthority(chartConfigInfo.getAccessAuthority().toString());
+        chartConfig.setUpdateAuthority(chartConfigInfo.getUpdateAuthority().toString());
+        chartConfig.setFilters(chartConfigInfo.getFilters().toString());
+
+        chartConfig.setCreateDate(timeUtil.SystemTime());
+
+        chartsConfigMapper.insertCharts(chartConfig);
+
+        return new RepEntity(RepCode.success);
+    }
+
+    /*
+    删除总体表
+     */
+//    public  RepEntity delAggregate(int id){
+//        if (aggregateMapper.getOneAggregate(id) == null){
+//            return new RepEntity(RepCode.Null);
+//        }
+//        aggregateMapper.delAggregate(id);
+//        return new RepEntity(RepCode.success);
+//    }
+//
+//    /*
+//    保存个体表设置
+//     */
+//    public RepEntity setDataView(DataViewInfo dataViewInfo){
+//        DataView dataView = new DataView();
+//        BeanUtils.copyProperties(dataViewInfo, dataView);
+//        dataView.setCreateTime(timeUtil.SystemTime());
+//        dataView.setSubsection(dataViewInfo.getSubsection().toString());
+//        dataView.setGroup(dataViewInfo.getGroup().toString());
+//        dataViewMapper.setDataView(dataView);
+//        return new RepEntity(RepCode.success);
+//    }
+//
+//    /*
+//    保存折线图
+//     */
+//    public RepEntity setLine(LineInfo lineInfo){
+//        Line line = new Line();
+//        BeanUtils.copyProperties(lineInfo,line);
+//        line.setCreateTime(timeUtil.SystemTime());
+//        line.setCount(lineInfo.getCount().toString());
+//        line.setAccumulate(lineInfo.getAccumulate().toString());
+//        line.setxAxis(lineInfo.getxAxis().toString());
+//        line.setyAxis(lineInfo.getyAxis().toString());
+//
+//        lineMapper.setLine(line);
+//        return new RepEntity(RepCode.success);
+//    }
+//
+//    /*
+//    保存散点图
+//     */
+//    public RepEntity setScatter(ScatterInfo scatterInfo){
+//        Scatter scatter = new Scatter();
+//        BeanUtils.copyProperties(scatterInfo,scatter);
+//        scatter.setCreateTime(timeUtil.SystemTime());
+//        scatter.setCount(scatterInfo.getCount().toString());
+//        scatter.setAccumulate(scatterInfo.getAccumulate().toString());
+//        scatter.setxAxis(scatterInfo.getxAxis().toString());
+//        scatter.setyAxis(scatterInfo.getyAxis().toString());
+//
+//        scatterMapper.setScatter(scatter);
+//        return new RepEntity(RepCode.success);
+//    }
+//
+//    /*
+//    保存饼图
+//     */
+//    public RepEntity setHistogram(HistogramInfo histogramInfo){
+//        Coordinate histogram = new Coordinate();
+//        BeanUtils.copyProperties(histogramInfo,histogram);
+//        histogram.setCreateTime(timeUtil.SystemTime());
+//        histogram.setCount(histogramInfo.getCount().toString());
+//        histogram.setAccumulate(histogramInfo.getAccumulate().toString());
+//        histogram.setxAxis(histogramInfo.getxAxis().toString());
+//        histogram.setyAxis(histogramInfo.getyAxis().toString());
+//
+//        histogramMapper.setHistogram(histogram);
+//        return new RepEntity(RepCode.success);
+//    }
+//
+//    /*
+//    保存柱状图
+//     */
+//    public RepEntity setPie(PieInfo pieInfo){
+//        Pie pie = new Pie();
+//        BeanUtils.copyProperties(pieInfo,pie);
+//        pie.setCreateTime(timeUtil.SystemTime());
+//        pie.setCount(pieInfo.getCount().toString());
+//        pie.setAccumulate(pieInfo.getAccumulate().toString());
+//        pie.setBlock(pieInfo.getBlock().toString());
+//
+//        pieMapper.setPie(pie);
+//        return new RepEntity(RepCode.success);
+//    }
+
+}

+ 30 - 0
src/main/java/com/database1/server/DashboardsService.java

@@ -0,0 +1,30 @@
+package com.database1.server;
+
+import com.database1.dao.DashboardsMapper;
+import com.model.po.Dashboards;
+import com.model.pojo.RepCode;
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.DashboardsInfo;
+import com.util.TimeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DashboardsService {
+    @Autowired
+    TimeUtil timeUtil;
+    @Autowired
+    DashboardsMapper dashboardsMapper;
+
+    public RepEntity setDashboards(DashboardsInfo dashboardsInfo){
+        Dashboards dashboards = new Dashboards();
+        BeanUtils.copyProperties(dashboardsInfo,dashboards);
+
+        dashboards.setBdConfiguration(dashboardsInfo.getBdConfiguration().toString());
+        dashboards.setCreateDate(timeUtil.SystemTime());
+
+        dashboardsMapper.setDashboards(dashboards);
+        return new RepEntity(RepCode.success);
+    }
+}

+ 224 - 0
src/main/java/com/database1/server/DataConnectorService.java

@@ -0,0 +1,224 @@
+package com.database1.server;
+
+import com.database1.dao.DataConnectorMapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.model.bo.DatabaseConfig;
+import com.model.bo.Pages;
+import com.model.po.DataConnector;
+import com.model.po.DataConnectorList;
+import com.model.po.Databases;
+import com.model.pojo.RepCode;
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.ColumnRenameInfo;
+import com.model.vo.configVo.DataConnectorInfo;
+import com.model.vo.configVo.DatabasesInfo;
+import com.util.SqlMatch;
+import com.util.TimeUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+//import com.dao.database2.DataColumnMapper;
+
+@Service
+public class DataConnectorService {
+
+    @Autowired
+    private DataConnectorMapper dataConnectorMapper;
+
+    @Autowired
+    private TimeUtil timeUtil;
+
+    @Autowired
+    SqlMatch sqlMatch;
+
+    @Autowired
+    ObjectMapper objectmapper;
+
+    /*
+    保存数据源
+     */
+    public RepEntity setDataConnector(DataConnectorInfo dataConnectorInfo){
+
+        if (dataConnectorInfo == null || "".equals(dataConnectorInfo)){
+            return new RepEntity(RepCode.Null);
+        }
+        DataConnector dataConnector = new DataConnector();
+        BeanUtils.copyProperties(dataConnectorInfo,dataConnector);
+
+        String tableName = SqlMatch.matchSql(dataConnector.getLoadObject());
+        dataConnector.setTableName(tableName);
+
+         String columnConfig = null;
+         String databaseConfig = null;
+         String dataTag = null;
+
+        try {
+            columnConfig = objectmapper.writeValueAsString(dataConnectorInfo.getColumnConfig());
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+        try {
+            databaseConfig = objectmapper.writeValueAsString(dataConnectorInfo.getDbConfig());
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+        try {
+            dataTag = objectmapper.writeValueAsString(dataConnectorInfo.getDataTag());
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+        dataConnector.setColumnConfig(columnConfig);
+        dataConnector.setDbConfig(databaseConfig);
+        dataConnector.setDataTag(dataTag);
+        dataConnector.setCreateDate(timeUtil.SystemTime());
+
+        System.out.println(dataConnector);
+
+        dataConnectorMapper.insertDataConnector(dataConnector);
+        return new RepEntity(RepCode.success);
+    }
+
+    //查看数据源列表
+    public RepEntity getListConnector(Pages pages){
+        if (pages == null || "".equals(pages)){
+            int pageNum = pages.getPageNum();
+            int pageSize = pages.getPageSize();
+
+            //使用分页插件,核心代码就这一行
+//            PageHelper.startPage(pageNum, pageSize);
+        }
+
+        List<DataConnectorList> listConnector = dataConnectorMapper.getDataConnectorList();
+        return new RepEntity(RepCode.success, listConnector);
+    }
+
+    /*
+    查看单个数据源配置
+     */
+    public RepEntity getConnector(int id){
+        DataConnector dataConnector = dataConnectorMapper.getOneData(id);
+        System.out.println(dataConnector);
+        return new RepEntity(RepCode.success, dataConnector);
+    }
+
+    /*
+    更新数据源配置
+     */
+    public RepEntity updateData(DataConnectorInfo dataConnectorInfo){
+
+        if (dataConnectorInfo == null || "".equals(dataConnectorInfo)){
+            return new RepEntity(RepCode.Null);
+        }
+        DataConnector dataConnector = new DataConnector();
+        BeanUtils.copyProperties(dataConnectorInfo,dataConnector);
+        //获取表名
+        String tableName = SqlMatch.matchSql(dataConnector.getLoadObject());
+        dataConnector.setTableName(tableName);
+
+        List<ColumnRenameInfo> columnConfig = dataConnectorInfo.getColumnConfig();
+        DatabaseConfig dbConfig = dataConnectorInfo.getDbConfig();
+        List<String> dataTag = dataConnectorInfo.getDataTag();
+
+        String columnConfigJson = null;
+        String dbConfigJson = null;
+        String dataTagJson = null;
+
+        if (!("".equals(columnConfig)) || columnConfig != null){
+            try {
+                columnConfigJson = objectmapper.writeValueAsString(columnConfig);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
+            dataConnector.setColumnConfig(columnConfigJson);
+        }
+        if (!("".equals(dbConfig)) || dbConfig != null){
+            try {
+                dbConfigJson = objectmapper.writeValueAsString(dbConfig);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
+            dataConnector.setDbConfig(dbConfigJson);
+        }
+        if (dataTag != null){
+            try {
+                dataTagJson = objectmapper.writeValueAsString(dataTag);
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
+            dataConnector.setDataTag(dataTagJson);
+        }
+
+        dataConnector.setUpdateDate(timeUtil.SystemTime());
+
+        System.out.println(dataConnector);
+
+        dataConnectorMapper.updateData(dataConnector);
+        return new RepEntity(RepCode.success);
+    }
+
+    /*
+    删除数据源
+     */
+
+    public RepEntity delDataConnector(List<Integer> idList){
+            dataConnectorMapper.deleteData(idList);
+        return new RepEntity(RepCode.success);
+    }
+
+    /*
+    保存数据库连接
+     */
+    public RepEntity inputDatabases(DatabasesInfo databasesInfo){
+        if (databasesInfo == null || "".equals(databasesInfo)){
+            return new RepEntity(RepCode.Null);
+        }
+        Databases databases = new Databases();
+        BeanUtils.copyProperties(databasesInfo, databases);
+        databases.setCreateDate(timeUtil.SystemTime());
+        dataConnectorMapper.inputDataBases(databases);
+        return new RepEntity(RepCode.success);
+    }
+
+    /*
+   查看数据库配置列表
+    */
+    public RepEntity getListDatabases(Pages pages){
+        if (pages == null || "".equals(pages)){
+            int pageNum = pages.getPageNum();
+            int pageSize = pages.getPageSize();
+
+            //使用分页插件,核心代码就这一行
+//            PageHelper.startPage(pageNum, pageSize);
+        }
+
+        List<Databases> databases = dataConnectorMapper.getDatabasesList();
+        return new RepEntity(RepCode.success, databases);
+    }
+
+    /*
+    删除数据库配置
+     */
+    public RepEntity delDatabases(List<Integer> idList){
+        System.out.println(idList);
+        dataConnectorMapper.deleteDatabases(idList);
+        return new RepEntity(RepCode.success);
+    }
+
+    /*
+    修改数据库配置
+     */
+    public RepEntity updatabases(DatabasesInfo databasesInfo){
+        Databases databases = new Databases();
+        BeanUtils.copyProperties(databasesInfo, databases);
+        System.out.println(databases);
+        dataConnectorMapper.updatabases(databases);
+        return new RepEntity(RepCode.success);
+    }
+}

+ 24 - 0
src/main/java/com/database2/dao/DataColumnMapper.java

@@ -0,0 +1,24 @@
+package com.database2.dao;
+
+
+import com.model.po.ColumnData;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface DataColumnMapper {
+    /*
+  查询列信息
+   */
+    @Select("select d.column_name as columnName, d.DATA_TYPE as columnType, b.comments as remarks from " +
+            "(select column_name,DATA_TYPE from user_tab_cols where Table_Name = #{tableName}) d," +
+            "(select * from user_col_comments where Table_Name = #{tableName}) b" +
+            " where d.column_name = b.column_name order by columnName")
+    List<ColumnData> getColumn(@Param("tableName") String tableName);
+
+}

+ 75 - 0
src/main/java/com/database2/dao/ShowChartsMapper.java

@@ -0,0 +1,75 @@
+package com.database2.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Mapper
+@Repository
+public interface ShowChartsMapper {
+
+    //x轴
+    @Select("select ${xAxisName} from ${tableName} group by ${xAxisName}")
+    List<String> getXAxis(@Param("xAxisName") String xAxisName, @Param("tableName") String tableName);
+
+
+    //x轴数据
+    @Select("select ${dataType}(${yAxisName}) from ${tableName} where ${xColumn} = #{xdata}")
+    String getValues(@Param("yAxisName") String yAxisName, @Param("xColumn") String xColumn,
+                     @Param("tableName") String tableName, @Param("dataType") String dataType,
+                     @Param("xdata") String xdata);
+
+    //x轴数据
+//    @Select("select ${dataType}(${yAxisName}) from ${tableName} group by ${xColumn}")
+//    List<Double> getYAxis(@Param("yAxisName") String yAxisName, @Param("xColumn") String xColumn, @Param("tableName") String tableName, @Param("dataType") String dataType);
+
+//    @Select("select ${dataType}(${yAxisName}) from ${tableName} where ${xAxisName} = #{values} group by ${groupsBy}")
+//    List<String> getGroups(@Param("groupsBy") String groupsBy, @Param("tableName") String tableName);
+
+    //查询分组系列
+    @Select("select ${groupsBy} from ${tableName} group by ${groupsBy}")
+    List<String> getGroups(@Param("groupsBy") String groupsBy, @Param("tableName") String tableName);
+
+    //查询分组的值
+    @Select("select ${dataType}(${yAxisName}) from ${tableName} where ${groupsColumn}=#{groupsIndex} and ${xColumn}=#{xColumnIndex}")
+    String getGroupsValue(@Param("dataType") String dataType, @Param("yAxisName") String yAxisName, @Param("tableName") String tableName,
+                               @Param("groupsColumn") String groupsColumn, @Param("groupsIndex") String groupsIndex,
+                                @Param("xColumn") String xColumn, @Param("xColumnIndex") String xColumnIndex);
+
+
+    //时间类型的X轴
+    @Select("select distinct to_char(${xAxisName},${timeType})time from TEST_BI_DATA ORDER by to_char(${xAxisName},${timeType}) ASC")
+    List<String> getTimeDate(@Param("xAxisName") String xAxisName, @Param("tableName") String tableName, @Param("timeType") String timeType);
+
+    //半年
+    @Select("select distinct case when to_char(${xAxisName},'MM')<=6 then to_char(${xAxisName},'YYYY')|| '-H1'" +
+            "else to_char(${xAxisName},'YYYY')||'-H2' end time from ${tableName} order by time")
+    List<String> getTimeYear(@Param("xAxisName") String xAxisName, @Param("tableName") String tableName);
+    
+    //无分组时间类型值
+    @Select("select ${dataType}(${yAxisName}) from ${tableName} where (to_char(${xAxisName},${timeType})) = #{xColumnIndex}")
+    String getTimeValue (@Param("dataType") String dataType, @Param("yAxisName") String yAxisName, @Param("tableName") String tableName,
+                         @Param("xAxisName") String xAxisName, @Param("timeType") String timeType, @Param("xColumnIndex") String xColumnIndex);
+
+    //无分组半年时间值
+    @Select("select ${dataType}(${yAxisName}) from ${tableName} where TO_CHAR(${xAxisName},'YYYY-MM') between #{firstIndex} and #{afterIndex}")
+    String getTimeValueYear(@Param("dataType") String dataType, @Param("yAxisName") String yAxisName, @Param("tableName") String tableName,
+                            @Param("xAxisName") String xAxisName, @Param("firstIndex") String firstIndex, @Param("afterIndex") String afterIndex);
+
+
+    //查询时间类型分组的值
+    @Select("select ${dataType}(${yAxisName}) from ${tableName} where ${groupsColumn}=#{groupsIndex} and TO_CHAR(${xColumn},${timeType})=#{xColumnIndex}")
+    String getGroupsValueTime(@Param("dataType") String dataType, @Param("yAxisName") String yAxisName, @Param("tableName") String tableName,
+                          @Param("groupsColumn") String groupsColumn, @Param("groupsIndex") String groupsIndex,
+                          @Param("xColumn") String xColumn, @Param("timeType") String timeType, @Param("xColumnIndex") String xColumnIndex);
+
+    //查询分组的值(时间类型半年)
+    //无分组半年时间值
+    @Select("select ${dataType}(${yAxisName}) from ${tableName} where TO_CHAR(${xAxisName},'YYYY-MM') between #{firstIndex} and #{afterIndex} and ${groupsColumn}=#{groupsIndex}")
+    String getTimeValueHalfYear(@Param("dataType") String dataType, @Param("yAxisName") String yAxisName, @Param("tableName") String tableName,
+                            @Param("xAxisName") String xAxisName, @Param("firstIndex") String firstIndex, @Param("afterIndex") String afterIndex,
+                                @Param("groupsColumn") String groupsColumn, @Param("groupsIndex") String groupsIndex);
+}

+ 28 - 0
src/main/java/com/database2/server/ImplementSqlService.java

@@ -0,0 +1,28 @@
+package com.database2.server;
+
+import com.database2.dao.DataColumnMapper;
+import com.model.po.ColumnData;
+import com.model.pojo.RepCode;
+import com.model.pojo.RepEntity;
+import com.util.SqlMatch;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ImplementSqlService {
+    @Autowired
+    DataColumnMapper dataColumnMapper;
+    /*
+    执行数据源
+     */
+    public RepEntity implementSql(String sqlStr){
+        String tableName = SqlMatch.matchSql(sqlStr).toUpperCase();
+        if ("".equals(tableName) || tableName == null){
+            return new RepEntity(RepCode.Null);
+        }
+        List<ColumnData> columnData = dataColumnMapper.getColumn(tableName);
+        return new RepEntity(RepCode.success, columnData);
+    }
+}

+ 170 - 0
src/main/java/com/database2/server/ShowChartsService.java

@@ -0,0 +1,170 @@
+package com.database2.server;
+
+import com.database2.dao.ShowChartsMapper;
+import com.model.bo.Series;
+import com.model.pojo.RepCode;
+import com.model.pojo.RepEntity;
+import com.model.vo.configVo.HistogramConfigInfo;
+import com.model.vo.dataVo.HistogramDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+@Repository
+public class ShowChartsService {
+    @Autowired
+    ShowChartsMapper showChartsMapper;
+    @Autowired
+    TimeConverterUtil timeConverterUtil;
+
+    /*
+    柱状图数据展示
+     */
+    public RepEntity showHistogram(HistogramConfigInfo histogramConfigInfo){
+        HistogramDataInfo histogramDataInfo = new HistogramDataInfo();
+        if (histogramConfigInfo == null || "".equals(histogramConfigInfo)){
+            return new RepEntity(RepCode.Null);
+        }
+        String tableName = histogramConfigInfo.getTableName();
+        String xColumn = histogramConfigInfo.getxAxis().getColumnRename();
+        String yColumn = histogramConfigInfo.getyAxis().getColumnRename();
+
+        String xAxisType = histogramConfigInfo.getxAxis().getDataType();
+        List<String> groupBy = histogramConfigInfo.getGroups();
+
+        if (xColumn == null || "".equals(xColumn) || yColumn == null || "".equals(yColumn)){
+            return new RepEntity(RepCode.nullAxis);
+        }
+
+        String dataType = histogramConfigInfo.getyAxis().getDataType();
+        if (dataType == null || "".equals(dataType) || "sum".equals(dataType)){
+            dataType = "sum";
+        }else if ("count".equals(dataType)){
+            dataType = "count";
+        }else if ("max".equals(dataType)){
+            dataType = "max";
+        }else if ("min".equals(dataType)){
+            dataType = "min";
+        }else if ("avg".equals(dataType)){
+            dataType = "avg";
+        }else if ("distinctCount".equals(dataType)){
+            dataType = "distinct count";
+        }else {
+            return new RepEntity(RepCode.erro);
+        }
+
+        Series series = new Series();
+        List<Double> value = new ArrayList<Double>();
+        List<Series> serieses = new ArrayList<Series>();    //生成柱状图的系列
+        List<String> xAxisData = new ArrayList<String>();  //X轴自己用
+        List<String> xData = new ArrayList<String>();      //X轴跟前端沟通失败之后转给前端用
+
+        //X轴
+        //判断是否为日期类型
+        if ("time".equals(histogramConfigInfo.getxAxis().getColumnType())){
+//            xAxisData = showChartsMapper.getDate(xColumn.getColumnRename(), tableName);
+            xAxisData = timeConverterUtil.timeConverter(xColumn, tableName, xAxisType);
+            xData = timeConverterUtil.toRespons(xAxisData,xAxisType );
+            System.out.println("data:"+xAxisData);
+        }else {
+            xAxisData = showChartsMapper.getXAxis(xColumn, tableName);
+
+        }
+        if ("".equals(xAxisData) || xAxisData == null || xAxisData.size() == 0){
+            return new RepEntity(RepCode.Null);
+        }
+        if ("week".equals(xAxisType) || "month".equals(xAxisType) || "quarter".equals(xAxisType)){
+            histogramDataInfo.setxAxis(xData);
+        }else {
+            histogramDataInfo.setxAxis(xAxisData);
+        }
+
+        System.out.println("x轴:"+ histogramDataInfo.getxAxis());
+
+        //无分组时Y值
+        System.out.println("列:"+groupBy);
+        Iterator itX = xAxisData.iterator();
+        while (itX.hasNext()){
+            String xdata = (String)itX.next();
+            double valueOne = 0;
+            String valueOnes = null;
+            if ("time".equals(histogramConfigInfo.getxAxis().getColumnType())){
+                valueOnes = timeConverterUtil.getTimeValueConverter(yColumn, xColumn, tableName, dataType, xAxisType, xdata);
+            }else {
+                valueOnes = showChartsMapper.getValues(yColumn, xColumn, tableName, dataType, xdata);
+            }
+            if (valueOnes == null || "".equals(valueOnes)){
+                valueOne = 0;
+            }else {
+                valueOne = Double.parseDouble(valueOnes);
+            }
+            value.add(valueOne);
+            System.out.println("value:"+value);
+        }
+
+        System.out.println(value);
+        series.setName(xColumn);
+        series.setValue(value);
+        serieses.add(series);
+        System.out.println(serieses);
+
+        System.out.println("size:"+groupBy.size());
+        //有分组
+        if (groupBy.size() != 0){
+            serieses.remove(0);
+            Iterator itGroup = groupBy.iterator();  //分组数
+
+            //便利分组
+            while (itGroup.hasNext()){
+               String groupByName = (String) itGroup.next(); //每个分组的组名
+                List<String> groupsData = showChartsMapper.getGroups(groupByName,tableName); //查询每个分组系列
+                System.out.println("groupdata:"+ groupsData.toString());
+                Iterator itGroupsData = groupsData.iterator();
+
+                //每个分组得到得每个系列
+                while(itGroupsData.hasNext()){
+                    Series ne = new Series();
+                    String groupsName = (String)itGroupsData.next();
+                    ne.setName(groupsName);
+                    ne.setStack(groupByName);
+
+                    List<Double> groupsValue = new ArrayList<Double>();
+                    Iterator itXAxisData = xAxisData.iterator();
+
+                    //每个系列对应X轴上的值
+                    while (itXAxisData.hasNext()){
+                        String xAxisDataOne = (String) itXAxisData.next();
+                        double groupsValueOne = 0;
+                        String groupsValueOnes = null;
+                        if ("time".equals(histogramConfigInfo.getxAxis().getColumnType())){
+                            groupsValueOnes = timeConverterUtil.getGroupTimeConverter(dataType, yColumn, tableName, groupByName, xAxisType,
+                                    groupsName, xColumn, xAxisDataOne);
+                        }else {
+                            groupsValueOnes = showChartsMapper.getGroupsValue(dataType, yColumn, tableName, groupByName, groupsName, xColumn, xAxisDataOne);
+                        }
+                        if ("".equals(groupsValueOnes) || groupsValueOnes == null){
+                            groupsValueOne = 0;
+                        }else{
+                            groupsValueOne = Double.parseDouble(groupsValueOnes);
+                        }
+                        groupsValue.add(groupsValueOne);
+                    }
+
+                    ne.setValue(groupsValue);
+                    System.out.println("值:"+ series);
+                    serieses.add(ne);
+                }
+                System.out.println(serieses);
+            }
+        }
+
+        histogramDataInfo.setSerieses(serieses);
+
+        return new RepEntity(RepCode.success, histogramDataInfo);
+    }
+
+
+}

+ 140 - 0
src/main/java/com/database2/server/TimeConverterUtil.java

@@ -0,0 +1,140 @@
+package com.database2.server;
+
+import com.database2.dao.ShowChartsMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/*
+处理时间分段
+ */
+@Service
+public class TimeConverterUtil {
+    @Autowired
+    ShowChartsMapper showChartsMapper;
+
+    //x轴时间类型
+    public List<String> timeConverter(String xColumnName, String tableName, String timeType){
+        String timeGroup = "'YYYY-MM-DD'";
+        List<String> value = new ArrayList<String>();
+        if ("year".equals(timeType)){
+            timeGroup = "'YYYY'";
+            value = showChartsMapper.getTimeDate(xColumnName, tableName, timeGroup);
+        }else if ("month".equals(timeType)){
+            timeGroup = "'YYYY-MM'";
+            value = showChartsMapper.getTimeDate(xColumnName, tableName, timeGroup);
+        }else if ("day".equals(timeType) || "".equals(timeType)){
+            value = showChartsMapper.getTimeDate(xColumnName, tableName, timeGroup);
+        }else if ("quarter".equals(timeType)){
+            timeGroup = "'YYYY-Q'";
+            value = showChartsMapper.getTimeDate(xColumnName, tableName, timeGroup);
+        }else if ("week".equals(timeType)){
+            timeGroup = "'YYYY-WW'";
+            value = showChartsMapper.getTimeDate(xColumnName, tableName, timeGroup);
+        }else if ("halfYear".equals(timeType)){
+            value = showChartsMapper.getTimeYear(xColumnName, tableName);
+        }else {
+            return null;
+        }
+        return value;
+    }
+
+    //x轴时间类型包装
+    public List<String> toRespons(List<String> dataList, String timeType){
+        List<String> value = new ArrayList<String>();
+        String dataLast = null;
+        Iterator isDataList = dataList.iterator();
+        while (isDataList.hasNext()){
+            String data = (String) isDataList.next();
+            if ("quarter".equals(timeType)){
+                String[] str = data.split("-");
+                dataLast = str[0] + "-Q" + str[1];
+            }else if ("month".equals(timeType)){
+                String[] str = data.split("-");
+                dataLast = str[0] + "-M" + str[1];
+            }else if ("week".equals(timeType)){
+                String[] str = data.split("-");
+                dataLast = str[0] + "-W" + str[1];
+            }
+            value.add(dataLast);
+        }
+        return value;
+    }
+
+    //无分组时间值
+    public String getTimeValueConverter(String yColumn, String xColumn, String tableName, String dataType, String timeType, String xdata){
+
+        String timeGroup = "'YYYY-MM-DD'";
+        String value = null;
+        //判断时间类型
+        if ("halfYear".equals(timeType)){
+            String[] str = xdata.split("-");
+            if ("上半年".equals(str[1])){
+                String firstIndex = str[0] + "-01";
+                String afterIndex = str[0] + "-06";
+                value = showChartsMapper.getTimeValueYear(dataType, yColumn, tableName, xColumn, firstIndex, afterIndex);
+            }else {
+                String firstIndex = str[0] + "-07";
+                String afterIndex = str[0] + "-12";
+                value = showChartsMapper.getTimeValueYear(dataType, yColumn, tableName, xColumn, firstIndex, afterIndex);
+            }
+        }else if ("year".equals(timeType)){
+            timeGroup = "'YYYY'";
+            value = showChartsMapper.getTimeValue(dataType, yColumn, tableName, xColumn, timeGroup,xdata);
+        }else if ("month".equals(timeType)){
+            timeGroup = "'YYYY-MM'";
+            value = showChartsMapper.getTimeValue(dataType, yColumn, tableName, xColumn, timeGroup,xdata);
+        }else if ("day".equals(timeType) || "".equals(timeType)){
+            value = showChartsMapper.getTimeValue(dataType, yColumn, tableName, xColumn, timeGroup,xdata);
+        }else if ("quarter".equals(timeType)){
+            timeGroup = "'YYYY-Q'";
+            value = showChartsMapper.getTimeValue(dataType, yColumn, tableName, xColumn, timeGroup,xdata);
+        }else if ("week".equals(timeType)){
+            timeGroup = "'YYYY-WW'";
+            value = showChartsMapper.getTimeValue(dataType, yColumn, tableName, xColumn, timeGroup,xdata);
+        }
+        return value;
+    }
+
+    //有分组时间类型值处理
+    public String getGroupTimeConverter(String dataType, String yColumn, String tableName, String groupByName, String timeType,
+                                        String groupsName, String xColumn, String xAxisDataOne){
+        String timeGroup = "'YYYY-MMDD'";
+        String value = null;
+        if ("year".equals(timeType)){
+            timeGroup = "'YYYY'";
+            value = showChartsMapper.getGroupsValueTime(dataType, yColumn, tableName, groupByName, groupsName, xColumn,
+                    timeGroup, xAxisDataOne);
+        }else if ("month".equals(timeType)){
+            timeGroup = "'YYYY-MM'";
+            value = showChartsMapper.getGroupsValueTime(dataType, yColumn, tableName, groupByName, groupsName, xColumn,
+                    timeGroup, xAxisDataOne);
+        }else if ("quarter".equals(timeType)){
+            timeGroup = "'YYYY-Q'";
+            value = showChartsMapper.getGroupsValueTime(dataType, yColumn, tableName, groupByName, groupsName, xColumn,
+                    timeGroup, xAxisDataOne);
+        }else if ("week".equals(timeType)){
+            timeGroup = "'YYYY-WW'";
+            value = showChartsMapper.getGroupsValueTime(dataType, yColumn, tableName, groupByName, groupsName, xColumn,
+                    timeGroup, xAxisDataOne);
+        }else if ("day".equals(timeType) || "".equals(timeType)){
+            value = showChartsMapper.getGroupsValueTime(dataType, yColumn, tableName, groupByName, groupsName, xColumn,
+                    timeGroup, xAxisDataOne);
+        }else if ("halfYear".equals(timeType)){
+            String[] str = xAxisDataOne.split("-");
+            if ("上半年".equals(str[1])){
+                String firstIndex = str[0] + "-01";
+                String afterIndex = str[0] + "-06";
+                value = showChartsMapper.getTimeValueHalfYear(dataType, yColumn, tableName, xColumn, firstIndex, afterIndex, groupByName, groupsName);
+            }else {
+                String firstIndex = str[0] + "-07";
+                String afterIndex = str[0] + "-12";
+                value = showChartsMapper.getTimeValueHalfYear(dataType, yColumn, tableName, xColumn, firstIndex, afterIndex, groupByName, groupsName);
+            }
+        }
+        return value;
+    }
+}

+ 123 - 0
src/main/java/com/model/bo/AggregateTable.java

@@ -0,0 +1,123 @@
+package com.model.bo;
+/*
+总体统计
+ */
+public class AggregateTable {
+
+    private String columnTarget;          //分析的目标列
+    private int isBars;                   //条数
+    private int isPercentage;             //百分比
+    private int isSum;
+    private int isAverage;
+    private int isStandardDeviation;    //标准差
+    private int isMax;
+    private int isFirstPercentile;       //25th
+    private int isAfterPercentile;       //75th
+    private int isMedian;                //中位数
+    private int isMin;
+
+    public String getColumnTarget() {
+        return columnTarget;
+    }
+
+    public void setColumnTarget(String columnTarget) {
+        this.columnTarget = columnTarget;
+    }
+
+    public int getIsBars() {
+        return isBars;
+    }
+
+    public void setIsBars(int isBars) {
+        this.isBars = isBars;
+    }
+
+    public int getIsPercentage() {
+        return isPercentage;
+    }
+
+    public void setIsPercentage(int isPercentage) {
+        this.isPercentage = isPercentage;
+    }
+
+    public int getIsSum() {
+        return isSum;
+    }
+
+    public void setIsSum(int isSum) {
+        this.isSum = isSum;
+    }
+
+    public int getIsAverage() {
+        return isAverage;
+    }
+
+    public void setIsAverage(int isAverage) {
+        this.isAverage = isAverage;
+    }
+
+    public int getIsStandardDeviation() {
+        return isStandardDeviation;
+    }
+
+    public void setIsStandardDeviation(int isStandardDeviation) {
+        this.isStandardDeviation = isStandardDeviation;
+    }
+
+    public int getIsMax() {
+        return isMax;
+    }
+
+    public void setIsMax(int isMax) {
+        this.isMax = isMax;
+    }
+
+    public int getIsFirstPercentile() {
+        return isFirstPercentile;
+    }
+
+    public void setIsFirstPercentile(int isFirstPercentile) {
+        this.isFirstPercentile = isFirstPercentile;
+    }
+
+    public int getIsAfterPercentile() {
+        return isAfterPercentile;
+    }
+
+    public void setIsAfterPercentile(int isAfterPercentile) {
+        this.isAfterPercentile = isAfterPercentile;
+    }
+
+    public int getIsMedian() {
+        return isMedian;
+    }
+
+    public void setIsMedian(int isMedian) {
+        this.isMedian = isMedian;
+    }
+
+    public int getIsMin() {
+        return isMin;
+    }
+
+    public void setIsMin(int isMin) {
+        this.isMin = isMin;
+    }
+
+    @Override
+    public String toString() {
+        return "AggregateTable{" +
+                "columnTarget='" + columnTarget + '\'' +
+                ", isBars=" + isBars +
+                ", isPercentage=" + isPercentage +
+                ", isSum=" + isSum +
+                ", isAverage=" + isAverage +
+                ", isStandardDeviation=" + isStandardDeviation +
+                ", isMax=" + isMax +
+                ", isFirstPercentile=" + isFirstPercentile +
+                ", isAfterPercentile=" + isAfterPercentile +
+                ", isMedian=" + isMedian +
+                ", isMin=" + isMin +
+                '}';
+    }
+}

+ 40 - 0
src/main/java/com/model/bo/Column.java

@@ -0,0 +1,40 @@
+package com.model.bo;
+
+public class Column {
+    private String columnRename;
+    private String columnType;
+    private String dataType;
+
+    public String getColumnRename() {
+        return columnRename;
+    }
+
+    public void setColumnRename(String columnRename) {
+        this.columnRename = columnRename;
+    }
+
+    public String getColumnType() {
+        return columnType;
+    }
+
+    public void setColumnType(String columnType) {
+        this.columnType = columnType;
+    }
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    @Override
+    public String toString() {
+        return "Column{" +
+                "columnRename='" + columnRename + '\'' +
+                ", columnType='" + columnType + '\'' +
+                ", dataType='" + dataType + '\'' +
+                '}';
+    }
+}

+ 53 - 0
src/main/java/com/model/bo/DataView.java

@@ -0,0 +1,53 @@
+package com.model.bo;
+
+/*
+个体统计
+ */
+public class DataView {
+    private String columnTarget;          //分析的目标列
+    private String sortOrder;                         //排序方式
+    private String showLines;
+    private int deviationValue;                    //偏差值
+
+    public String getColumnTarget() {
+        return columnTarget;
+    }
+
+    public void setColumnTarget(String columnTarget) {
+        this.columnTarget = columnTarget;
+    }
+
+    public String getSortOrder() {
+        return sortOrder;
+    }
+
+    public void setSortOrder(String sortOrder) {
+        this.sortOrder = sortOrder;
+    }
+
+    public String getShowLines() {
+        return showLines;
+    }
+
+    public void setShowLines(String showLines) {
+        this.showLines = showLines;
+    }
+
+    public int getDeviationValue() {
+        return deviationValue;
+    }
+
+    public void setDeviationValue(int deviationValue) {
+        this.deviationValue = deviationValue;
+    }
+
+    @Override
+    public String toString() {
+        return "DataView{" +
+                "columnTarget='" + columnTarget + '\'' +
+                ", sortOrder='" + sortOrder + '\'' +
+                ", showLines='" + showLines + '\'' +
+                ", deviationValue=" + deviationValue +
+                '}';
+    }
+}

+ 80 - 0
src/main/java/com/model/bo/DatabaseConfig.java

@@ -0,0 +1,80 @@
+package com.model.bo;
+
+public class DatabaseConfig {
+    private String name;
+    private String addrass;
+    private String port;
+    private String databaseType;
+    private String dataName;
+    private String userName;
+    private String passWord;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAddrass() {
+        return addrass;
+    }
+
+    public void setAddrass(String addrass) {
+        this.addrass = addrass;
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    public void setPort(String port) {
+        this.port = port;
+    }
+
+    public String getDatabaseType() {
+        return databaseType;
+    }
+
+    public void setDatabaseType(String databaseType) {
+        this.databaseType = databaseType;
+    }
+
+    public String getDataName() {
+        return dataName;
+    }
+
+    public void setDataName(String dataName) {
+        this.dataName = dataName;
+    }
+
+    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;
+    }
+
+    @Override
+    public String toString() {
+        return "DatabaseConfig{" +
+                "name='" + name + '\'' +
+                ", addrass='" + addrass + '\'' +
+                ", port='" + port + '\'' +
+                ", databaseType='" + databaseType + '\'' +
+                ", dataName='" + dataName + '\'' +
+                ", userName='" + userName + '\'' +
+                ", passWord='" + passWord + '\'' +
+                '}';
+    }
+}

+ 40 - 0
src/main/java/com/model/bo/Histogram.java

@@ -0,0 +1,40 @@
+package com.model.bo;
+
+public class Histogram {
+    private String xAxis;
+    private String yAxis;
+    private String dataType;
+
+    public String getxAxis() {
+        return xAxis;
+    }
+
+    public void setxAxis(String xAxis) {
+        this.xAxis = xAxis;
+    }
+
+    public String getyAxis() {
+        return yAxis;
+    }
+
+    public void setyAxis(String yAxis) {
+        this.yAxis = yAxis;
+    }
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    @Override
+    public String toString() {
+        return "Histogram{" +
+                "xAxis='" + xAxis + '\'' +
+                ", yAxis='" + yAxis + '\'' +
+                ", dataType='" + dataType + '\'' +
+                '}';
+    }
+}

+ 60 - 0
src/main/java/com/model/bo/Layout.java

@@ -0,0 +1,60 @@
+package com.model.bo;
+
+public class Layout {
+    private int id;
+    private String xCoord;
+    private String yCoord;
+    private String width;
+    private String heigth;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getxCoord() {
+        return xCoord;
+    }
+
+    public void setxCoord(String xCoord) {
+        this.xCoord = xCoord;
+    }
+
+    public String getyCoord() {
+        return yCoord;
+    }
+
+    public void setyCoord(String yCoord) {
+        this.yCoord = yCoord;
+    }
+
+    public String getWidth() {
+        return width;
+    }
+
+    public void setWidth(String width) {
+        this.width = width;
+    }
+
+    public String getHeigth() {
+        return heigth;
+    }
+
+    public void setHeigth(String heigth) {
+        this.heigth = heigth;
+    }
+
+    @Override
+    public String toString() {
+        return "Layout{" +
+                "id=" + id +
+                ", xCoord='" + xCoord + '\'' +
+                ", yCoord='" + yCoord + '\'' +
+                ", width='" + width + '\'' +
+                ", heigth='" + heigth + '\'' +
+                '}';
+    }
+}

+ 30 - 0
src/main/java/com/model/bo/Line.java

@@ -0,0 +1,30 @@
+package com.model.bo;
+
+public class Line {
+    private String xAxis;
+    private String yAxis;
+
+    public String getxAxis() {
+        return xAxis;
+    }
+
+    public void setxAxis(String xAxis) {
+        this.xAxis = xAxis;
+    }
+
+    public String getyAxis() {
+        return yAxis;
+    }
+
+    public void setyAxis(String yAxis) {
+        this.yAxis = yAxis;
+    }
+
+    @Override
+    public String toString() {
+        return "Coordinate{" +
+                "xAxis='" + xAxis + '\'' +
+                ", yAxis='" + yAxis + '\'' +
+                '}';
+    }
+}

+ 30 - 0
src/main/java/com/model/bo/Pages.java

@@ -0,0 +1,30 @@
+package com.model.bo;
+
+public class Pages {
+    private int pageNum;
+    private int pageSize;
+
+    public int getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(int pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    @Override
+    public String toString() {
+        return "Pages{" +
+                "pageNum=" + pageNum +
+                ", pageSize=" + pageSize +
+                '}';
+    }
+}

+ 20 - 0
src/main/java/com/model/bo/Pie.java

@@ -0,0 +1,20 @@
+package com.model.bo;
+
+public class Pie {
+    private String columnTarget;          //分析的目标列
+
+    public String getColumnTarget() {
+        return columnTarget;
+    }
+
+    public void setColumnTarget(String columnTarget) {
+        this.columnTarget = columnTarget;
+    }
+
+    @Override
+    public String toString() {
+        return "Pie{" +
+                "columnTarget='" + columnTarget + '\'' +
+                '}';
+    }
+}

+ 42 - 0
src/main/java/com/model/bo/Series.java

@@ -0,0 +1,42 @@
+package com.model.bo;
+
+import java.util.List;
+
+public class Series {
+    private String name;
+    private List<Double> value;
+    private String stack;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<Double> getValue() {
+        return value;
+    }
+
+    public void setValue(List<Double> value) {
+        this.value = value;
+    }
+
+    public String getStack() {
+        return stack;
+    }
+
+    public void setStack(String stack) {
+        this.stack = stack;
+    }
+
+    @Override
+    public String toString() {
+        return "Series{" +
+                "name='" + name + '\'' +
+                ", value=" + value +
+                ", stack='" + stack + '\'' +
+                '}';
+    }
+}

+ 212 - 0
src/main/java/com/model/po/ChartConfig.java

@@ -0,0 +1,212 @@
+package com.model.po;
+
+public class ChartConfig {
+    private int chartId;
+    private String chartName;
+    private String tableName;
+    private String chartType;
+    private int DataId;            //数据源id
+    private int dashboardsId;      //看板id
+    private String groupBy;        //分组
+    private String Subsections;    //分段
+    private String chartConfig;
+    private String createBy;
+    private String accessAuthority;   //访问权限
+    private String updateAuthority;    //修改权限
+    private String describes;           //描述
+    private int isLegend;           //图例
+    private int isTooltip;            //提示框
+    private int isDatazoom;           //缩放
+    private int isToolbox;            //工具箱
+    private String filters;          //筛选
+    private String createDate; //数据类型
+    private String updateDate; //数据类型
+
+    public int getChartId() {
+        return chartId;
+    }
+
+    public void setChartId(int chartId) {
+        this.chartId = chartId;
+    }
+
+    public String getChartName() {
+        return chartName;
+    }
+
+    public void setChartName(String chartName) {
+        this.chartName = chartName;
+    }
+
+    public String getChartType() {
+        return chartType;
+    }
+
+    public void setChartType(String chartType) {
+        this.chartType = chartType;
+    }
+
+    public int getDataId() {
+        return DataId;
+    }
+
+    public void setDataId(int dataId) {
+        DataId = dataId;
+    }
+
+    public int getDashboardsId() {
+        return dashboardsId;
+    }
+
+    public void setDashboardsId(int dashboardsId) {
+        this.dashboardsId = dashboardsId;
+    }
+
+    public String getGroupBy() {
+        return groupBy;
+    }
+
+    public void setGroupBy(String groupBy) {
+        this.groupBy = groupBy;
+    }
+
+    public String getSubsections() {
+        return Subsections;
+    }
+
+    public void setSubsections(String subsections) {
+        Subsections = subsections;
+    }
+
+    public String getChartConfig() {
+        return chartConfig;
+    }
+
+    public void setChartConfig(String chartConfig) {
+        this.chartConfig = chartConfig;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    public String getAccessAuthority() {
+        return accessAuthority;
+    }
+
+    public void setAccessAuthority(String accessAuthority) {
+        this.accessAuthority = accessAuthority;
+    }
+
+    public String getUpdateAuthority() {
+        return updateAuthority;
+    }
+
+    public void setUpdateAuthority(String updateAuthority) {
+        this.updateAuthority = updateAuthority;
+    }
+
+    public String getDescribes() {
+        return describes;
+    }
+
+    public void setDescribes(String describes) {
+        this.describes = describes;
+    }
+
+    public int getIsLegend() {
+        return isLegend;
+    }
+
+    public void setIsLegend(int isLegend) {
+        this.isLegend = isLegend;
+    }
+
+    public int getIsTooltip() {
+        return isTooltip;
+    }
+
+    public void setIsTooltip(int isTooltip) {
+        this.isTooltip = isTooltip;
+    }
+
+    public int getIsDatazoom() {
+        return isDatazoom;
+    }
+
+    public void setIsDatazoom(int isDatazoom) {
+        this.isDatazoom = isDatazoom;
+    }
+
+    public int getIsToolbox() {
+        return isToolbox;
+    }
+
+    public void setIsToolbox(int isToolbox) {
+        this.isToolbox = isToolbox;
+    }
+
+    public String getFilters() {
+        return filters;
+    }
+
+    public void setFilters(String filters) {
+        this.filters = filters;
+    }
+
+    public String getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(String createDate) {
+        this.createDate = createDate;
+    }
+
+    public String getUpdateDate() {
+        return updateDate;
+    }
+
+    public void setUpdateDate(String updateDate) {
+        this.updateDate = updateDate;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    @Override
+    public String toString() {
+        return "ChartConfig{" +
+                "chartId=" + chartId +
+                ", chartName='" + chartName + '\'' +
+                ", tableName='" + tableName + '\'' +
+                ", chartType='" + chartType + '\'' +
+                ", DataId=" + DataId +
+                ", dashboardsId=" + dashboardsId +
+                ", groupBy='" + groupBy + '\'' +
+                ", Subsections='" + Subsections + '\'' +
+                ", chartConfig='" + chartConfig + '\'' +
+                ", createBy='" + createBy + '\'' +
+                ", accessAuthority='" + accessAuthority + '\'' +
+                ", updateAuthority='" + updateAuthority + '\'' +
+                ", describes='" + describes + '\'' +
+                ", isLegend=" + isLegend +
+                ", isTooltip=" + isTooltip +
+                ", isDatazoom=" + isDatazoom +
+                ", isToolbox=" + isToolbox +
+                ", filters='" + filters + '\'' +
+                ", createDate=" + createDate +
+                ", updateDate=" + updateDate +
+                '}';
+    }
+}
+
+

+ 40 - 0
src/main/java/com/model/po/ColumnData.java

@@ -0,0 +1,40 @@
+package com.model.po;
+
+public class ColumnData {
+    private String columnName;
+    private String columnType;
+    private String remarks;
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public void setColumnName(String columnName) {
+        this.columnName = columnName;
+    }
+
+    public String getColumnType() {
+        return columnType;
+    }
+
+    public void setColumnType(String columnType) {
+        this.columnType = columnType;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    @Override
+    public String toString() {
+        return "ColumnData{" +
+                "columnName='" + columnName + '\'' +
+                ", columnType='" + columnType + '\'' +
+                ", remarks='" + remarks + '\'' +
+                '}';
+    }
+}

Some files were not shown because too many files changed in this diff